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

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

  ?/ U+ f4 n4 \. b- B3 t: N9 A& g8 L! A& Y3 E) K6 S( e
下面的代码是完全调试通过的:

7 J7 g& c  I. f) V9 Z
#define ADC_SPI_CS_CLR GPIOB->BSRR=GPIO_Pin_12- I! `' v5 A- \  `2 {* O% p
#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))0 b5 X% H& L9 S; s" G/ e3 D, B/ M
#define ADC_OP_WRITE ((u8)(0x00))
) x* i) P0 ^* U) C9 ]" c% Z7 ~( R6 G6 C
#define ADC_REG_STAT ((u8)(0x00<<3))
/ O4 v- g2 N& H+ ~' I6 k/ `/ r: h: A#define ADC_REG_MODE ((u8)(0x01<<3))5 F1 b$ }+ r% ]; w) P
#define ADC_REG_CONFIG ((u8)(0x02<<3))
/ Z0 a  d1 l! \# o8 X" D' b% r#define ADC_REG_DATA ((u8)(0x03<<3))
2 m) c* p5 t9 v0 `2 d" V# J#define ADC_REG_ID ((u8)(0x04<<3)). X8 Y* @1 Y) Z: {8 ]0 k+ g
#define ADC_REG_IO ((u8)(0x05<<3))) a; ?2 ^% Z2 P. g5 P  z
#define ADC_REG_OFFSET ((u8)(0x06<<3))! o3 Q/ S( y1 w) G4 V( @
//#define ADC_REG_STAT ((unsigned char)(0x07))

, f2 j6 h+ @9 g" C2 ^#define ADC_CON_CH1 ((u8)(0x00)): g7 R/ X! z! M$ ]3 ~- F1 y
#define ADC_CON_CH2 ((u8)(0x01))
! s4 b- B4 j3 g. M! @+ M#define ADC_CON_CH3 ((u8)(0x02))3 V8 r' G7 D7 D. P* e
#define ADC_CON_AVDD ((u8)(0x07))
#define ADC_CON_GAIN1 ((u8)(0x00)); R6 O" _4 h+ w$ x5 K2 t/ d  Z# |$ C
#define ADC_CON_GAIN2 ((u8)(0x01))
- n8 ~8 r# f3 W#define ADC_CON_GAIN3 ((u8)(0x02))
- A0 V$ o' ~  f6 Q& p/ B0 c4 S#define ADC_CON_GAIN4 ((u8)(0x03))
5 ?0 L* Q3 B/ |3 l#define ADC_CON_GAIN5 ((u8)(0x04))3 A# P. ~" ~/ g& @$ \& ^* ?
#define ADC_CON_GAIN6 ((u8)(0x05))
: c! w- b( Z9 z* M/ C( g5 ?#define ADC_CON_GAIN7 ((u8)(0x06))& G0 W8 a' F% x- U6 O
#define ADC_CON_GAIN8 ((u8)(0x07))
#define ADC_SINGLE_POLAR ((u8)(1<<4)) //单双极性+ t/ f$ V- m# Q. Y( E" W9 P6 r7 x# F
#define ADC_DOUBLE_POLAR ((u8)(0<<4))
#define ADC_MODE_CONTINUOUS ((u8)(0<<5))
  M9 @) C# P' W#define ADC_MODE_ONCE ((u8)(1<<5))
8 |9 V5 K% Q& ~" b* x7 o
#define ad7799_StatRDY ((u8)(1<<7))
2 P- ~; i( l+ ~% Z#define ad7799_StatERR ((u8)(1<<6))
7 a9 ?6 R( U) R3 ]- Z, L#define ad7799_StatNOR ((u8)(1<<5))
void SPI_Config(void)
% C3 ]" b3 j. k5 A: L) Z{
& t0 o% S1 {0 u4 a( X* g( JSPI_InitTypeDef SPI_InitStructure;7 X: z$ P7 I- \6 O
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);$ R) @: F. q( u( f$ A3 @
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/ x; ]; I- f) I9 Y3 S( ~
8 s7 ^$ b5 x) M! n6 o$ a" OGPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  J& ?5 g4 @" y+ H- u3 \GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
3 U/ j! @  f' B0 K+ j  iGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;% B6 ]& {. `3 A) B& t+ l/ s. c
GPIO_Init(GPIOB, &GPIO_InitStructure);

. s0 f- g  \1 f% }3 SGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14|GPIO_Pin_15;
5 B. H$ z! W5 i. x& k8 vGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4 w8 ~- ~# D- aGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
9 T- t; e9 [2 F! d. SGPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI2 configuration */: r- @2 E7 `' @9 N* J, P4 m
SPI_Cmd(SPI2, DISABLE); //必须先禁能,才能改变MODE
" m2 {# J  |# j3 E1 s0 T9 OSPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工- L$ X( K8 R0 W. g% C7 t* b
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主. X2 h7 l  P0 ]
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位" }& t6 f4 o( ?& T- X4 s+ T
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL=1 时钟悬空高. Z8 y$ M1 S% q$ d1 X
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1 数据捕获第2个; e# V' p" f/ }" D6 x
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS' |4 g* j, j! Z' q
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //2分频
! D3 q8 ~4 d( cSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前/ q9 I! \4 `4 {8 `% |% x3 l
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC7
5 y" @( q& D7 l: [- U
( l  Z; w" Q& |6 t# r- xSPI_Init(SPI2, &SPI_InitStructure);# o+ d4 R4 \5 n; G
SPI_Cmd(SPI2, ENABLE);
! ^$ T  \+ U. a8 Q5 N
}
+ }" C! ~6 k) \2 J. z( W( ^

7 n* f' z) J3 Z: Z/ j- U+ r0 eu8 SPIByte(u8 byte)
  A) a3 V% W8 C6 L: y  w{
9 c# t+ f3 P( \" t+ t. H/*等待发送寄存器空*/1 ?) o: v( ?8 ^+ X8 ?: p% {
while((SPI2->SR & SPI_I2S_FLAG_TXE)==RESET);- l9 ^9 W4 H/ |6 h
/*发送一个字节*/6 |% Y1 F) Q* D% {1 Y
SPI2->DR = byte;
/ ]. a* p/ y+ R: k$ K/* 等待接收寄存器有效*/7 l. N. _4 C* g
while((SPI2->SR & SPI_I2S_FLAG_RXNE)==RESET);
3 k, U0 J  T' ^return(SPI2->DR);6 G8 T9 D0 `' U3 V  y
}
$ H6 F% p% U% d( H. D/*---------------------------------------------------------1 f9 [" \% V& X0 W& K0 Q
Func: AD7799读取寄存器数据
, ?, S8 I) e7 o, @" f+ u3 {Time: 2012-3-29
  f, L6 i# C" X7 `+ N4 WVer.: V1.02 D: h' Z( {/ B6 m% m
Note:
$ e8 Z& X- h% s---------------------------------------------------------*/, |  z6 V+ q( G
void AD7799_ReadReg(u8 RegAddr,u8 *Buffer,u8 Length)7 F8 B- `1 p5 b) v5 S+ N, ]
{
; O7 v! b/ Y: K( [u8 i;! A0 `$ w" c+ r) A
ADC_SPI_CS_CLR;
. E/ r7 L" g0 Q( N  }7 @% oRegAddr|=ADC_OP_READ;  S) ?, R1 Q  G( n2 w
//ADC_WriteBytes(&RegAddr,1);* ]7 O4 h$ N9 E/ @: y# Y9 q+ o
//ADC_ReadBytes(Buffer,Length);
) o# ^( ], b, L' f9 h. QSPIByte(RegAddr);
+ _, e/ `4 O! t5 P9 hfor(i=0;i<Length;i++)" S( P, ]! f8 M0 @: a9 }& C. C
{1 i- T4 n2 C; u8 x
Buffer=SPIByte(Buffer);1 @( l. i' T2 E/ _& Q3 _! ~+ i
}
. j* ]+ r+ U4 Y5 l# i' o" YADC_SPI_CS_SET;
/ m7 t8 o( |* Q9 y}) i- S3 B. s3 t0 F1 T! i

4 Z- x$ e& Z) j0 J5 v9 A: n4 C1 p" b# i. d
/*---------------------------------------------------------
+ d/ `* Q" k+ v+ `7 YFunc: AD7799写入寄存器数据* e# Y* q2 _' W8 l) _
Time: 2012-3-29
8 }; q' r) H* H* L: P7 }& C7 HVer.: V1.0
  l3 t; k  a6 D4 w' aNote:
- K$ b( R: f" i$ E  b4 ~% `* ]---------------------------------------------------------*/. T# K  z) v1 g
void AD7799_WriteReg(u8 RegAddr,u8 *Buffer,u8 Length)
1 t( Z* b7 }1 q' M' F4 w: `{% {0 T- u; q: m1 h2 L. w% i2 E* C
u8 i;
. h  i1 K* B3 _- y3 `) f1 |ADC_SPI_CS_CLR;
' W9 q! M% W0 k1 rRegAddr|=ADC_OP_WRITE;
. H( g, q. D) z% G' a( N& \+ ?//ADC_WriteBytes(&RegAddr,1);
6 H) M! G+ x( R7 L/ }//ADC_WriteBytes(Buffer,Length);  i/ O( V- P1 p+ ~, G& s! _+ h
SPIByte(RegAddr);
' D% Y  Z) }/ T" vfor(i=0;i<Length;i++)- t6 E* R/ p3 x
{
* S- M- s  b! a" Q) z) {( m* B8 ^SPIByte(Buffer);, T9 o0 B9 V& `
}
6 [/ M: [/ d1 w& l9 z$ ~ADC_SPI_CS_SET;; \6 u3 W( j( i* `
}
: @8 O* N9 m( F$ Q5 W; e/*---------------------------------------------------------( e" ?7 p  e: Z7 l' i. O5 i. ?
Func: AD7799忙判断/ a) `, `) D, P/ b2 l9 i
Time: 2012-3-29
7 w: K# D( i% f( z9 T. g1 nVer.: V1.0  L1 K& g* Z+ h
Note: 0/OK >0/ERROR,timeout
* N- {1 E2 n% t---------------------------------------------------------*/3 S% ?3 p3 w- {8 Z1 _
u8 AD7799_WaitBusy()
* S. D" f8 |' z+ S$ s{$ p: r% ^+ Y5 h, e2 }2 L
u16 i;
3 c$ R! l' o2 M* y% M  \9 V7 HADC_SPI_CS_CLR;: Z* G4 {' d' z9 K3 o" j
i=0;
9 q- {5 N( R$ l& \  Qwhile(ADC_RDY_DAT>0)
! I% ?* N) q" j8 x& U9 a' z{
6 n, ^0 N6 q2 L6 Di++;
' `4 d* Z5 n: |8 v/ t0 r# Rif(i>5000)1 h3 S/ \2 U# j& P/ t# D# A$ O
return 1;% v# l! |8 [" C" i% b
}
' b& B, }5 A" d9 ~; CADC_SPI_CS_SET;! t' _& @: Y' A1 r5 ]( d
return 0;
3 z; E, \( F, H# s! [8 }  ~}
/*---------------------------------------------------------
4 H. J8 a/ G+ y- o' IFunc: AD7799通道内部校准& v; t8 y3 m. H$ w
Time: 2012-3-29
9 }3 z+ n$ H0 O8 A$ {Ver.: V1.0
" q$ e% x$ o1 b$ G1 |Note: 0/OK >0/Error
. Z* e* R8 U0 d( r2 L) P7 s2 P---------------------------------------------------------*/0 D) r4 N# l# L7 K- }3 k5 }, b
u8 AD7799_Calibrate(u8 CHx,u8 Gain)
/ `  i7 A/ U+ C  m# |{
/ r% [6 P: l( l: a$ e, Ku8 R,Cmd[2];4 d( ^( s& e% H7 g
Cmd[0]=0x30|Gain; //0x10代表配置寄存器高八位中单双极性位置1, K4 c' a2 J; G; C5 `5 \8 r) f
Cmd[1]=0x30|CHx;
1 r/ Q2 v  @3 ~" TAD7799_WriteReg(ADC_REG_CONFIG,Cmd,2); //设置配置寄存器
* u- [$ b/ I7 s4 _1 h/ B9 cCmd[0]=0x80;- S/ d1 A! t6 ~$ j( ^0 C+ t! U  A
Cmd[1]=0x0F;/ r7 l7 `% [% Z% J+ B  ^8 v* G8 Z$ h
AD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行内部零度校准6 }9 {! y: t6 A* z& `4 S
R|=AD7799_WaitBusy(); //等待校准完成
0 [9 M* R; @9 F) o% ICmd[0]=0xA0;# n5 v  {$ Z( N
Cmd[1]=0x0F;) D; o9 K7 v7 A4 b# B
AD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行内部满肚校准
$ [+ Z) H) C0 H4 v& hR|=AD7799_WaitBusy(); //等待校准完成
/* Cmd[0]=0xC0;5 s. `" j! u) r( k7 f. H
Cmd[1]=0x0F;1 v9 W: x3 l+ w* _4 t$ S3 R
AD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行系统零度校准
. V/ m4 K/ C' N; r0 D( iR|=AD7799_WaitBusy(); //等待校准完成
0 L4 A& r, T. w6 j. mCmd[0]=0xE0;% I, s9 @0 A( d
Cmd[1]=0x0F;
" F2 V! O# `, v' g- s0 q  X: PAD7799_WriteReg(ADC_REG_MODE,Cmd,2); //进行系统满度校准: g/ p8 V6 A* F# U" r
R|=AD7799_WaitBusy(); //等待校准完成 */
return R;- B  \% \. l; ~1 ^- Y# W& d
}: e+ K: Z1 V) F+ F9 ^
u8 AD7799_Read_STAT(void)
# \% ^* R: b. a1 B{
$ v) T8 I0 B& _5 H; }u8 Cmd[2];
* N4 \! f/ h% v$ h3 q; v, p, XAD7799_ReadReg(ADC_REG_STAT,Cmd,1);
) Q" U9 e2 @) [9 [5 [3 |; s9 Sreturn Cmd[0];1 H8 [) y: O0 l9 f- v
}
u16 AD7799_Read_CONFIH(void)5 J: |( K1 W0 h& \
{
$ c' K7 Z3 d" g. C& Mu8 Cmd[2];
2 b3 r0 c# Z( F1 r: r+ w% @AD7799_ReadReg(ADC_REG_CONFIG,Cmd,2);# P1 m. s7 j- c$ x% k8 F8 V# q
return (Cmd[0]<<8)+Cmd[1];: ~8 Y7 A3 ^6 J  n. \& L
}+ {1 F4 I  c& C. }
/*---------------------------------------------------------
3 q: m3 L! n& M2 ^Func: AD7799复位% y7 ~4 x2 L* T- ^
Time: 2012-3-29
( `0 E  ?8 J6 [' g# h! ?' `Ver.: V1.0
+ b2 a+ ]) _' ~: U) P9 |; GNote: 0/OK >0/Error
$ P2 D. ^" p2 [: p9 C---------------------------------------------------------*/
# i" B( B# H  t! `; ?- o$ Avoid AD7799_Reset(), P, [& ~' v% _# ?/ o. I, D7 b
{. e  u# u' m6 \; t1 }0 M
// u8 Cmd[4]={0xFF,0xFF,0xFF,0xFF};* h. ^: }2 ^* d/ M' G  w
ADC_SPI_CS_CLR;! a0 `9 R5 g  n2 H! X4 b  W5 m
// ADC_WriteBytes(Cmd,4);( r4 Z3 m& x5 f- @, D. e
SPIByte(0xFF);$ e' A$ g7 e9 ~, l3 \
SPIByte(0xFF);) f; \, T4 J$ o$ L
SPIByte(0xFF);6 ]  c) s$ e" t6 E6 }; w
SPIByte(0xFF);  E; V# N7 ?& b( w6 `
ADC_SPI_CS_SET;
/ b" M" A* Z6 J6 v}; {5 ]0 _* j1 c) A+ C  q% C
/*---------------------------------------------------------8 s$ U; T0 ?0 b( }
Func: AD7799初始化
6 @8 Y; G+ K) T+ w3 ]% z. o3 f) XTime: 2012-3-29
& {! c8 m$ x9 @3 fVer.: V1.08 w: }3 r, S. K( C# b
Note: 0/OK >0/Error
; e- \8 {$ u+ l2 Z, {---------------------------------------------------------*/5 z( u" t- l+ a
u8 AD7799_Init(u8 Gain)
+ r* D4 \3 M6 |; f, ]{# I- G) O5 d2 q( U# y/ p  X5 M  y
u8 ID,Cmd[2];
+ a9 Y- w) q+ l6 d' m% |9 bAD7799_Reset();
' H' }# |9 Y# z8 ?3 D/ M# N  hdelay_ms(5);
" Z7 {! T: h) A6 \: W6 y! c// AD7799_ReadReg(ADC_REG_ID,&ID,1); //读取器件ID
6 Z$ z: T/ D4 \: v/ b- t& M// if((ID==0xFF)||(ID==0x00))return 1;
. x9 i2 D  v4 J( e" {AD7799_Calibrate(ADC_CON_CH1,Gain); //通道1校准, ?) V* d+ N7 F& d5 q% l
AD7799_Calibrate(ADC_CON_CH2,Gain); //通道2校准
. Q5 Q9 M) |- ^. u: y7 R5 ]! g4 W//AD7799_Calibrate(ADC_CON_CH3,Gain); //通道3校准
* p& x" B8 W, H# @// Cmd[0]=0<<6;. y7 O1 h+ m) K# ~; O  \% G4 @
// AD7799_WriteReg(ADC_REG_IO,Cmd,1);9 v9 u: s, q% \! W
return 0;
, i# f7 @8 S& k( V}
/*---------------------------------------------------------# D- g7 ], u  x
Func: AD7799开始转换% X; b- I' H( z/ ^0 p
Time: 2012-3-298 Q3 p* ~# p. c0 J. [% u; f5 V6 R0 l; t& t
Ver.: V1.0
& f, e! l- }1 C! gNote:
5 N7 V0 m, f2 L+ F---------------------------------------------------------*/0 e7 Q& f9 x) }, P3 S2 f
void AD7799_Start(u8 CovChx,u8 CovGain,u8 CovRate,u8 CovMode)4 h2 ?7 ?2 m3 k. H, R+ G0 T
{
# ?& T% w* t1 S* au8 Cmd[2];8 z) m/ U3 y0 K8 l! u
Cmd[0]=0x30|CovGain;+ Y; D2 i1 G3 i, J) a/ {
Cmd[1]=0x30|CovChx; //0x30
: `9 X, e: C, J4 KAD7799_WriteReg(ADC_REG_CONFIG,Cmd,2);
8 ~. U* e7 Z6 Z. f3 H0 ~, h1 [# aCmd[0]=0x10|CovMode;' G9 Z, N% l" v
Cmd[1]=CovRate;
0 D, ]1 v$ r, G2 q- N+ l" c4 K) VAD7799_WriteReg(ADC_REG_MODE,Cmd,2);
  m; U8 M9 t% L/ v2 H- f}
/*---------------------------------------------------------1 u  V0 p6 O/ v6 p& ]
Func: AD7799读取转换结果: R7 I' ^. [3 ~0 w
Time: 2012-3-29
, W; z6 B3 x; |Ver.: V1.0
5 W, q+ O/ v, y; `  U& v/ ]Note:, z, W1 U. M; X6 l% P6 [
---------------------------------------------------------*/
0 {( w8 d- H# u1 A/ Ku32 AD7799_Read()* [) r; T4 J+ A$ C3 R7 S( T& F* k* z
{) L+ `) N% I& e) T5 ?4 Y
u8 Cmd[4];0 S# R' P, c# A! N- |
u16 i=0;8 t5 f4 p' B" E0 P2 W
u32 D;+ H: _  f! X1 \5 d* O: K2 \8 K
Cmd[0]=0;
5 ?1 Z+ @9 S1 [while((AD7799_Read_STAT()&ad7799_StatRDY)!=0)
8 x0 {+ n8 U# m* s+ b4 `{
+ T) l# a. J* G  e4 t$ E: [i++;0 u1 [/ m% S% t, d7 M/ U& M
if(i>10000)
! f9 }  H9 t/ Gbreak;
3 e' F* V" W- {1 g! A2 x; J}
' Z3 V% z# `4 n' H  q& a. Jif((AD7799_Read_STAT()&ad7799_StatERR)==0)& f- F  h8 x/ E9 O1 X/ Z$ L4 a& C
{
! o, h; K. ?8 ?  X9 dAD7799_ReadReg(ADC_REG_DATA,Cmd,3);
: W% q3 P, V) o6 `& r7 Y/ H7 vD=(Cmd[0]<<16)+(Cmd[1]<<8)+Cmd[2];
5 Q: d4 y0 D) I2 U4 J9 W, Ereturn D;! Q$ U5 t# d: A5 _5 v4 m( C9 O2 S
}& a' t* U/ Q( {; S) k& R. s; L) |3 C
else6 p4 Z& U  _3 ]. y' [
{
. I: U4 x5 K" Y8 ?* c4 TAD7799_ReadReg(ADC_REG_DATA,Cmd,4);) O; @0 }5 a& R: n
return 0xFFFFFF;9 `2 r+ Y& h2 S9 K2 M: A7 A8 K
}
0 f- f5 `2 h9 L: i+ _( S, F" N% B3 U, H: z7 {7 \
}
void ADt7799test(); P. n& f( e7 t
{: H* S; h0 C$ W; x/ \
u32 Val;2 w+ r1 }6 k( x0 V! S
u16 a;. m/ E3 g9 Y1 |9 W. J
AD7799_Init(ADC_CON_GAIN1);1 t9 s7 G; H/ S% ]
AD7799_Start(ADC_CON_CH1,ADC_CON_GAIN1,0x01,ADC_MODE_CONTINUOUS);
8 \2 o" \. |7 Y5 n6 }1 c& g  `) a. N2 |
AD7799_Read();1 k7 A5 j' I$ O7 h, H0 \$ J3 M; h
AD7799_Read();) b$ R# p9 `$ e9 e9 H4 e
AD7799_Read();' s- c# r& N) {* P  j* ^
AD7799_Read();8 `# L( s5 N' Q6 E
AD7799_Read();9 R1 Z, h( V+ J/ u& M
AD7799_Read();
# @. p2 V2 \9 S
}

, _& w5 B, _% 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(-)配置寄存器单双极性选择
  ?4 p1 k8 @% X* D$ i
收藏 评论0 发布时间:2022-1-24 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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