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;
else
ADS1256_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,可提供部分资料,供大家设计参考。