立创开源:基于STC15单片机的便携式心电监护仪设计与实现
立创开源基于STC15单片机的便携式心电监护仪设计与实现最近有不少做毕业设计的朋友来问有没有一个既完整又容易上手的嵌入式项目可以学习。正好我之前参与了一个基于STC15单片机的便携式心电监护仪的开源项目觉得特别适合作为学习案例。它麻雀虽小五脏俱全涵盖了信号采集、模拟电路处理、单片机编程、算法实现和无线通信是一个典型的嵌入式系统综合实践。今天我就把这个项目的设计思路、硬件构成和软件实现掰开揉碎了给大家讲讲。无论你是想复刻一个实物还是单纯想学习其中的技术点相信都能有所收获。1. 项目背景与核心功能心脏病是威胁人类健康的主要因素之一。传统的心电监护设备往往价格昂贵、体积庞大难以满足日常随身监测的需求。因此开发一款低成本、便携式的心电监护仪让用户能随时了解自己的心脏状况具有很大的实用价值。我们这个项目实现的核心功能有三个实时心电波形显示与心率计算在设备自带的屏幕上画出心电图并实时计算出心率值。血氧饱和度测量集成MAX30102传感器可以测量血氧饱和度。双模式数据显示可以在设备本地屏幕显示也可以通过蓝牙将心电波形数据发送到电脑上位机进行显示和记录。心率异常告警当检测到心率过快或过慢时设备会发出警告。2. 硬件系统设计详解整个硬件系统可以看作由几个模块拼接而成主控、心电信号处理电路、血氧传感器、电源管理和人机交互。咱们一个个来看。2.1 核心大脑STC15单片机项目主控芯片选择了STC15W4K56S4系列单片机。这是一款基于8051内核的国产单片机性价比高资源丰富。供电单片机采用3.3V供电在设计电路时需要特别注意电平匹配。复位与下载芯片的P5.4引脚比较特殊将其拉低可以使单片机复位这个引脚也常用于配合串口进行程序烧录ISP下载。在画PCB时通常会把这个引脚通过一个跳线帽或测试点引出来方便调试和更新程序。注意STC15系列单片机下载程序需要冷启动即先点击下载按钮再给单片机上电。把P5.4脚通过一个按钮接到地就可以实现手动触发复位方便下载。2.2 心脏信号的“翻译官”心电处理电路心电信号极其微弱只有0.几毫伏并且混杂了大量干扰。我们的电路任务就是把这份微弱的“原始电报”放大并翻译成单片机ADC能清晰读取的“标准文书”。整个放大滤波电路的总增益设计为1250倍。电路采用五级级联设计每一级都有明确的任务第一级前置放大器增益7任务初步放大信号并引入右腿驱动电路。关键点右腿驱动是心电采集中的经典技术。它通过一个反向放大器将人体感应的共模干扰比如工频干扰反馈回去从而大幅抑制共模干扰提高信号质量。第二级107Hz低通滤波任务滤除高于107Hz的高频噪声比如肌电干扰肌肉颤动产生的高频电信号。第三级50Hz双T型有源陷波器任务专门针对最强的50Hz工频干扰进行滤除。双T网络能在一个非常窄的频率点这里调谐在50Hz产生极大的衰减像一把精准的手术刀切掉这个干扰。第四级0.1Hz高通滤波与放大增益50任务滤除因呼吸、身体缓慢移动造成的基线漂移一种低频干扰同时进行第二次主要放大。第五级最终放大增益≈5任务将信号幅度调整到最适合单片机ADC采样的范围例如0-3.3V。2.3 能量中心供电系统便携设备供电设计至关重要。本项目采用USB Type-C接口和3.7V锂电池双供电方案非常实用。自动切换与充电当插入USB线时系统自动切换为USB供电并同时通过TP4056充电管理芯片为锂电池充电。TP4056是一款线性充电芯片外围电路简单充电状态有LED指示非常适合这种小型设备。电池选用常见的850mAh的3.7V锂电池保证足够的续航时间。电压转换锂电池电压3.7V-4.2V和USB 5V电压都需要通过稳压电路转换为系统所需的3.3V。这部分电路在原理图中通过LDO低压差线性稳压器实现。2.4 其他关键硬件血氧传感器MAX30102通过I2C接口与单片机通信。它内部集成了红光和红外光LED、光电探测器以及环境光抑制电路单片机只需要读取它采集到的光强度数据即可。蓝牙模块用于将心电波形数据无线发送到电脑。通常选用HC-05、HC-08等串口透传模块单片机通过串口UART将数据发送给蓝牙模块模块再无线转发给电脑上位机。显示屏用于本地实时显示心电波形和心率、血氧数值。通常选用SPI或I2C接口的小尺寸OLED屏驱动简单显示效果好。3. 软件设计与算法实现硬件搭好了台子软件就是唱戏的主角。下面讲讲单片机里的程序是怎么工作的。3.1 心电波形绘制在屏幕上画出实时滚动的心电波形是直观显示功能的关键。ADC采样单片机以固定的时间间隔例如每秒200次对处理后的心电信号进行ADC采样得到一个代表电压的数值数组。坐标映射Y轴将ADC采样值比如0-4095按比例缩放到屏幕的像素高度范围内。X轴代表时间。每个新的采样点绘制在屏幕最右侧同时将所有已有的波形点向左移动一个像素实现“从左向右滚动”的效果。连线绘制为了波形更平滑不是在每个像素点画一个点而是在相邻两个采样点对应的屏幕坐标之间画一条直线连接起来。// 伪代码示例波形绘制逻辑 int adc_value Read_ADC(); // 读取当前ADC值 int y_pos SCREEN_HEIGHT - (adc_value * SCREEN_HEIGHT / ADC_MAX); // 计算Y坐标 // 将整个波形图像左移一个像素 Shift_Waveform_Left(); // 在当前最右侧的位置从上一次的点到当前点画线 Draw_Line(prev_x, prev_y, CURRENT_RIGHT_X, y_pos); // 更新前一个点的坐标 prev_y y_pos;3.2 心率计算与R波检测心率计算的核心是找到心电波形中的R波那个最高最尖的波峰并计算相邻R波的时间间隔。项目采用了简单快速的阈值法进行R波检测遍历数据程序循环检查ADC采样得到的心电数据数组。判断峰值对于每一个数据点检查它是否同时满足两个条件比它左边和右边的数据点都高是一个局部峰值。它的值超过一个预设的阈值。记录时刻如果满足条件就认为检测到了一个R波记录下这个时刻。计算心率连续记录多个R波出现的时间计算它们之间的平均时间间隔秒。心率次/分钟的计算公式为心率 60 / 平均R波间隔(秒)// 伪代码示例简单的阈值法R波检测 #define THRESHOLD 2500 // 阈值需要根据实际信号幅度调整 int Detect_R_Wave(int ecg_data[], int data_length) { for (int i 1; i data_length - 1; i) { // 判断是否为局部峰值且超过阈值 if (ecg_data[i] ecg_data[i-1] ecg_data[i] ecg_data[i1] ecg_data[i] THRESHOLD) { return i; // 返回检测到R波的位置索引 } } return -1; // 未检测到 }提示阈值法虽然简单快速但缺点也很明显阈值需要根据信号情况手动调整如果信号有大的基线漂移或噪声毛刺很容易误判。在实际产品中通常会使用更鲁棒的算法如Pan-Tompkins算法。3.3 血氧饱和度读取MAX30102传感器的驱动相对标准。初始化通过I2C配置传感器的工作模式、采样率、LED电流等参数。数据读取传感器将采集的数据存放在FIFO寄存器中。我们需要持续地通过I2C读取这些数据。每次读取得到红光Red和红外光IR两个通道的原始光强度值。注意数据通常是18位或19位的分3个字节存储需要按数据手册说明合并成一个完整的整型数。简化计算精确计算血氧饱和度SpO2需要分别计算红光和红外光信号的交流AC和直流DC分量公式复杂。为了在资源有限的单片机上快速实现项目采用了一个经验简化公式首先计算比值 R 红光数据 / 红外光数据。然后代入公式SpO2 120 - 25 * R。这个公式计算出的结果是一个近似值准确性不如医疗标准算法但用于趋势观察和简易评估是可行的。4. 上位机与项目演示为了方便在电脑上观察和记录更长时间的心电数据项目还配套了一个基于LabVIEW开发的简易上位机。功能通过蓝牙接收单片机发送来的心电波形数据并在电脑屏幕上实时绘制出来。作用解放了设备本地的屏幕可以用于更长时间的数据记录和回看分析也方便项目演示和调试。项目的实际运行效果包括心电波形显示、心率血氧测量、蓝牙数据传输等都可以在开源的视频链接中查看。从视频中可以看到整个系统已经能够稳定地工作实现了便携式心电监护的基本功能。5. 总结与思考这个基于STC15的便携心电监护仪项目是一个非常好的嵌入式系统入门到进阶的实践案例。它让你亲身体验了从模拟信号处理、数字采集、数据处理到无线通信的全流程。如果你要复现或借鉴这个项目有几个点可以深入优化R波检测算法可以尝试实现更稳健的Pan-Tompkins算法提高心率计算的抗干扰能力。血氧算法如果单片机资源允许可以尝试实现标准的“交流/直流分量法”来计算血氧提升准确性。低功耗设计作为便携设备可以优化程序在空闲时让单片机进入休眠模式并合理控制屏幕背光、传感器LED的开关大幅延长电池续航。数据存储可以加入SD卡模块将异常心电片段存储下来供后续分析。开源硬件和软件的魅力就在于你可以站在前人的肩膀上根据自己的需求和想法进行修改和提升。希望这个项目的详细解析能为你打开一扇通往嵌入式医疗电子或综合项目开发的大门。