第二章 碰撞信号基础:加速度传感器原理、陀螺仪与角速度传感器、信号采集与滤波基础

各位同学,欢迎来到第二章。上一章我们聊了安全气囊系统到底是怎么工作的,说白了就是「撞了要炸,不撞别炸」。那问题来了——系统怎么知道「撞了」?靠的就是传感器。

这一章,我们重点讲碰撞信号的源头。我个人习惯把传感器比作安全气囊的「眼睛」和「耳朵」。眼睛看直线运动,耳朵听旋转运动。嗯,今天就把这两样东西彻底讲透。

2.1 加速度传感器原理

加速度传感器,说白了就是测量「速度变化快慢」的器件。你想想看,一辆车以50km/h匀速行驶,加速度是0。突然撞墙,速度在几十毫秒内降到0,那加速度就非常大。

安全气囊用的加速度传感器,量程通常在±50g到±200g之间。g是重力加速度,1g≈9.8m/s²。我做过一个项目,客户要求量程±100g,结果选型时发现某款传感器在低温下漂移严重……嗯,后来换了MEMS方案才搞定。

2.1.1 工作原理

目前主流的是MEMS电容式加速度传感器。内部有一个微小的质量块,固定在弹簧结构上。当有加速度时,质量块会移动,改变电容值。通过测量电容变化,就能反推出加速度。

公式很简单:

F = m × a
ΔC ∝ Δx ∝ a

力等于质量乘以加速度。电容变化量正比于位移变化量,位移变化量正比于加速度。我在调试时遇到过一个问题——输出信号噪声特别大。后来发现是电源纹波干扰,加了个LC滤波就好了。

2.1.2 关键参数

参数 说明 典型值
量程 可测量的最大加速度 ±100g ~ ±200g
灵敏度 每g对应的输出电压 10~40 mV/g
带宽 能响应的频率范围 DC ~ 1kHz
零偏 无加速度时的输出值 ±50mg
我的经验:选型时别只看量程。带宽也很关键。碰撞信号的频率成分主要在100Hz~400Hz之间,带宽太低会丢失细节。我曾经吃过这个亏,后来每次选型都先做频谱分析。

2.2 陀螺仪与角速度传感器

加速度传感器只能测直线运动。但车祸不一定是正面撞,也可能是侧面撞、翻滚。这时候就需要陀螺仪了。

陀螺仪测量的是角速度,单位是°/s。说白了就是「转得有多快」。我参与过一个翻滚检测项目,当时用的陀螺仪量程是±300°/s。结果测试时发现,车辆翻滚时角速度峰值能达到400°/s以上……嗯,后来换了±500°/s的型号。

2.2.1 工作原理

MEMS陀螺仪基于科里奥利效应。一个振动的质量块,当有角速度输入时,会受到科里奥利力,产生垂直于振动方向的位移。测量这个位移,就能得到角速度。

公式:

F_c = 2 × m × (v × ω)

其中F_c是科里奥利力,m是质量,v是振动速度,ω是角速度。说白了,振动越快、角速度越大,产生的力就越大。

注意:陀螺仪对振动非常敏感。我曾经在实车测试时,发现陀螺仪输出有大量毛刺。排查了半天,原来是发动机振动通过车身传递到了传感器模块。后来加了减震垫才解决。

2.2.2 加速度计 vs 陀螺仪

特性 加速度计 陀螺仪
测量对象 直线加速度 角速度
典型量程 ±100g ±300°/s
主要误差 零偏、噪声 零偏、温漂
应用场景 正面碰撞、侧面碰撞 翻滚检测、偏置碰撞

你想想看,为什么需要两种传感器?因为碰撞不一定是直线。比如25%偏置碰撞,车会旋转。只靠加速度计,你很难判断旋转程度。加上陀螺仪,就能准确识别翻滚。

2.3 信号采集与滤波基础

传感器输出的信号,不能直接用。为什么?因为太脏了。噪声、干扰、谐振……各种乱七八糟的东西混在里面。我刚开始做这行时,直接拿原始信号去触发算法,结果误报率高达30%。后来老老实实做滤波,误报率降到1%以下。

2.3.1 采样定理

采样频率必须大于信号最高频率的两倍。这是奈奎斯特定理,没得商量。碰撞信号的频率成分一般在400Hz以内,所以采样频率至少要800Hz。我习惯用1kHz以上,留点余量。

// 伪代码:采样配置
#define SAMPLE_RATE 1000  // 1kHz
#define SAMPLE_TIME 0.1   // 100ms
int samples[SAMPLE_RATE * SAMPLE_TIME];
关键点:采样频率太低会导致混叠。高频信号会伪装成低频信号,算法根本识别不出来。我曾经见过一个案例,采样频率设了500Hz,结果把200Hz的碰撞信号混叠成了50Hz的噪声……算法直接罢工。

2.3.2 低通滤波

低通滤波,说白了就是把高频噪声滤掉。碰撞信号是低频的,噪声是高频的。一滤一个准。

最简单的是一阶RC低通滤波:

// 一阶低通滤波
float lowpass_filter(float input, float prev_output, float alpha) {
    return alpha * input + (1 - alpha) * prev_output;
}
// alpha = T / (T + RC),T是采样周期

alpha值怎么选?我一般取0.1到0.3之间。alpha越大,滤波越弱,响应越快。alpha越小,滤波越强,但信号延迟也越大。这是个权衡。

避坑指南:我曾经把alpha设成0.05,滤波效果确实好,但信号延迟了20ms。安全气囊必须在30ms内点火,20ms延迟太致命了。后来我改成0.2,延迟降到5ms,噪声也还能接受。

2.3.3 带通滤波

有时候你只关心某个频率范围的信号。比如碰撞信号主要在100Hz~400Hz。低于100Hz可能是车辆颠簸,高于400Hz可能是发动机振动。这时候用带通滤波。

带通滤波可以串联一个高通和一个低通:

// 带通滤波:高通 + 低通
float highpass_filter(float input, float prev, float beta) {
    return beta * (prev + input - prev);
}
float bandpass_filter(float input, float state[], float alpha, float beta) {
    float hp = highpass_filter(input, state[0], beta);
    state[0] = hp;
    return lowpass_filter(hp, state[1], alpha);
}

嗯,代码看起来有点绕。但实际用起来很简单。你只需要调两个参数:高通截止频率和低通截止频率。

2.3.4 滑动平均滤波

还有一种简单粗暴的方法——滑动平均。取最近N个点的平均值。N越大,滤波越平滑,但延迟也越大。

// 滑动平均滤波
#define WINDOW_SIZE 5
float moving_average(float new_sample) {
    static float buffer[WINDOW_SIZE] = {0};
    static int index = 0;
    static float sum = 0;
    
    sum -= buffer[index];
    buffer[index] = new_sample;
    sum += buffer[index];
    index = (index + 1) % WINDOW_SIZE;
    
    return sum / WINDOW_SIZE;
}

我一般用窗口大小3到7。太小了没效果,太大了延迟高。你想想看,窗口大小10,采样频率1kHz,那就是10ms延迟。对于安全气囊来说,10ms已经不少了。

2.4 实战:传感器信号处理流程

好了,理论讲完了。我们来看一个完整的信号处理流程。这是我实际项目中用过的框架:

  1. 传感器原始数据:加速度计和陀螺仪输出模拟电压或数字值
  2. 去直流偏置:减去零偏值,得到真正的加速度/角速度
  3. 低通滤波:滤除高频噪声,截止频率400Hz
  4. 积分/微分:如果需要速度或位移,对加速度积分
  5. 特征提取:计算峰值、能量、持续时间等
  6. 算法判断:是否触发安全气囊
核心思想:信号处理不是越复杂越好。我见过有人用卡尔曼滤波、小波变换……效果确实好,但计算量太大,单片机跑不动。对于安全气囊,简单可靠的滤波就够了。别炫技,稳才是王道。

最后说一句。传感器和滤波是安全气囊算法的基石。基础不牢,地动山摇。我见过太多项目,算法写得天花乱坠,结果传感器信号都没处理好,最后误报、漏报一大堆。嗯,这一章的内容,值得你反复看。

下一章,我们讲碰撞信号的特征提取。到时候会用到今天学的滤波知识。别掉队。