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

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

7 b4 C7 [8 s* @* J5 t5 z9 C( e+ E9 K# K5 t# S, d' s: q# z
下面的代码是完全调试通过的:

; [3 z! O( U; X. g  k
#define ADC_SPI_CS_CLR GPIOB->BSRR=GPIO_Pin_12. B( M( p- ^/ w7 m  c
#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))
* f1 t& m6 T/ `* P0 {, E" u#define ADC_OP_WRITE ((u8)(0x00))

. N' o# J1 i* N) C#define ADC_REG_STAT ((u8)(0x00<<3))' l& Q% i, A! ]
#define ADC_REG_MODE ((u8)(0x01<<3))
: a4 _/ B( S- h#define ADC_REG_CONFIG ((u8)(0x02<<3))& n/ K$ n8 I1 M4 \# p# X$ x- U
#define ADC_REG_DATA ((u8)(0x03<<3))
2 w; C' D! k5 W) z#define ADC_REG_ID ((u8)(0x04<<3))
6 \  f: ~: y9 {7 u* T#define ADC_REG_IO ((u8)(0x05<<3))4 @. h& t  b4 E; `0 E, }1 B
#define ADC_REG_OFFSET ((u8)(0x06<<3))
. T5 j& u& E; D% L; C8 C  L! r//#define ADC_REG_STAT ((unsigned char)(0x07))

# M; w4 P" G, ?# q% ^* ]#define ADC_CON_CH1 ((u8)(0x00))
* C6 E( ^6 X% y. ^7 j4 k#define ADC_CON_CH2 ((u8)(0x01))* ~" P% e: [. r* \* ?' [2 X9 p
#define ADC_CON_CH3 ((u8)(0x02)). Y0 T2 {& o3 `. m" M3 c# B
#define ADC_CON_AVDD ((u8)(0x07))
#define ADC_CON_GAIN1 ((u8)(0x00))
5 k: D4 p, Y/ _' _( x0 D( r+ s7 N#define ADC_CON_GAIN2 ((u8)(0x01)), s# b5 z2 Y  ?
#define ADC_CON_GAIN3 ((u8)(0x02))) K/ [9 }/ j1 [: l, E
#define ADC_CON_GAIN4 ((u8)(0x03))! d  f% }$ ]& W$ h
#define ADC_CON_GAIN5 ((u8)(0x04))
! W+ Z: B4 ?% P; D2 ~#define ADC_CON_GAIN6 ((u8)(0x05))
+ z. S2 U7 I  N1 j, H# Y#define ADC_CON_GAIN7 ((u8)(0x06))* Y0 {1 @5 [0 T1 ~  U
#define ADC_CON_GAIN8 ((u8)(0x07))
#define ADC_SINGLE_POLAR ((u8)(1<<4)) //单双极性
4 B1 |7 b! h$ J& M#define ADC_DOUBLE_POLAR ((u8)(0<<4))
#define ADC_MODE_CONTINUOUS ((u8)(0<<5))
$ e! K6 W3 x" [6 |5 k( w#define ADC_MODE_ONCE ((u8)(1<<5))

- w8 O+ B* W7 E2 I% q: q) e8 U/ N#define ad7799_StatRDY ((u8)(1<<7))+ t8 y* G: W' Z4 l6 o" B3 ~
#define ad7799_StatERR ((u8)(1<<6))
) Q7 J4 [: J! F! j# h5 j% `#define ad7799_StatNOR ((u8)(1<<5))
void SPI_Config(void)% P2 L1 N& N1 _
{
5 ]( }' z8 \1 {  ?  s! M4 i- C2 NSPI_InitTypeDef SPI_InitStructure;' o% ]; a% o' M  q8 m
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);& U  U! n( h& c3 s9 c6 c  Y" p, F' `' A9 k
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
( q0 _/ g9 I: t7 d
5 c3 G& s$ t2 g* E* V4 iGPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;0 |; V' Y7 j2 Q! E
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;# l( D5 V/ p' ^* v* N6 c) m
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;0 b- E- ], ^9 ?# G6 ?
GPIO_Init(GPIOB, &GPIO_InitStructure);

9 N2 l; J# g& i# tGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14|GPIO_Pin_15;
( w5 {; l1 O5 l' E- O- y& B. u  [GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  ^; p8 V% i2 F( E+ B5 }
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
, G8 O1 V" ?4 I0 q9 h. j4 xGPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI2 configuration */( _# D! H; H  t! D- R0 }3 ^- }9 \' C
SPI_Cmd(SPI2, DISABLE); //必须先禁能,才能改变MODE0 B. G5 _# q# n: l6 F$ k
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工% C1 h0 B2 F  r# w
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主
( e1 I2 }1 S, I2 q6 J; xSPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位. V- p3 p" \/ h
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL=1 时钟悬空高: _$ R$ b8 x1 C9 k* K) c" [+ p$ `
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1 数据捕获第2个& A& U" `% R1 U! D! l' H: H6 l
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS
7 R# s! o% v: r/ ^: S0 \9 sSPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //2分频
3 X+ ]2 \! `  l! L2 fSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
4 X! X5 E) \% P8 W. ], wSPI_InitStructure.SPI_CRCPolynomial = 7; //CRC7" p4 s! H" M- @0 Z/ p# j. c" B
% l1 G' F4 K) J, q! M: W" R
SPI_Init(SPI2, &SPI_InitStructure);8 W6 y7 w% \  T8 C7 n. w
SPI_Cmd(SPI2, ENABLE);
% b& O8 l/ b) J. F/ K
}
0 l. g' z& ^/ c" Z- s0 }$ O0 d9 u& n, W
7 h# u$ P" ]+ c. c3 ^
u8 SPIByte(u8 byte)
9 L% c$ Q. i* S8 l- S{* q2 ]: O6 P' ^% n
/*等待发送寄存器空*/
/ K2 `' G. C9 B6 k' r) f# y+ Vwhile((SPI2->SR & SPI_I2S_FLAG_TXE)==RESET);
, S5 P! V9 D3 C7 c  D% X# C3 \/*发送一个字节*/7 H' t) p2 l' g0 X
SPI2->DR = byte;4 x- v( y, D0 n/ h+ [6 e2 n4 }
/* 等待接收寄存器有效*/
( U9 }; u9 Z2 K4 w- z5 kwhile((SPI2->SR & SPI_I2S_FLAG_RXNE)==RESET);. @! ]* b+ P; i" Q/ l
return(SPI2->DR);
3 F9 a# C5 T" u0 `+ y}
7 F3 c+ k2 L2 s: s$ |/*---------------------------------------------------------
+ |3 N5 p* z; p" f, cFunc: AD7799读取寄存器数据
8 n( U6 D: D+ l1 Y/ VTime: 2012-3-29
3 Z/ C$ x5 H% J% jVer.: V1.0
! s  \0 S( s: C! a. N+ S9 Q: eNote:
1 c% @& J" Y4 `. t+ ^7 E: d' J---------------------------------------------------------*/2 \/ X3 E" O/ N
void AD7799_ReadReg(u8 RegAddr,u8 *Buffer,u8 Length)
/ p/ \& X* V; v$ J; g" T2 ]{
7 x6 g; H/ q% ]4 t4 a5 r# V0 Cu8 i;) Y+ l# l- `% i% b' u
ADC_SPI_CS_CLR;1 m1 g  e% L; [: U$ p- Y
RegAddr|=ADC_OP_READ;0 G( k9 Z2 A5 x9 g
//ADC_WriteBytes(&RegAddr,1);
6 y% A$ U7 z0 m4 e4 s5 a7 _% C//ADC_ReadBytes(Buffer,Length);# y9 c0 o& k# z- g/ B3 e# F
SPIByte(RegAddr);
- B/ d+ ?) w& P3 Afor(i=0;i<Length;i++)" O. T  _3 o2 f- p  B) h
{
3 t9 V( n/ p$ C9 Y' B) yBuffer=SPIByte(Buffer);
$ k/ p( @) }. r/ W8 m}6 ~' J5 o4 I8 m( H. [# m5 m. Z
ADC_SPI_CS_SET;
- G% L7 R( b* E7 z}5 |6 M# x- D: H  O8 U

! s  T) g2 s9 q5 p! L  G1 ~& k1 K2 F' o* ]
/*---------------------------------------------------------5 `7 W$ n8 s0 U. D9 m5 x4 }
Func: AD7799写入寄存器数据! F' v) ^7 I( {! d/ w
Time: 2012-3-29
- P6 T; u0 ~; aVer.: V1.0* k7 ?, G- \* H' \. ]4 h* q) B
Note:
* w4 ?. s+ D+ j6 s' j---------------------------------------------------------*/
6 K# _9 H6 @3 @void AD7799_WriteReg(u8 RegAddr,u8 *Buffer,u8 Length)
: d# @$ B# e) _0 K{* Y# V5 e6 r) [# _9 E
u8 i;' O. \8 T; |! E+ p" k2 T9 f
ADC_SPI_CS_CLR;9 H6 Y: y/ k3 |0 W- _- R# N4 G
RegAddr|=ADC_OP_WRITE;
% \( g! J6 [' A/ E: h//ADC_WriteBytes(&RegAddr,1);
9 S1 U5 w/ N5 w; ^//ADC_WriteBytes(Buffer,Length);+ H5 O" A' w% W, H
SPIByte(RegAddr);
- J2 z) j, X6 M* Kfor(i=0;i<Length;i++): m- c# b4 F1 t. ~, ?
{
. S5 h1 M6 T* N. a6 m* _3 N. H& KSPIByte(Buffer);
$ h8 N, ^% E. b0 }" J8 d}; T& _4 V4 N- j5 [  h
ADC_SPI_CS_SET;
' w+ e! o( ]( f* J}
; M, F" O# x" _2 y. N& E/*---------------------------------------------------------
; \8 n$ k- s( b3 ]; a! UFunc: AD7799忙判断$ ]5 x& ?' u4 E- X+ Y
Time: 2012-3-29
/ x7 b4 H& A/ t# d8 Y" PVer.: V1.0. c" g4 }" v) J9 K4 i! d1 \
Note: 0/OK >0/ERROR,timeout
3 M) d5 a. @: X( m$ u( T---------------------------------------------------------*/
1 t5 U+ r) H* M5 e6 U/ eu8 AD7799_WaitBusy()
. ~1 q% C/ [1 h$ N; U0 D{
# i* m6 R) c" l1 `+ hu16 i;
" X7 f# h$ h( pADC_SPI_CS_CLR;# u. j. \. G. L& z$ T
i=0;
. u/ }3 Z7 g6 kwhile(ADC_RDY_DAT>0)
8 e% m) J- r+ _, E* O. q{
; a% F8 ^( w1 }4 l4 A; Ni++;
) p+ o8 w7 w$ J8 G9 vif(i>5000)
# `2 V6 D& I, _+ [' L  K! S9 |) areturn 1;  ?$ ~* k" x. _5 p/ Q. }
}+ s$ `" O9 u* D+ n7 j
ADC_SPI_CS_SET;
4 k5 v; f" E2 treturn 0;
) B) J" i. @) P7 L# m5 `; `; R7 r}
/*---------------------------------------------------------" {/ \# F9 T$ ?: P5 ^
Func: AD7799通道内部校准
  \( i6 S8 r0 `5 j) nTime: 2012-3-29. L  J( P: B3 N1 j2 A1 a# |; W
Ver.: V1.0
( q2 }3 J! x% n; Y+ w7 J9 ?Note: 0/OK >0/Error
4 P% F8 [! U. B---------------------------------------------------------*/
; H2 j  n2 E- F9 Zu8 AD7799_Calibrate(u8 CHx,u8 Gain)
  \& `8 p, x: h! K{
* \# e' S! [! i2 j( v) Qu8 R,Cmd[2];1 E' \1 M4 q3 Y7 B, }, @, G
Cmd[0]=0x30|Gain; //0x10代表配置寄存器高八位中单双极性位置1
0 c5 R& f) G8 `- u# FCmd[1]=0x30|CHx;0 D! }( Q0 X! b# `5 ~0 J" ~
AD7799_WriteReg(ADC_REG_CONFIG,Cmd,2); //设置配置寄存器# d# L0 x5 x" ]6 U( w3 x
Cmd[0]=0x80;
9 f9 \+ F- P' H1 yCmd[1]=0x0F;) @1 V# ^& z6 A0 m: L5 b
AD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行内部零度校准
9 J8 A* N& Z8 E- IR|=AD7799_WaitBusy(); //等待校准完成
7 s# N& _! L7 D  E  uCmd[0]=0xA0;% M7 O  A) c' f+ |+ X7 \% C
Cmd[1]=0x0F;
: _7 W& c7 f7 V1 T; v1 JAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行内部满肚校准
  T: m) Q: p; D( b# h( vR|=AD7799_WaitBusy(); //等待校准完成
/* Cmd[0]=0xC0;5 [2 z$ L; {+ p: A
Cmd[1]=0x0F;
% X4 G2 X  i* l1 u3 tAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行系统零度校准6 C& {  N! S4 L- A/ y: H
R|=AD7799_WaitBusy(); //等待校准完成' C2 y  ^" W  }: H; b, a
Cmd[0]=0xE0;( B, E' X# |* r9 k+ w
Cmd[1]=0x0F;
  L2 ^# m. S6 z7 R" v: t+ QAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行系统满度校准
6 v. z9 D! t7 _R|=AD7799_WaitBusy(); //等待校准完成 */
return R;* m3 k% p% k) p
}
- \$ J7 p6 s; i) mu8 AD7799_Read_STAT(void)) u$ k( a8 v. G
{! ?6 u; e  D8 c  Y
u8 Cmd[2];
+ d3 q2 E/ F- n3 M/ u1 l( HAD7799_ReadReg(ADC_REG_STAT,Cmd,1);! u2 q3 A- C9 _- d/ Z* c
return Cmd[0];
" D4 m7 O+ y4 q5 Y9 o}
u16 AD7799_Read_CONFIH(void)
7 d+ @+ ~; H' I4 M% |{$ P5 c/ H6 |: Y: p
u8 Cmd[2];
% R) i+ M) D* v; ~, ~AD7799_ReadReg(ADC_REG_CONFIG,Cmd,2);
( j( I+ E% c2 U3 E% O, ?return (Cmd[0]<<8)+Cmd[1];
! L6 Q: N* W& `$ w% U* p}
& H; |; I( w  }, o/*---------------------------------------------------------
1 S2 Y; o. w3 FFunc: AD7799复位0 p- G: o, Q2 x/ ~
Time: 2012-3-297 I9 X& u  h4 C9 c! u: H0 z) h6 E
Ver.: V1.0# B4 `1 h2 I  L, {) K$ V
Note: 0/OK >0/Error& e) Y! d% q$ v# ]
---------------------------------------------------------*/! Z/ J* v- }) b/ I
void AD7799_Reset()
- o7 q# E0 `4 B8 k5 i{
& x$ Q8 g  s6 J0 t, T// u8 Cmd[4]={0xFF,0xFF,0xFF,0xFF};
- R1 f2 k0 x6 iADC_SPI_CS_CLR;# f+ u) @) x) |- z% z& f2 o
// ADC_WriteBytes(Cmd,4);5 \4 m% u. Z& _% A1 `9 {
SPIByte(0xFF);
& Y$ F/ g0 j* q# k# y. D  iSPIByte(0xFF);, O1 z+ m) ~+ l) j/ u0 U
SPIByte(0xFF);4 u6 o) J$ z: w! j" o* o; j
SPIByte(0xFF);+ C: [( ?" {, n: u
ADC_SPI_CS_SET;
  R: Z2 q/ N4 @' ^+ {}# Y  N7 \& E! z( H* S* _: N
/*---------------------------------------------------------# b) ]# [" a' K. ?
Func: AD7799初始化  ?1 a& G3 _+ l$ @+ H
Time: 2012-3-29! r; G% [  m; D+ A* H6 R4 P
Ver.: V1.0* V. j! }4 R; d
Note: 0/OK >0/Error
! L. R, ~5 q* p---------------------------------------------------------*/
; c' O4 b) n5 Tu8 AD7799_Init(u8 Gain)/ c9 l; c( \1 l4 j, \
{
/ N' z3 g4 r6 A4 ]u8 ID,Cmd[2];
. Q$ N6 X" @' [# R3 fAD7799_Reset();
( K% @4 g* H( X/ ^7 M" Ldelay_ms(5);: m0 I9 _( i) M
// AD7799_ReadReg(ADC_REG_ID,&ID,1); //读取器件ID, a7 h6 c9 E  |7 r4 L
// if((ID==0xFF)||(ID==0x00))return 1;
7 a5 P8 C2 b  t/ r1 o& V, f- ]AD7799_Calibrate(ADC_CON_CH1,Gain); //通道1校准8 ]( `( e+ i0 w2 C$ F
AD7799_Calibrate(ADC_CON_CH2,Gain); //通道2校准; h9 \  d0 {* B4 _8 n. x, J
//AD7799_Calibrate(ADC_CON_CH3,Gain); //通道3校准' C: I* F/ W+ H! n: T5 F2 G  t
// Cmd[0]=0<<6;
5 q% A9 P5 i: G# n4 Q' G// AD7799_WriteReg(ADC_REG_IO,Cmd,1);2 ~4 F" ?6 [# s
return 0;( W! l3 @( W1 S
}
/*---------------------------------------------------------2 N4 _; n& {2 `9 C" P* \
Func: AD7799开始转换
9 C) }0 m+ a0 p" n5 s3 d3 ATime: 2012-3-29
  O9 Q/ ^, h/ o9 M9 M" u- F3 J# PVer.: V1.0- {5 B9 t4 a% I* W% {/ K) }( D3 t; F
Note:
2 i" t! ?; `" y: N---------------------------------------------------------*/
. y" d% S  @/ L( P4 h. L, Kvoid AD7799_Start(u8 CovChx,u8 CovGain,u8 CovRate,u8 CovMode)3 y7 R, N$ }/ }
{! Q8 w6 @! P6 i$ g9 u( C2 u- P
u8 Cmd[2];
. h/ p) B1 v$ b6 u3 j' E9 E& ECmd[0]=0x30|CovGain;
" T# F  J- a: R1 F" Q: [5 |Cmd[1]=0x30|CovChx; //0x30+ V! I6 e' k: t0 W* S
AD7799_WriteReg(ADC_REG_CONFIG,Cmd,2);
* x7 F9 d( l" T8 o+ V; H  x7 g% r: kCmd[0]=0x10|CovMode;
* Q5 n, e- p( G: ]/ QCmd[1]=CovRate;
+ Q: R, M  i' [AD7799_WriteReg(ADC_REG_MODE,Cmd,2);
, m9 M4 ~2 X4 L3 E$ l% E7 d9 M) f1 T}
/*---------------------------------------------------------$ X+ I, P2 k0 f3 P
Func: AD7799读取转换结果
) N  t" B% `+ G  F/ }Time: 2012-3-29- N* F0 v* j2 i6 M: i1 F9 D2 \5 i
Ver.: V1.0
& D& c5 B5 i7 w, v# bNote:- H) R4 z$ F* w/ a$ ~; |: I4 O9 ~! M
---------------------------------------------------------*/+ b& i  M4 J  C" r* U
u32 AD7799_Read()0 i9 _  Z1 F# }( B+ j$ V8 v
{
/ q; U( Y, F, E6 J* E3 |6 Iu8 Cmd[4];
# [, Q8 y: E, Q8 cu16 i=0;
3 |/ F; H& M! O/ t8 Nu32 D;: e+ E9 F' T: }, o* x% K4 k. L
Cmd[0]=0;# E, }6 ~. L0 \, E
while((AD7799_Read_STAT()&ad7799_StatRDY)!=0)+ `' z6 \$ ^% k4 {' `1 T! c. a  X
{* e# r7 ~9 l. m3 w3 [
i++;8 D3 C: U7 s6 v$ M! I, p
if(i>10000)
' ~1 T9 z8 i# T! Y* M6 F1 d* G" Ebreak;
. X" j* V& C& g, ?; M}3 s2 u7 J( x% Q! i2 L- r
if((AD7799_Read_STAT()&ad7799_StatERR)==0)
! w# v: r; l/ W5 K{
% a! B& I, J- \( SAD7799_ReadReg(ADC_REG_DATA,Cmd,3);2 G$ S) V/ w8 E2 X* a' P0 s' |
D=(Cmd[0]<<16)+(Cmd[1]<<8)+Cmd[2];
- b+ y% L4 E5 |. D, Preturn D;
8 M: n4 w: L/ j4 x4 d% c; \}4 F% P+ T% U% z8 t6 F0 E6 v4 [
else4 b* P: B" t' `4 q
{
0 q# s( \2 q1 NAD7799_ReadReg(ADC_REG_DATA,Cmd,4);
8 u  `2 p; p9 |9 A6 d/ rreturn 0xFFFFFF;
( ~2 r% W. x6 m; q}, u0 ]+ f  ?- v9 ^8 M. n/ T9 y
: Z" e% T5 C& l) d2 v$ C
}
void ADt7799test()
$ I: @! l5 C) A/ C8 M/ |& x{
* `4 E# O& [$ j- yu32 Val;
, K9 \4 A3 J8 k. Uu16 a;8 F; {7 q% u6 `: N! _
AD7799_Init(ADC_CON_GAIN1);9 T. F& m, ^/ a1 k2 t2 Z+ q
AD7799_Start(ADC_CON_CH1,ADC_CON_GAIN1,0x01,ADC_MODE_CONTINUOUS);
9 U0 `$ ~5 f4 {! v2 x& r; t  t9 U9 m) k/ m1 ^9 x
AD7799_Read();2 |; W2 V; s* F6 a: o$ C
AD7799_Read();1 v0 E& g! m3 I% I
AD7799_Read();6 u, u6 Y* @( D. ^$ _: u; q
AD7799_Read();, K/ a* k$ _+ o- H
AD7799_Read();- W9 P! Y  T- h  c% d
AD7799_Read();
( t% h" N$ C, k1 D% w
}

! c! `! l" E3 V& J5 q  S, ~
下面说一下自己遇到的问题:
一:增益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 c5 ]! v0 k8 J. Q
收藏 评论0 发布时间:2022-1-24 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版