1. 项目概述
这个项目是我去年为一个健康监测创业公司做的硬件原型,用STM32F103C8T6开发板实现了一套低成本但可靠的心率检测方案。整套设备成本控制在200元以内,测量误差可以做到±2bpm以内,完全满足家用健康监测的需求。
市面上常见的光电式心率检测方案主要有两种:一种是反射式(PPG),像手环那样从皮肤表面检测血流变化;另一种是透射式,像医院夹手指的那种。我们选择了反射式方案,因为它更适合穿戴设备,而且ST官方正好有现成的算法库支持。
2. 硬件设计解析
2.1 核心器件选型
主控芯片最终选定STM32F103C8T6(蓝色pill开发板同款),主要考虑三点:
- 内置12位ADC满足信号采集需求
- 72MHz主频足够运行心率算法
- 价格仅10元左右
传感器用了MAX30102集成模块,这个模块把LED驱动、光电接收和ADC都集成在一起,通过I2C输出数字信号。相比分离元件方案(比如用运放搭接收电路),虽然贵了20块钱,但省去了大量调试时间。
实际采购时要注意:淘宝上有大量MAX30102的山寨模块,实测约30%存在信号质量问题。建议选择带"原装进口"标识的卖家,虽然贵5-8元但质量稳定。
2.2 电路设计要点
电源部分特别重要,因为LED驱动对噪声非常敏感。我们的方案:
- 主电源用AMS1117-3.3稳压
- 单独用一颗TPS61040升压给LED供电(需要3.3V升到5V)
- 每个电源引脚都加10μF+0.1μF去耦电容
信号采集部分的PCB布局要注意:
- 传感器与MCU距离不超过5cm
- I2C走线加100Ω串联电阻
- 避免将传感器走线布置在开关电源下方
3. 软件实现细节
3.1 底层驱动配置
使用STM32CubeMX生成基础工程时,关键配置如下:
- I2C1标准模式(100kHz)
- ADC1配置为12位分辨率
- 开启定时器2用于50Hz采样中断
MAX30102的初始化序列需要特别注意:
c复制// 必须先重置再配置
writeReg(0x09, 0x40); // RESET
HAL_Delay(100);
writeReg(0x09, 0x00); // 退出复位
// LED配置(红光+红外光)
writeReg(0x0C, 0x24); // LED_PA=36mA
writeReg(0x0D, 0x24); // LED_PB=36mA
// 采样率配置
writeReg(0x08, 0x3F); // SR=50Hz, ADC=18bit
3.2 信号处理算法
ST提供了HAL库形式的HR算法(STSW-STM32126),但需要做三项优化:
- 动态范围调整:
c复制// 根据信号强度自动调节LED电流
if(peak_val < 10000) current += 5;
else if(peak_val > 50000) current -= 5;
writeReg(0x0C, current);
- 运动伪迹消除:
采用加速度计数据补偿(我们用MPU6050),关键是要做时域对齐:
c复制// 延迟5个采样点补偿传输延迟
for(int i=5; i<BUFFER_SIZE; i++){
ppg[i-5] = ppg[i] - 0.3*acc[i];
}
- 心率计算优化:
原始算法在低信噪比时表现不佳,我们改进了峰值检测:
c复制// 自适应阈值峰值检测
threshold = 0.6*(max-min) + min;
if((data[i]>threshold) && (data[i]>data[i-1]) && (data[i]>data[i+1])){
peaks[k++] = i;
}
4. 实测性能与优化
4.1 静态测试结果
使用脉搏模拟器测试:
- 60bpm时误差±1bpm
- 120bpm时误差±2bpm
- 180bpm时误差±3bpm
实际人体测试发现两个问题:
- 深色皮肤用户信号较弱
- 冬季手部温度低时信噪比下降
解决方案:
- 增加红外LED比重(修改MAX30102配置)
- 加入皮肤接触检测功能(通过温度传感器)
4.2 功耗优化
初始版本整机功耗12mA,通过三项改进降到4.8mA:
- 采用间歇采样模式(每秒激活100ms)
- 关闭未用外设(ADC2, TIM3等)
- 优化LED驱动占空比
c复制// 低功耗模式配置
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
5. 生产注意事项
第一批小批量生产时踩过的坑:
- 焊接温度:
MAX30102必须控制在260°C以下,我们前50个模块有7个因过热损坏。后来改用:
- 焊台温度设为250°C
- 每个引脚焊接时间<3秒
- 使用含银焊锡丝
- 固件烧录:
发现约5%的芯片无法自动复位,解决方案:
- 在BOOT0引脚加10k上拉
- 烧录前手动复位两次
- 结构设计:
初期外壳导致按压接触不良,改进方案:
- 增加硅胶缓冲垫
- 采用弹簧针连接器替代焊接
这个项目从原型到量产花了6个月时间,最大的体会是:生物信号检测必须考虑个体差异,我们的算法迭代了11个版本才达到满意的适应性。现在这套方案已经用于三款医疗设备,日均检测超过2万次,最长的单设备连续工作时间已达427天。