基于AD7705的低频数据采集电路设计


目录

1.89C51单片机介绍2.AD7705介绍3.AD7705与单片机的接口4.实际应用电路设计5.软件设计6.系统设计时值得注意的问题

  AD7705具有自校准和系统校准功能,能够消除器件的本身和系统的增益以及偏移误差。是用于开发智能系统、微控制器系统和基于DSP系统的理想产品。本文主要讲述了采用AD7705与89C51单片机设计的一个低频数据采集电路,并详细介绍了电路设计和软件设计方法。

  1.89C51单片机介绍

89C51单片机

  图1 89C51单片机

  89C51是一种带4K字节闪烁可编程可擦除只读存储的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。其特性:

  .与MCS-51 兼容

  ·4K字节可编程闪烁存储器

  ·寿命:1000写/擦循环

  ·三级程序存储器锁定

  ·128*8位内部RAM

  ·32可编程I/O线·两个16位定时器/计数器

  ·可编程串行通道

  ·低功耗的闲置和掉电模式

  ·片内振荡器和时钟电路

  2.AD7705介绍

AD7705

  图2 AD7705

  AD7705为完整16位、低成本、Σ-Δ型ADC,适合直流和低频交流测量应用。其具有低功耗(3 V时最大值为1 mW)特性,因而可用于环路供电、电池供电或本地供电的应用中。片内可编程增益放大器提供从1至128的增益设置,无需使用外部信号调理硬件便可接受低电平和高电平模拟输入。其特性:

  两个全差分输入通道ADC。

  可编程增益前端:增益范围从1至128。

  三线串行接口:SPI®, QSPI™, MICROWIRE™, DSP 兼容;SCLK上可接受施密特触发器输入。

  提供模拟输入缓冲。

  工作电压:2.7 V至3.3 V或4.75 V至5.25 V。

  功耗:最大1 mW(3V)。

  待机电流:最大8µA。

  16引脚DIP、16引脚SOIC和TSSOP封装。

  3.AD7705与单片机的接口

  首先介绍AD7705与单片机的连接方法,因为它采用串行接口,使得与大多数单片机很容易连接。AD7705与8xC51单片机的接口电路如图3所示。

AD7705与8XC51单片机的接口电路

  图3 AD7705与8XC51单片机的接口电路

  在一般的简单系统中,常常只有1片AD7705或其它共用口线的器件,故CS- 通常接低电平,节省了单片机的输出输入控制线,这样就可以配置成三线连接方式。三线连接方式下决定数据寄存器是否被更新也即是确定数据寄存器是否可以被读,只有通过监控通信寄存器DRDY-位来判断,这种做法的代价是时间开销较多,它并不适用于时效性要求比较强的系统。比较好的办法是监控硬件DRDY-引脚的状态,以决定数据寄存器是否被更新,硬件DRDY-引脚的输出与通信寄存器DRDY-位同步,DRDY-引脚一旦变成低电平 ,表明数据寄存器数据已经更新,可以读取。所以DRDY-输出引脚接至CPU的INT0或INT1就可以实现中断或者查询方式的监控。但不管是查询方式还是中断方式 ,都需要增加一根数据线。在本设计中采用了硬件DRDY-引脚查询的方法。

  串行口包含5个信号,即SCLK、DIN、DOUT、DRDY-和CS-,通常直接连接到8xC51对应的引脚P3.0、P3.1、P3.2、P3.3,DIN线用来向片内寄存器传输数据,而DOUT线用来访问寄存器里的数据。SCLK是串行时钟输入,所有的数据传输都和SCLK信号有关,对于与单片机的接口,为确保芯片数据转换可靠,在两次相邻的数据传输之间,应将本SCLK置为高电平。DRDY-线作为状态信号,表示数据什么时候准备好以便从寄存器读取数据。数据寄存器中有新的数据字的时候,DRDY-脚变为低电平。如果在数据寄存器数据更新之前,若DRDY-脚变为高电平,提示这时候不要读数据,避免在数据寄存器更新的过程中读出不可靠的数据。

  AD770 的读写操作严格按照时序进行,图4给出AD7705读和写时序。

AD7705 读、写时序

  图4 AD7705 读、写时序

  4.实际应用电路设计

  我们设计的是一个气象探测仪器的实际应用电路,专门用于温度和湿度的模数转换。因为实时性要求不太高,因此数据读取采用了查询方法 ,这种方法对一般的应用是可以满足要求的。在图3电路中,CLCK、DIN、DOUT和DRDY-引脚直接连接80C52的P1.0-P1.3引脚。由CC3和RC5 成的复位电路,通电时,输入引脚RESET-处于低电平,复位所有的逻辑、数据滤波器和模拟调试器,将所有的片内寄存器设置到其默认状态。使用芯片REF195产生+5V基准电压供给AD7705作为参考电压,同时作为温度传感器的激励电流源。注意基准电压输出端应该并联10μ和1000p去耦电容CC4和CC8,因为微小的噪声电平都会影响转换精度。实际上,由于AD7705的功耗很小(最大 1.1mA),所以在设计中作者将AD7705的电源输入端VDD直接连接到REF195基准电压输出端第6脚上,从而大大减少了电源干扰造成的转换误差。第一通道的输入端加入去耦电路,3个1000p的去耦电容CC5、CC6、CC7和两个10k电阻,因为引入了大电容去耦电路,因此需要AD7705工作于缓冲模式。通道2作为供电电压的监测。

  从图5可以看出,AD7705输入基准电压等于+5V,被y输入端input2输入电压负端接地,正端最大输入幅度+0.3V,故增益可以选择8或者16。input1是从+12V电源分压得到2.0V左右,可以选择增益2。注意输入信号幅度与增益关系,通道增益太大放大结果会超过基准电压+5V,造成转换结果错误。

  AD7705内部只有一套模数转换电路,通道1和通道2的选择通过软件设置进行切换,实际应用中往往需要对不同通道采取不同的增益,动态地对AD7705进行增益、通道设置 ,很灵活方便地达到这一目的。

气象探测仪电路图

  图5  气象探测仪电路图

  5.软件设计

  使用AD7705之前,首先要对所有寄存器进行设置,才能保证器件正常工作。在实际使用中,首先选择模拟输入模式(单极性还是双极性)、是否需要缓冲、时钟分频和输出更新速率;根据外部输入信号的幅度来决定设置器件的增益值,本实例里通道1和通道2输入信号都是单极性,但幅度不同,所以循环选择通道,选择相应参数,应用中选择输入通道单极性、初始增益等于8、数据更新速率为250Hz。根据实际确定所有参数以后,对AD7705芯片进行设置,参数设置方法比较独特,在设置参数之前,首先对通信寄存器进行一次写操作,来决定下一个是什么样的寄存器和什么样的操作内容,再进行下一步的参数写入,读者可参考下面的AD7705初始化程序InitADC( ) 。

  模拟输入电路前端加入了一个简单的R、C滤波器,会在输入电压中引起增益误差,必须对器件进行校准,因为每次系统校准可以对系统的增益、偏移误差、以及器件本身的内部误差进行补偿 ,所以参数设置完毕以后,应该对器件进行一次系统校准,写入设置寄存器位MD1和MD0分别为0和1完成系统自校准,自校准后自动返回正常模数转换工作模式。实际中各路输入信号幅度往往不完全相同,因此每转换一路就需要一次参数设置和系统校准。还需注意的是,在非缓冲模式下使用时,系统校准还可以消除模拟输入端由电源阻抗引起的任何误差。

  下面是用 C51 语言编写的初始化程序 :

  void InitADC(void)

  { unsigned char i ;

  ADC- CLK= 1 ;ADC- DIN = 1 ;

  for(i = 0 ;i < 40 ;i + + ) {ADC- CLK= 0 ;ADC- CLK= 1 ;} / / 防止接口迷失,通信寄存器返回到等待写状态

  WriteToReg- ADC- Init(0x20) ; / / 通道 1 ,下一个写时钟寄存器

  WriteToReg- ADC- Init(0x06) ; / / 写时钟寄存器设置更新速率为 250Hz

  WriteToReg- ADC- Init(0x10) ; / / 通道 1 ,下一个写设置寄存器

  WriteToReg- ADC- Init(0x5c) ; / / 写设置寄存器 ,设置成单极性、无缓冲、增益为 8、滤波器工作、自校准

  Delay- 1ms(50) ; / / 延时

  unsigned int WriteToReg- ADC(unsigned int byteword)

  { unsigned int AD16bit ,Token ;

  unsigned char i ;

  ADC- CLK= 1 ; ADC- CS = 0 ; / * 开始 * /

  Token = 0x80 ; AD16bit = byteword ;

  for(i = 0 ;i < 8 ;i + + )

  { if (AD16bit & Token) ADC- DIN = 1 ; / * 输入数据位 * /

  else ADC- DIN = 0 ;

  ADC- CLK= 1 ; ADC- CLK= 0 ; ADC- CLK= 1 ;

  Token = Token > > 1 ;

  }

  ADC- CLK= 1 ; ADC- DIN = 1 ; / * 结束 * /

  return(TRUE) ; }

  初始化以后,CPU就可以从模数转换器中读数据,读取数据之前必须确定数据寄存器的状态,有两种不同的方式查询,第一种是查询DRDY-引脚,如果DRDY-引脚处于低电平,这表示数据已经转换完成,可以读取。第二种是查询通信寄存器中的DRDY-位,如果是“0”表示数据可以读取。本例使用前者。读数据流程图如图6所示,读数据的频率为大约每分钟60次,远小于数据寄存器更新速率,确保了避免在数据寄存器更新的过程中读出不可靠的数据。

读数据流程图

  图6  读数据流程图

  为了便于读者理解,给出读数据寄存器的函数原代码如下 :

  unsigned int ReadADC- 16BitValue (unsigned char channel)

  { unsigned int AD16bit ,Token ;

  unsigned char i ;

  WriteToReg - ADC(0x38| channel) ; / / 设置读当前通道数据

  while (ADC- DRDY= = 1) { ;} / / 等待数据准备好

  ADC- CLK= 1 ; ADC- CS = 0 ;

  AD16bit = 0x00 ;

  for(i = 0 ;i < 16 ;i + + )

  { AD16bit = AD16bit < < 1 ;

  ADC- CLK= 0 ;

  if (ADC- DOUT = = 1) AD16bit = AD16bit| 0x01 ; / / 读取数据位

  ADC- CLK= 1 ;

  }

  ADC- CLK= 1 ; ADC- DIN = 1 ;

  return(AD16bit) ;

  }

  6.系统设计时值得注意的问题

  AD7705功能独特,具有分辨率高、接口简单等特点,实际应用有时会遇到一些问题,只要注意是完全可以避免的,下面提供几点实际应用经验供参考:

  (1)在实际应用中,由于强电磁场、系统中的闪烁信号干扰或者软件错误,不可避免会造成接口迷失,一旦接口迷失,就无法对AD7705进行正常操作,数据也无法从中正常读出。因此,在系统软件设计中应当定时复位系统接口,使通信寄存器回到等待写状态,这一过程可以通过向DIN输入端写入至少32个串行时钟周期的逻辑“1”以复位串行接口。同时也应当注意,由于接口出现迷失,写入任何寄存器的信息都是不可预料的,所以接口复位后建议将所有的寄存器重新设置一次。

  (2)输出数据可以从串行口上随机地或周期性地读出,读出速率应不超过预设的输出寄存器更新速率。读数据的例程里面不应该加入太多的其它操作 ,确保在下一次输出数据更新之前读操作已经完成,这样才能避免连续两次从数据寄存器读到同样的数据(没有被更新数据)。

  (3)在设计AD7705印刷板电路必须讲究布线技巧,布线的好坏直接影响数据转换精度,甚至会引起芯片工作失常。经验表明,AD7705应该布设在一个相对独立和集中的区域,器件面用覆铜作接地平面,起到屏蔽作用。

  数字区和模拟区尽可能在底面分开布线,模拟接地与数字接地应只在一个点连接在一起,以避免出现接地环路,并用屏蔽网格技术加以屏蔽,最后要以星型结构接入系统公共接地点。所有电源都要加电容去耦电路,电容器尽可能靠近芯片的电源输入端。

热门标签