1. 项目背景与核心价值
作为一名长期从事嵌入式医疗设备开发的工程师,我一直在寻找一种能够兼顾便携性和专业性的心率监测方案。市面上的消费级手环虽然方便,但精度有限;而专业医疗设备又过于笨重昂贵。这次基于STM32的双模心率检测仪设计,正是为了解决这个痛点。
这个项目的核心创新点在于同时整合了光电式(PPG)和心电式(ECG)两种检测方式。MAX30102模块通过指尖或手腕测量血流变化,适合日常连续监测;AD8232模块则采用标准三导联采集心电信号,在需要更高精度的场景下使用。两种模式的数据可以相互验证,显著提高了测量的可靠性。
实际测试中发现,运动状态下的光电心率容易受"运动伪影"干扰,而心电信号则相对稳定。这时双模设计的优势就体现出来了——系统会自动选择更可靠的数据源。
2. 硬件架构设计解析
2.1 主控选型与关键考量
选择STM32F103C8T6作为主控主要基于以下几点考虑:
- ADC性能:内置12位ADC,采样率最高1MHz,完全满足心电信号(通常<250Hz)和光电信号(100Hz)的采集需求
- 外设接口:具备I2C、SPI、UART等丰富接口,可同时连接多个传感器模块
- 运算能力:72MHz主频配合硬件浮点运算,能实时处理滤波、峰值检测等算法
- 低功耗特性:支持多种休眠模式,在Stop Mode下电流仅10μA
2.2 传感器模块对比选型
光电传感器方案对比
| 型号 | 检测参数 | 接口 | 功耗 | 选择理由 |
|---|---|---|---|---|
| MAX30102 | 心率+血氧 | I2C | 0.7mA | 集成度高,自带环境光抑制 |
| MAX30100 | 心率+血氧 | I2C | 0.6mA | 旧型号,缺货 |
| BH1790GLC | 仅心率 | I2C | 0.3mA | 功能单一 |
最终选择MAX30102不仅因为其双参数检测能力,更看重其内置的运动伪影抑制算法。实际使用中,通过调整LED驱动电流(7-50mA可调)可以适应不同肤色用户的测量需求。
心电传感器关键参数
AD8232作为专业级心电前端芯片,其设计要点包括:
- 高增益:设置增益=1000倍,将mV级心电信号放大到适合ADC采集的范围
- 带通滤波:0.5-40Hz带宽有效抑制基线漂移(<0.5Hz)和肌电干扰(>40Hz)
- 右腿驱动:通过RL电极形成闭环反馈,显著降低50Hz工频干扰
实测中发现,若省略右腿驱动电极,信号质量会下降约30%。建议使用带屏蔽层的导联线,并将STM32金属外壳接地。
2.3 电源管理设计细节
电源系统采用分级设计策略:
- 充电管理:TP4056芯片提供500mA恒流/恒压充电,充满自动截止
- 电压转换:AMS1117-3.3V将锂电池电压稳定在3.3V,纹波<50mV
- 动态供电:
- 传感器模块单独供电,不用时可断电
- OLED屏采用PWM调光,亮度根据环境光自动调整
- 无线模块仅在传输时唤醒
实测功耗数据:
- 连续工作模式:12.8mA
- 间歇采样模式(每秒唤醒一次):平均1.2mA
- 深度休眠模式:8.5μA
3. 软件实现关键技术
3.1 信号采集的时序控制
系统采用中断驱动架构保证实时性:
c复制// 定时器3配置(100Hz中断,用于MAX30102采样)
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_InitStruct.TIM_Prescaler = 7200 - 1; // 72MHz/7200 = 10kHz
TIM_InitStruct.TIM_Period = 100 - 1; // 10kHz/100 = 100Hz
TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM3_IRQn);
// 定时器2配置(250Hz中断,用于AD8232采样)
TIM_InitStruct.TIM_Prescaler = 720 - 1; // 72MHz/720 = 100kHz
TIM_InitStruct.TIM_Period = 400 - 1; // 100kHz/400 = 250Hz
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
两个定时器中断的优先级需要精心设置:
- 心电采样(TIM2)设为最高优先级,因为信号频带更宽
- 光电采样(TIM3)次之
- 无线传输等后台任务使用低优先级
3.2 信号处理算法优化
光电信号处理流程
- 直流去除:采用滑动平均滤波器
c复制#define WINDOW_SIZE 10 float moving_average(float new_sample) { static float buffer[WINDOW_SIZE]; static int index = 0; buffer[index] = new_sample; index = (index + 1) % WINDOW_SIZE; float sum = 0; for(int i=0; i<WINDOW_SIZE; i++) { sum += buffer[i]; } return sum / WINDOW_SIZE; } - 峰值检测:改进的动态阈值算法
- 阈值 = 前5个峰值的平均值 × 0.7
- 最小峰间距 = 对应心率200bpm的间隔(300ms)
心电信号处理创新点
- 基于小波的噪声抑制:
- 使用Haar小波变换分解信号
- 抑制高频系数中的噪声成分
- 重构信号保留QRS波特征
- 改进的Pan-Tompkins算法:
c复制void QRS_Detect(float ecg_signal) { // 1. 带通滤波(5-15Hz) static float bp_filtered = butterworth_bandpass(ecg_signal); // 2. 微分求斜率 static float diff = bp_filtered - last_sample; // 3. 平方放大差异 static float squared = diff * diff; // 4. 移动窗口积分(30ms窗口) static float integrated = moving_integration(squared, 30ms); // 5. 自适应阈值检测 if(integrated > dynamic_threshold) { mark_as_QRS(); update_threshold(); } }
3.3 低功耗管理策略
系统状态机设计:
mermaid复制stateDiagram
[*] --> DeepSleep: 无操作30s
DeepSleep --> Sampling: 定时唤醒
Sampling --> Processing: 数据就绪
Processing --> Wireless: 需要传输
Wireless --> DeepSleep: 传输完成
具体实现技巧:
- 外设分级断电:
c复制void enter_low_power() { // 关闭非必要外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, DISABLE); // 配置GPIO为模拟输入(漏电流最小) GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStruct); } - 动态频率调整:
- 采样期间:72MHz全速运行
- 空闲期间:降频至8MHz
- 休眠期间:切换至内部HSI时钟
4. 系统测试与性能优化
4.1 关键指标测试方法
心率精度测试方案
- 使用Fluke ProSim8生命体征模拟器生成标准ECG信号
- 同时连接商用心电监护仪(作为基准)和本设备
- 对比不同心率下(60-180bpm)的测量差异
测试数据示例:
| 设定心率 | 本设备测量值 | 误差 |
|---|---|---|
| 60bpm | 61bpm | +1 |
| 120bpm | 118bpm | -2 |
| 180bpm | 176bpm | -4 |
抗干扰测试
- 在电磁干扰环境(如靠近手机)下测试
- 运动状态测试(手臂摆动、步行、跑步)
- 不同肤色受试者测试(Fitzpatrick量表I-VI型)
4.2 常见问题解决方案
光电信号不稳定的处理
- 佩戴问题:
- 确保传感器与皮肤紧密接触
- 避免强光直射传感器区域
- 不同季节考虑皮肤湿度影响
- 算法优化:
- 增加信号质量指数(SQI)评估
- 动态调整采样率和LED电流
心电基线漂移对策
- 硬件层面:
- 使用Ag/AgCl电极
- 电极粘贴前用酒精清洁皮肤
- 软件层面:
- 采用中值滤波去除突发干扰
- 实现基线跟踪补偿算法
5. 项目扩展与改进方向
在实际部署中,我们发现几个有价值的改进点:
-
多模态数据融合:
- 当光电和心电数据差异>10%时触发复核
- 采用卡尔曼滤波融合两种信号源
-
云端智能分析:
python复制# 示例:使用LSTM网络检测心律失常 model = Sequential() model.add(LSTM(64, input_shape=(250,1))) model.add(Dense(3, activation='softmax')) # 分类:正常/房颤/室性早搏 -
硬件迭代方案:
- 升级到STM32U5系列,功耗降低80%
- 改用MAX86150传感器,增加血压监测功能
- 添加BLE5.2实现手机直连
这个项目最让我自豪的是其临床实用性——在某社区医院的三个月试用期间,成功检测出2例潜在房颤病例。后续计划加入呼吸率检测功能,使其成为真正的多参数健康监护平台。