首页 » 互联网 » 「FastBond项目分享」体外诊断之便携式12导联心电仪_波形_芯片

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

乖囧猫 2025-01-17 16:58:08 0

扫一扫用手机浏览

文章目录 [+]

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

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

「FastBond项目分享」体外诊断之便携式12导联心电仪_波形_芯片 「FastBond项目分享」体外诊断之便携式12导联心电仪_波形_芯片 互联网

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

「FastBond项目分享」体外诊断之便携式12导联心电仪_波形_芯片 「FastBond项目分享」体外诊断之便携式12导联心电仪_波形_芯片 互联网
(图片来自网络侵删)

基于以上几点,我设计了这一款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得到SNshort 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是打算出来的。

事理图 & 程序

分享

标签:

相关文章