4、加速度传感器详解:MEMS加速度计原理、三轴加速度数据解读、运动检测(静止/移动/旋转)、倾斜角计算
好,咱们进入第四章。加速度传感器,这玩意儿在剃须刀里可是个宝贝。你想想看,没有它,你怎么知道刀头现在是什么姿态?怎么判断用户是在刮胡子还是把剃须刀扔在桌上?
我个人习惯把加速度计比作「电子水平尺」。它不仅能告诉你平不平,还能告诉你动没动、转没转。今天咱们就把它的底裤扒干净。
4.1 MEMS加速度计原理:芯片里的弹簧秤
MEMS加速度计,说白了就是微米级别的弹簧秤。里面有个可移动的质量块,外面连着梳齿状的电容极板。当芯片加速时,质量块会偏移,电容值就变了。
我当年第一次接触MEMS时,总觉得这东西很玄乎。后来拆开一个报废的加速度计,用显微镜一看——嗯,就是一堆微小的梳子齿。没什么神秘的。
核心原理就三步:
- 质量块位移:加速度让质量块偏离中心位置
- 电容变化:梳齿间距改变,电容值跟着变
- 电压输出:电容转电压电路,输出模拟或数字信号
关键参数:量程(±2g / ±4g / ±8g / ±16g)、灵敏度(LSB/g)、零偏(0g时的输出值)、噪声密度(μg/√Hz)
在剃须刀项目里,我建议选±2g或±4g量程。为什么?因为剃须刀的运动加速度一般不超过1g,选大量程反而浪费分辨率。我曾经有个同事选了±16g,结果倾斜角计算精度差得离谱——这就是典型的杀鸡用牛刀。
4.2 三轴加速度数据解读:XYZ到底在说什么
三轴加速度计输出的是三个轴的加速度值,单位是g(重力加速度)。静止时,三个轴的平方和应该等于1g²。
公式很简单:
总加速度 = sqrt(X² + Y² + Z²)
静止时,这个值应该在0.98g ~ 1.02g之间。如果偏差太大,说明传感器有问题,或者你拿它在做自由落体运动。
举个例子,剃须刀平放在桌上:
| 轴 | 理论值 | 说明 |
|---|---|---|
| X | 0g | 水平方向,无重力分量 |
| Y | 0g | 水平方向,无重力分量 |
| Z | 1g | 垂直方向,重力全在Z轴 |
如果剃须刀竖起来,Z轴变成0g,X或Y轴变成±1g。你想想看,这就是倾斜角计算的基础。
避坑指南:我曾经在调试时发现数据跳动很大,查了半天发现是电源纹波太大。加速度计对电源很敏感,建议加个LC滤波,或者用LDO单独供电。
4.3 运动检测:静止、移动、旋转
运动检测是加速度计最常用的功能之一。说白了就是判断物体当前的状态。
4.3.1 静止检测
判断静止很简单:计算三轴加速度的方差。如果方差小于某个阈值,就认为静止。
// 静止检测伪代码
float variance = 0;
for (int i = 0; i < N; i++) {
variance += (accel[i] - mean)²;
}
variance /= N;
if (variance < THRESHOLD) {
// 静止状态
}
N一般取10~20个样本,阈值根据噪声水平调整。我习惯用0.01g²作为初始值,然后根据实际数据微调。
4.3.2 移动检测
移动检测看的是总加速度的变化。当总加速度偏离1g时,说明有外力作用。
这里有个坑:走路时加速度计会测到0.5g~2g的波动,但剃须刀在脸上移动时,加速度变化更平滑。所以阈值要分开设。
4.3.3 旋转检测
旋转检测稍微复杂点。单纯靠加速度计很难区分旋转和平移,因为加速度计测的是线加速度,不是角速度。
但有个技巧:如果物体绕某个轴旋转,重力分量会在另外两个轴上交替变化。比如绕Z轴旋转,X和Y轴的重力分量会呈正弦波变化。
注意:加速度计无法检测绕重力轴的旋转(即航向角变化)。如果你需要完整的姿态检测,必须加陀螺仪。这就是为什么IMU(惯性测量单元)要同时包含加速度计和陀螺仪。
4.4 倾斜角计算:从加速度到角度
倾斜角计算是加速度计最经典的应用。原理很简单:利用重力在三个轴上的分量,反推出物体的倾斜角度。
4.4.1 单轴倾斜角
如果只绕一个轴旋转,公式很直观:
angle = arcsin(axis_value / 1g)
比如绕Y轴旋转,X轴输出0.5g,那么倾斜角就是arcsin(0.5) = 30°。
4.4.2 双轴倾斜角(更常用)
实际项目中,我更推荐用双轴计算。因为单轴在接近90°时灵敏度会下降(正弦函数在90°附近变化平缓)。
// 绕X轴旋转的倾斜角(俯仰角)
pitch = atan2(Y, Z) * 180 / PI;
// 绕Y轴旋转的倾斜角(横滚角)
roll = atan2(-X, Z) * 180 / PI;
为什么用atan2?因为它能处理四个象限,输出范围是-180°到180°,而且不会出现除零错误。
经验之谈:我建议把角度计算放在定时中断里,每10ms算一次。太频繁了浪费CPU,太慢了跟不上运动。10ms对于剃须刀来说刚刚好。
4.4.3 倾斜角校准
加速度计有零偏和灵敏度误差,不校准的话角度误差可能达到5°以上。校准方法很简单:
- 水平放置,记录三轴输出(零偏)
- 翻转180°,记录三轴输出(灵敏度)
- 计算校准系数
// 校准公式
calibrated_value = (raw_value - zero_bias) * scale_factor;
我曾经在量产时发现每把剃须刀的零偏都不一样,后来加了个出厂校准流程,问题就解决了。嗯,这里要注意:校准数据要存到非易失性存储器里,不然断电就丢了。
4.5 实战:剃须刀姿态检测
最后,咱们把前面学的串起来。假设你要判断剃须刀是「平放」、「竖放」还是「倒置」:
// 姿态判断逻辑
float pitch = atan2(Y, Z) * 180 / PI;
float roll = atan2(-X, Z) * 180 / PI;
if (abs(pitch) < 15 && abs(roll) < 15) {
// 平放(Z轴朝上)
} else if (abs(pitch) > 75 && abs(roll) < 15) {
// 竖放(X轴朝上或朝下)
} else if (abs(roll) > 75 && abs(pitch) < 15) {
// 侧放(Y轴朝上或朝下)
} else {
// 其他姿态
}
这个逻辑我在项目里用过,效果不错。但要注意:阈值要根据实际使用场景调整。比如剃须刀放在充电座上时,角度可能不是完美的0°,所以阈值要留点余量。
小技巧:如果你发现角度数据抖动厉害,可以加个低通滤波。一阶RC滤波就够用:filtered = 0.9 * filtered + 0.1 * raw。系数根据采样率调整,采样率越高,系数越小。
好了,这一章就到这里。加速度计的内容其实很深,但咱们做剃须刀,掌握这些就够用了。下一章咱们聊陀螺仪,那玩意儿比加速度计有意思多了。