第二章 碰撞信号基础:加速度传感器原理、陀螺仪与角速度传感器、信号采集与滤波基础
各位同学,欢迎来到第二章。上一章我们聊了安全气囊系统到底是怎么工作的,说白了就是「撞了要炸,不撞别炸」。那问题来了——系统怎么知道「撞了」?靠的就是传感器。
这一章,我们重点讲碰撞信号的源头。我个人习惯把传感器比作安全气囊的「眼睛」和「耳朵」。眼睛看直线运动,耳朵听旋转运动。嗯,今天就把这两样东西彻底讲透。
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 |
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];
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越小,滤波越强,但信号延迟也越大。这是个权衡。
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 实战:传感器信号处理流程
好了,理论讲完了。我们来看一个完整的信号处理流程。这是我实际项目中用过的框架:
- 传感器原始数据:加速度计和陀螺仪输出模拟电压或数字值
- 去直流偏置:减去零偏值,得到真正的加速度/角速度
- 低通滤波:滤除高频噪声,截止频率400Hz
- 积分/微分:如果需要速度或位移,对加速度积分
- 特征提取:计算峰值、能量、持续时间等
- 算法判断:是否触发安全气囊
最后说一句。传感器和滤波是安全气囊算法的基石。基础不牢,地动山摇。我见过太多项目,算法写得天花乱坠,结果传感器信号都没处理好,最后误报、漏报一大堆。嗯,这一章的内容,值得你反复看。
下一章,我们讲碰撞信号的特征提取。到时候会用到今天学的滤波知识。别掉队。