1. 加速度计基础:从原理到实战
大家好,我是老张。做嵌入式算法这些年,我接触最多的传感器就是加速度计。今天咱们聊聊手环里这个小东西——它到底怎么工作的?选型时要注意什么?
1.1 什么是加速度计?
加速度计,说白了就是测量物体运动状态的传感器。你把手环戴在手上,它能感知你是走路、跑步还是睡觉翻身。
它的核心原理其实很简单:内部有一个微小的质量块,当手环运动时,质量块会因惯性产生位移。通过检测这个位移,就能算出加速度值。
关键点:加速度计测量的是惯性力,不是速度。静止时它测的是重力加速度(1g ≈ 9.8 m/s²)。
我记得刚入行时,有个同事把加速度计平放在桌上,看到输出是0,以为传感器坏了。其实不是——它测的是重力方向,平放时Z轴应该是1g才对。
1.2 手环中常见的加速度计型号
目前主流手环用的加速度计,我列几个常见的:
| 型号 | 厂商 | 特点 |
|---|---|---|
| LIS3DH | ST | 低功耗,支持FIFO,适合手环 |
| BMA400 | Bosch | 超低功耗,自带步数检测 |
| ADXL345 | ADI | 经典款,资料多,适合入门 |
| ICM-20948 | InvenSense | 九轴(加速度+陀螺仪+磁力计) |
我个人习惯用LIS3DH,功耗低、FIFO好用,做计步算法很顺手。BMA400也不错,自带硬件计步,能省不少CPU资源。
小技巧:选型时别只看精度,功耗和封装尺寸更重要。手环电池就那么点大,功耗高了续航直接崩。
1.3 三轴加速度原理
三轴加速度计,就是能同时测量X、Y、Z三个方向的加速度。为什么是三个轴?因为我们的运动是三维的。
你想想看,手环戴在手腕上,手臂摆动时,加速度方向是变化的。单轴只能测一个方向,根本不够用。
三轴数据怎么用?举个例子:
- X轴:手臂左右摆动时的加速度
- Y轴:手臂前后摆动时的加速度
- Z轴:手臂上下运动时的加速度
实际项目中,我们通常用三轴合成后的矢量幅值来做分析:
// 三轴合成加速度
float acc_magnitude = sqrt(ax*ax + ay*ay + az*az);
为什么要合成?因为手环佩戴方向不固定,单轴数据受姿态影响太大。合成后的幅值,能更稳定地反映运动强度。
注意:合成幅值会丢失方向信息。如果你需要判断运动方向(比如走路还是跑步),还是要用原始三轴数据。
1.4 量程与灵敏度
这两个参数,选型时必须搞清楚。
量程就是加速度计能测量的最大加速度范围。常见的有±2g、±4g、±8g、±16g。
手环应用场景:
- 日常走路、跑步:±2g 或 ±4g 就够了
- 剧烈运动(跳跃、打球):建议 ±8g
- 摔倒检测:需要 ±16g
我曾经做过一个摔倒检测项目,一开始用了±2g量程,结果测试时用力摔手机,数据直接饱和了。后来换成±16g,才把冲击峰值抓出来。
灵敏度又叫分辨率,单位是LSB/g。它表示每1g加速度对应多少数字量。
举个例子:
// LIS3DH 在 ±2g 量程下
// 灵敏度 = 16384 LSB/g
// 读取原始值 32768,对应加速度 = 32768 / 16384 = 2g
| 量程 | 灵敏度 (LSB/g) | 适用场景 |
|---|---|---|
| ±2g | 16384 | 日常活动、睡眠监测 |
| ±4g | 8192 | 步行、慢跑 |
| ±8g | 4096 | 跑步、跳跃 |
| ±16g | 2048 | 摔倒检测、剧烈运动 |
核心原则:量程越大,灵敏度越低。选量程时,够用就行,别贪大。±2g的灵敏度是±16g的8倍,小信号检测能力更强。
嗯,这里要注意:手环静止时,Z轴输出约1g(重力)。如果你选±2g量程,那动态范围只剩±1g了。做剧烈运动检测时,很容易饱和。
我个人建议:手环项目默认选±4g或±8g,兼顾灵敏度和动态范围。除非你明确知道应用场景,再考虑其他量程。
1.5 避坑指南
最后分享几个我踩过的坑:
- 零偏问题:加速度计静止时输出不一定是0。我遇到过一批传感器,Z轴静止输出1.05g,偏了5%。这个需要在算法里做校准。
- 温度漂移:手环戴在手上,体温会影响传感器输出。冬天和夏天的数据可能不一样。
- 焊接应力:贴片焊接后,PCB形变会导致传感器输出偏移。我建议量产前做一次出厂校准。
好了,这一章就到这里。下一章我们聊聊加速度计的数据读取和预处理,包括I2C通信、FIFO使用、数据对齐这些实战内容。