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

【经验分享】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:

3 r/ G1 m) Q- x$ }8 x$ G$ [* ?$ s6 @4 K
下面的代码是完全调试通过的:

$ G, n) A" N2 d: z
#define ADC_SPI_CS_CLR GPIOB->BSRR=GPIO_Pin_12
" O  Z5 C0 B& Y" i4 F& L" P$ t! D#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))
- g; e! T: G6 k, c  w% a#define ADC_OP_WRITE ((u8)(0x00))

1 D" ?* T+ |% B  _3 l9 u% i5 E1 u2 z#define ADC_REG_STAT ((u8)(0x00<<3))
$ f! b& ?8 a0 [% n2 j: ?#define ADC_REG_MODE ((u8)(0x01<<3))
! \5 V; J# ^3 t! a' O. i  N3 ?- D. L#define ADC_REG_CONFIG ((u8)(0x02<<3))
% j! ^2 [+ t# ~: ~3 X6 v#define ADC_REG_DATA ((u8)(0x03<<3))
. U+ s5 O' r" [; ]" n6 s#define ADC_REG_ID ((u8)(0x04<<3))
. T" n/ ~* L/ q5 ^9 x4 F; |#define ADC_REG_IO ((u8)(0x05<<3))
) {+ N, e* t! a6 Z. ?2 q7 G1 z' }#define ADC_REG_OFFSET ((u8)(0x06<<3))
8 X" _. j+ i, M2 ^) b//#define ADC_REG_STAT ((unsigned char)(0x07))

2 ^$ f1 \  Q, x) N) Y& Y#define ADC_CON_CH1 ((u8)(0x00))
- d% M. t5 a2 B#define ADC_CON_CH2 ((u8)(0x01))7 }5 p" O5 t9 D6 l1 Y" A5 z% a7 p
#define ADC_CON_CH3 ((u8)(0x02))4 f$ d2 z3 B& V: b7 Z* Q  k' a: W* y+ s
#define ADC_CON_AVDD ((u8)(0x07))
#define ADC_CON_GAIN1 ((u8)(0x00))
; A+ S6 Z  m0 ^: P2 s$ u+ j#define ADC_CON_GAIN2 ((u8)(0x01))& s; F+ z  U' g% b( ]  l
#define ADC_CON_GAIN3 ((u8)(0x02))
# `. K' _4 p6 L! X+ C#define ADC_CON_GAIN4 ((u8)(0x03))( u8 Z2 o7 ]$ U3 d6 I! [+ S
#define ADC_CON_GAIN5 ((u8)(0x04))
8 v" t! A! }" C! _2 F3 s( ?: L4 C" }#define ADC_CON_GAIN6 ((u8)(0x05))
3 X6 S# v( O: g& G! O, g#define ADC_CON_GAIN7 ((u8)(0x06))! V, s8 q$ i3 d6 B. r& \  W
#define ADC_CON_GAIN8 ((u8)(0x07))
#define ADC_SINGLE_POLAR ((u8)(1<<4)) //单双极性
4 m  D+ s  L( S# x5 A#define ADC_DOUBLE_POLAR ((u8)(0<<4))
#define ADC_MODE_CONTINUOUS ((u8)(0<<5))6 T  V* S: O9 ], h
#define ADC_MODE_ONCE ((u8)(1<<5))
- ^$ R- p  @6 k) Y7 }( k7 J
#define ad7799_StatRDY ((u8)(1<<7))( j+ B: O) G1 Z( B2 J# y* `  c
#define ad7799_StatERR ((u8)(1<<6))7 N, @* n; o' `. A4 m/ ^
#define ad7799_StatNOR ((u8)(1<<5))
void SPI_Config(void)
: P8 `/ x! f7 a{
, o4 ~# z7 F1 v3 gSPI_InitTypeDef SPI_InitStructure;4 c1 t" W( K5 f" F( [
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
" |6 p, ]" j5 _% q9 R: J! eRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  I- m4 w: g6 d- B% Q
9 a8 F1 m. M! W  Q
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
9 g4 N1 V" A7 H. o1 y! S. X: xGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 k" u* q) G! u. u
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
# ?0 s" u& \: D' a7 O+ FGPIO_Init(GPIOB, &GPIO_InitStructure);
8 h" f/ F8 K4 k1 t
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14|GPIO_Pin_15;2 u! T) k9 N3 `6 D/ z$ L1 p
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;0 u9 v! s) A' N( R
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;3 \* ?+ m2 A4 h, [$ z
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI2 configuration */
: q/ }: T) y, v5 P6 J  j# ?# o& VSPI_Cmd(SPI2, DISABLE); //必须先禁能,才能改变MODE
- y0 W. X, p  Y5 S9 ~) USPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工) d% [: y, w" v# `( \
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主$ L, X9 d9 [; g
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位
* r( S) h) Z1 ^) ~5 W4 T  v/ }SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL=1 时钟悬空高! U4 a- E3 H) u/ H" O6 L
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1 数据捕获第2个- i  ?3 H. u* h0 [( @* ]0 p
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS  O& ?: ^7 H9 d3 L9 G
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //2分频: S- B3 H; Y# V5 Z7 `" ?2 l
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前. c2 Y! z/ U: {. c) g+ T# Y
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC7( F& s4 ~$ m/ D1 y7 W; H

8 L0 M. g+ ?; T! m2 USPI_Init(SPI2, &SPI_InitStructure);
( m; D6 k: o* k$ A. jSPI_Cmd(SPI2, ENABLE);

7 \% ]4 s6 L/ F: i) S  ~}

0 J5 y% }, v# R7 ?

/ {/ @! j4 r1 H& J7 _u8 SPIByte(u8 byte)+ ?! C9 W6 ]! T' h0 c( B& z; k( L
{  `! P* z3 q( ?1 |7 Q1 I# e9 I
/*等待发送寄存器空*/* g5 J2 J- M  W2 {& a; p
while((SPI2->SR & SPI_I2S_FLAG_TXE)==RESET);6 {% C- G3 l1 @) w$ g$ p3 t  P' P
/*发送一个字节*/: W1 x, d  l% n- A
SPI2->DR = byte;9 ?1 J# V: J+ d% M% ]) H: Z/ h$ m, }$ \
/* 等待接收寄存器有效*/
4 |; g6 ^. E: a' |0 \1 }2 D* G  dwhile((SPI2->SR & SPI_I2S_FLAG_RXNE)==RESET);
" v8 R9 X- a1 M$ Hreturn(SPI2->DR);& t! m; x  k  ?# G9 q
}
% f! T6 v& K( T8 n8 _/*---------------------------------------------------------
& @- z. B! P9 S' \9 K7 n, UFunc: AD7799读取寄存器数据
6 R, l) l, q) X. cTime: 2012-3-296 V! K3 d% ]$ D5 p
Ver.: V1.0
  ?* q+ C3 t, r0 _: N8 UNote:
' O9 W# A  J- G# J' S) z, p---------------------------------------------------------*/
) K3 F3 x; q2 g8 a) E4 l- G1 Qvoid AD7799_ReadReg(u8 RegAddr,u8 *Buffer,u8 Length)3 P6 K$ i2 L( z, w- {% {1 @
{. ^$ S- i/ t  O# Q
u8 i;6 M! l7 p3 v! F5 p  s* k* \8 B
ADC_SPI_CS_CLR;
' ^8 u2 G3 V; M( mRegAddr|=ADC_OP_READ;! ]: V+ v! J' Z% H  _
//ADC_WriteBytes(&RegAddr,1);
/ V2 p) p* _$ \* ]//ADC_ReadBytes(Buffer,Length);6 v& \. n  R" F$ w
SPIByte(RegAddr);
: b- V+ H2 p2 e. b5 J. efor(i=0;i<Length;i++)
0 {3 L1 P0 v0 ~" S+ E9 m{
9 k6 M5 ]1 b. j. c$ u) ]# oBuffer=SPIByte(Buffer);( ~8 j; j, E! y( q0 L. B
}
0 A6 p4 Q( A. g  H/ G- UADC_SPI_CS_SET;
! e% y; \% e+ e/ b}- J4 U3 l8 w% ]- J9 E

. |( ~* ]( Y# {& x1 Y: l
3 J3 }- J( k3 L3 T/*---------------------------------------------------------
9 [2 W! u- C: }; `1 ]Func: AD7799写入寄存器数据- r8 z( O3 C9 w# o* Y
Time: 2012-3-29
" H" k2 t' _% r4 T: ^Ver.: V1.0, I. f5 F) b5 h; c! B
Note:
6 u1 c2 |% K8 s5 |1 ?  M---------------------------------------------------------*/! I6 x8 n8 ^" r, }
void AD7799_WriteReg(u8 RegAddr,u8 *Buffer,u8 Length)7 j- n+ w( ]$ c
{
7 o9 O/ i0 q4 }5 Uu8 i;
& M4 Q( B# O/ d% a' |: QADC_SPI_CS_CLR;
3 K5 B0 X+ f4 C" W4 v3 x* j; T+ W. D4 F# zRegAddr|=ADC_OP_WRITE;' s3 m# w/ n8 b' L/ }
//ADC_WriteBytes(&RegAddr,1);
. e; B  T: k) h# o! J//ADC_WriteBytes(Buffer,Length);3 O4 y. {( x; u( K% O
SPIByte(RegAddr);& S2 _- _4 A0 z/ o6 o
for(i=0;i<Length;i++)
. K; S9 p: W/ r) I/ _5 {* N{/ p& g9 M! T- W+ Y! U
SPIByte(Buffer);
- x" b+ M* G' [) x2 w  `7 N}! k! Z7 A( y/ ]$ t% F+ O
ADC_SPI_CS_SET;6 E0 m8 u& j# X  |
}
* D( o3 ^& ^* d+ o3 N/*---------------------------------------------------------1 P0 X, e, M& w) L
Func: AD7799忙判断
3 S- o6 n. W% S. f! i6 _' JTime: 2012-3-29' n  s  A; O3 l
Ver.: V1.0
: p2 P' n4 Z( g5 ^7 J9 |5 yNote: 0/OK >0/ERROR,timeout" {# c0 v. {2 i9 b
---------------------------------------------------------*/; ?5 l9 e: ?3 g6 ^: O) ]
u8 AD7799_WaitBusy()9 W, G2 w) i8 v) y% ^( X' |
{
5 z4 P. |3 Q  @1 Yu16 i;; Z1 ~7 c; F; D$ e6 K, F! J& ]0 t  @
ADC_SPI_CS_CLR;& ?7 r7 A8 [8 q. V/ {
i=0;, `' E5 j1 K) d( H. Y9 B" O1 W
while(ADC_RDY_DAT>0)
6 K# v7 {3 W( E{& x" s" y& Y  N; Y" Y6 V% I
i++;, C! I+ S& f2 `) D4 R2 b7 J- h
if(i>5000)3 F' J; d6 U; Z% t5 y8 V' E# D
return 1;5 D% E* \; e9 @5 I* p+ ^8 L2 ?0 b
}
- s  R) r- O) r) @4 ~ADC_SPI_CS_SET;
3 i- A! R$ u" ?8 Breturn 0;
7 o& i8 T7 z: V+ g5 H- L}
/*---------------------------------------------------------! m0 O% c% P5 `7 x
Func: AD7799通道内部校准2 p/ i0 u0 \/ Q
Time: 2012-3-29
* N8 w* V: s9 s  v! u8 J. XVer.: V1.0
* |% f( b) n. [& aNote: 0/OK >0/Error- S2 b0 w) e* }% ]4 `
---------------------------------------------------------*/+ c6 l6 z8 `/ {" a) L1 y# L: ^
u8 AD7799_Calibrate(u8 CHx,u8 Gain)
+ s7 k- ~/ Z8 ]6 m7 E{' L# e" m: s( a5 ?! z% _: s9 j
u8 R,Cmd[2];
! s  q) f$ j1 K* wCmd[0]=0x30|Gain; //0x10代表配置寄存器高八位中单双极性位置1
( @1 E# M& }% D1 A0 T% w$ P; C( zCmd[1]=0x30|CHx;8 |) s; F; v5 a+ v9 f2 k; c
AD7799_WriteReg(ADC_REG_CONFIG,Cmd,2); //设置配置寄存器
3 Q7 N0 l2 u$ ~7 nCmd[0]=0x80;
2 x8 _8 |" I6 C! C; v( @Cmd[1]=0x0F;
$ U/ z( X; L9 sAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行内部零度校准( a- f1 C# q9 n- i0 L( g) e# F
R|=AD7799_WaitBusy(); //等待校准完成3 E; G$ W, Q" M) d4 Z6 c
Cmd[0]=0xA0;
4 ]  C. y8 d( z5 OCmd[1]=0x0F;1 J  Z+ S( U5 H8 F3 L6 j8 x
AD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行内部满肚校准, o" t' l" ^; J- A& C/ n1 z
R|=AD7799_WaitBusy(); //等待校准完成
/* Cmd[0]=0xC0;
% g1 E: O1 \; ~, y1 c5 K+ B' X" G3 |: pCmd[1]=0x0F;
( ^1 d# u1 |' _4 T" f! j9 Q( hAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行系统零度校准
  \2 q7 r$ K7 n9 i2 FR|=AD7799_WaitBusy(); //等待校准完成
" P8 B: f/ D5 sCmd[0]=0xE0;
3 E+ ^& b: T- P# iCmd[1]=0x0F;
" a7 v% w* _2 Q$ q& _" QAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行系统满度校准2 @8 R, R% o+ U
R|=AD7799_WaitBusy(); //等待校准完成 */
return R;
/ x5 K: x, m% g}" y3 S, ~1 \7 a- L# @+ k: e
u8 AD7799_Read_STAT(void)
$ }: d0 Y4 F4 ~{
4 }3 d0 [- ^6 U9 ?2 t) W$ ou8 Cmd[2];% h8 m+ n6 C& N- Y
AD7799_ReadReg(ADC_REG_STAT,Cmd,1);+ I) T0 q* ^5 K! T! d2 S  a) e% V
return Cmd[0];; q, d1 M! z9 E! I# k
}
u16 AD7799_Read_CONFIH(void)" S% K& t: c- ~% W# a
{
" d0 e0 F  P' B# Su8 Cmd[2];
, A- Y# m# {# I0 u2 f$ KAD7799_ReadReg(ADC_REG_CONFIG,Cmd,2);
6 D+ d9 g% S. c3 c4 z, Lreturn (Cmd[0]<<8)+Cmd[1];
8 }% Y1 k8 Q4 S" Q3 Z+ X2 o3 O/ ^}
, q$ d8 |6 u( O' U/*---------------------------------------------------------
% H2 L0 a. J4 O+ p5 UFunc: AD7799复位! U# F( ~" _+ Q& d1 `1 [) A( c
Time: 2012-3-298 E$ k2 J/ q" \
Ver.: V1.0
  ]1 v/ E& I4 T' k/ TNote: 0/OK >0/Error
* A, @' {) w  c8 s0 k1 V# N---------------------------------------------------------*/8 C% E1 u- \1 r& o8 ?+ \
void AD7799_Reset()/ x6 R: b4 c6 M9 ^. n, ~
{
/ l/ ^6 n& a5 n  R- C/ w3 K/ F% N// u8 Cmd[4]={0xFF,0xFF,0xFF,0xFF};
" B! C, n/ V! a4 ]4 Y$ JADC_SPI_CS_CLR;
) C: z, i* j7 m. W// ADC_WriteBytes(Cmd,4);
& F; X$ {" s0 ^. U' s4 uSPIByte(0xFF);2 _3 v. C# X  c+ ~! `8 n, H, w- _2 L
SPIByte(0xFF);
* ^* h) ~/ m" x& x% H3 lSPIByte(0xFF);0 o) M, h3 E) w
SPIByte(0xFF);
) p8 I% c/ |, A6 }9 {( e7 R2 o: TADC_SPI_CS_SET;
  D9 ^; ?: E: @5 i, Q6 a6 R& }0 f& v}
& G5 E5 Z& t( B1 o% a) r0 V  C5 |/*---------------------------------------------------------4 s2 q: P* R7 p# S
Func: AD7799初始化
+ r( X6 X1 Y7 eTime: 2012-3-29
) q9 Y2 f( b, {4 q. Q% f3 f& O* Z8 pVer.: V1.00 ]6 e. L0 U- X9 r# \' X. `! a0 A
Note: 0/OK >0/Error
0 h/ X6 J* O* a2 w9 ^# `" g---------------------------------------------------------*/
$ K  F8 f) J* T) A% du8 AD7799_Init(u8 Gain)
( F: t7 G2 V! G! F9 X+ o% Y1 `{
2 Z2 B3 z$ A5 M7 w; J7 `  Q4 bu8 ID,Cmd[2];
9 k/ q* ]( f6 ]) l7 G% @9 B9 w( f0 hAD7799_Reset();
' s" _0 [' p' R! e* T8 b6 `delay_ms(5);
0 {: A9 ^  S: b- `// AD7799_ReadReg(ADC_REG_ID,&ID,1); //读取器件ID
$ R- }+ c/ X) Q! x3 m  X9 m// if((ID==0xFF)||(ID==0x00))return 1;
' Z0 d/ b( t8 B4 o& {AD7799_Calibrate(ADC_CON_CH1,Gain); //通道1校准: c0 N# z0 q# [  t
AD7799_Calibrate(ADC_CON_CH2,Gain); //通道2校准
8 ^& @: [. x5 {. Q8 O7 _& V" _9 u//AD7799_Calibrate(ADC_CON_CH3,Gain); //通道3校准
7 Z) N6 o& h9 o' q4 T// Cmd[0]=0<<6;
0 R3 H9 ~/ {; q! a7 h/ _// AD7799_WriteReg(ADC_REG_IO,Cmd,1);' r1 z' L$ k2 q* [' R7 x2 N4 H" X
return 0;
4 Z$ _. t6 Y" O5 ~3 g# e}
/*---------------------------------------------------------
4 S* W+ I- ~5 A5 v2 ^# v% \. E. ^Func: AD7799开始转换+ Y! H0 Q3 S/ |, {! O0 c
Time: 2012-3-29
4 @1 c. Z+ |1 Z/ ~Ver.: V1.0& k  t+ H5 K# p1 C
Note:
  h1 |4 x+ I$ T4 g& c7 {---------------------------------------------------------*/3 x. m  t% ~& ]- c
void AD7799_Start(u8 CovChx,u8 CovGain,u8 CovRate,u8 CovMode)
! d7 C! r# j, [  `{
+ p; Z+ J. H; O% Y5 ku8 Cmd[2];8 ^7 ~% d6 ]+ M# h: s
Cmd[0]=0x30|CovGain;4 [) X  o  l& c* W* k7 M8 p
Cmd[1]=0x30|CovChx; //0x30$ x9 N- J: @* i9 P
AD7799_WriteReg(ADC_REG_CONFIG,Cmd,2);( m7 h0 e) k& g4 ]' f  J1 y$ ?
Cmd[0]=0x10|CovMode;" y+ r6 \4 P; X( M- I1 u. M
Cmd[1]=CovRate;0 Y+ t8 c  L- F" t" F% Q* ^
AD7799_WriteReg(ADC_REG_MODE,Cmd,2);5 `& z) X) [% \( A. {: j- o+ m
}
/*---------------------------------------------------------4 n+ I8 |3 A8 `
Func: AD7799读取转换结果
8 B" Y. R' V6 L' ?% ETime: 2012-3-29
' x, Z/ I$ @" VVer.: V1.0
7 M: x1 e' M0 W0 C+ PNote:
' x" W" ?2 a5 y+ X  D5 m3 N---------------------------------------------------------*/
8 E1 D6 Z1 \8 ?2 `u32 AD7799_Read()$ ^- Q7 A$ H6 ~% ^6 i# h
{
; G# G- D- n) T, Iu8 Cmd[4];" u8 E7 I4 w& q- l9 m3 D0 c0 a! N
u16 i=0;
. u9 V, E3 P) |- ]u32 D;
) h6 |, a- g* J7 g) e: Z3 rCmd[0]=0;
% M! F% `1 a; h. ]1 M& Bwhile((AD7799_Read_STAT()&ad7799_StatRDY)!=0)& T  v' H% c0 H9 y' x( R3 d" D
{
; l, n4 K/ {0 U# oi++;
) B5 v, ?4 n' z! V5 j& Uif(i>10000)$ a. h$ ?$ Q- Y/ h& b! }
break;! G9 u" }& Z& U! c7 F/ x* t
}
0 x0 M# m$ |+ z' W9 g7 G9 tif((AD7799_Read_STAT()&ad7799_StatERR)==0)
/ P1 \$ `' Q" x{
% @7 ^  i+ b3 I$ [AD7799_ReadReg(ADC_REG_DATA,Cmd,3);/ ]" {# d" C) F0 z
D=(Cmd[0]<<16)+(Cmd[1]<<8)+Cmd[2];+ k: s9 q- T, j5 p
return D;4 Y1 M. i, K9 J6 I  Y
}
$ E5 Y: l) n4 t8 u" _else5 G% i& D* _4 x& K; @
{
3 N& S$ W% E& J7 K- B1 qAD7799_ReadReg(ADC_REG_DATA,Cmd,4);0 `" _/ Q  v( I: p
return 0xFFFFFF;
* n7 H9 F+ L/ |* y' A}
" J! B* \. {# `2 r, x
* t4 r5 o$ `0 d, N# l}
void ADt7799test()+ i& s5 i! U5 |) B
{# e% S' o$ `5 i" g4 m4 O
u32 Val;
9 a2 d2 J; ]. ~/ ?u16 a;( h! e: R4 j" r* s
AD7799_Init(ADC_CON_GAIN1);
- [( U$ u+ C1 d( l0 Z0 w* b, TAD7799_Start(ADC_CON_CH1,ADC_CON_GAIN1,0x01,ADC_MODE_CONTINUOUS);5 s9 u6 u; Q$ |5 t2 m: l
5 [/ P+ q& |5 J) d7 @
AD7799_Read();* j( {/ i; H8 w
AD7799_Read();2 r6 N$ H1 K- s& x9 K- N
AD7799_Read();
. z, K" W) |# R- @; {AD7799_Read();
: r2 S  g. _% ?$ j/ IAD7799_Read();8 _% |1 f. _2 a, o4 L7 }
AD7799_Read();

5 z6 N. D2 f1 v! c/ V4 ^}
* z8 W- K1 U9 K( S1 ]" M# b8 w5 f
下面说一下自己遇到的问题:
一:增益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(-)配置寄存器单双极性选择
$ h' b) s1 B/ {- B' F' X' a" U
收藏 评论0 发布时间:2022-1-24 22:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版