电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
玩转stm32,来完成一个简易心率计-软件进阶版
分 享
扫描二维码分享
玩转stm32,来完成一个简易心率计-软件进阶版
STM32
嵌入式
C语言
李肖遥
关注
发布时间: 2020-07-30
丨
阅读: 977
## 前言 自公元三世纪我国最早的脉学专著《脉经》问世,脉学理论就得到不断的发展,“望、闻、问、切”是中国传统医学中最具有特色的一种诊断方式之一,“把脉”也成为了医者诊断患者身体状况的重要途径,其中蕴含的丰富的信息为患者的诊断提供了重要依据。但是由于中医靠的是手指获取脉搏心率,虽然简单无创但是也暴露出一些缺陷,由于存在许多主观臆断因素,影响了对脉象判断的规范化;其次这种手法也很难把握,大大影响了其精度和可行性。 在1860年Vierordt创建了第一台杠杆式脉搏描记仪器,距今已经有一百多年的历史,脉搏波所呈现出的形态(波形)、强度(波幅)、速率(波速)和节律(周期)等方面的综合信息,在很大程度上反映出人体心血管系统中许多生理病理的血流特征,因此对脉搏波采集和处理具有很高的医学价值和应用前景,而国内20世纪50年代初期,心率相关仪器也被朱颜引用到中医脉诊的客观化研究中,并且取得了重大发展,为中国心率仪器的研究与发展方面奠定了扎实的基础。此后随着医疗器械的创新,电子科学技术的不断发展,国内外在研制中医心率检测仪方面取得了重要成果。尤其是在70年代中期,国内许多地方相继成立了跨学科的心率研究协作研究组,通过多学科共同合作,大大促进了中医心率研究的发展。目前,心率检测仪除了在医学领域被广泛应用之外,商业应用方面也都用到了比如运动、健身器材中的心率测试。而现在临床上使用的心电检测仪虽然功能强大,测量精度高,但是其价格昂贵携带不便,不利于家庭的普及。为了将传统的中医药学发扬光大,促进脉诊的应用和发展,必须与现代科技相结合,实现更科学、客观的诊断。 在先进科学技术的推动下,医疗仪器的相关技术日新月异,全球医疗仪器的发展朝微小化迈进。便携式、低功耗的心率计会越来越受到人们的青睐。在医学、电子学、工程技术领域科研中,心率计的研究一直是当中涉及的焦点,在人们不断的努力创新中,各种静态的、动态的心率计已经相继问世,并且随身携带和远程遥控,极大方便了人们的生活。在国外到06年底,已经开始研究可佩戴式心率计。植入人体式心率计。国内的心率计产品由于受相关科学水平及生产设备的限制,功能和集成度不及国外。随着电子技术的发展与创新,我国必定能迎难而上,实现技术上的突破,为人们创造出便携、精确的心率检测仪。 ## 系统的软件总体设计 ### stm32f103zet6 控制器 本系统采用32位的单片机stm32f103zet6来实现,系统要采用一个ADC,一个定时器,一个串口以及部分普通IO口,因为系统要采集脉搏信号,为了更加准确的得到心率值,本款单片机AD采集最高可达到14M,所以是最好的选择。在中断定时器中,通过一系列的计算、除噪、判断就可以得到最终的心率值。这里最主要介绍本系统要用到的电路模块。 ### stm32f103zet6 资源简介 STM32F103ZET6该芯片具有Cortex_M3内核、144管脚、64KB SRAM、512KB FLASH、2个基本定时器、4个通用定时器、2个高级定时器、3个SPI、2个IIC、5个串口、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口、1个FSMC接口以及112个通用IO口。该芯片的配置十分强悍,并且还带外部总线(FSMC)可以用来外扩SRAM 和连接LCD等,通过FSMC 驱动LCD ,可以显著提高LCD 的刷屏速度。本设计使用到了一个ADC,通过DMA传输方式,可以解放CPU进行更好的处理,而每当一次DMA过程结束后,触发 DMA完成中断,从而采集计算得到心率值。MCU的原理图如图所示。 ![](https://cf04.ickimg.com/bbsimages/202008/e14aeb4bb3c26a44a64840f25af4e1dc.png) ## 系统的软件实现 程序的功能:可以通过对ADC口的检测其数据和心电信号的采集,转换和处理,最后用显示屏显示心率值,还可以通过蓝牙把心率值发送到上位机APP。同时一旦心率不在设定范围之内,可以通过报警模块来提示,提醒用户注意自己身体。 程序流程分析过程中最基本的工具就是主程序流程图,它是程序分析中最基本、最重要的分析技术,也是整个设计的关键一步,是我们设计思路的具体体现。有了主程序流程图,我们就可以有根据把一个复杂的软件设计分解为若干个功能模块,然后逐一设计各个模块的功能。系统初始化之后,进行定时器中断、显示等工作,不同的外部硬件控制不同的子程序。 主程序流程图如图所示。 ![](https://cf04.ickimg.com/bbsimages/202008/f8461449c961b3cf6ee15e542ea4c3e1.png) ### 定时器中断程序 程序的功能:初始化IO口、UART口,并设定波特兰为115200,初始化定时器中断,如果检测到心跳,就把心率值发送到上位机APP中,并且把检测是否有心跳标志位清零,否则继续把心率值发送到上位机APP中,一直循环下去。定时器中断程序如图4-2所示。 ![](https://imgkr.cn-bj.ufileos.com/d6137b9f-72dd-41cf-983a-7290ab7e65c5.png) ### 上位机APP 程序 程序的功能:此程序要求android 4.3及以上系统,手机要求内置4.0蓝牙芯片,配置本机的蓝牙模块,搜索蓝牙设备,并且进行蓝牙socket通信,最后显示出串口发送来的心率值。 ![](https://imgkr.cn-bj.ufileos.com/63c0b404-386e-4d5c-8df9-04045ba93558.png) ## 系统调试 ### 程序设计 在软件设计中,一般采用模块化的程序设计方法,软件构造活动中的重要组成部分是给出解决特定问题程序的过程,把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,包括分析、设计、编码、测试、排错等等不同阶段。同时模块化编程也有利于程序的优化和分工,提高了程序的阅读性。各个程序模块都要完成一个明确的任务,实现某个具体的功能或者初始化某个系统,在具体需要时调用相应的模块即可。 心率值准确、脉搏波形完好都与传感器和手指的接触有很大关系,为了获得良好准确的实验效果,有以下注意事项: 1) 保持指尖与传感器接触良好,不要太用力按,否则血液循环不畅会影响测量效果。 2) 保持镇静,测量时身体不要过多移动,这个会影响测量效果。 3) 不要用冰凉的手指进行检测,因为血液循环不好会影响测量结果。 4) 测量过程中要保持测量背景光的恒定,减少背光的干扰。 ### 各模块调试 根据本系统设计方案,可以分为模拟信号调试部分、单片机控制电路部分、上位机APP调试部分。由于系统采用模块化设计,所以方便了对各个电路模块的逐级测试,能够清晰的发现其中的错误并且改进。 #### 传感器部分的调试 使用示波器测量,按照引脚顺序接好电源和地引脚。将示波器探头接到输出引脚(S),同时将示波器的时间扫描档放置到200ms左右,电压扫描档放置在2V左右,示波器探头设置为直流耦合(DC)。如图5-1所示,测得的波形如下,传感器是好的。 ![](https://imgkr.cn-bj.ufileos.com/35c2246e-214e-4703-8908-f4dfd5646abb.png) #### 串口的调试 程序主要通过USART串口输出数据,输出格式均为ASCII码,波特率为9600。以“S”为前缀的表示心率图的数值化表示;“B”为前缀的表示心率值;“Q”为前缀的表示IBI数值即相邻两个心跳之间的时间。“S”数据20ms发送一次数据量较大。“B”、“Q”数据只有在检测到有效心率的时候,在每一次心跳后发送一次,如图所示 ![](https://cf04.ickimg.com/bbsimages/202008/37c79cd0cb8941bb0f9d1fe446438b37.png) #### 上位机APP的调试 打开软件会出现如下界面,询问是否打开蓝牙,点击确定之后再扫描设备,当扫描到设备之后,连接到蓝牙。此时,蓝牙的提示红灯会停止闪烁。 ### 系统检测 系统上电后等待测试状态 系统在测试状态下的数据如下,其中Signal表示采集到的信号值,BPM为检查到心率值。左侧LED灯表示模拟心跳状态,测量中显示的数据,如图5所示 ![](https://cf04.ickimg.com/bbsimages/202008/bbb98220a171a3a99d35e71782bc46f2.png) ### 心率传感器部分程序 ``` #include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "lcd.h" #include "adc.h" #include "timer.h" #include "dma.h" #include "beep.h" #define true 1 #define false 0 int BPM = 0; // 存储心率值 int Signal; // 保存即将采集到的数据 int IBI = 600; // 脉搏跳动的时间差 unsigned char Pulse = false; // 脉冲高为真,低就false unsigned char QS = false; // 发现有脉冲就true. int rate[10]; // 用数组来保存过去10次的IBI值 unsigned long sampleCounter = 0; // 用于确定脉冲定时 unsigned long lastBeatTime = 0; // int P =512; //用于保存脉冲波峰 int T = 512; // 用于查找脉冲波槽 int thresh = 512; // 用于查找心跳的瞬间时刻 int amp = 100; // 用于保存脉冲波形的振幅 int Num; unsigned char firstBeat = true; // 放心率数组,我们可以开始在合理的心率值开始采集 unsigned char secondBeat = false; //放心率数组,我们可以开始在合理的心率值开始采集第二次 void sendDataToTFTLED(char symbol, int dat ); void DMA_Configuration(void); void Adc_Init(void); u8 t; u16 times=0; #define ADC1_DR_Address ((u32)0x4001244C) //就是ADC1的外设基地址(0x40012400)加上ADC数据寄存器(ADC_DR)的偏移地址(0x4c) u16 ADC_ConvertedValue=0xff; int fadeRate = 0; // used to fade LED on with PWM on fadePin /@@*********************************************************************** * Function Name : main * Description : 主函数 * Input : None * Output : None * Return : None ***********************************************************************/ int main(void) { delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); BEEP_Init(); //PB8 ,BEEP高低控制 TIM3_Int_Init(1999,71); Adc_Init() ; DMA_Configuration(); ADC_SoftwareStartConvCmd(ADC1, ENABLE); POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(30,30,200,16,16,"Welcome to the design"); POINT_COLOR=BROWN; LCD_ShowString(10,50,200,16,16,"Intelligent heart rate "); LCD_ShowString(10,70,200,16,16,"meter based on ARM design!"); POINT_COLOR=BRRED ; LCD_ShowString(100,90,200,16,16,"Hui Li"); LCD_ShowString(90,110,200,16,16,"2016/5/9"); //显示提示信息 POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(60,130,200,16,16,"Signal:"); LCD_ShowString(60,150,200,16,16,"BPM:"); while(1) { sendDataToTFTLED('B',BPM); if(BPM > 120) { BEEP = 0; } else BEEP = 1; sendDataToTFTLED('S', Signal); // 发送采集到的信号到显示屏上 LCD_ShowxNum(156,130,ADC_ConvertedValue,4,16,0);//显示ADC采集到的值 LCD_ShowxNum(156,150,BPM,4,16,0);//显示心率值 if (QS == true) { sendDataToTFTLED('B',BPM); // send heart rate with a 'B' prefix sendDataToTFTLED('Q',IBI); // send time between beats with a 'Q' prefix QS = false; // reset the Quantified Self flag for next time } delay_ms(200); //delay for 20ms } } ``` ## 总结 本次所设计的心率检测系统使用方便、应用广泛,具有实用价值,由于制作时间周期短,同时本人掌握的知识有限,本次设计虽然基本功能完成,但是其中还有很多不足之处,如程序冗余度高,心率传感器灵敏度不高,上位机显示不够美观等等问题。并且没有语音系统实现自动读取心率次数等人性化功能,在设计过程中模块复杂加大了电源管理的复杂度。然而随着科技的进步、医学的不断发展,势必会使心率检测仪的功能逐渐完善,应用领域也会不断扩大,携带也会更加方便。电子技术的不断发展,也将会给我们的生活带来更多健康的影响,带来更多的方便和精彩。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
李肖遥
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交