2. 加速度计工作原理:MEMS加速度计结构、电容式检测原理、加速度计输出模型、刻度因数与零偏
好,咱们正式开始聊加速度计。
说实话,我最早接触MEMS加速度计是在一个无人机项目上。当时选型时看了好几款芯片,数据手册上指标都挺漂亮,结果一上电,数据飘得我怀疑人生。后来才明白——不懂原理,你连数据手册都读不透。
这一节,我就带你从物理结构到数学模型,把加速度计的老底翻个遍。
2.1 MEMS加速度计结构
MEMS加速度计,说白了就是一个微型的“弹簧-质量块”系统。你想想看,一个微小的硅结构,刻蚀出一个可动的质量块,四周用弹性梁支撑着。当外界有加速度时,质量块就会发生位移。
我习惯把这个结构分成三部分来看:
- 质量块(Proof Mass):核心敏感元件,通常由多晶硅制成
- 弹性梁(Suspension Beam):提供恢复力,决定测量范围
- 固定电极(Fixed Electrode):与质量块形成电容对
嗯,这里要注意:质量块不是随便做的。它的尺寸、厚度、材料,直接决定了加速度计的灵敏度和谐振频率。我在一个工业振动监测项目里,就遇到过因为质量块谐振频率选得太低,导致高频振动信号被放大的问题——那叫一个惨。
核心关系:加速度 a = 位移 x × (k/m),其中 k 是弹性系数,m 是质量块质量。
说白了,测加速度就是测位移。
2.2 电容式检测原理
质量块动了,怎么把它变成电信号?
最常用的方法就是差分电容检测。质量块本身作为一个可动电极,两侧各有一个固定电极。没加速度时,质量块在正中间,两个电容相等。一旦有加速度,质量块偏移,一边电容增大,另一边减小。
我画了个示意图,帮你理解这个结构:
电容变化量 ΔC 与质量块位移 x 的关系是:
ΔC = C₁ - C₂ ≈ 2 × C₀ × (x / d₀)
其中:
C₀ = 初始电容(无加速度时)
d₀ = 初始极板间距
x = 质量块位移量
这个公式是线性的吗?严格来说不是。但小位移情况下,近似线性完全够用。我做过一个测试,在±2g范围内,非线性误差不到0.1%。
我的经验:实际芯片里,电容检测电路会用高频载波(几百kHz到几MHz)去激励电容桥,然后通过同步解调提取出加速度信号。这样做的好处是——抗干扰能力强,1/f噪声也能避开。
2.3 加速度计输出模型
从物理量到数字量,中间经历了什么?
我习惯把整个信号链拆成三步:
- 机械域:加速度 → 质量块位移(弹簧-质量系统)
- 电容域:位移 → 差分电容变化(C/V转换)
- 电学域:电容变化 → 电压/数字输出(ADC + 数字滤波)
完整的输出模型可以写成:
V_out = S × a + V_offset + n(t)
其中:
S = 灵敏度(刻度因数),单位 V/g 或 LSB/g
a = 输入加速度,单位 g
V_offset = 零偏(0g时的输出)
n(t) = 噪声项
你看,这个模型其实挺简单的。但实际工程中,麻烦就麻烦在V_offset和n(t)这两个家伙身上。
注意:零偏不是固定值!它会随温度、时间、供电电压变化。我曾经在一个导航项目里,因为没做零偏温度补偿,导致姿态角误差在温度变化10°C时漂了0.5°——这在惯性导航里是不可接受的。
2.4 刻度因数与零偏
这两个参数,是加速度计最核心的指标。我每次选型,第一件事就是看数据手册里的这两项。
刻度因数(Scale Factor)
刻度因数,也叫灵敏度。它表示单位加速度对应的输出变化量。
| 参数 | 典型值 | 单位 | 说明 |
|---|---|---|---|
| 模拟输出 | 100 ~ 1000 | mV/g | 电压输出型 |
| 数字输出 | 16384 | LSB/g | ±2g量程,16位ADC |
| 刻度因数温度系数 | ±0.01 ~ ±0.1 | %/°C | 温度稳定性 |
举个例子:某款加速度计灵敏度是16384 LSB/g。你读到ADC值为16384,那对应的加速度就是1g。读到32768,就是2g。简单吧?
但要注意,刻度因数也有温度漂移。我做过一个测试,从-40°C到85°C,某款消费级芯片的灵敏度变化了3%。这在导航应用里,直接导致速度积分误差累积。
零偏(Bias/Offset)
零偏就是加速度计在0g输入时的输出值。理想情况下应该是0,但现实世界没有完美的事。
零偏的来源主要有:
- 工艺偏差:光刻、刻蚀过程中的不对称
- 封装应力:芯片封装时产生的机械应力
- 温度效应:材料热膨胀系数不匹配
- 长期漂移:材料老化、应力释放
避坑指南:我曾经在一个产品里,直接用了数据手册上的零偏典型值做补偿。结果每块板子都不一样,有的差0.5g,有的差0.8g。后来才意识到——零偏必须逐片标定,不能靠手册值。
零偏的标定方法其实不复杂:把加速度计水平放置(Z轴朝上),采集一段时间的数据,取平均。这时候理论上Z轴输出应该是1g,X和Y轴应该是0g。实际值与理论值的差值,就是零偏。
// 零偏标定伪代码
float bias_x = 0, bias_y = 0, bias_z = 0;
int sample_count = 1000;
for (int i = 0; i < sample_count; i++) {
accel_data_t data = read_accel();
bias_x += data.x;
bias_y += data.y;
bias_z += data.z - 1.0; // Z轴减去1g
}
bias_x /= sample_count;
bias_y /= sample_count;
bias_z /= sample_count;
// 使用时补偿
float compensated_x = raw_x - bias_x;
嗯,这里有个细节:标定时加速度计必须绝对水平。我见过有人用手扶着标定,结果手一抖,零偏误差大了10倍。建议用精密转台或者至少用水平仪校准过的平台。
我的习惯:量产时,我会在产线上做一个六位置标定(±X, ±Y, ±Z六个方向),这样不仅能标定零偏,还能标定刻度因数和交叉轴耦合。虽然成本高一点,但数据质量提升非常明显。
好了,这一节的内容就到这里。加速度计的原理,说白了就是测电容变化。但要把这个原理变成可靠的工程产品,零偏和刻度因数的处理才是真正的功夫所在。