【STM32本科毕业设计】基于STM32的心电采集系统

一. 概述

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

二. 设计方案

本次设计的重点在于设计一套实用性强的医学信号采集系统,并附带跌倒检测与报警功能,该系统吸收现有的产品优点,同时进行一些改良与简化,具有以下几个特征:
(1)、电路简单、系统整体功耗低、发热量低、可以稳定连续运行;
(2)、使用新型、主频高的控制芯片,能在芯片上实现数据滤波
(3)、设计安卓端上位机显示心电信号与反馈信息
(4)、PC端上位机显示信号波形,将采集的数据以文件格式储存,并对数据进行分析,供科研人员进一步研究。
在这里插入图片描述

1. 前端模拟放大电路

采用AgCl电极片,减小基线漂移。
心电信号通过二级放大,放大倍数1000倍以上,第一级采用仪表放大器AD620进行放大,二级电路用LM358,和OP07构成放大。通过蓝牙,用于STM32与手机通信。附加MPU6050用于跌倒检测。
心电部分采用右腿驱动,减小工频干扰。通过RC与运算放大器构成有源带通滤波器,0.3HZ-106Hz的频率通过。电源部分采用AMS11175.0V和7660s构成一对正负5负的电压为运放供电。通过AMS11173.3V稳压到3.3V为STM32进行供电。

2. 负电源产生电路

用两个ICL7660s并联,提高能够输出的最大电流。
在这里插入图片描述

3. 心电放大电路

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

4. 电压抬升电路

经过放大后的信号,电压范围在-5V到+5V,为了让STM32AD能够读到电压值,需要将放大的信号转换到0-3.3V。
在这里插入图片描述
可知最后输出的电压在0到3.3之内,可以由STM32的AD读出。
在这里插入图片描述

三. 单片机部分

1. 主控单元选取

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

2. 信号的采集与传输

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

3. 定时器配置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); 

配置DMA外设到内存传输:

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

用定时器配置ADC采样率:

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

4. 干扰来源分析

工频干扰:工频干扰是由电力系统引起的一种干扰,由50hz及其谐波构成的一种干扰,幅值约为ECG(心电信号)的50%
基线漂移:呼吸作用引起的,源于被测对象在测试过程中呼吸时电机与人体皮肤间的阻抗仪器放大的热噪声等干扰引起的,频率约为0.15-0.3hz。呼吸作用时ECG幅值有15%的变化。
肌电干扰:来源于人体的肌肉颤抖,肌电干扰产生毫伏级电势,可视为瞬间发生的高斯零均值带限噪声。

5. 数字陷波滤波器的设计

工频干扰可以用先波器进行处理,过滤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];

6. 数字高通滤波器的设计

数字高通滤波器能有效抑制呼吸作用导致的基线漂移,同样采用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];

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

对IIR滤波后的数据进行SG平滑处理,先在Matlab平台上面进行实时仿真,通过提取MIT-BIH数据库的文件,对其进行SG平滑滤波以验证算法的效果,再将其翻译成c语言:
在这里插入图片描述
SG平滑之后数据比之前平滑很多。

8. 跌倒检测算法检测

基于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); 

四. 安卓端程序设计

1. 概述

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

(1)蓝牙服务:

负责与STM32系统建立蓝牙连接的串口信道,收发数据。

(2)绘图模块:

实现与用户的交互功能,对采集数据进行实时画图,以供观察。

(3)网络服务:

负责向服务器发出连接请求,将接收的数据通过Wifi发送至服务器

(4)其它服务:

包括短信提醒和保存数据的功能,可以通过对网络返回的数据进行判断,给用户预先设置的联系人发送短信提醒,并且对数据进行保存,方便让专业学者进行诊断

2. Android SDK对蓝牙的支持

(1). 蓝牙通信技术

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

(2). Android蓝牙APIS

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

3. Android客户端设计

(1). 蓝牙通信:

进行蓝牙通信需要完成以下四个步骤: (1) 设置蓝牙适配器; (2) 发现已经配对或者可用的附近的蓝牙设备; (3) 连接设备; ( 4) 在不同设备之间传输数据。
系统流程如图:
在这里插入图片描述

(2). 绘图模块:

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

(3). 数据上传:

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

五. PC端上位机程序设计

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

🚀 获取工程代码及更多详细资料可点击链接进群领取,谢谢支持!👇

点击免费领取更多资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值