你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32操作24位AD芯片AD7799

[复制链接]
STMCU小助手 发布时间:2022-1-24 22:00
AD7799是早些前ADI公司推出的一款高精度低速24位ADC器件,主要应用于低功耗精密测量场合。最近开发与气压检测相关的产品,选择了这个芯片,经过PCB的合理布线,感觉这颗芯片的效果还不错。
  AD7799内部数字部分和模拟部分的供电是分开的,数字部分由DVCC供电,模拟部分由AVCC供电,经过实验,在只有DVCC而不加AVCC的时候芯片的数字接口部分是可以工作的,这样就可以把AIN3+和AIN3-作为数字信号来启动模拟电源输出AVCC,不知道这样描述是否清楚,主要是为低功耗和省电考虑。
  AD7799内部有三个差分通道,可以分别配置成为差分模式和单端模式,在单端模式下需要保证AINx(+)电压高于AIN(-)电压,否则转换结果为零,这很显然。差分模式下实际上的量化等级只有2的23次方,因为有一位做了符号位,在差分方式下应当注意24位值的符号位处理,应当将其扩展到第32位,做为一个字来处理。
  芯片内部有一个增益可编程的放大器,可以设定增益为1/2//4/8/16/32/64/128倍增益。经本人实际使用其增益还比较精确,只是在高增益时实际测量的值偏差变大。由于分辨率太高,轻微的信号波动和引线布局都对转换结果影响较大,所以在使用前需要对通道进行零度和满度校准。
  零度校准时,芯片内部将差分通道的两个输入端内部短接,这时得到一个转换值存放于内部对应通道的零度偏差寄存器中,满度校准时,芯片内部将两个输入端接到参考电压上,这时得到的转换值存放于内部相应通道的满度寄存器中。至于系统误差校准,这个没做研究。
  利用STM32的SPI接口与相连接,非常完美,它的SPI不以CS线的上升沿做为结束同步标志,CS线仅仅只是做为片选使用,STM32可以工作于硬件CS管理模式。每个字节都可以有CS的复位、置位变化,也可以多个字节只有一次cS的复位、置位变化,很灵活,我还是采用了软件管理CS线的方式。
  编程时,需要特别注意SPI的模式,它的特点(看AD7799的DS中给出的时序图)是SCLK在空闲时保持高电平,数据在SCLK半个周期之后送到MOSI线上,与一般器件的SPI时序有所不同,当然这也是标准SPI时序之后,只是一般器件不采用这种方式。以下是STM32单片机的SPI配置,我用到的是SPI2:
5 U: Z4 }# t, _

, f. v; {4 b9 b! n! t
下面的代码是完全调试通过的:
! c2 l# ?  v- c6 b# {
#define ADC_SPI_CS_CLR GPIOB->BSRR=GPIO_Pin_12
7 S/ D6 ^6 [4 w/ Q#define ADC_SPI_CS_SET GPIOB->BSRR=GPIO_Pin_12
#define ADC_RDY_DAT (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
#define ADC_OP_READ ((u8)(0x40))
  l6 L; q3 l! F- z* U: j& }#define ADC_OP_WRITE ((u8)(0x00))

) F. y! w# ^+ K#define ADC_REG_STAT ((u8)(0x00<<3))
* `  V6 N. }9 P* v1 @$ N% W#define ADC_REG_MODE ((u8)(0x01<<3)); }( V7 X) `' Z6 O3 X! j
#define ADC_REG_CONFIG ((u8)(0x02<<3))) U9 T+ }" {( v5 U: g% V
#define ADC_REG_DATA ((u8)(0x03<<3))( h  r4 B! F1 g9 L
#define ADC_REG_ID ((u8)(0x04<<3))' ^4 L4 I* ^$ |6 D8 I
#define ADC_REG_IO ((u8)(0x05<<3))
2 X! Q( w7 Z% t#define ADC_REG_OFFSET ((u8)(0x06<<3))
- d3 C) t" |6 m5 G3 Z//#define ADC_REG_STAT ((unsigned char)(0x07))

$ ]) |  `7 B% G0 }#define ADC_CON_CH1 ((u8)(0x00))
. b% U- z/ i/ G#define ADC_CON_CH2 ((u8)(0x01))$ R% F8 d, ~, O7 r" l
#define ADC_CON_CH3 ((u8)(0x02))# H8 h/ v! i' ]3 p2 V
#define ADC_CON_AVDD ((u8)(0x07))
#define ADC_CON_GAIN1 ((u8)(0x00))
( y, N3 Z- z" {! A* a) J/ t#define ADC_CON_GAIN2 ((u8)(0x01))% u6 L' s' i# u
#define ADC_CON_GAIN3 ((u8)(0x02))
, x+ w' K  A. @1 Y#define ADC_CON_GAIN4 ((u8)(0x03))
+ R5 U; t( d0 k! x#define ADC_CON_GAIN5 ((u8)(0x04))
1 T3 X5 [8 f( `3 N& @8 |  F3 [. _) Y#define ADC_CON_GAIN6 ((u8)(0x05))
3 ]. K+ w3 Y, {/ q; @#define ADC_CON_GAIN7 ((u8)(0x06))
' W" P7 G' V& _, g) x" W4 `#define ADC_CON_GAIN8 ((u8)(0x07))
#define ADC_SINGLE_POLAR ((u8)(1<<4)) //单双极性
  x$ K' z# ?3 m8 Z5 k7 H, Q#define ADC_DOUBLE_POLAR ((u8)(0<<4))
#define ADC_MODE_CONTINUOUS ((u8)(0<<5))
& B) J- N6 h7 a* V& q#define ADC_MODE_ONCE ((u8)(1<<5))
$ E% f- s$ n- i
#define ad7799_StatRDY ((u8)(1<<7))
/ r" q$ p* q4 K9 n2 V5 m0 |#define ad7799_StatERR ((u8)(1<<6))5 \+ W8 t7 j3 J) H
#define ad7799_StatNOR ((u8)(1<<5))
void SPI_Config(void)
/ Z$ J( M; c" [* M{2 ?2 P# Y2 R& r0 z
SPI_InitTypeDef SPI_InitStructure;' s3 v  M- a5 P$ L' n8 Q$ f  g1 O$ h
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);# v3 Y7 P; [* e9 ?5 R$ Q
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);' l; G' {  g: O
+ G9 ?8 ~8 p' V
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
" ~2 r& i& ^: x8 G6 dGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;% ?0 @$ L' f. B$ ?
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;( M$ Z' F) n% m% h9 R' r+ O0 v
GPIO_Init(GPIOB, &GPIO_InitStructure);

8 X2 e5 m  n5 @, A2 k' y5 JGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14|GPIO_Pin_15;
  i' N# A' o! b7 vGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
* z5 u% K! K7 e( a: Q2 v( z2 Z6 IGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;! b' h* Y% ]- Z7 _/ O# {/ a
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI2 configuration */7 z( Z1 z0 Y$ F1 @+ {) z- w" W
SPI_Cmd(SPI2, DISABLE); //必须先禁能,才能改变MODE: R3 b1 O; G! o, N5 q) K5 K
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工: H+ ?0 Q* b5 `% t' Q7 K
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主1 Y- X- B5 i% o6 l0 ^6 H1 }- G0 B
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位
2 w3 {1 H( z8 N! w  A/ wSPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL=1 时钟悬空高( r; e5 t2 O- p9 w6 }
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1 数据捕获第2个( s2 E; ~& |& |+ {: g* n
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS
! [* q! H# _. \6 P# m8 \SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //2分频
5 F0 Y( A& S$ z( ?* USPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前' j; m  p# k& E, ^# o' F
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC7
/ u* E* b1 O! K" G
9 T& H: w" v" o7 zSPI_Init(SPI2, &SPI_InitStructure);) J% L' |; Q: w5 @+ ~, l
SPI_Cmd(SPI2, ENABLE);

% j. U5 u* I+ v2 g/ `  L+ _}
, w. r6 u+ w7 ~
$ f; w6 s. K7 F: |" q( g
u8 SPIByte(u8 byte)
9 t! K/ N: z4 }{
! C/ n) A" A: J$ u( n# {9 U/*等待发送寄存器空*/. W8 \0 j4 S, U/ l4 e; X
while((SPI2->SR & SPI_I2S_FLAG_TXE)==RESET);4 f2 V7 k0 g6 K2 ?; z
/*发送一个字节*/
* p6 _- j- N4 D1 u$ B2 ESPI2->DR = byte;
9 m4 |/ E0 w3 H8 k/* 等待接收寄存器有效*/' g2 B$ }/ `8 Q0 `5 M2 J5 o
while((SPI2->SR & SPI_I2S_FLAG_RXNE)==RESET);
0 i% ~6 V7 p9 [( ereturn(SPI2->DR);
& c3 z% ~; T7 F( t, |( Z) n; A: M% a}6 C3 |7 J. c; ~) t
/*---------------------------------------------------------
9 z4 H7 ?, V6 F% P* ]Func: AD7799读取寄存器数据
. _% b0 a3 i+ `3 L4 R4 I% sTime: 2012-3-29
' x, m4 n% t1 B7 z0 [7 g- k8 z3 JVer.: V1.0: D, S+ {- v0 E* \. x4 _& |5 z: C; z
Note:
$ f3 Y5 q* s& D$ C* }---------------------------------------------------------*/' w7 Q9 E- g3 x
void AD7799_ReadReg(u8 RegAddr,u8 *Buffer,u8 Length)& O" `# I& c4 V2 _( J* ]
{; x% h: u6 M5 v, k, x+ |0 z
u8 i;( x0 T% u; U3 z5 C& N
ADC_SPI_CS_CLR;" y; z' D! w& I9 O1 m3 D
RegAddr|=ADC_OP_READ;
1 L# K4 U+ K# d9 C+ o7 W: D& A: _//ADC_WriteBytes(&RegAddr,1);
; A- \( i1 E3 ]" D6 ~//ADC_ReadBytes(Buffer,Length);9 e6 c- w+ J( u( B/ v
SPIByte(RegAddr);  H% s( W% e: |" x
for(i=0;i<Length;i++)
8 T- }) x, n; P) U2 P5 S% ]{5 w* @) w/ A# |( F
Buffer=SPIByte(Buffer);
) ]2 U+ c' O: D# z$ n* t# E}
/ U. S: _# r# O, q3 rADC_SPI_CS_SET;
3 ^, [3 V( W! I5 V}$ w( h1 v' u+ x% t) J

' N* r6 n% I  i+ G& p2 }0 ~7 U& Z7 ?* s2 ~* ^3 |- }
/*---------------------------------------------------------* U/ a( Q  k. f: i! K; d+ Q* V$ J
Func: AD7799写入寄存器数据* _7 M* U# X: f; X: {( [; ?* j
Time: 2012-3-29
0 @( R$ j- {: f* Y+ K8 X( p! VVer.: V1.03 @' G2 i3 b/ q4 |
Note:6 i# ]( B: `; I' ]1 S
---------------------------------------------------------*/' g' d0 p5 _7 \7 A5 ^* y7 Q
void AD7799_WriteReg(u8 RegAddr,u8 *Buffer,u8 Length)
' Z- a8 q  r6 o+ y4 _{
. b! Q  ~3 F1 U/ f5 j. H+ Wu8 i;
: P$ }6 Z4 v+ ~ADC_SPI_CS_CLR;
/ B2 Z+ ]% ~" T6 h$ d9 tRegAddr|=ADC_OP_WRITE;5 o6 X. |* w# `$ ~; y; j# L
//ADC_WriteBytes(&RegAddr,1);
+ G2 f+ `& c. P//ADC_WriteBytes(Buffer,Length);
" j% D' X! o9 ySPIByte(RegAddr);
, b3 n8 A9 {9 f7 D; P6 l1 Bfor(i=0;i<Length;i++)3 [4 B9 L! ^1 C+ e2 f) d
{
; s; d2 s8 h* e2 fSPIByte(Buffer);0 k8 F4 x7 i/ v' X# v  ]9 M
}/ k, A5 y8 S7 o' k( f  p4 i
ADC_SPI_CS_SET;( J- g1 Y0 q' i4 `1 F
}
# G9 o) ~3 G6 R& M8 u* k( l/*---------------------------------------------------------
5 k9 q( g1 r! m" y- pFunc: AD7799忙判断* J- A! q- F) ]8 E0 [
Time: 2012-3-29! b. T1 G+ ?2 E4 a0 W" J+ r
Ver.: V1.0% K% O5 o: O' y$ A# B6 _
Note: 0/OK >0/ERROR,timeout6 y/ c1 O2 w  R* `1 u8 _8 f
---------------------------------------------------------*/8 i# P2 z# M7 w# u
u8 AD7799_WaitBusy()
0 H3 y5 ~* A8 Q! x{7 F" ?9 _. `8 z# {& [1 e# i
u16 i;1 ?& P, i+ x; {
ADC_SPI_CS_CLR;9 P) e/ N: B8 v+ ]
i=0;6 v3 x. |# f! B
while(ADC_RDY_DAT>0)
7 P* E9 E" s+ r; m4 T{
) d4 H, D! R) c' {/ w) [8 zi++;
: z* ?- t, G3 f. {$ e7 ?* oif(i>5000)" z$ ?5 \9 k& l1 G
return 1;& e8 F4 L3 B  ?6 d" G2 h: l
}
6 H9 _- J6 Q& t3 |ADC_SPI_CS_SET;
, \* V3 Y* `, h: Jreturn 0;
3 g0 ~) _" R. l+ m}
/*---------------------------------------------------------& I" ^1 R' I" a! x$ W
Func: AD7799通道内部校准
, Z& y$ l, I/ Y$ s" QTime: 2012-3-29* l4 t; B& F8 r
Ver.: V1.0% ^. G" G; D* a; `- z# T
Note: 0/OK >0/Error
: M9 h- ]/ t- J/ R( N5 b2 y8 K---------------------------------------------------------*/
6 e% }  T% u- }8 A, U; hu8 AD7799_Calibrate(u8 CHx,u8 Gain)) U1 v& |3 H: G' L7 F
{% t; _4 @) B# R7 `5 I# f8 M
u8 R,Cmd[2];( r3 e  T% m, c6 k2 ]
Cmd[0]=0x30|Gain; //0x10代表配置寄存器高八位中单双极性位置1
6 I8 i6 I! ^( x2 O9 NCmd[1]=0x30|CHx;
4 n: n! e* {2 n6 [  T, \! RAD7799_WriteReg(ADC_REG_CONFIG,Cmd,2); //设置配置寄存器: F7 z6 z0 p- q. ^
Cmd[0]=0x80;
0 C, S% K9 ^; i; ?+ R6 BCmd[1]=0x0F;* ^& I9 t! X1 G* q0 t: Z
AD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行内部零度校准
7 @' _; E/ l4 u- d$ T& AR|=AD7799_WaitBusy(); //等待校准完成$ G' S: X- Z- N  Q- L6 }
Cmd[0]=0xA0;, M7 H7 ?/ O% h% ?# f; ]7 a
Cmd[1]=0x0F;
' i8 R9 Q& E8 oAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行内部满肚校准
6 C: {# }2 _9 f5 K' O% e9 TR|=AD7799_WaitBusy(); //等待校准完成
/* Cmd[0]=0xC0;' C3 g" S  u7 I2 R* N8 y. f
Cmd[1]=0x0F;
. H9 l5 [6 T/ B$ k! iAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行系统零度校准
" ~$ p! w: N8 @. ~R|=AD7799_WaitBusy(); //等待校准完成
* ~2 `- x: P* T- bCmd[0]=0xE0;
: v, ^* V% ?/ e* \  d0 mCmd[1]=0x0F;
: E5 h. n$ z. A' n* gAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行系统满度校准' b1 u0 S2 P, R8 O
R|=AD7799_WaitBusy(); //等待校准完成 */
return R;# Y+ u; ]" H8 o
}
' E2 w+ Q5 U. I4 v2 ku8 AD7799_Read_STAT(void)
% y, Y! }2 V( F" M; A{
+ m0 l( v+ H9 N+ m0 w$ V& b! Xu8 Cmd[2];
" ]" V) ?2 t- a) z1 Z/ F+ PAD7799_ReadReg(ADC_REG_STAT,Cmd,1);5 m/ N% U  y( A- f
return Cmd[0];0 u5 V% q" y/ q) C) T
}
u16 AD7799_Read_CONFIH(void)
# k) R9 t$ k: U( a9 G{
) F4 I2 O6 ?6 p+ P+ L. G6 D: r/ {u8 Cmd[2];
* |- v* y3 q& v: r- a/ t3 MAD7799_ReadReg(ADC_REG_CONFIG,Cmd,2);
2 {- F  O4 W$ \; t3 m5 |return (Cmd[0]<<8)+Cmd[1];; \# u% Q! F# b' Z* C& |
}
9 m6 N3 b; b; w4 v# X/*---------------------------------------------------------+ K6 b! k6 H" Y7 @( B
Func: AD7799复位0 K% i! J2 E! J3 @5 U
Time: 2012-3-298 ?; ~! M1 i. E' x
Ver.: V1.01 G. q3 q7 H, h9 q
Note: 0/OK >0/Error
/ v6 y4 p. D" @+ ^: R---------------------------------------------------------*/# F9 ^: K" i/ {1 H; U
void AD7799_Reset()! ^* n9 w: U* b  O
{
1 D; A( A, U* I; U9 Q- \// u8 Cmd[4]={0xFF,0xFF,0xFF,0xFF};
. _9 `( }2 q4 h# X" ?ADC_SPI_CS_CLR;
. _: n. V- c, N. w. g( X1 N* ^// ADC_WriteBytes(Cmd,4);
8 U( v- ^$ q* `6 s' `/ }SPIByte(0xFF);. Q. y7 Z+ J6 ]; R% k
SPIByte(0xFF);+ L8 y5 g" D' c4 k  ]4 D
SPIByte(0xFF);
( w  u9 m( P6 U5 E2 ?  @4 G! ISPIByte(0xFF);
  m7 s! n& J9 b9 M; t  pADC_SPI_CS_SET;( r( Z3 I) h5 h# s
}0 R# Y' B- g# d* a9 V- ~
/*---------------------------------------------------------3 W/ G8 D) O# H+ E. {
Func: AD7799初始化: M, F/ z! |+ _7 |
Time: 2012-3-29
( h1 [" W, N- L6 l9 a# p; V9 aVer.: V1.0% p5 M4 U& g. T. D0 z% K
Note: 0/OK >0/Error
9 q7 W3 o+ f8 m: D4 A---------------------------------------------------------*/% y& W# u& s9 P
u8 AD7799_Init(u8 Gain)
, M! c( J+ X7 X8 T{( z+ Z* |0 |( v4 H- Q! o/ H
u8 ID,Cmd[2];- W1 s6 l+ G; o/ t2 S, [+ a& f
AD7799_Reset();6 h. d7 }, l( V4 P: V, G5 j
delay_ms(5);
6 N3 B5 y6 I+ e: @* E; J// AD7799_ReadReg(ADC_REG_ID,&ID,1); //读取器件ID
1 I  d) f' b$ _" E4 f0 c// if((ID==0xFF)||(ID==0x00))return 1;
8 n) m* c/ z3 _7 ?5 e9 Z& j) x  \3 wAD7799_Calibrate(ADC_CON_CH1,Gain); //通道1校准
9 O) p( _3 t+ z5 O, F  s3 hAD7799_Calibrate(ADC_CON_CH2,Gain); //通道2校准
' m* |, z' I) s" }; \" s4 Q//AD7799_Calibrate(ADC_CON_CH3,Gain); //通道3校准
1 N# l0 ?5 V4 e9 O: _5 ^// Cmd[0]=0<<6;* }2 }8 q+ G8 L0 Y
// AD7799_WriteReg(ADC_REG_IO,Cmd,1);
) E0 J) Z% x7 U) p& Kreturn 0;
! \" y% p, L. f, k3 h* f}
/*---------------------------------------------------------
; w3 p/ x7 Y$ R# D4 kFunc: AD7799开始转换- P2 }) Q& Y* d- ?5 `8 A1 u, G
Time: 2012-3-29- r9 J1 e" M3 n- T; H* S# r
Ver.: V1.0
- G  Y" C. }& d. [( ENote:' D5 X* g) L! S
---------------------------------------------------------*/
) n% d8 r0 j! P% f0 cvoid AD7799_Start(u8 CovChx,u8 CovGain,u8 CovRate,u8 CovMode)
7 h9 M5 n& d$ Y{% D+ j' J# Y7 [
u8 Cmd[2];9 x0 ^' p( y: F  e
Cmd[0]=0x30|CovGain;
6 F; {" e( ]* a7 @  [% OCmd[1]=0x30|CovChx; //0x30& ]4 E0 t$ B! T! w8 z. x+ u
AD7799_WriteReg(ADC_REG_CONFIG,Cmd,2);
* {) C5 r: d, H8 t- }5 W8 n- a6 TCmd[0]=0x10|CovMode;
( P: N0 i9 D& _6 l% qCmd[1]=CovRate;
* Q! `. {0 `1 k1 {AD7799_WriteReg(ADC_REG_MODE,Cmd,2);, z8 z9 f+ G! p, ]$ Z
}
/*---------------------------------------------------------
" w( F' A9 \+ }Func: AD7799读取转换结果0 ]; ?, k! c% x2 P# R- U: V6 A2 A2 |
Time: 2012-3-29
6 |/ P' C2 W8 }: V1 H+ b- C+ `Ver.: V1.0+ j4 h) p8 t: \: u" ~8 ]
Note:
& U" r; Z/ x$ R, x1 p8 P/ s---------------------------------------------------------*/
8 b8 v/ V3 Z. o) eu32 AD7799_Read()
/ Q2 |& K* e+ X" A* G{( C; ^' D9 _% e! E
u8 Cmd[4];
% H+ h) H: D$ N8 A" N' xu16 i=0;1 h+ F' }! I* Z) O  e1 x/ Y
u32 D;
: E1 y1 X3 F  n5 E  ~Cmd[0]=0;
& t, D( ?. E7 Y# c& }while((AD7799_Read_STAT()&ad7799_StatRDY)!=0)
- r8 H8 R# y8 x% H/ U/ m' t! Z- p{2 Y% z5 O3 m8 P$ A) V
i++;$ V4 ~; G5 b; M' q
if(i>10000)
) T7 @& [, m- p: R4 u9 c  X$ a' Vbreak;* Z+ t3 i0 Q) ]: q
}9 c5 Y% w* E6 q# D9 ^7 t; ^- Z
if((AD7799_Read_STAT()&ad7799_StatERR)==0)+ B% f5 }0 e, Z% n! n/ `* f
{
1 E0 C" ?# x: Y& h; yAD7799_ReadReg(ADC_REG_DATA,Cmd,3);5 k0 U: `* u4 Q) z
D=(Cmd[0]<<16)+(Cmd[1]<<8)+Cmd[2];  `) a9 \) I0 M( K2 @* k; `
return D;
+ s; c. @( I; ]( q3 ^}* `" q; d. `, x9 T' H4 y
else7 j9 v  u  v' h4 a  r& Q# _  B
{
: z0 {/ R+ G1 L2 G6 f& v* HAD7799_ReadReg(ADC_REG_DATA,Cmd,4);2 O! b- g  ~' A
return 0xFFFFFF;
% d! t. {# s2 \$ f; T5 n! {}' C+ _8 o( ^; n. E8 c% T: p3 I- ]" v) k

. u9 S& Z) y2 x( {* q}
void ADt7799test()# D9 M* ~7 M: d/ b& C
{+ M( O9 j. B( p$ s" ~! Z0 z+ ~. t
u32 Val;
8 N! I7 b* q: W5 Hu16 a;
4 x1 j8 l) ~; @: _2 i5 V% |AD7799_Init(ADC_CON_GAIN1);9 n! n- j  E- e: H" N  A
AD7799_Start(ADC_CON_CH1,ADC_CON_GAIN1,0x01,ADC_MODE_CONTINUOUS);
( w2 E$ L" E7 s; Z8 S# y" @& l' o2 o" \* d4 E: f
AD7799_Read();4 O' w- @- r* s0 \5 k
AD7799_Read();+ u2 x; r1 ~! G
AD7799_Read();9 [3 u4 M' t( l" B
AD7799_Read();( G$ @/ R# c* m% W7 n0 H! E
AD7799_Read();
* E1 d* ^/ S: G3 X- T6 [: R3 \AD7799_Read();

/ ~7 S0 g8 I0 C, @4 G}

: |* i3 w; M: `. H5 @. b
下面说一下自己遇到的问题:
一:增益1和2起作用,4-128不起作用,增益1与2不通过内部放大器,4-128时通过内部放大器,问题出在电路设计上:
当使用IN-AMP时,AIN+与AIN-的工作范围为(GND+300mV)~(AVDD-1.1V);
共模电压>0.5V是指[(AIN+)+(AIN-)]/2>0.5V即可
如果你的AIN-一定要接GND,那一定是无法使用In-Amp,只能使用unbuffer模式。
我们输入用的单端模式0-5v,所以无法使用4-128增益
二:编程中用到的管教
CS、SCLK、DIN、DOUT(注意时钟频率的选择,查看片选是否生效,输入输出高低电平是否正确)
三:三路差分输入,第三路能设置成IO口,如果不用最好设成模拟输入
四:根据REFIN(+)和REFIN(-)配置寄存器单双极性选择

6 s$ E+ b: Y" o, d& k0 s4 _. `: N
收藏 评论0 发布时间:2022-1-24 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版