前记
在医疗可穿戴领域,ads1292是一个无法绕过去的存在。今年几个项目产品都和这个芯片有关系。 从不了解到熟悉,算是踩了不少坑吧。对每次的项目进行复盘,是我这些年养成的最好的习惯了。
ads1292芯片
特性如下所示:
ADS1291、ADS1292 和 ADS1292R 是多通道同步采 样 24 位 Δ-Σ 模数转换器 (ADC),它们具有内置的可编 程增益放大器 (PGA)、内部基准和板载振荡器。 ADS1291、ADS1292 和 ADS1292R 包含 便携式 低 功耗医疗心电图 (ECG)、体育和健身 应用通常所需的 所有功能。 凭借高集成度和出色的性能,ADS1291、ADS1292 和 ADS1292R 可在显著减少尺寸、功耗和总体成本的前 提下创建可扩展的医疗仪器系统。 ADS1291、ADS1292 和 ADS1292R 每通道具有灵活 的输入多路复用器,此多路复用器可独立连接至内部生 成的信号,实现测试、温度和持续断线检测。此外,可 选择输入通道的任一配置生成右腿驱动 (RLD) 输出信 号。ADS1291、ADS1292 和 ADS1292R 工作时的数 据速率高达 8kSPS。通过器件内部激励灌电流或拉电 流,可在器件内部执行持续断线检测。ADS1292R 版 本包括一个完全集成的呼吸阻抗测量功能。 总结下来,该芯片是一个用来测量心率和呼吸的利器。
接口信息
该芯片的前端需要连接电极片,这部分设计的原则是尽量减少采集干扰。所以信号屏蔽上要做些工作。该芯片采集到的数据使用spi接口连接到了主控设备上。具体示意图如下所示: 可以看出,该芯片是通过SPI接口和其他设备通信的,把spi接口调试好,使用好,是一个不可缺少的环节。笔者在这里遇到了一些问题,根本原因还是因为芯片配置错误导致对设备接口SPI的使用上出了问题。这点非常值得反思。
调试总结
配置信息。
ads1292是否正常工作,芯片配置特别关键。这次在移植的过程中,就是有一个小小的配置错误,导致了spi读不到数据。调试花费了很多时间。 这里的配置一般要注意几个地方: 1 启动配置信息,主要一定要先发送停止读取数据的命令,再复位,否则在数据传输过程中配置参数,极容易导致系统出错。 // ADS_CLKSEL=1;//启用内部时钟 // ADS_START=0; //停止数据输出 // ADS_RESET=0; //复位 // delay_ms(1000); // ADS_RESET=1;//芯片上电,可以使用 // delay_ms(100); //等待稳定
ADS1292_Send_CMD(SDATAC);//发送停止连续读取数据命令 delay_ms(100); ADS1292_Send_CMD(RESET);//复位 delay_s(1); ADS1292_Send_CMD(SDATAC);//发送停止连续读取数据命令 delay_ms(100);
2 配置参数很多是默认的即可,可是要配置的时候一要知道每个参数所代表的含义,否则容易出错:
ADS1292_REG[CONFIG1] = 0x00; //0000 0aaa [7] 0连续转换模式 [6:3] 必须为0 ADS1292_REG[CONFIG1] |= Ads1292_Config1.Data_Rate;//[2:0] aaa 采样率设置采样率 ADS1292_REG[CONFIG2] = 0x00; //1abc d0e1 [7] 必须为1 [2] 必须为0 [0] 设置测试信号为1HZ、±1mV方波 ADS1292_REG[CONFIG2] |= Ads1292_Config2.Pdb_Loff_Comp<<6; //[6]a 导联脱落比较器是否掉电 ADS1292_REG[CONFIG2] |= Ads1292_Config2.Pdb_Refbuf<<5; //[5]b 内部参考缓冲器是否掉电 ADS1292_REG[CONFIG2] |= Ads1292_Config2.Vref<<4; //[4]c 内部参考电压设置,默认2.42V ADS1292_REG[CONFIG2] |= Ads1292_Config2.Clk_EN<<3; //[3]d CLK引脚输出时钟脉冲? ADS1292_REG[CONFIG2] |= Ads1292_Config2.Int_Test<<1; //[1]e 是否打开内部测试信号, ADS1292_REG[CONFIG2] |= 0x81;//设置默认位 ADS1292_REG[LOFF] = 0x10;//[7:5] 设置导联脱落比较器阈值 [4] 必须为1 [3:2] 导联脱落电流幅值 [1] 必须为0 [0] 导联脱落检测方式 0 DC 1 AC ADS1292_REG[CH1SET] = 0x00; //abbb cccc ADS1292_REG[CH1SET] |=Ads1292_Ch1set.PD<<7; //[7] a 通道1断电? ADS1292_REG[CH1SET] |=Ads1292_Ch1set.GAIN<<4; //[6:4]bbb 设置PGA增益 ADS1292_REG[CH1SET] |=Ads1292_Ch1set.MUX; //[3:0]cccc 设置通道1输入方式 ADS1292_REG[CH2SET] = 0x00; //abbb cccc ADS1292_REG[CH2SET] |=Ads1292_Ch2set.PD<<7; //[7] a 通道2断电? ADS1292_REG[CH2SET] |=Ads1292_Ch2set.GAIN<<4; //[6:4]bbb 设置PGA增益 ADS1292_REG[CH2SET] |=Ads1292_Ch2set.MUX; //[3:0]cccc 设置通道2输入方式 ADS1292_REG[RLD_SENS] = 0X00; //11ab cdef [7:6] 11 PGA斩波频率 fMOD/4 ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Pdb_Rld<<5; //[5]a 该位决定RLD缓冲电源状态 ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld_Loff_Sense<<4; //[4]b 该位使能RLD导联脱落检测功能 ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld2N<<3; //[3]c 这个位控制通道2负输入 用于右腿驱动的输出 ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld2P<<2; //[2]d 该位控制通道2正输入 用于右腿驱动的输出 ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld1N<<1; //[1]e 这个位控制通道1负输入 用于右腿驱动的输出 ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld1P; //[0]f 该位控制通道1正输入 用于右腿驱动的输出 ADS1292_REG[RLD_SENS] |= 0xc0;//设置默认位 ADS1292_REG[LOFF_SENS] = 0X00; //00ab cdef [7:6] 必须为0 ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Flip2<<5; //[5]a 这个位用于控制导联脱落检测通道2的电流的方向 ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Flip1<<4; //[4]b 这个位控制用于导联脱落检测通道1的电流的方向 ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff2N<<3; //[3]c 该位控制通道2负输入端的导联脱落检测 ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff2P<<2; //[2]d 该位控制通道2正输入端的导联脱落检测 ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff1N<<1; //[1]e 该位控制通道1负输入端的导联脱落检测 ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff1P; //[0]f 该位控制通道1正输入端的导联脱落检测 ADS1292_REG[LOFF_STAT] = 0x00; //[6]0 设置fCLK和fMOD之间的模分频比 fCLK=fMOD/4 [4:0]只读,导联脱落和电极连接状态 ADS1292_REG[RESP1] = 0X00;//abcc cc1d ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_DemodEN<<7;//[7]a 这个位启用和禁用通道1上的解调电路 ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_modEN<<6; //[6]b 这个位启用和禁用通道1上的调制电路 ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_ph<<2; //[5:2]c 这些位控制呼吸解调控制信号的相位 ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_Ctrl; //[0]d 这个位设置呼吸回路的模式 ADS1292_REG[RESP1] |= 0x02;//设置默认位 ADS1292_REG[RESP2] = 0x00; //a000 0bc1 [6:3]必须为0 [0]必须为1 ADS1292_REG[RESP2] |= Ads1292_Resp2.Calib<<7; //[7]a 启动通道偏移校正? ADS1292_REG[RESP2] |= Ads1292_Resp2.freq<<2; //[2]b 呼吸频率设置 ADS1292_REG[RESP2] |= Ads1292_Resp2.Rldref_Int<<1; //[1]c RLDREF信号源外部馈电? ADS1292_REG[RESP2] |= 0X01;//设置默认位 ADS1292_REG[GPIO] = 0x0C; //GPIO设为输入 [7:4]必须为0 [3:2]11 GPIO为输入 [1:0] 设置输入时,指示引脚电平,设置输出时控制引脚电平
spi接口 ads129x系列的接口都是SPI的,这里面和普通的spi接口相比,还加了一个ready信号中断。该信号是用来通知host是否有信号输出的。非常关键。笔者在调试过程中,由于配置失误导致ads1292的spi信号一直输出为零,刚开始还以为是审批出错了,这里走了不少弯路。根本原因,还是对系统不熟悉,这点也算是一个教训吧。
总结
这块涉及到的知识比较多。由于是微弱信号采集,所以对硬件adc的设计这块非常关键。不能引入干扰是最基本的原则,也最最大的困难,这点花费时间很长,后续 花一些时间专门做一个专题研究解析。
软件涉及到东西比较多了,几乎用到了所有常用的接口,SPI接口数据传输和存储,串口打印,无线ble传输,本地sdio数据存储等。这些都是非常重要的软件接口和单元, 笔者也花费了不少时间去熟悉和调试,这块后面也会有不少专题要写出来。
随着对可穿戴医疗设备的深入,越来越发现自身团队医疗方面的知识欠缺了。对医疗知识的基本熟悉和理解,这点非常关键,是最好产品的必备路径。今后也要重点做一些专门的 学习和研究。
标签:ADS1292R,芯片,心率,ads1292,接口,ADS1292,spi,开发阶段 From: https://www.cnblogs.com/dylancao/p/16799095.html