AD1256之STM32程序——STM32测试高精度ADC篇(四)

1.  ADS1256概述

 

        ADS1256是TI(TexasInstruments)公司推出的一款低噪声高分辨率的24位Sigma-Delta(E-v)模数转换器(ADC)。E-vADC与传统的逐次逼近型和积分型ADC相比有转换误差小而价格低廉的优点,但由于受带宽和有效采样率的限制,E-vADC不适用于高频数据采集的场合。该款ADS1256可适合于采集最高频率只有几千赫兹的模拟数据的系统中,数据输出速率最高可为30K采样点/秒(SPS),4路差分与8路伪差分输入,有完善的自校正和系统校正系统,SPI串行数据传输接口。本文结合笔者自己的应用经验,对该ADC的基本原理以及应用做简要介绍。

        ADS1256性价比很高,是TI公司24位ADC中出货最大的几款ADC之一,用量很大,网上资料以相对齐全,供货很稳定,非常适用于中底速高精度的测试,如应变计、气体分析、仪器仪表、压力传感器、血液分析、工业过程控制、医疗科学仪器等应用。笔者对ADS1256做了一次比较测试,分享下测试的结果

 

 

2.  硬件设计分析

 

AD1256之STM32程序——STM32测试高精度ADC篇(四)

 

 

        从结构图可以看出来,AD1256是模拟区域与数字区域完全独立的ADC,即AVDD给模拟区域供电,DVDD给数字区域供电,在原理图设计方面按照官方指导文档,需要对两个区域做独立的布线与隔离处理,才能让信噪比最佳。另可靠的基准电压是高精度ADC命根,本次试验选择TI公司推出的REF5025作基准参考,REF5025可低于3µVpp/V 噪声、3ppm/°C 漂移,性能是十分出色的。

 

AD1256之STM32程序——STM32测试高精度ADC篇(四)

 

 

        由于经常做高频类项目,十分讨厌杜邦线/飞线测试方式,在高精度的领域,24位ADC梯度值2的2416777216,如果接入基准电压是2.5v,理论分辨率可达到0.149μV,做过高频的工程师深知杜邦线的罪恶,根据上面的技术分析,哪怕线路被引入1μV的干扰,也可以让精度打上一定折扣。为了让ADS1232性能得以充分体现,特意做了一个测试载板,载板的设计也是很关键,分割模拟数字区域同时,连接地方大量使用钽电容做旁路电路,以把波纹抑制到最小,合理的布局与布线也很重要,敷铜区域也需要模数分离,以磁珠或者0-5R/电感隔开。

 

AD1256之STM32程序——STM32测试高精度ADC篇(四)

 

3.  时序图解说

 

AD1256之STM32程序——STM32测试高精度ADC篇(四)

 

 

        由时序图看出来,ADS1256读写是简单的3线串行读数方式,属于Microwire串行接口,STM32的SPI接口可以完美的与之匹配,当然也可以采用软仿SPI替代STM32的硬件SPI,这样的程序更具移植性。SPI时序实现也相对简单,ADS1256的CS线仅仅只是做片选使用(上图所示)在数据输出结束的T10阶段需要,需要发送一次脉冲。在SCLK第一脉冲DIN开始接受数据输入,数据输入完毕的T6内SCLK需要保持低电平,然后调制一个周期的脉冲信号,数据即可全部到达DOUT总线,一次读写完毕。

 

4.  核心源码

 

 

 
  1. //写一个字节

  2. void ADS1256_write_bit(u8 temp)

  3. {

  4. u8 i;

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

  6. {

  7. ADS1256_Write_SCLK_H;

  8. if(temp&0x80)

  9. ADS1256_Write_DIN_H;

  10. else

  11. ADS1256_Write_DIN_L;

  12. temp=temp<<1;

  13. ADS1256_delayus(1);

  14. ADS1256_Write_SCLK_L;

  15. ADS1256_delayus(1);

  16. }

  17. }

 

 
  1. //读一个字节

  2. u8 ADS1256_read_bit(void)

  3. {

  4. u8 i;

  5. u8 date;

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

  7. {

  8. ADS1256_Write_SCLK_H;

  9. date=date<<1;

  10. ADS1256_delayus(1);

  11. ADS1256_Write_SCLK_L;

  12. date= date | ADS1256_Read_DOUT;

  13. ADS1256_delayus(1);

  14. }

  15. return date;

  16. }

 

 
  1. //初始化:

  2. u8 ADS1256_Init(void)

  3. {

  4. u8 ReturnData = 0;

  5. u8 ADS1256_reg_Init[5]={

  6. 0x02, //状态寄存器初始化值

  7. 0x01, //模拟多路选择器初始化值

  8. 0x00, //AD控制寄存器初始化值

  9. 0x03, //数据速度寄存器初始化值

  10. 0x00, //I/O控制寄存器初始化值

  11. };

  12. ADS1256_Write_CS_H;

  13. ADS1256_Write_SYNC_H;

  14. ADS1256_Write_SCLK_L;

  15. ADS1256_Write_RST_L;

  16. ADS1256_delayms(1);

  17. ADS1256_Write_RST_H;

  18. ADS1256_delayms(1);

  19. ADS1256_Write_CS_L;

  20. ADS1256_delayms(1);

  21.  
  22. ADS1256_write_reg(0x00,ADS1256_reg_Init[0]);//状态寄存器初始化

  23. ADS1256_delayus(1);

  24.  
  25. ADS1256_write_reg(0x01,ADS1256_reg_Init[1]);//模拟多路选择器初始化

  26. ADS1256_delayus(1);

  27.  
  28. ADS1256_write_reg(0x02,ADS1256_reg_Init[2]);//AD控制寄存器初始化

  29. ADS1256_delayus(1);

  30.  
  31. ADS1256_write_reg(0x03,ADS1256_reg_Init[3]);//数据速度寄存器初始化

  32. ADS1256_delayus(1);

  33.  
  34. ADS1256_write_reg(0x04,ADS1256_reg_Init[4]);//I/O控制寄存器初始化

  35. ADS1256_delayus(1);

  36.  
  37. if(ADS1256_reg_Init[1] != ADS1256_read_reg(0x01)) ReturnData = 1;

  38.  
  39. if(ADS1256_reg_Init[2] != ADS1256_read_reg(0x02)) ReturnData = 1;

  40. ADS1256_delayus(1);

  41.  
  42. if(ADS1256_reg_Init[3] != ADS1256_read_reg(0x03)) ReturnData = 1;

  43. ADS1256_delayus(1);

  44.  
  45. if(ADS1256_reg_Init[4] != ADS1256_read_reg(0x04)) ReturnData = 1;

  46. ADS1256_delayus(1);

  47.  
  48. while(ADS1256_Read_DRDY);

  49.  
  50. return(ReturnData);

  51. }

 

 
  1. //读数程序:

  2. u32 ADS1256_Read_a_Data(void)

  3. {

  4. u32 Data,Data1,Data2,Data3;

  5. Data1 = ADS1256_read_bit();

  6. Data2 = ADS1256_read_bit();

  7. Data3 = ADS1256_read_bit();

  8. Data = (Data1<<16) | (Data2<<8) | Data3;

  9. return (Data);

  10. }

 

5.  测试结果

 

AD1256之STM32程序——STM32测试高精度ADC篇(四)

 

 

        测试源是2.50v基准输出电压值,实际加入电压是:2.50000000v(8位半表实测),通过误差曲线的分析,摆幅稳定在-2- -8µV,效果还是很理想的。官方测试条件Gain=128,VREF=5V,下图是手册提供的有效位与测试电压关系图,在1ksps采样时候可以达到近22位的有效值,但是在全速30kHz采样时候只有20位的有效值,频率采集快了,会有一定失真,这是所有AD转换芯片的通病,当然阻抗匹配也有一定的原因。因此在使用前零度和满度校准是十分必要的。

 

AD1256之STM32程序——STM32测试高精度ADC篇(四)

 

 

6.  总结

        作为一款中低速高精度的ADC,ADS1256有着30kHz的转换频率,4路差分输入或8路伪差分输入,相比AD7190虽然价格略高一些,但是性能相比ADI公司的AD7190的性能提高不少,有8路伪差分的输入通道,特别是采样速率,在本次测试看,拥有不错的性价比和出色的性能会让它在同级别的ADC中也有非常强的竞争能力。欢迎大家多交流技术,Q Q:1625874998,可提供部分资料,供大家设计参考。