【满满的干货!附源码】基于stm32的智能心电图采集系统

    1.写在前面的话:

写在前面的话(可无视):楼主现在属于刚刚学会画板子,但是只能保证电路通电能够,于是上网买了一些资料打算学习一些走线的技巧,但是发现里面的线画的天啊,随便一撕感觉就能把焊盘给撕开...至于剩下的资料对于楼主来说太高深了(希望能遇到会单片机编程的高手带一带孩子吧  ,51会一些,stm32和51相比太复杂了),于是发出来造福社会了,我打算从这个文章开始做一个免费的资源合集系列,姑且就叫:不仅有详细的文档资料,如果设计单片机,上位机和app,小程序的源代码,我也会上传,链接会在文章结尾。                 

         

摘要:本次设计是基于Cortex-M3内核的信号采集与数据处理的系统以实现人体生理信号的实时监控,实现了远程健康监护原型的各项功能,不仅可以大大减少医疗消费支出,而且更有效的提高个人健康监护服务。通过Agcl电极片采集到人体肢体导联电压波形,利用模拟预先抗混叠处理滤除奈奎斯特区间以外的频率,再经过模拟前端将信号放大1000倍,得到放大后的波形。利用STM32单片机实现片上IIR实时滤波消除50HZ的工频干扰与基线漂移,以及Savitzky-Golay平滑滤波处理。将采集完的数据通过蓝牙传输到安卓端上位机,用户可以通过手机实时观察自身心电波形,清楚的了解自身身体状况。同时通过wifi网络将心电数据传输到PC端上位机,PC端进行数据分析与信息反馈到电脑中,实现医生对病人的情况进行实时监控。PC端可设置为多用户模式,真正实现一对多服务,对人民的健康水平具有十分重要的意义。

关键词:心电信号采集,Cortex-M3,IIR滤波器,Savitzky-Golay滤波器,安卓,PC上位机

Abstract:This design is based on Cortex-M3 kernel’s system,which can collect signal and process data ,in order to achieve the real-time monitoring of human physiological signals.to achieve various functions of remote health monitoring prototype can not only reduce medical expenditure greatly but improve the personal health care service. Firstly,human body lead voltage waveform collected by the Agcl electrode slice adopts pre antialiasing processing to filter out the frequency which is outside the Nyquist interval .Then the signal is zoomed in 1000 times through the analog front-end so that it gets the waveform zoomed in. Meanwhile,Using STM32 MCU can realize IIR real-time filtering On the chip eliminating 50HZ power line interference ,baseline drift and Savitzky-Golay smooth filter. The collection of data is sent to Android PC via Bluetooth .Therefore mobile phone users can observe their ECG waveform in real-time so as to clearly understand user’s physical condition. At the same time, ECG data is transferred to PC terminal through WiFi network.PC terminal analyzes data came from patients and doctor get feedback in order that doctor monitor in real-time patient's physical condition.Moreover,PC terminal can be set for multi-user mode that realizes one-to-many service .It’s vital significant to the people's health level.

Key words:ECG signal acquisition, Cortex-M3, IIR filter, Savitzky-Golay filter, Android, PC

一.研究背景

随着现代生产生活水平的提高,以及我国人口老龄化程度越来越严重,人们也越来越关心自己的身体健康状况。伴随着计算机技术以及通信技术的发展,远程医疗得到了越来越广泛的应用,提高了医疗机构的知名度,取得良好的社会效益,逐渐成为一种新的医疗服务模式。生理信号监测系统及采集系统作为远程医疗的一个重要环节,被不少机构和学府作为重点的研究对象。

在众多的生理信号中,ECG信号是学者研究和关注的重点。有学者设计出了便携式的ECG测量系统。由于人体ECG信号较弱,容易受到外界干扰,所以也涌现出用许多心电信号的降噪方法。

信号降噪可以通过硬件或者软件的设计去处理。硬件电路的设计一般为搭建有源滤波器,但模拟陷波滤波器或模拟高通滤波器要达到好的性能参数时,必须使用高阶的滤波器。高阶滤波器的设计比较复杂,实际应用时往往因为阻容器件精度的限制导致整个滤波器的性能达不到设计效果,而且模拟器件在长时间使用之后会老化,导致系统性能进一步下降。现如今数字信号处理器的应用已十分广泛,而且价格逐步下降,一些其他类型的微控制器也有了DSP架构,可以实现较大数值和精度的计算。加上数字信号处理技术已经十分成熟,故选择数字滤波器会使整个系统的设计更加简单。在信号降噪之后,可以对ECG信号进行了进一步的研究,例如进行QRS波群检测,胎儿心电分离等工作。

医学生理信号采集系统比较典型的产品为BIOPAC公司生产的MP150采集系统,该产品采用采集主机与前端处理卡分离的模式,可以自由组合采集的信号类型。采集卡与上位机采用以太网方式进行连接,能以极高的速率进行数据传输,最高采用指标可以达到16路,16-bit精度,200k采样率。但MP150也存在一定缺陷,如使用时间超过3小时采集主机会发热,造成系统内部产生噪声,干扰信号的采集。

二.研究目的

本次设计的重点在于设计一套实用性强的医学信号采集系统,并附带跌倒检测与报警功能,该系统吸收现有的产品优点,同时进行一些改良与简化,具有以下几个特征:

(1)、电路简单、系统整体功耗低、发热量低、可以稳定连续运行;

(2)、使用新型、主频高的控制芯片,能在芯片上实现数据滤波

(3)、设计安卓端上位机显示心电信号与反馈信息

(4)、PC端上位机显示信号波形,将采集的数据以文件格式储存,并对数据进行分析,供科研人员进一步研究。

三.实施方案

1总体流程图

2.前端模拟放大电路

采用AgCl电极片,减小基线漂移。

心电信号通过二级放大,放大倍数1000倍以上,第一级采用仪表放大器AD620进行放大,二级电路用LM358,和OP07构成放大。通过蓝牙,用于STM32与手机通信。附加MPU6050用于跌倒检测。

心电部分采用右腿驱动,减小工频干扰。通过RC与运算放大器构成有源带通滤波器,0.3HZ-106Hz的频率通过。电源部分采用AMS11175.0V和7660s构成一对正负5负的电压为运放供电。通过AMS11173.3V稳压到3.3V为STM32进行供电。

2.1负电源产生电路

用两个ICL7660s并联,提高能够输出的最大电流。

2.2心电放大电路

R25,C24,R26和U2(OP07)构成右腿驱动电路,AD620将信号放大10倍左右。C25与R12与U3(OP07)构成一个有源高通滤波器。R35、C26构成低通滤波器,放大倍数=(R34/R33)*(R37/R36)=1000。

2.3电压抬升电路

经过放大后的信号,电压范围在-5V到+5V,为了让STM32AD能够读到电压值,需要将放大的信号转换到0-3.3V。

可知最后输出的电压在0到3.3之内,可以由STM32的AD读出。

3.单片机部分

3.1 主控单元选取

本次数据采集与滤波电路使用的主控芯片为意法半导体公司的STM32F103RBT6。该芯片的具有ARM 32-bit Cortex-M3 CPU,片上128k flash,20kRAM,12-bit精度的是,片内ADC转换器,以及I2C接口等外设。可以在简单的电路上完成信号采集与数据滤波等运算。

3.3.2信号的采集与传输

模拟信号的采样使用了ADC1的第10通道,两次采样时间间隔为14个时钟周期,转换精度为12bit,ADC的触发时钟配置为TIM2输出,通过DMA方式进行外设到内存数据传输,采用DMA乒乓结构进行数据存储和处理

3.2.1定时器配置PWM输出关键代码

TIM_TimeBaseStructure.TIM_Period = 400;        

TIM_TimeBaseStructure.TIM_Prescaler = 720 - 1;  

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_Pulse = 200;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//下面详细说明

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 200;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_CtrlPWMOutputs(TIM2, ENABLE);

3.3.2.2配置DMA外设到内存传输

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;

3.3.2.3用定时器配置ADC采样率

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2 ; //Timer触发 ADC_ExternalTrigConvCmd(ADC1, ENABLE);   //使用外部中断触发(相对于M3内核来说)

3.3.3干扰来源

工频干扰:工频干扰是由电力系统引起的一种干扰,由50hz及其谐波构成的一种干扰,幅值约为ECG(心电信号)的50%

基线漂移:呼吸作用引起的,源于被测对象在测试过程中呼吸时电机与人体皮肤间的阻抗仪器放大的热噪声等干扰引起的,频率约为0.15-0.3hz。呼吸作用时ECG幅值有15%的变化

肌电干扰:来源于人体的肌肉颤抖,肌电干扰产生毫伏级电势,可视为瞬间发生的高斯零均值带限噪声

3.3.3数字陷波滤波器的设计

工频干扰可以用先波器进行处理,过滤50hz信号,而基线漂移则通过高通滤波器消除0.5hz以下的频率。常用固定频率的设计有IIR滤波器和FIR滤波器两种,其中FIR滤波器具有良好的线性相位。但是在同等性能条件下阶数比IIR滤波器高,运算量大。故本设计的工频陷波和高通滤波均采用IIR滤波器来设计

   IIR滤波器的设计方法有脉冲响应不变法和双线性变换法,但过程比较复杂,借助Matlab的fdatool工具包可以直接生成相关参数。再通过直接II型翻译成c语言形式应用于STM32平台

导出滤波系数得到转移函数

再根据滤波器直接II型实现框图,翻译成c语言代码并烧录到主控芯片中运行

c语言响应代码

x0=ADC_ConvertedValueLocal;  //输入ADC采集到的信号

w0[0]=IIR_50Notch_A[0]*x0-IIR_50Notch_A[1]*w0[1]-IIR_50Notch_A[2]*w0[2];

y0=IIR_50Notch_B[0]*w0[0]+IIR_50Notch_B[1]*w0[1]+IIR_50Notch_B[2]*w0[2];

w0[2]=w0[1];

w0[1]=w0[0];

3.3.4数字高通滤波器的设计

数字高通滤波器能有效抑制呼吸作用导致的基线漂移,同样采用Matlab Fdatool工具箱设计0.5hz二阶IIR高通滤波器,导出滤波系数。

得到响应函数:

翻译成C语言代码:

   w1[0]=0.991153*(IIR_High_A[0]*x1-IIR_High_A[1]*w1[1]-IIR_High_A[2]*w1[2]);

   y1=IIR_High_B[0]*w1[0]+IIR_High_B[1]*w1[1]+IIR_High_B[2]*w1[2];

w1[2]=w1[1];

   w1[1]=w1[0];

3.3.5.采用SG平滑滤波算法对心电信号进行平滑处理

对IIR滤波后的数据进行SG平滑处理,先在Matlab平台上面进行实时仿真,通过提取MIT-BIH数据库的文件,对其进行SG平滑滤波以验证算法的效果,再将其翻译成c语言,

SG平滑之后数据比之前平滑很多

3.3.5跌倒检测算法检测

基于MPU6050六轴模块设计跌倒检测算法。MPU6050是全球首例整合性6轴运动处理器件整合了3轴陀螺仪和3轴加速度计,免除了组合陀螺仪和加速度计时之轴间差的问题。

由于产品佩戴于胸前,所以选取X轴方笔直朝下,使用I2C通讯协议,提取MPU6050各轴数据,消除零点漂移之后,对加速度计的数据进行均值滤波,通过加速度计数据得到x轴与重力加速度方向的角度,然后通过卡尔曼滤波融合陀螺仪的加速度,得到修正之后X轴与重力加速度方向的倾角,实际实验测试出临界阈值。

mpu6050_get_data(&gx,&gy,&gz,&ax,&ay,&az,&temperature);   

acc_filter();         

ax-=AX_OFFSET;         

ay-=AY_OFFSET;

az-=AZ_OFFSET;

gx-=GX_OFFSET;         

gy-=GY_OFFSET;

gz-=GZ_OFFSET;

angle_dot = gz * GZRO_SCALE;  

angle =atan(sqrt(ax * ax + ay * ay )/az );  

angle =angle * 57.295780;   

kalman_filter(angle, angle_dot, &f_angle, &f_angle_dot);

3.5.6数据帧协议

4安卓端程序设计

4.1  Android客户端的作用相当于一个网关,一是通过蓝牙发送请求数据的命令至STM32核心控制系统并接收数据,同时在界面上绘制心电图; 二是通过Wifi在后台将心电数据发送至服务器,包含如下组件:

  1. 蓝牙服务:负责与STM32系统建立蓝牙连接的串口信道,收发数据。
  2. 绘图模块:实现与用户的交互功能,对采集数据进行实时画图,以供观察。
  3. 网络服务:负责向服务器发出连接请求,将接收的数据通过Wifi发送至服务器
  4. 其它服务:包括短信提醒和保存数据的功能,可以通过对网络返回的数据进行判断,给用户预先设置的联系人发送短信提醒,并且对数据进行保存,方便让专业学者进行诊断

4.2  Android SDK对蓝牙的支持

4.2.1 蓝牙通信技术

蓝牙通信技术是一种支持设备短距离通信( 一般10m以内) 的无线电技术,能在包括移动电话PDA无线耳机笔记本电脑相关外设等众多设备之间进行无线信息交换 利用蓝牙技术,能够有效得简化移动通信终端设备之间的通信

4.2.2 Android蓝牙APIS

AndroidSDK2.0版本及以上包含了对蓝牙网络协议栈的支持,这使得Android设备能够无线连接其它蓝牙设备交换数据Android的应用程序框架提供了访问蓝牙功能的APIs( 应用程序接口) , 这些APIs让应用程序能够无线连接其他蓝牙设备,实现点对点,或点对多点的无线交互功能。可用的蓝牙APIs都包含在android.bluetooth包里,使用蓝牙APIs,一个Android应用程序能够实现下列功能: ( 1) 扫描其它蓝牙设备;( 2) 查询本地蓝牙适配器用于配对蓝牙设备; ( 3) 建立RFCOMM信道; ( 4) 通过服务发现连接其它设备; ( 5) 数据通信;( 6) 管理多个连接。

4.3 Android客户端设计

4.3.1 蓝牙通信:进行蓝牙通信需要完成以下四个步骤: ( 1) 设置蓝牙适配器; ( 2) 发现已经配对或者可用的附近的蓝牙设备; ( 3) 连接设备; ( 4) 在不同设备之间传输数据。

  系统流程如图:

4.3.2 绘图模块:提取心电数据,并绘制心电图.提取STM32模块经过滤波后得到的心电数据,通过事先设定的协议:以@为开始符,|为数据的分隔符,$为停止符,进行数据的发送和提取,再通过SufaceView控件去进行动态心电图的绘制

4.3.3数据上传:在向服务器上传数据时,采用Socket 通信协议 Socket 通常称作套接字,一个Socket 对象包含了IP地址和端口应用程序通常通过套接字向网络发出请求或者应答网络请求套接字之间的连接过程可以分为三个步骤: 服务器监听,客户端请求,连接确认 首先在PC端建立一个ServerSocket监听客户请求,本文采用在Android手机端监听了上传事件的方法,触发事件后,通过“socket=new Socket(172.38.30.10)”来请求连接服务器 通过socket.getOutputStream().write()来发送数据。

5.PC端上位机程序设计

二:上位机部分

采用VC++6.0编写PC端上位机,上位机与手机通过WiFi进行通信.

上位机具有以下功能:

  1. 波形显示,实时显示用户心电图
  2. 与手机通过Wi-Fi进行数据传输
  3. 在服务器端显示用户心率,姓名等信息
  4. 心率分析,通过检测QRS波中的R波,运用阈值检测算得心率数据
  5. 将心电图的数据记录并保存到文件,也可以从文件中读取心电数据进行显示。
  6. 上位机支持多用户连接,服务器端可根据用户的姓名进行选择观看。
  7. 采用FFT计算出频谱心电图(FCG),对于研究心电图具有重要意义。运用蝶形算法计算fft求得心电信号的频谱,比DFT的计算量减小很多。

相关上位机,单片机以及app的源代码会随后上传,这个上传没太整明白,研究一下。

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值