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通道单端模式时的用法是否正确?
正确的循环读取三个单通道数据的操作步骤是怎样的?
以上问题的原因是什么?需要做什么样的实验确认问题所在?
目前还没找出问题来,有些急,请尽快回复下。多谢!
lanbo chen:
是否有朋友幫忙回復下呢?
szxx:
你好
1.在复位后不要立即读,要等待一段时间再读取。具体时间可以参考datasheet table 14 data conversation time
2.这个可能跟你程序有关系,具体你要在多做些实验来看一下。
lanbo chen:
回复 szxx:
你好:单通道顺序读取部分代码如下:
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的状态变化还是会都不到正确数据。