1. 项目背景与核心功能
这个基于STM32的心率血氧检测仪项目,本质上是一个典型的生物医学信号采集与分析系统。我在医疗电子领域工作多年,见过太多学生和工程师在这个看似简单的项目上栽跟头。实际上,要做出一个真正可用的检测仪,远比想象中复杂。
核心功能说起来很简单:通过光电传感器采集人体脉搏波信号,然后通过算法计算出心率和血氧饱和度(SpO2)两个关键生理参数。但魔鬼藏在细节里——从硬件选型到信号处理,从算法优化到临床验证,每个环节都有大量技术难点需要攻克。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件系统设计
2.1 主控芯片选型
STM32F103C8T6是这个项目最常见的选择,但我必须指出几个关键考量点:
- 72MHz主频足够处理双通道ADC数据
- 内置12位ADC,但实际有效位(ENOB)可能只有10位
- 需要至少2个定时器:一个用于PWM驱动LED,一个用于采样时序控制
经验之谈:很多人在ADC采样率设置上犯错。心率信号带宽通常<5Hz,按奈奎斯特定理10Hz采样足够,但实际需要50-100Hz采样才能保证波形完整性。
2.2 传感器方案对比
市场上常见的有三种方案:
- 分离式方案:红光LED(660nm)+红外LED(940nm)+光电二极管
- 集成模拟前端:如MAX30100(I2C接口)
- 数字式模块:如MAX30102(自带算法)
我强烈推荐初学者使用MAX30102,原因有三:
- 集成度极高,减少硬件设计风险
- 自带FIFO,缓解MCU处理压力
- 提供原始数据输出,适合算法研究
2.3 电路设计要点
电源部分最容易出问题:
- LED驱动需要恒流源,普通电阻限流会导致亮度不稳定
- 光电二极管需要跨阻放大器,增益选择很关键
- 必须加入硬件滤波电路(建议二阶有源低通)
一个实测有效的电路参数:
code复制LED驱动电流:红光20mA,红外10mA
跨阻增益:1MΩ(对应0.5μA光电流产生0.5V输出)
低通截止频率:5Hz(心率信号主要能量在0.5-3Hz)
3. 软件算法实现
3.1 信号预处理
原始信号通常包含:
- 基线漂移(呼吸运动导致)
- 工频干扰(50/60Hz)
- 运动伪影(最难处理)
我的预处理流水线:
- 移动平均滤波(窗口宽度=采样率/2)
