1. 项目背景与核心功能
智能穿戴设备已经成为现代人健康管理的重要工具。作为一名嵌入式开发者,我最近完成了一个基于STM32F103的智能手环项目,实现了计步和心率监测两大核心功能。这个方案成本控制在百元以内,非常适合作为学生毕业设计或创客项目参考。
选择STM32F103C8T6作为主控芯片主要基于三点考虑:首先是性价比,这款Cortex-M3内核的MCU价格仅10元左右;其次是生态完善,有丰富的开发资料和社区支持;最后是性能足够,72MHz主频配合硬件I2C/SPI接口能很好地处理传感器数据。整个项目开发周期约两周,其中传感器调试和算法优化占了大部分时间。
2. 硬件设计与元件选型
2.1 核心硬件架构
系统采用模块化设计,主要包含以下部件:
- 主控:STM32F103C8T6最小系统板(含USB转串口芯片)
- 运动传感器:MPU6050六轴加速度计(计步功能)
- 光学传感器:MAX30102(心率血氧检测)
- 显示模块:0.96寸OLED(SSD1306驱动)
- 电源管理:TP4056充电芯片+3.7V锂电池
- 其他:振动马达、按键、蜂鸣器等外设
特别提醒:MAX30102需要特别注意PCB布局,传感器与皮肤接触面的透光孔设计直接影响测量精度。建议参考官方的光学结构设计指南。
2.2 关键元件参数对比
| 元件 | 型号 | 关键参数 | 成本 |
|---|---|---|---|
| 主控 | STM32F103C8T6 | 72MHz, 64KB Flash, 20KB RAM | ¥9.8 |
| 加速度计 | MPU6050 | ±2/4/8/16g可调, I2C接口 | ¥6.5 |
| 心率模块 | MAX30102 | 采样率50-3200Hz, 红光/IR双LED | ¥18.0 |
| 显示屏 | SSD1306 | 128x64分辨率, I2C接口 | ¥12.0 |
选择MPU6050而非更专业的计步芯片(如BMA400)是因为它集成度高且价格低廉,虽然需要自行实现计步算法。MAX30102则是目前开源方案中最成熟的光学心率方案,相比同类产品(如HRM2511)具有更好的抗运动干扰能力。
3. 软件架构与核心算法
3.1 系统软件框架
采用裸机开发(非RTOS)以降低复杂度,主程序流程如下:
- 硬件初始化(时钟、外设、传感器)
- 进入主循环:
- 读取传感器数据(定时器触发)
- 执行计步/心率算法
- 更新显示和状态指示
- 处理低功耗模式
c复制while(1) {
if(timer_flag) { // 10ms定时中断
timer_flag = 0;
Read_Sensors();
Step_Algorithm();
HR_Algorithm();
Update_Display();
}
Power_Management();
}
3.2 计步算法实现
采用基于阈值的三轴加速度计算法,主要步骤:
-
数据预处理:
- 原始数据校准(去除重力影响)
- 三轴向量合成:√(x²+y²+z²)
- 低通滤波(截止频率5Hz)
-
特征提取:
- 寻找波峰波谷(窗口比较法)
- 有效步判断条件:
- 波峰-波谷差值 > 阈值(实测1.2g较合适)
- 步频在0.5-3Hz范围内
- 连续3个有效周期才计为1步
c复制#define STEP_THRESHOLD 1.2f // 重力加速度单位
if((peak_valley > STEP_THRESHOLD) &&
(interval > 333) && (interval < 2000)) {
step_count++;
last_step_time = current_time;
}
3.3 心率算法实现
MAX30102提供原始光电容积图(PPG)数据,处理流程:
-
信号预处理:
- DC分量去除(高通滤波)
- 50Hz工频滤波(带阻)
- 运动伪迹消除(自适应滤波)
-
特征提取:
- 寻找PPG波形峰值
- 计算RR间期(峰值间距)
- 转换为心率值:HR = 60/RR(s)
实测发现,静止状态下算法误差在±3bpm内,但运动状态下需要结合加速度数据进行补偿。建议采用滑动平均(窗口8-10个周期)提高稳定性。
4. 低功耗设计与优化
4.1 功耗分布实测
| 工作模式 | 电流消耗 | 优化措施 |
|---|---|---|
| 全速运行 | 12.8mA | 降低主频至48MHz |
| 仅心率监测 | 4.2mA | 关闭OLED和MPU6050 |
| 睡眠模式 | 0.8mA | 外设全部掉电 |
4.2 关键优化技巧
-
动态频率调整:
- 数据显示期间:72MHz
- 仅传感器工作时:48MHz
- 空闲时:切到HSI时钟源
-
外设管理:
- OLED仅在抬手亮屏时供电
- MPU6050设置自动休眠模式
- MAX30102采样间隔可调(监测时50Hz,待机时10Hz)
-
代码优化:
- 避免轮询等待(改用中断)
- 减少浮点运算(改用Q格式定点数)
- 关键函数使用寄存器操作
c复制void Enter_Low_Power(void) {
RCC->CFGR &= ~RCC_CFGR_HPRE_DIV1; // AHB分频
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
SystemClock_Config(); // 唤醒后恢复时钟
}
5. 常见问题与解决方案
5.1 计步不准问题排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 静止时误计步 | 阈值设置过低 | 增大STEP_THRESHOLD参数 |
| 快速行走漏计 | 采样率不足 | 提高MPU6050输出速率(≥50Hz) |
| 仅特定方向有效 | 轴向未校准 | 执行6面校准程序 |
5.2 心率测量异常处理
-
信号质量差:
- 确保传感器贴合皮肤
- 增加LED电流(MAX30102可调至18.6mA)
- 涂抹少量清水增强光学耦合
-
运动干扰:
- 启用内置的FIFO缓冲
- 实现运动补偿算法(参考:
c复制motion_level = sqrt(acc_x*acc_x + acc_y*acc_y); if(motion_level > 0.2g) adjust_hr_algorithm(); ```)
-
数据漂移:
- 定期执行DC重置(每5分钟)
- 添加基线跟踪滤波器
6. 项目进阶方向
完成基础功能后,可以考虑以下扩展:
-
无线传输:
- 添加蓝牙模块(HC-05)连接手机
- 实现NFC刷卡功能(PN532模块)
-
功能增强:
- 睡眠质量监测(结合加速度和心率变异性)
- 体温检测(加入MLX90614红外传感器)
-
算法优化:
- 机器学习计步(TensorFlow Lite for MCU)
- 多模态心率融合(PPG+ECG)
这个项目最让我惊喜的是MAX30102的表现——虽然只是几十元的传感器,但经过合适的算法处理,其心率检测精度接近商业产品。下一步我计划移植FreeRTOS来实现更复杂的功能调度,同时尝试将功耗控制在200μA以下以实现一周续航
