
摘要:ADS1292R是TI公司早在几年前出产的一款医用级ADC芯片,它主要应用在医疗仪器(心电图ECG),可以监护患者以及病人护理和健身监视器。ADS1292R集成了心电采集所需要的部件,方便设备小型化。它的功耗极低,使得可以作为长时间监控成为可能。而且输入参考噪音低,共模抑制比高。足以进行心电采集。电赛很可能会让大家利用这款芯片做一个心电图检测仪,显示模块很可能就是大家所熟知的RGB大屏幕,同时这道题应该是信号题了。 先来看一段官方视频,体会一下这个心电检测仪到底是啥样的~ https://mp.weixin.qq.com/s/eXH8VF9YplueWsUfKaXgmA心电信号和呼吸信号是人体的重要生物电信号。尤其是心电信号,它比其他生物电信号更直观,更具有规律性,它是反映心脏健康状况的重要依据。心电图是诊断和分析治疗心血管疾病的一个重要手段,在临床治疗中心电图得到广泛应用。但是常规心电图一般需要通过大型医疗场所,如医院、疗养院的心电图机采集数据获得,其获得途径较难、价格较高、耗时长等弊端阻碍了心电图机的进一步应用。今年大家经历了新冠疫情,所以出这种题目也是情理当中,毕竟学以致用,学了不能用,那学了又有何用?对吧。 ![]() : g+ H H- A/ v- v1 i2 M* f : W W9 V. d9 G% G. t: Q, o 1 引脚功能及配置 ![]() ![]()
* X% f9 N* H- k) F" a 2 信号采集的硬件要求2 U1 S9 D- y0 a/ z# k! Z: s/ { 心电及呼吸信号采集前端是整个监护系统的核心部分,如果前端信号采集部分的电路出现问题,即使你的模块板子再好也不能得到你想要的输入信号,自然就GG。ECG 属于微弱的小信号,其幅值在 10μ V~5mV 之间,极易受到干扰,导致有用信号淹没在诸多噪声中。为了能有效地提取出有用信号,对信号采集硬件提出如下要求:
3 电极片的选择 极片也是传感器的一种,其作用是将人体内的离子导电的位移电流转化为检测电路中的电子导电的传导电流,电极片作为检测电路输入前端,其性能也影响着检测电路的噪声、共模抑制比等,所以选择合适的电极片对整个系统的信号质量尤为重要。既然是比赛那就用学校的钱买最好的点电极片了,战术后仰! ![]() ![]() 4 测量的电路 下图1是官方数据手册中截取的,图2是对应的中文内部框图,图3是在网上多次看到的原理图,有些图用的人多了自然有它的道理,这个不必纠结。设计电路首先要遵从数据手册然后再在此电路的基础上进行修改。 ![]() ![]() ![]() 5 信号输入和右腿驱动电路 ADS1292R 可以实现双通道信号采集和模数转换,通道1(IN1N和IN1P)为呼吸信号采集通道,IN3N和IN3P为ADS1292R 内部产生的32kHz 正弦电流信号的输出端。在正弦电流信号的输出电路中,可以在31号和32号引脚外加保护电阻,限制从 ADS1292R 流向人体的电流,同时还可以在电阻后加电容起到隔离流回人体的直流的作用(电阻和电容是串联)。在呼吸信号输入电路中,C2和C7起到抑制流回人体的直流电流的作用。C1和C6起到人体免受电路突发故障所引起的大电流伤害的作用。心电信号极易受到 50Hz 工频干扰,这种干扰常以共模的形式出现。一般在生物电信号检测电路中,需要对驱动电路即右腿驱动电路来消除这种共模干扰,从而提高系统的共模抑制比。ADS1292R片内集成了右腿驱动电路,这样有利于减小监护设备的体积,降低功耗。右腿信号由RLDINV端口输入至片内右腿驱动电路,设置 ADS1292R内部 RLD_SENS 寄存器,使片内右腿驱动电路的输出连至通道2以减少心电信号中共模干扰。官方公开的资料中并未给出片内右腿驱动电路的反相放大器中电阻阻值,其放大倍数未知,为保证整个电路的信号稳定、可靠,右腿驱动电路需要各位大佬根据系统需要外搭。 & L1 n* @1 x# [8 u" i* d5 Y 8 ]; W3 G( D! E7 a 6 心电及呼吸信号降噪 心电信号非常微弱,典型值仅为1mV 左右。正常的心电信号大部分为 0.5~ 40Hz 的低频信号,而心电信号的总体范围为 0.05~100Hz。心电信号极易受到来自外界、人体自身以及电路的干扰,如基线漂移、工频干扰、肌电噪声等。干扰信号混杂于心电及呼吸信号中,导致有用信号畸变,有时有用信号会完全淹没在噪声里,故有用信号的特征值很难被提取。所以相应的滤波去噪处理是必要的。 ![]() 常用的心电信号去噪方法有硬件降噪和软件滤波这两种。硬件降噪主要是通过搭建相应的电路来实现滤波功能,但这种硬件滤波电路不仅搭建调试难度大,而且增加了成本、体积和功耗。建议大家通过软件滤波,这对参加电赛的软件手来说肯定不难,智能车都搞过这点滤波的问题还能难道你这个大佬吗?对吧! 5 H3 X$ D5 p1 w4 e k TI杯当然是建议用TI提供的板子—MSP430。如果前期没有用过MSP430的板子也没有问题,用STM32也不是不可以。另外芯片也单片机通信的方式是SPI通信,相信SPI通信大家都会,因为有7针的OLD显示屏就是用的SPI通信,这点就不用多说了。 ![]() 代码初始化需要配置寄存器,具体程序中已经注释的非常清楚,仅供参考啊!void ads_Init(void) { uint8_t send_data[20], read_data[20]; $ M5 W; _- B7 b! d$ _- c! g/ M* K ads_Reset(1); // 复位引脚置一,正常工作 0 T: a. n# X/ V; v osDelay(1000); osDelay(100); //指令:停止连续读数据模式 send_data[0]=ADS1292R_CMD_SDATAC; 0 B' S+ ~8 U, z c ^$ e while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,1,1000)); osDelay(10); 9 \7 z4 E6 c4 f+ B; o5 U. | //写配置寄存器2=0xa0,内部参考电压为2.42V send_data[0] = ADS1292R_CMD_WREG_1(ADS1292R_REG_CONFIG2); send_data[1] = ADS1292R_CMD_WREG_2(1);' T+ F) q" k$ q" s send_data[2] = 0xa0; while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,3,1000)); 9 c. m( [! _% }6 Q5 F& X2 k osDelay(10); //写配置寄存器1=0x01,连续转换模式,采样率为2507 k+ O* G# T" B# \* s4 ]5 n send_data[0] = ADS1292R_CMD_WREG_1(ADS1292R_REG_CONFIG1);3 z0 x& R& W3 s send_data[1] = ADS1292R_CMD_WREG_2(1); send_data[2] = 0x01; while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,3,1000)); . R% m8 W' g Z, h/ b5 k | osDelay(10); * T* s7 s! Q! s+ L* i2 m2 v ~' J5 H //写导联脱落检测寄存器=0xF0,正负极分别为70%和30%,该功能实际未使用 send_data[0] = ADS1292R_CMD_WREG_1(ADS1292R_REG_LOFF); send_data[1] = ADS1292R_CMD_WREG_2(1);2 t) c6 T) K' s send_data[2] = 0xF0; # R$ {+ o6 Z, p6 o3 Q% |1 P: f while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,3,1000));7 O+ h- Z/ v: p L4 b osDelay(10); //写通道1设置寄存器=0x30,设置增益为3,正常节点输入 send_data[0] = ADS1292R_CMD_WREG_1(ADS1292R_REG_CH1SET);, e. u5 V: D3 q, k6 T/ i1 g3 Q send_data[1] = ADS1292R_CMD_WREG_2(1); I( A) F" [& ^4 c& ]. c send_data[2] = 0x30; ) o1 H( ?& p0 a* u; A# ]2 e while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,3,1000)); $ Q7 Z' P# Y% a4 ]- q$ m osDelay(10); 1 i) {" y+ `! o9 C( o //写右腿驱动寄存器=0xEF,PGA的斩波频率为4分频,使能右腿驱动,关闭右腿驱动的脱落检测,通道2的右腿驱动负极和正极分别连接到通道2输入的负极和正极,通道1的右腿驱动负极和正极分别连接到通道1的负极和正极 send_data[0] = ADS1292R_CMD_WREG_1(ADS1292R_REG_RLD_SENS);) x- V4 R: q) n* z1 q send_data[1] = ADS1292R_CMD_WREG_2(1);& G0 s# D8 D- i. F send_data[2] = 0xEF; j4 l. t8 W& u while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,3,1000)); osDelay(10); //写脱落检测寄存器=0x0F,关闭通道1和2的电流方向检测,使能通道1和2的正负极脱落检测' N! `3 h+ A# ~ N' Y* O //其实只使用了通道1,而且脱落检测实际上没有使用 send_data[0] = ADS1292R_CMD_WREG_1(ADS1292R_REG_LOFF_SENS); send_data[1] = ADS1292R_CMD_WREG_2(1); send_data[2] = 0x0F; # k3 ?( B# _7 ` f N# \ while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,3,1000)); osDelay(10); //写呼吸控制寄存器1=0xF2,使能呼吸调制解调电路,呼吸解调相位为135°,时钟为32KHz,内部时钟6 W1 @" [! ~2 S( U6 l send_data[0] = ADS1292R_CMD_WREG_1(ADS1292R_REG_RESP1); send_data[1] = ADS1292R_CMD_WREG_2(1);0 A. R0 R" O( H0 q6 }9 }- T/ y send_data[2] = 0xF2; while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,3,1000)); osDelay(10); //写呼吸控制寄存器2=0x83,关闭偏置校准,呼吸控制频率为32KHz,右腿驱动参考信号为外部信号 send_data[0] = ADS1292R_CMD_WREG_1(ADS1292R_REG_RESP2);, S _4 _+ }4 I0 r( \5 d8 C send_data[1] = ADS1292R_CMD_WREG_2(1); send_data[2] = 0x83; & ?) O* j2 y {4 V4 z while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,3,1000)); osDelay(10); # S- K: U1 h* ?' Y7 Y" u. j( L) n7 f ads_Start(1); //启动转换 5 ^, }3 N c: g( e* M" ? osDelay(10);& f$ [' q: O4 `/ f1 q& x //指令:连续读模式- x$ z6 \3 `9 L! n+ @( ~8 s send_data[0]=ADS1292R_CMD_RDATAC; while(HAL_OK!= HAL_SPI_TransmitReceive(&hspi1,send_data,read_data,1,1000)); " I/ C+ J) A$ e# M osDelay(10); }4 g( b3 {0 P; j void ads_Get_Data(uint8_t* raw_data)# y2 L2 X3 q7 C, d' W& A {' W" i$ o! o! j; Y static uint8_t sendBuf[9]={0,0,0,0,0,0,0,0,0}; HAL_SPI_TransmitReceive_DMA(&hspi1,sendBuf,raw_data,9); } |
沙发,好贴子,要是能贴出算法部分就好了 |