Part Number:ADS1291Other Parts Discussed in Thread: AFE4400, ADS1292ECG-FE
TI工程师,您好,我最近在用ADS1291采集心电信号,使用连续模式时,可以正常采集信号,但使用单次转换模式时,DRDY引脚一直是高电平,无法读取数据,调试的过程中有两次突然可以正常触发读取数据,但其后就再也没有读到数据了。
我是使用的ADS1291和AFE4400同步采集PPG和ECG,AFE4400的DRDY作为触发信号,当AFE4400的DRDY中断后,读取AFE4400的数据,然后将ADS1291的START引脚置高,等待ADS1291的DRDY引脚产生下降沿,然后读取ECG数据,读取完成后将ADS1291的START引脚置低,如此完成一次数据读取。
下图是电路图:
ADS1291配置如下:
uint8_t ADS1291_Register_Settings [11] ={
0x82, // CONFIG1
0xA2, // CONFIG2
0x10, // LOFF
0x00, // CH1SET
0x01, // CH2SET
0x33, // RLD_SENS
0x00, // LOFF_SENS
0x00, // LOFF_STAT
0x02, // RESP1
0x03, // RESP2
0x0C // GPIO
};
初始化流程如下:
Ads1291_ConfigGPIO();
bsp_InitSPIBus(SPI_COM1,SPI_BAUDRATEPRESCALER_128,SPI_PHASE_2EDGE,SPI_POLARITY_LOW); Ads1291WriteCmd(ADS1291_SDATAC);//发送停止连续读取数据命令
HAL_Delay(100); Ads1291WriteCmd(ADS1291_RESET);//复位
HAL_Delay(1000); Ads1291WriteCmd(ADS1291_SDATAC);//发送停止连续读取数据命令
HAL_Delay(100);
Ads1291WriteRegister(ADS1291_CONFIG1,11,ADS1291_Register_Settings);//配置ADS1291寄存器
单次触发读取数据流程如下:
Ads1291Start();//ads1291开始一次转换,START引脚置高电平
while(1) //等待DRDY引脚产生下降沿
{
if(bsp_Ads1291DataReady())
break; }
Ads1291WriteCmd(ADS1291_RDATA); bsp_Ads1291ReadData(ECG_DATA);
Ads1291Stop();//ads1291停止一次转换,START引脚置低电平
所以我想请教一下,这个流程是对的吗?为什么有两次能正常触发,但其后再也不能正常工作了,但连续读取模式时,又是正常的。谢谢。
Amy Luo:
您好,
您可以用示波器捕捉一下START 和 DRDY 和 CS信号吗?
,
liang wei:
START置高后一直为高电平,DRDY一直高电平,CS信号是根据是否读取数据才转换电平的,SPI读取或写入数据前置高,完成后置低
,
liang wei:
另外,我想问一下RESET引脚可以这样接成上电复位的模式吗?我又测试了下,发现连续模式下也不正常,上电后,输出几次数据后就自动停止了,偶尔能够连续输出时输出的数据都为0(DRDY中断模式)
,
Amy Luo:
您可以按照下面FAQ中的调试步骤进行调试吗?
https://e2echina.ti.com/support/data-converters/f/data-converters-forum/192643/faq-ads129x
另外,TI 提供了ADS1292ECG-FE 代码,您可以参考:
https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/775220/faq-does-ti-provide-source-code-c-c-ccs-labview-for-the-ads1191-ads1192-ads1292-or-ads1292r/2868097#2868097
,
liang wei:
感谢您的回复,我修改了一下spi接收的代码,可能还是spi通信不正常造成的,现在能连续读取了,没有再测试单次转换了,只是采集的心电信号偶尔会有很高的尖峰,我再找下问题
,
Amy Luo:
很高兴您现在可以连续读取了;
关于采集的信号有尖峰,建议您先采集ADS1291内部测试信号(通过CONFIG2寄存器和MUX1[3:0]配置),以验证是程序问题还是外部输入信号问题?
,
liang wei:
您好,我又调试了一下,主要问题可能还是ADS1291和AFE4400同步的问题。
(1)单次转换可以正常工作了,但是按照AFE4400的DRDY信号来触发ADS1291的START信号,从而触发ADS1291一次转换这个思路恐怕不行,直接导致了两个片子都不正常了,而且触发频率也不是想象的AFE4400的DRDY频率,之前有看到过TI工程师提供的两个片子的同步原理图,似乎是将二者的外部振荡信号连接在一起了,但是即便是这样,怎么读取数据了?不太明白
(2)之前一直不正常的原因是我修改了SPI的接收程序,改动是从ADS1291读取数据时,主机发送0XFF,我不太清楚STM32的SPI默认的SPI(HAL)库是不是发送的0,如果是的话,有可能导致ADS1291误认为我在读取0x00寄存器或者是没有给SPI的SCLK?所以导致数据一直不正常,以上想法未经验证。但AFE4400就不存在这个问题。
(3)采集的心电信号有尖峰的原因是:我将ADS1291的DRDY作为同步信号,然后在main函数的while循环里死循环等待AFE4400DRDY中断,进而读取PPG数据,我之前没意识到两个片子的采样频率设置的是一样的,从而导致偶尔等待时间过长,进而导致ADS1291数据还未更新完成就读取了ECG数据,从而读到的数据是0xc0 0x00 0x00(ADS1291更新数据应该是移位,正常情况下这三个字节都出现在读取的9个字节的最前面三个),所以画出波形来就是尖峰,我把AFE4400的采样频率翻倍,这种情况似乎就没有了。
while(1)
{
if(ecgdata_ready_flag)//ADS1291DRDY中断置位该变量 { ecgdata_ready_flag=0; bsp_Ads1291ReadData(ECG_DATA);
while(1)//死循环等待AFE4400DRDY下降沿 { if(ppgdata_ready_flag)//AFE4400DRDY中断置位该变量 { ppgdata_ready_flag=0; break; } } AFE44xx_Read_Data(&PPG_RED,&PPG_IR);//读取PPG数据
}
(4)ADS1291的RESET引脚接成上电复位的模式似乎没什么影响,我在初始化的过程中并没有给RESET脉冲(没有接在单片机的IO口上),但还是能正常工作。
再次感谢TI工程师的指导!
,
Amy Luo:
非常抱歉回复迟了,关于ADS1291和AFE4400同步的相关问题,建议您将问题发布在E2E英文技术论坛上,将由资深的英文论坛工程师为您提供帮助。
英文论坛对应子论坛链接:https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum