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

来源:互联网 发布:linux的ftp权限设置 编辑:程序博客网 时间:2024/06/06 15:44

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





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



3.  时序图解说



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


4.  核心源码


//写一个字节void ADS1256_write_bit(u8 temp){u8 i;for(i=0;i<8;i++){ADS1256_Write_SCLK_H; if(temp&0x80) ADS1256_Write_DIN_H;elseADS1256_Write_DIN_L;temp=temp<<1;ADS1256_delayus(1); ADS1256_Write_SCLK_L;ADS1256_delayus(1);}}

//读一个字节u8 ADS1256_read_bit(void){        u8 i;        u8 date;for(i=0;i<8;i++){ADS1256_Write_SCLK_H;date=date<<1;ADS1256_delayus(1);ADS1256_Write_SCLK_L;date= date | ADS1256_Read_DOUT;ADS1256_delayus(1);}        return date;}

//初始化:u8 ADS1256_Init(void){u8 ReturnData = 0;u8 ADS1256_reg_Init[5]={0x02,  //状态寄存器初始化值0x01,  //模拟多路选择器初始化值0x00,  //AD控制寄存器初始化值0x03,  //数据速度寄存器初始化值0x00, //I/O控制寄存器初始化值};ADS1256_Write_CS_H;ADS1256_Write_SYNC_H;ADS1256_Write_SCLK_L;ADS1256_Write_RST_L;ADS1256_delayms(1);ADS1256_Write_RST_H;ADS1256_delayms(1);ADS1256_Write_CS_L;ADS1256_delayms(1);ADS1256_write_reg(0x00,ADS1256_reg_Init[0]);//状态寄存器初始化ADS1256_delayus(1);ADS1256_write_reg(0x01,ADS1256_reg_Init[1]);//模拟多路选择器初始化ADS1256_delayus(1);ADS1256_write_reg(0x02,ADS1256_reg_Init[2]);//AD控制寄存器初始化ADS1256_delayus(1);ADS1256_write_reg(0x03,ADS1256_reg_Init[3]);//数据速度寄存器初始化ADS1256_delayus(1);ADS1256_write_reg(0x04,ADS1256_reg_Init[4]);//I/O控制寄存器初始化ADS1256_delayus(1);        if(ADS1256_reg_Init[1] != ADS1256_read_reg(0x01))  ReturnData = 1;        if(ADS1256_reg_Init[2] != ADS1256_read_reg(0x02))  ReturnData = 1;   ADS1256_delayus(1);        if(ADS1256_reg_Init[3] != ADS1256_read_reg(0x03))  ReturnData = 1;ADS1256_delayus(1);        if(ADS1256_reg_Init[4] != ADS1256_read_reg(0x04))  ReturnData = 1;ADS1256_delayus(1);while(ADS1256_Read_DRDY);return(ReturnData);}

//读数程序:u32 ADS1256_Read_a_Data(void){u32 Data,Data1,Data2,Data3; Data1 = ADS1256_read_bit();Data2 = ADS1256_read_bit();Data3 = ADS1256_read_bit();Data = (Data1<<16) | (Data2<<8) | Data3;return (Data);}

5.  测试结果




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




6.  总结

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