ADS1256测量误差很大
各位专家:
我目前在使用ADS1256,实测结果显示误差很到,输入模拟电压值 = 2.5000V,AD实际采集值 = 2.5320V, 相差约32mV;在其它几点测量,误差也较大。
电路图在附件中。不知道是不是因为没有设置好自校准参数?请专家帮忙分析原因,谢谢。
程序代码如下:
延时子程序:
void delay_12clk(void)
{ unsigned char i;
for(i=0;i<24;i++) ;
}
写寄存器子程序:
static void write_register(unsigned char reg,unsigned char wdata)
{
SPI1_send(WREG|reg); //选择写入寄存器
SPI1_send(0x00); //写入1个寄存器
SPI1_send(wdata); //写入数据
}
读寄存器子程序:
static unsigned char read_register(unsigned char reg)
{
static unsigned char x;
while(ADRDYB); //DRDY信号低时才能读寄存器
SPI1_send(RREG|reg); //选择写入寄存器
SPI1_send(0x00); //写入1个寄存器
delay_10us(); //延时10us 20130413添加
delay_10us(); //延时10us 20130413添加
x = SPI1_TranByte(0xFF); //读出寄存器值
return (x);
}
读ADS1256测量值程序:
unsigned long read_data()
{
unsigned char rx_dat[4]; long x;
while(ADRDYB);
rx_dat[0] = SPI1_TranByte(0xFF);
rx_dat[1] = SPI1_TranByte(0xFF);
rx_dat[2] = SPI1_TranByte(0xFF);
x = (long)rx_dat[0]*65536+(long)rx_dat[1]*256 +(long)rx_dat[2];
return (x);
}
初始化ADS1256子程序:
void INIT_ADS1256(void)
{
CS_SPI1 = 0; //选通SPI0
delay_100us(); //延时100us
while( ADRDYB); //20130417添加
SPI1_send(RESET); //复位 20130313
write_register(STATUS,0x06); //输出高位数据在前
write_register(MUX, 0x18); //MUX寄存器为默认值
write_register(ADCON, 0x20); //ADCON寄存器为默认值
write_register(DRATE,0xa1); // 1000sps 采样率
write_register(IO,0x00);
write_register(OFC0,0x00);
write_register(OFC1,0x12);
write_register(OFC2,0x02);
SPI1_send(SELFCAL);
delay_2us();
delay_2us();
delay_2us();
delay_2us();
}
ADS1256测试子程序:
void ADS1256_test(unsigned char *ADS1256_data_point)
{
unsigned long v = 0;
unsigned char i = 0;
CS_SPI1 = 0;
SPI1_send(SELFCAL);
delay_2us();
delay_2us();
delay_2us();
delay_2us();
while(ADRDYB); //DRDY信号低时才能读寄存器
write_register(MUX,0x38); //选择#3 channel
SPI1_send(SELFCAL);
SPI1_send(SELFOCAL);
SPI1_send(SYNC); //启动转换
delay_12clk(); //延时12clk
SPI1_send(WAKEUP);
delay_12clk(); //延时12clk
SPI1_send(SELFOCAL);
SPI1_send(RDATA);
delay_12clk(); //延时12clk
v = read_data();
*ADS1256_data_point = ((v & 0x00FF0000) >> 16);
++ADS1256_data_point;
*ADS1256_data_point = ((v & 0x0000FF00) >> 8);
++ADS1256_data_point;
*ADS1256_data_point = ((v & 0x000000FF) );
}
需要说明一下,在程序中,将偏移量校准寄存器 OFC0 ~ OFC2 设置值都不起作用
请问TI专家,怎样进行ADS1256的校准?
请教TI专家:
电路中ADS1256的晶体为10MHz,对转换精度有何影响?
加我QQ吧,我也在做这个遇到点问题,可以讨论下,441380244
您好,您需要在每一次配置完参数后进行一次自校准,而且,自校准是不需要您设置什么参数的,只需启动,并等待校准完成后即可。
另外,如果您的信号输入阻抗很高,建议您开启缓冲器,并注意合适的共模输入范围。
我现在是将模拟输入口连接成单端的方式,不是差分的。请问TI专家,2.5V参考源处串接的49.9Ω电阻需要去除吗?
另外,AINCOM引脚需要悬空吗?我目前是将其连接到地的。
不知道您使用的什么基准芯片,有没有驱动,建议去掉该电阻。然后AINCOM是接地的。
基准芯片为:ADR5041B 精度:0.1% 用MCP6031做射随器,对其进行了驱动. 推荐电路中基准源的串接49.9Ω电阻已经去除,但测量值还是不准确。
您好,您在每次配置好参数之后有没有做自校准呢?
然后你的配置情况是怎么样的,增益?缓冲?转换速度?
每次只要有寄存器操作(配置参数),就会进行自校准。
增益:PGA = 1
缓冲:打开和关闭都试过
转换速度:5 sps ----7500 sps 都试过
实测精度任然不准确。
请教TI专家:
我现在的ADS1256的测量精度约为1-2mV,但是当输入高于3.8V时,输出值就一直为3.8V了(开启了缓冲器),
如果不开缓冲器,则当输入高于4.2V时,输出就变为0了。
而我的实际测量范围约为:0.5V ---- 4.5V
请教一下,如何避免这种情况?
你好,想咨询下,你之前的问题是怎么解决的?我的电路也出现了测量值不准的情况!该怎么办呢?
您好,ADS1256的基准输入电压是2.6V,因此你可以改用2.5V的基准再次测试。
你好,想咨询下,你之前的问题是怎么解决的?我的电路也出现了测量值不准的情况!该怎么办呢?
数字量最大8388607,一般情况下只有高四位8388是稳定,后面的607都不稳定,乱跳
我的设置时PGA=1,基准2V,不使用缓冲,启用自动校正
后面几位跳很正常啊,不过这么好的ADC 后面9位多在跳就就有点多了。你需要确认一下一下几点:
(1)首先看ADC是否工作正常。直接ADC输入端引脚短接,看看跳动是不是还是这么大.
(2) 使用的基准是不是够稳?!可以看看datasheet
(3)输入信号本身是不是本来就不稳。
现在使用REF3125做基准,ref=2.5V,采样频率2.5SPS,放大1倍,使用输入缓冲,直接测量的是基准电压
软件中没有滤波
为何实际采集仍然不稳定,有偏差呢?达不到22位分辨率哦,那里的问题呢?
图中X是采集次数,Y是数字量转换后的电压值!
您好,首先从低噪上来看,您的低噪大概是1uV峰峰值,这个是对的,符合datasheet,您的数据上有一个低频的脉动,这个很有可能是温度变化引起的,温度变化会产生温漂现象和热电偶现象,所以建议您把电路放在一个温度相对恒定的环境,空气流动小的地方再次测试,必要的话放在恒温箱中测试。
您好,问一个题外的问题,单极性ADC和双极性ADC是根据所能接受的模拟信号电压极性区别的吗
您好,在绝大多数情况下不是这样区分的,很多ADC定义单双极性主要是以同相输入端相对反相输入端而言的,即同相端大于反相端认为正,反正认为负的,但其实信号对地而言都是正的。当然也有极少数的真双极型adc,例如ADS1248,ADS1282,这些ADC可以双电源供电,可以输入真正的正负信号。