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使用、数据对齐这些实战内容。