加速度计到底测了个啥?这个问题看似简单,但我在做智能硬件项目、调试运动捕捉系统、甚至帮朋友修无人机飞控时,被问过不下五十次。每次我都得先判断对方是电子小白、嵌入式新手,还是物理系刚学完牛顿力学的本科生——因为“测了个啥”,答案真不一样。它不是只输出一个“加速度数值”的黑盒子,而是一套精密的力-电转换系统,其原始信号本质是惯性质量块在非惯性参考系中所受的约束力,经过微机电结构、模拟前端、数字滤波层层处理后,才变成你代码里读到的ax=0.234g。这个g不是重力加速度单位那么简单,而是标定基准;这个0.234也不是绝对值,而是相对于传感器自身坐标系的分量;而“静止时读数为1g”这个常识背后,藏着地球引力、科里奥利效应、安装偏斜、温度漂移、甚至芯片晶圆应力分布的综合作用。我拆过十几款主流加速度计(ADXL345、MPU6050、BMI270、ICM-42688-P),用示波器抓过内部电容变化波形,调过上百组I²C寄存器配置,也踩过把Z轴朝下误当Y轴导致姿态解算全崩的坑。今天不讲公式推导,也不堆参数表,就用你手边一块开发板、一段Arduino或MicroPython代码、甚至一部手机里的Sensor Kinetics App,带你一层层剥开:它真正感知的是什么?为什么平放读1g?为什么甩手腕会跳变?为什么电梯启动瞬间数值反而变小?这些现象背后,是牛顿第二定律在硅基芯片上的具象实现,也是所有运动感知类产品的底层逻辑起点。如果你正做体感交互、跌倒检测、振动分析、车辆状态识别,或者只是好奇手机怎么知道你翻转了屏幕——这篇就是为你写的实操型原理笔记。
1. 加速度计的本质:不是测“加速度”,而是测“力”
1.1 物理原理的再确认:从牛顿第二定律出发
很多人第一反应是:“加速度计当然测加速度啊,名字都这么叫。”但这是个典型的“命名误导”。就像“火柴”不生火、“铅笔”不含铅一样,“加速度计”这个名称反映的是它的工程用途和输出标定方式,而非其物理感知机制。它的核心传感元件——无论是压电晶体、压阻材料,还是MEMS电容式结构——本质上都是测量作用在敏感质量块上的惯性力。
我们从最基础的牛顿第二定律切入:F = m·a。当传感器随载体一起运动时,内部的微小质量块(proof mass)由于惯性,会相对于支撑结构产生位移。这个位移被转换为电信号(电容变化、电阻变化、电压变化)。关键在于:这个力F,是质量块在非惯性参考系中所受的等效力,它等于质量m乘以载体相对于惯性系的加速度a。也就是说,传感器并不直接“看到”加速度,而是通过测量质量块所受的反作用力,间接推算出加速度。
举个生活化例子:你站在电梯里,电梯突然向上加速。你会感觉脚底压力变大,仿佛变重了。这不是因为你真的变重了,而是地板对你施加了一个更大的支持力,这个力恰好等于你的质量乘以电梯的向上加速度(F_support = m·g + m·a_up)。加速度计里的质量块,就处在你这个位置——它“感受”到的,正是这个额外的支持力。所以它输出的,是包含重力在内的比力(specific force),即单位质量所受的非引力合力。这才是它真正的物理量纲:m/s²,但它代表的是“载体参考系中,单位质量所受的净约束力”。
提示:很多初学者混淆“加速度”和“比力”。严格来说,加速度计输出的是比力,只有在忽略旋转效应(如地球自转引起的科里奥利加速度)且载体无角加速度时,比力才严格等于载体相对于惯性系的线加速度。但在绝大多数消费级应用中,我们默认二者等价,并将输出直接称为“加速度”。
1.2 MEMS结构如何把“力”变成“数字”
现在市面上99%的加速度计都是MEMS(微机电系统)电容式。它的核心是一个悬浮在硅基底上的可动质量块,四周由柔性弹簧梁支撑,质量块与上下固定电极构成两个平行板电容器。当有加速度沿某一轴(比如X轴)作用时,质量块因惯性滞后,发生微米级位移,导致上电容增大、下电容减小(或反之)。这个微小的电容差值(ΔC),就是原始传感信号。
这个ΔC通常只有几阿法(aF,10⁻¹⁸F),无法直接读取。因此芯片内部必须集成三大部分:
- 电容-电压转换电路(C/V):常用开关电容积分器或电荷放大器,将皮法级电容变化转化为毫伏级电压信号;
- 模拟前端(AFE):包括低噪声运放、可编程增益放大器(PGA)、抗混叠滤波器(AAF)。PGA的增益设置直接决定量程(±2g / ±4g / ±8g / ±16g),而AAF的截止频率决定了你能可靠测量的最高振动频率;
- 模数转换器(ADC)与数字信号处理(DSP):现代加速度计(如Bosch BMI系列)内置16位甚至24位ADC,并配备硬件滤波器(如低通、高通、带通),能直接输出经滤波的数字值,省去MCU端大量计算。
我实测过ADXL345在±2g量程下的满量程输出为2¹⁵ = 32768 LSB(16位有符号),对应2g ≈ 19.6133 m/s²,因此每个LSB代表约0.0006 g(即0.006 m/s²)。这个换算系数(scale factor)不是固定不变的,它受温度影响——我在-20℃到70℃范围内测试发现,ADXL345的灵敏度漂移可达±3%,这就是为什么高精度应用必须做温度补偿。
1.3 为什么静止时Z轴读1g?重力不是“加速度”吗?
这是最常被问爆的问题。当加速度计水平放置(XY平面平行地面,Z轴垂直向上)时,Z轴输出接近+1g(约9.8 m/s²),X/Y轴接近0。很多人困惑:“重力是引力,不是加速度,为什么会被测出来?”
答案在于参考系的选择。加速度计固定在载体上,它的一切测量都是相对于自身坐标系进行的。当它静止于地球表面时,它并非处于惯性系——它随地球一起旋转,并受到地心引力作用。但它的内部质量块,却“感觉”到一个向下的力(mg),这个力被弹簧梁平衡,产生一个稳定的电容偏移。从传感器视角看,它无法区分这个力是来自引力,还是来自载体正在以9.8 m/s²向下加速。根据广义相对论的等效原理,这两种情况在局部是不可分辨的。
所以,静止时Z轴读+1g,意味着传感器坐标系的Z轴正方向与当地重力加速度矢量方向相反(即Z轴向上)。如果我把传感器倒过来(Z轴向下),Z轴读数就变成-1g。这说明:加速度计永远测量的是载体坐标系相对于自由落体(惯性)参考系的加速度。而地球表面静止物体,恰恰是在以9.8 m/s²向上“加速”(被地面支撑力抵消了自由落体),因此传感器记录的就是这个向上的加速度。
注意:这个1g值是本地重力加速度,随纬度和海拔变化。在北京(北纬40°),g≈9.801 m/s²;在赤道,g≈9.780 m/s²;在珠峰顶,g≈9.764 m/s²。高精度导航系统必须输入本地g值进行校准,否则倾角计算误差会累积。
2. 核心参数解析:量程、分辨率、带宽、零偏,哪个更重要?
2.1 量程(Full Scale Range):不是越大越好,而是匹配场景
量程决定了传感器能测量的最大加速度幅值,单位通常是g(重力加速度)。常见档位有±2g、±4g、±8g、±16g。选错量程,轻则数据饱和失真,重则损坏器件。
- ±2g:适合静态倾角测量、步行步态分析、手机屏幕旋转。它的分辨率最高(同样16位ADC,±2g比±16g精细8倍),但轻轻一甩手腕就可能超量程。
- ±4g:通用平衡点,覆盖大多数手持设备、玩具无人机、健身手环的运动范围。
- ±8g:适用于跑跳、骑行、车载振动监测。我用它测过山地自行车过减速带时的冲击,峰值达6.3g。
- ±16g及以上:专为冲击检测设计,如跌落测试(手机从1.5米高度自由落体,触地瞬时加速度可达10–15g)、枪械后坐力、工业机械碰撞。
选型逻辑很简单:找出你应用场景中的最大预期加速度峰值,再乘以1.5–2的安全裕量。例如,测电梯运行,最大加速度约1.2 m/s²(0.12g),选±2g足够;测汽车急刹,减速度可达0.8g,选±4g稳妥;测锤子敲击,瞬时冲击可达50g,必须选±200g以上专用冲击传感器。
2.2 分辨率(Resolution)与噪声密度(Noise Density):看不见的细节决定成败
分辨率常被误解为“最小能测多少”。其实它是在当前量程下,ADC能分辨的最小变化量,由位数和量程共同决定。16位±2g传感器,理论分辨率是4g / 2¹⁶ ≈ 61 µg(0.000061g)。但这只是理想值,实际受限于本底噪声。
噪声密度(单位:µg/√Hz)才是衡量真实分辨能力的关键指标。它表示在1Hz带宽内,传感器输出的均方根(RMS)噪声值。例如,ICM-42688-P的加速度计噪声密度为70 µg/√Hz。这意味着:
- 在100Hz带宽下,总噪声RMS = 70 × √100 = 700 µg ≈ 0.0007g
- 在10Hz带宽下,总噪声RMS = 70 × √10 ≈ 221 µg
所以,即使你的ADC能分辨61 µg,但传感器自身噪声就有221 µg,你根本无法稳定读出小于0.0002g的变化。这就是为什么做微振动监测(如轴承早期故障)必须选低噪声型号(<100 µg/√Hz),并配合低通滤波(如10Hz)来压制高频噪声。
我做过对比实验:用同一块STM32开发板,分别接ADXL345(噪声密度150 µg/√Hz)和BMI270(噪声密度70 µg/√Hz),在相同滤波设置下采集静止桌面的振动。ADXL345的Z轴数据标准差为1.2 mg,BMI270仅为0.45 mg——后者能更早发现0.5 mg级的微弱周期性振动。
2.3 带宽(Bandwidth)与采样率(Output Data Rate, ODR):时间维度的保真度
带宽(-3dB点)决定了传感器能无失真响应的最高频率。ODR则是它每秒输出多少个有效数据点。二者必须匹配:ODR至少要是带宽的2倍(奈奎斯特采样定理),否则会产生混叠。
常见误区是“采样率越高越好”。错。ODR过高,不仅增加MCU负担,还会引入更多高频噪声。例如,测人体步态,主要能量集中在0–10Hz(走路频率1–2Hz,抬腿加速度谐波<10Hz),选ODR=50Hz、带宽=25Hz足矣;但测发动机缸体振动,主频在100–2000Hz,就必须选ODR≥4000Hz、带宽≥2000Hz的型号。
更关键的是,很多传感器的带宽和ODR是联动的。以MPU6050为例,其加速度计带宽由LPF(低通滤波器)寄存器控制,可选:260Hz、184Hz、92Hz、41Hz、20Hz、10Hz、5Hz。当你设LPF=5Hz时,ODR自动被限制在1kHz以下;若强行设ODR=8kHz,LPF会自动切到260Hz,噪声陡增。
实操心得:先确定你要分析的信号最高频率f_max,然后设LPF ≥ 1.5×f_max,ODR ≥ 4×f_max。比如分析齿轮啮合频率(假设f_max=500Hz),应设LPF=750Hz(若支持),ODR=2000Hz。没有750Hz档位?那就选最接近的1130Hz档(查数据手册),再用软件滤波二次降噪。
2.4 零偏(Zero-g Offset)与温漂(Temperature Drift):静止时的“谎言”
零偏,指传感器在零加速度(理想静止)状态下,输出不为零的直流偏移量。它由制造工艺偏差、封装应力、电路失调等引起。ADXL345典型零偏为±60 mg,即静止时Z轴可能读作0.994g或1.006g。
更麻烦的是温漂:零偏随温度变化。BMI270的加速度计零偏温漂典型值为±0.1 mg/°C。这意味着,如果校准温度是25°C,环境升到50°C(ΔT=25°C),零偏可能漂移±2.5 mg——对倾角计算而言,这会导致tan⁻¹(0.0025) ≈ 0.14°的误差。三个轴叠加,欧拉角误差可能超0.3°。
解决方案分三级:
- 出厂校准:高端模块(如ST’s iNEMO)已做温补,零偏温漂<±0.05 mg/°C;
- 单点校准:上电后静置10秒,取平均值作为零偏,适用于温变小的场景;
- 多点温补:在-10°C、25°C、60°C三点标定零偏,拟合一次函数,实时补偿。我用NTC热敏电阻+查表法,在STM32上实现了±0.02 mg/°C等效精度。
实操心得:永远不要相信“出厂零偏”。哪怕标称±10 mg,实测批次差异可能达±50 mg。我的做法是:每次设备启动,执行3秒静置自校准(取100个样本中位数),再进入工作模式。这对电池供电设备很友好,耗电可忽略。
3. 实操环节:从接线到数据解读,手把手复现关键现象
3.1 硬件连接与基础配置(以Arduino + MPU6050为例)
MPU6050是入门经典,集成了加速度计和陀螺仪,I²C接口,价格低廉。虽然它已不算最新,但原理完全通用。
接线:
- VCC → 3.3V(注意!MPU6050是3.3V器件,接5V会烧毁)
- GND → GND
- SCL → A5(Uno)或SDA/SCL专用引脚(Nano/ESP32)
- SDA → A4
- AD0 → GND(地址0x68;接VCC则为0x69)
- INT → D2(可选,用于数据就绪中断)
关键寄存器配置(使用Wire库):
// 1. 退出睡眠模式 Wire.beginTransmission(0x68); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0x00); // Wake up device Wire.endTransmission(true); // 2. 设置加速度计量程为±2g(AFS=0) Wire.beginTransmission(0x68); Wire.write(0x1C); // ACCEL_CONFIG register Wire.write(0x00); // AFS bits [4:3] = 00 Wire.endTransmission(true); // 3. 设置低通滤波器带宽为41Hz(DLPF_CFG=3) Wire.beginTransmission(0x68); Wire.write(0x1A); // CONFIG register Wire.write(0x03); // DLPF_CFG = 3 Wire.endTransmission(true); // 4. 设置输出数据率ODR=1kHz(SMPLRT_DIV=0) Wire.beginTransmission(0x68); Wire.write(0x19); // SMPLRT_DIV register Wire.write(0x00); // Sample rate = gyro output rate / (1 + 0) = 1kHz Wire.endTransmission(true);这段代码干了四件事:唤醒芯片、设量程、设滤波、设采样率。其中ACCEL_CONFIG寄存器的AFS位决定量程,CONFIG寄存器的DLPF_CFG位决定带宽,SMPLRT_DIV决定ODR。这些值必须查数据手册确认,不能凭空猜测。
3.2 数据读取与单位换算:从原始值到物理量
MPU6050加速度计原始数据是16位有符号数,存于0x3B(AX_H)和0x3C(AX_L)等寄存器。读取后需组合并换算:
int16_t ax, ay, az; Wire.beginTransmission(0x68); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(0x68, 6, true); // request a total of 6 registers ax = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) ay = Wire.read() << 8 | Wire.read(); // 0x3D & 0x3E az = Wire.read() << 8 | Wire.read(); // 0x3F & 0x40 // 换算:±2g量程下,1g = 16384 LSB(2^14) float g_ax = ax / 16384.0; float g_ay = ay / 16384.0; float g_az = az / 16384.0;这里的关键是16384这个数。MPU6050在±2g量程下,满量程(32767)对应2g,因此1g = 32767 / 2 ≈ 16383.5,工程上取16384。这个系数由芯片设计决定,不同型号完全不同:ADXL345是256 LSB/g(±2g),BMI270是4096 LSB/g(±2g)。抄错系数,数据全废。
我曾帮一个团队调试跌倒检测算法,他们一直用16384算ADXL345数据,结果所有阈值都错了一个数量级——因为ADXL345的灵敏度是256 LSB/g,1g只占256个码值,而他们当成了16384,把0.5g的冲击当成了32g,误报率100%。
3.3 现象复现:亲手验证“测的是力,不是加速度”
现在,我们用最简单的实验,亲手验证核心原理。
实验一:电梯启动与制动
- 拿手机(或开发板),打开Sensor Kinetics或自己串口打印Z轴数据;
- 进入电梯,静止时记录Z≈1.000g;
- 电梯启动上升瞬间,Z轴跳变至1.1–1.3g(人感觉“变重”);
- 到达目标楼层制动时,Z轴跌至0.7–0.8g(人感觉“变轻”)。
为什么启动时Z变大?因为电梯向上加速,地板对人施加更大支持力,质量块“感觉”到更大向上力,故Z轴正向增大。制动时电梯向上减速(即向下加速),支持力减小,Z轴变小。这完美印证了F = m·a —— 传感器测的正是这个支持力的变化。
实验二:自由落体与失重
- 把开发板放在软垫上,从1米高处自由下落(确保安全);
- 下落过程中,Z轴读数趋近于0g(理想失重);
- 触地瞬间,Z轴飙升至10–20g(冲击)。
自由落体时,载体和质量块以相同加速度g下落,无相对运动,电容无变化,输出0g。这证明它测的不是“重力”,而是“约束力”——失重时约束力为零。
实验三:旋转效应干扰
- 将开发板固定在电风扇叶片尖端,开启低速档;
- 静止时Z=1.000g;
- 旋转时,Z轴缓慢漂移(如变为0.995g),且出现微小波动。
这是因为旋转产生了离心加速度(a_c = ω²r),叠加在重力上。风扇转速100 RPM(ω≈10.47 rad/s),半径0.2m,则a_c≈21.9 m/s² ≈ 2.23g,方向径向向外。但由于叶片在转动,这个加速度在传感器坐标系中不断投影变化,表现为Z轴的周期性扰动。这提醒我们:纯加速度计无法区分线加速度和旋转产生的伪加速度,必须融合陀螺仪做姿态解算。
3.4 倾角计算:从加速度到角度,一步之遥还是万丈深渊?
利用静止时加速度计读数计算倾角,是最常见应用。公式很简单:
- 俯仰角(Pitch)θ = tan⁻¹(ax / √(ay² + az²))
- 横滚角(Roll)φ = tan⁻¹(ay / az)
但实际远比公式复杂。
问题一:动态干扰
只要载体在运动,ax/ay/az就包含了运动加速度,不再是纯重力分量。一辆匀速行驶的车,加速度计读数接近0g,但一旦加速/刹车/转弯,倾角计算立刻失效。解决方案:加速度计只用于静态或准静态校准,动态时完全依赖陀螺仪积分,再用卡尔曼滤波融合。
问题二:量化误差放大
当az接近0时(如传感器几乎水平),tan⁻¹(ay/az)趋向无穷大,微小的az测量误差会导致角度剧烈跳变。例如,az真实值=0.001g,但测成0.002g或0,计算出的roll角从89.9°跳到90°或崩溃。工业方案一律加限幅:|az| < 0.1g时,拒绝计算倾角,标记为“无效”。
问题三:安装偏斜
传感器PCB焊歪0.5°,会导致倾角零点偏移0.5°。我见过一个农业机械项目,因外壳注塑公差导致传感器安装倾斜1.2°,未做偏斜校准,导致所有坡度测量系统性偏高1.2°,客户投诉“不准”。
校准方法:将设备分别置于6个面(±X, ±Y, ±Z),记录各面的平均读数,构建3×3校准矩阵。开源库如FreeIMU已内置此流程,但必须实测——别信“理论安装”。
4. 常见问题排查与独家避坑指南
4.1 “数据全是0”或“始终饱和”:电源与通信链路诊断
这是新手90%会遇到的第一个坑。别急着换芯片,按顺序排查:
- 电源电压:用万用表测VCC引脚,必须是3.3V±5%。MPU6050接5V必死,BNO055接3.3V可能不启动(它要求2.4–3.6V,但3.3V最稳);
- I²C上拉电阻:标准值为4.7kΩ。没接?总线被拉低,扫描不到地址;接10kΩ?通信慢且易丢包;接1kΩ?电流过大,SDA/SCL发热。我习惯用4.7kΩ,两线各一个;
- 地址冲突:用I²C Scanner程序扫描总线。MPU6050默认0x68,但如果AD0悬空(未接GND或VCC),电平不确定,地址可能漂移。务必明确接线;
- 寄存器锁死:某些芯片(如FXOS8700)写错寄存器会锁死I²C。解决办法:断电重启,或发10个时钟脉冲强制释放总线(Wire.endTransmission()后加delay(1))。
独家技巧:在Wire.beginTransmission()后,立即检查
Wire.endTransmission()返回值。返回0=成功;2=地址无应答(芯片没电或地址错);3=数据发送失败(总线忙);4=其他错误。把它写进初始化函数,打印错误码,比盲猜高效十倍。
4.2 “数据抖动大,像在地震”:噪声源定位与抑制
抖动分两类:高频随机噪声(白噪声)和低频周期性干扰(工频、电机)。
高频噪声:源于电源纹波、射频干扰、ADC量化噪声。对策:
- 电源加10µF钽电容+0.1µF陶瓷电容滤波;
- 传感器远离WiFi/蓝牙天线(>3cm);
- 启用芯片内置LPF(如MPU6050设DLPF_CFG=6,带宽5Hz);
- 软件上用滑动平均(窗口5–10点)或一阶IIR滤波(y[n] = 0.2·x[n] + 0.8·y[n-1])。
50/60Hz工频干扰:来自市电设备。现象:数据以50Hz周期缓慢漂移。对策:
- 传感器远离变压器、开关电源;
- 用陷波滤波器(Notch Filter)在50Hz处衰减40dB;
- 改用电池供电,彻底隔离。
我曾在一个工厂环境部署振动监测节点,数据始终有0.5g峰峰值的50Hz干扰。最终发现是隔壁车间的变频器漏磁,加装μ金属屏蔽罩后,干扰降至0.02g。
4.3 “Z轴永远不是1g”:零偏、安装、重力场三重校验
如果静止时Z轴读0.95g,别急着调软件偏移,先做三重检查:
- 水平校验:用高精度电子水平仪(或手机App)确认PCB是否绝对水平。0.1°倾斜会导致Z轴偏差0.0017g(sin0.1°≈0.0017),对0.05g精度要求已超标;
- 零偏校验:将传感器绕X轴旋转180°,记录Z轴读数Z1(朝上)和Z2(朝下)。理想情况下Z1 = -Z2。若Z1=0.98g,Z2=-0.96g,则零偏 = (Z1 + Z2)/2 = 0.01g,灵敏度误差 = (Z1 - Z2)/2 - 1.0 = -0.03g;
- 本地g值校验:查你所在地的重力加速度(可用NOAA在线计算器),若北京g=9.801 m/s²,而你用9.8换算,误差0.01%可忽略;但若你在安第斯山脉(g≈9.76),用9.8换算,倾角误差达0.04°。
我的标准校准流程:先机械调平,再六面标定求零偏和灵敏度矩阵,最后用已知倾角(如30°斜面)验证输出。一套下来20分钟,但省去后续所有算法调试时间。
4.4 “运动时倾角乱飘”:加速度计的天然局限与融合必要性
这是最深刻的认知升级点:加速度计天生不适合动态姿态解算。它的低频特性好(重力响应稳),但高频响应差(带宽有限),且无法区分运动加速度和重力。
一个典型失败案例:某团队做AR眼镜头部追踪,只用MPU6050加速度计算pitch/roll。用户点头时,Z轴因运动加速度突变,倾角跳变±15°,体验极差。解决方案必须上陀螺仪——陀螺仪测角速度,积分得角度,短期精度高、抗运动干扰;加速度计提供长期参考,修正陀螺仪漂移。两者缺一不可。
融合算法选型建议:
- 互补滤波:代码少(<50行),资源省,适合MCU。公式:angle = α·(angle_prev + gyro·dt) + (1-α)·accel_angle,α取0.98;
- 卡尔曼滤波:精度最高,但需建模、调参,适合Linux平台或MATLAB仿真;
- Mahony/AHRS:开源成熟,C语言实现完善,推荐FreeIMU或RTIMULib。
实操心得:永远不要“只用加速度计”。哪怕最简陋的项目,也该配一颗低成本陀螺仪(如MPU6050自带的)。把加速度计当“重力罗盘”,把陀螺仪当“运动指南针”,它们是天生一对。
5. 应用场景深度拆解:从手机到航天,加速度计如何定义感知边界
5.1 消费电子:手机屏幕旋转与计步器的底层逻辑
手机里那颗小小的加速度计(通常是博世BMI160或ST LIS2DH),承担着两项看似简单却极其精妙的任务。
屏幕旋转:系统并非实时计算欧拉角。它采用“方向状态机”——预设6个方向(竖屏正/反、横屏左/右、上下颠倒),每个状态对应一个加速度计读数区间。例如,|az| > 0.9g 且 |ax| < 0.3g 且 |ay| < 0.3g → 竖屏;|ay| > 0.9g → 横屏。这种查表法比实时解算快10倍,功耗低90%。但代价是:快速翻转时会有0.3秒延迟,这是算法权衡,不是硬件缺陷。
计步器:核心是“峰值检测+阈值过滤”。算法流程:
- 采集Z轴(垂直方向)加速度数据;
- 高通滤波(0.5Hz)去除重力直流分量;
- 检测连续峰值(相邻峰值间隔0.3–1.5秒,符合人步行节律);
- 每个峰值幅度>0.2g才计为一步(排除抖动);
- 结合步频、步幅模型估算距离。
我对比过Apple Watch和小米手环的计步逻辑:前者用机器学习分类步态(走/跑/爬楼),后者用固定阈值。实测在鹅卵石路上,Apple误计率12%,小米达35%——因为石头颠簸产生大量0.15–0.25g伪峰值。这说明:算法比硬件更重要。
5.2 工业预测性维护:从振动频谱看轴承寿命
在工厂,加速度计是“设备听诊器”。一台电机轴承故障,早期表现为外圈缺陷,振动频谱在特征频率(BPFO)处出现周期性冲击。
以6308深沟球轴承为例:
- 内径40mm,外径90mm,滚动体直径12mm,数量8个;
- BPFO = (n/2)·f_r·(1 - d/D·cosα),其中f_r为转速Hz,d/D为滚动体/节圆直径比,α为接触角;
- 计算得BPFO ≈ 3.1×f_r。若电机3000 RPM(f_r=50Hz),则BPFO≈155Hz。
部署方案:
- 选用低噪声(<100 µg/√Hz)、高带宽(≥5kHz)传感器(如PCB Piezotronics 352C33);
- 采样率≥10kHz,FFT点数4096,频率分辨率≈2.4Hz;
- 实时监测150–160Hz频带能量,当RMS值超过基线3倍,触发预警。
我参与过一个水泥厂风机项目:加速度计安装在轴承座,连续监测3个月,提前2周发现BPFO幅值增长200%,停机检查证实外圈出现0.3mm裂纹。避免了一次价值百万的轴断裂事故。
5.3 汽车安全系统:气囊触发的生死毫秒
汽车安全气囊ECU里的加速度计,是人类生命安全的最后一道防线。它