快捷搜索:

「FastBond项目分享」体外诊断之便携式12导联心电仪

 

项目介绍

该心电仪设计的时候主要考虑了以下几点:

1.体积足够小,足够便携。让用户对他的体积重量的感知尽可能的低。

2.设备足够安全。所有与医疗有关的设备,无论是医疗器械,还是辅助诊断设备,都要保证不对使用者的安全有不好的影响。更不能有危险的存在。

3.设备代码有保护,不会轻易被别人所复制。不会产生设计了一个产品,然后被人轻易读出代码,然后抄板复制。

基于以上几点,我设计了这一款12导联的心电仪。

硬件部分,采用STM32F103作为主控,ADS1298作为心电波形采样主芯片。美信的DS2411R作为软件加密芯片。ADI的ADP151作为供电的LDO。使用3节干电池作为供电,这样安全性比较高。使用蓝牙进行通信,支持TF卡功能。

软件部分:可使用蓝牙实时上传采集到的心电数据,并可以使用对应的接收软件解析出来。也可将心电数据保存到TF卡里面,然后把文件读出来解析出相关数据。板子预留一个按键可以作为扩展功能使用,比如紧急呼叫,一键暂停或者开始,通知设备上传数据到云端。

上位机部分:使用C#编写,可以接收设备上传的信号,能够显示12条导联波形,显示设备当前电量,得到按键状态等功能。用于辅助测试以及演示使用。该项目原本计划还有一个手机端的软件,受限于时间并没有完成。

最开始计划使用ADAS1000加MAX32660然后使用LTC6655作为模拟部分基准芯片,放弃的原因也很简单,成本太高了,远远超出预算。最后选择了当前展示的方案。

项目用到的仪器器件

仪器

1.心电模拟器:可产生1Hz的方波信号,60BPM的正常心电波形,100BPM心电波形。

2.示波器:用于采集模拟端输出的信号,以及判断通信波形是否正常。

3.万用表:用于测量板子电源是否正常工作,以及相关功耗性能测试。

器件

1.ADI的ADP151

超低功耗,超低压差的LDO芯片,用于给ADS1298提供3.3V的模拟电源。性能非常优异。200 mA负载时工作电源电流低至265 μA,因此ADP151适合电池供电的便携式设备。

2.美信的DS2411R

非常经典的加密芯片,通过单总线接口可以巷设备提供一个唯一ID用于加密功能,当然,比起目前可以将部分代码放到加密芯片里面的新型加密芯片来说,DS2411R是有一点落后,不过SOT23-3的封装,加上目前出开盖外没啥有效的破解手段的原因。使用这个芯片还是完全能够应对此项目的需求的。

3.ADS1298:

8通道、24位模拟前端。与普通的模/数转换芯片相比,ADS1298更多的优势在于其便携性、紧凑性、低功耗性。该芯片的集成特性包括8路独立的PGA和24b ADC,右腿驱动电路以及电极检测等。

关键代码与说明

1.ADS1298驱动代码

ADS1298_SPI_Init(); ADS1298_CS_L; delay_us(1); SPIx_ReadWriteByte(ADS1298_SDATAC); while(device_id != 0x92) //识别芯片型号,1298为0x92 { device_id = ADS1298_SPIReadReg(ADS1298_ID); // printf("ID:0X%02X\n",device_id); delay_ms(100); } ADS1298_SPIWriteReg(ADS1298_CONFIG1, 0X46); //LP 250 0XC6); //HR 500 // ADS1298_SPIWriteReg(ADS1298_CONFIG2, 0X34); ADS1298_SPIWriteReg(ADS1298_CONFIG3, 0XCC); ADS1298_SPIWriteReg(ADS1298_LOFF, 0X33); ADS1298_SPIWriteReg(ADS1298_CH1SET, 0X60); //12 正常 ADS1298_SPIWriteReg(ADS1298_CH2SET, 0X60); ADS1298_SPIWriteReg(ADS1298_CH3SET, 0X60); ADS1298_SPIWriteReg(ADS1298_CH4SET, 0X60); ADS1298_SPIWriteReg(ADS1298_CH5SET, 0X60); ADS1298_SPIWriteReg(ADS1298_CH6SET, 0X60); ADS1298_SPIWriteReg(ADS1298_CH7SET, 0X60); ADS1298_SPIWriteReg(ADS1298_CH8SET, 0X60); ADS1298_SPIWriteReg(ADS1298_RLD_SENSP, 0X00); ADS1298_SPIWriteReg(ADS1298_RLD_SENSN, 0X00); ADS1298_SPIWriteReg(ADS1298_LOFF_SENSP, 0X00); ADS1298_SPIWriteReg(ADS1298_LOFF_SENSN, 0X00); ADS1298_SPIWriteReg(ADS1298_PACE, 0X01); ADS1298_SPIWriteReg(ADS1298_CONFIG4, 0X02); ADS1298_SPIWriteReg(ADS1298_WCT1, 0X0A); ADS1298_SPIWriteReg(ADS1298_WCT2, 0XE3); SPIx_ReadWriteByte(ADS1298_RDATAC); ADS1298_START_H; //转换开始

2.DS2411R驱动代码

//初始化DS2411的IO口 DQ 同时检测DS的存在 //返回1:不存在 //返回0:存在 uint8_t DS2411_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED0-->PA.8 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_2); //PA.8 输出高 DS2411_Rst(); return DS2411_Check(); } //从DS2411得到SN short DS2411_Get_SN(void) { uint8_t SN[8]; DS2411_Rst(); if(DS2411_Init())printf("DS2411 Check Failed!"); DS2411_Write_Byte(0x33);// Read ROM SN[0]=DS2411_Read_Byte(); //0 SN[1]=DS2411_Read_Byte(); //1 SN[2]=DS2411_Read_Byte(); //2 SN[3]=DS2411_Read_Byte(); //3 SN[4]=DS2411_Read_Byte(); //4 SN[5]=DS2411_Read_Byte(); //5 SN[6]=DS2411_Read_Byte(); //6 SN[7]=DS2411_Read_Byte(); //7 printf("%.2X-%.2X-%.2X-%.2X-%.2X-%.2X-%.2X-%.2X",SN[0],SN[1],SN[2],SN[3],SN[4],SN[5],SN[6],SN[7]); return 0; }

3.代码主逻辑

void TIM3_IRQHandler(void) //TIM3中断 { static uint8_t flag = 0; static uint8_t s = 0; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源 if(SWITCH == 1) { if(flag == 0) mode = 0; else flag = 0; } else { if(flag == 1) mode = 1; else flag = 1; } if(mode == 0) { if(ble_ecg.state != 0) { LED0 = 1; LED1 = 0; } else { LED0 = 1; LED1 = s%2; } } else { if(sd_ecg.state != 0) { LED0 = 0; LED1 = 1; } else { LED0 = s%2; LED1 = 1; } } s++; } }

功能演示

1.接心电模拟器

1Hz的方波信号

60BPM的正常心电波形

100BPM心电波形

2.测量人体心电

未在身上涂酒精,而且为了方便录制视频是坐着测量的。如果涂酒精且平躺静止,效果要好很多。

项目遇到的问题与解决

1.测量不到波形不知道哪里问题。

查阅芯片寄存器手册得知有测试模式,将其调整为测试模式后,由内部产生1Hz方波,得知是接口配置问题,修正后解决。

2.测量到的波形在一些条件下会出现非常严重的跳变

ADS1298的数据为24位补码,需针对这个情况对读出的原始数据进行转化。

3.基线漂移非常严重

在上位机代码里面追加滤波算法,追加动态y轴范围。显示效果好了很多。

4.对12导联输出不太理解怎么回事

查阅相关资料才知道,aVR、aVL、aVF是计算出来的。

原理图 & 程序

分享

[注:本文部分图片来自互联网!未经授权,不得转载!每天跟着我们读更多的书]


互推传媒文章转载自第三方或本站原创生产,如需转载,请联系版权方授权,如有内容如侵犯了你的权益,请联系我们进行删除!

如若转载,请注明出处:http://www.hfwlcm.com/info/230949.html