微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ADS1247工作在单端模式读出数据异常

ADS1247工作在单端模式读出数据异常

时间:10-02 整理:3721RD 点击:

TI工程师好:

     项目中用到了贵司的ADS1247芯片,驱动程序移植自“Example_ADS1248FW“(原本为MSP430,移植到STM8上)。

ADS1247用作单端3通道ADC,模拟信号分别从AIN0、AIN1、AIN2、输入,AIN3接模拟地,参考源为外部REF0供给的4.096V(LM4030AMF-4.096)。

目前在使用ADS1247时遇到以下问题:

1、芯片可以正常读写寄存器,也可以读取ADC的转换结果。但MCU运行后第一次读取的结果总是0(MCU硬上电或者复位)。

2、循环依次读取0、1、2三个模拟输入通道的结果,结果发现切换通道后读取的结果是上一通道的结果,

      即:读0通道时是0(仅运行后第一次,后面就不是0),读1通道时结果却和0通道的实测结果吻合,读2通道时又与1通道实测结果一致,依次类推。

问题1可以根据问题2的实验推知第一次的0是复位后的初始值,无意义数据。因此主要问题集中在问题2,为什么读出的是上一次的数据。

请问我将ADS1247用作3通道单端模式时的用法是否正确?

正确的循环读取三个单通道数据的操作步骤是怎样的?

以上问题的原因是什么?需要做什么样的实验确认问题所在?

目前还没找出问题来,有些急,请尽快回复下。多谢!

是否有朋友幫忙回復下呢?

你好

1.在复位后不要立即读,要等待一段时间再读取。具体时间可以参考datasheet table 14  data conversation time

2.这个可能跟你程序有关系,具体你要在多做些实验来看一下。

你好:单通道顺序读取部分代码如下:

ADS1247_SelInputChannel(channel);
ADS1248SendSync();
ADS1248SendSync();
ADS1248WaitForDataReady(0); //(this section debug add, test result is useless)
//delay time depends on sample rate(datasheet table 14)
Delay_ms(300); //note:this time must be more than 210mS at 20SPS.
Data = ADS1248ReadData();

return Data;

问题已经得到解决,可以正确返回对应通道数据了,第一次为0的问题也随之解决(证明我之前猜想是对的),的确是读取时间间隔问题。

但是离谱的是:在20SPS下,table14给的时间是大约50mS,我之前这里的延时是100mS,我以为没问题,但总是出错,我就一直增大,

最后找到可以正确返回结果的延时时间下限是210mS,这和手册数据差异太大了。(note:ADS1247寄存器也读出来确认过OK)

另外下面三条指令加不加效果都一样,似乎没有任何作用。按说第三条指令等待DRDY Pin的状态应该没问题,但是如果不延时,或者延时时间小于210mS,

还是读不到正确的数据。

ADS1248SendSync();
ADS1248SendSync();
ADS1248WaitForDataReady(0);

uint8_t ADS1248WaitForDataReady( int16_t Timeout )
{
/* This function shows a method for polling DRDY instead of using as interrupt function
* -- Note: this method is not used in the demo, but if we the method was switched to polling from the interrupt method,
* the desired port is PORT2 on the MSP430 as this demo is configured.
*/
if (Timeout > 0)
{
// wait for /DRDY goes to 1 to make sure it is high before we look for the transition low
while ( (ADC_DRDY_GET==0) && (Timeout-- >= 0) );
// wait for /DRDY goes to 0
while ( (ADC_DRDY_GET==1) && (Timeout-- >= 0) );
if (Timeout < 0)
return ADS1248_ERROR; //ADS1248_TIMEOUT_WARNING;
}
else
{
// wait for /DRDY = 1
while ( ADC_DRDY_GET==0 );
// wait for /DRDY = 0
while ( ADC_DRDY_GET==1 );
}

return ADS1248_NO_ERROR;
}

因此还存在遗留问题:

1、为何等待时间不是table14给出的时间,相反长了非常多。

2、为何通过等待DRDY Pin的状态变化还是会都不到正确数据。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top