这个运动记录仪项目是我去年为一个大学生电子设计竞赛指导的作品,核心目标是用最基础的单片机实现专业运动手环80%的功能。当时参赛队伍只有500元预算,却要完成从硬件选型到算法调优的全流程开发。最终我们用了STM32F103C8T6这块"蓝色小药丸"(业内对这款性价比神器的昵称),配合三轴加速度计和蓝牙模块,做出了续航15天、误差小于3%的运动监测设备。
现在很多智能穿戴设备动不动就卖上千元,其实拆开看核心传感器成本不到50元。这个项目就是要证明:用最朴素的单片机方案,配合精心设计的算法,完全可以实现商业级产品的核心功能。特别适合电子专业学生练手,或者创客群体做二次开发。
主控芯片选了STM32F103C8T6,这块ARM Cortex-M3内核的芯片堪称单片机界的"五菱宏光"——72MHz主频、20KB RAM、64KB Flash,淘宝单价仅8元。相比Arduino方案,STM32的直接寄存器操作虽然学习曲线陡峭,但换来的是极致性能和控制精度。
运动检测采用MPU6050六轴传感器(实际只用三轴加速度计功能),这个指甲盖大小的模块同时包含加速度计和陀螺仪,通过I2C接口通信。它的特别之处在于内置了数字运动处理器(DMP),可以直接在芯片内完成姿态解算,减轻主控负担。
实测发现:MPU6050的DMP输出频率设置为100Hz时,既能满足运动检测需求,又不会过度消耗CPU资源。高于200Hz会导致明显的电源噪声干扰。
要让纽扣电池续航15天,必须做好以下几点:
c复制// 低功耗模式切换示例
void Enter_LowPower_Mode(void) {
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 500, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config(); // 唤醒后重新配置时钟
}
商业手环常用的是一种叫"峰值检测"的算法,我们做了简化版实现:
python复制# 伪代码示例
def step_detect(accel_data):
filtered = butter_lowpass(accel_data, cutoff=5Hz)
gravity = moving_average(filtered, window=10)
dynamic_accel = filtered - gravity
peaks = find_peaks(dynamic_accel, height=0.3g, distance=20)
return len(peaks)
市面上大多数设备用固定公式:卡路里=步数×0.04。我们改进为动态计算:
注意:运动算法必须做实地校准。我们在操场实测发现,穿硬底鞋时要把步长系数调高12%,女性用户的基础代谢率要下调8%。
在FreeRTOS和裸机编程之间,我们选择了更轻量的裸机方案,原因有三:
采用时间片轮询架构:
c复制void main() {
while(1) {
if(timer1_flag) { // 10ms定时
Sensor_Update();
timer1_flag = 0;
}
if(timer2_flag) { // 1s定时
Step_Algorithm();
timer2_flag = 0;
}
BLE_Process(); // 事件驱动
}
}
采用"环形缓冲区+闪存快照"的混合存储方案:
c复制typedef struct {
uint32_t timestamp;
uint16_t steps;
float calories;
} __attribute__((packed)) Record_t;
Record_t records[60*24*7]; // 存储7天数据
初期版本在蓝牙传输时会出现传感器数据跳变,原因是:
改进措施:
发现以下场景会产生误计数:
解决方案:
如果要产品化,还需要考虑:
这个项目的全部源码和PCB设计文件我都放在了GitHub上,搜索"STM32-Pedometer"就能找到。最难的部分其实是算法调参,建议先用Python仿真再移植到C语言,可以节省大量调试时间。