3、传感器故障诊断(一):电压采样故障(开路、短路、漂移)的检测与定位。
各位工程师朋友,咱们今天聊聊电压采样故障。这是BMS里最基础、也最让人头疼的问题之一。我做了这么多年BMS,见过太多因为电压采样不准导致的误报、拒报,甚至电池包直接趴窝。说白了,电压是BMS的“眼睛”,眼睛花了,后面所有算法都是白搭。
电压采样故障,常见的有三种:开路、短路、漂移。咱们一个一个拆开讲。
3.1 开路故障:信号断了怎么办?
开路,就是采样线断了。你想想看,一根线从电芯正极连到采样芯片,中间任何一个焊点虚焊、线束折断、连接器松动,都会导致开路。我在项目中遇到过最离谱的一次,是产线上工人把采样线压在了电池模组螺丝下面,拧紧的时候直接压断了。
开路故障的典型特征:采样值会突然跳到一个极端值。比如,正常3.6V的电芯,开路后可能读到0V,或者因为上拉/下拉电阻的影响,读到某个固定电压(比如2.5V)。
怎么检测?
我个人习惯用“相邻差分法”。原理很简单:
- 正常工作时,相邻两节电芯的电压差不会太大(比如<50mV)。
- 如果某节电芯采样值突然变成0V,而相邻电芯正常,那基本可以判定开路。
但这里有个坑:电芯本身也可能出问题(比如内部断路)。怎么区分?我建议加一个“激励电流法”。
激励电流法原理:
在采样回路中注入一个已知的小电流(比如1mA)。如果采样线正常,电芯两端会产生一个微小的电压变化(ΔV = I × R_internal)。如果开路,电压变化会非常大(因为回路阻抗无穷大)。
代码实现上,我一般这样写:
// 伪代码:开路检测
float v_now = read_voltage(channel);
float v_prev = read_voltage(channel, 100ms_ago);
if (abs(v_now - v_prev) > 5.0V) { // 5V跳变,明显异常
// 触发激励电流
inject_current(channel, 1mA);
float v_injected = read_voltage(channel);
if (v_injected > 4.5V || v_injected < 0.5V) {
set_fault(OPEN_CIRCUIT, channel);
}
}
小提示:开路检测的阈值不能设得太死。我见过一些同行设成0.1V跳变就报开路,结果在低温环境下(电芯内阻变大)疯狂误报。建议留出20%的余量。
3.2 短路故障:电压被“拉”走了
短路分两种:对地短路和对电源短路。对地短路,采样值会被拉到接近0V;对电源短路,采样值会被拉到接近参考电压(比如5V)。
嗯,这里要注意:短路和开路有时候表现很像。比如对地短路,读出来也是0V左右。怎么区分?
我的方法:看“响应速度”。
- 开路:电压变化是瞬时的,一个采样周期内从正常值跳到0V。
- 短路:电压变化可能有一个过渡过程(比如电容放电),但最终稳定在0V或5V。
更可靠的做法是“冗余采样”。我在设计时,每个采样点会放两个独立的采样通道(比如主芯片和备份芯片)。如果两个通道读数一致,那大概率是电芯真有问题;如果只有一个通道异常,那就是采样回路故障。
| 故障类型 | 主通道读数 | 备份通道读数 | 诊断结论 |
|---|---|---|---|
| 电芯正常 | 3.6V | 3.6V | 无故障 |
| 采样线对地短路 | 0.1V | 3.6V | 主通道短路 |
| 电芯内部短路 | 0.1V | 0.1V | 电芯故障 |
警告:千万不要在短路故障未排除的情况下尝试“自恢复”。我曾经有个项目,软件检测到短路后自动尝试重新上电,结果把采样芯片烧了。短路故障必须硬件隔离,软件只能报警。
3.3 漂移故障:最隐蔽的杀手
漂移,说白了就是采样值慢慢偏离真实值。它不像开路短路那么剧烈,但长期积累下来,SOC估算会越来越不准,最后导致过充或过放。
为什么会漂移?原因很多:
- 采样电阻老化(温度循环导致阻值变化)
- ADC参考电压温漂
- 连接器接触电阻增大
检测漂移,我推荐“自校准法”。
每个采样周期,先测量一个内部精密参考电压(比如1.25V)。如果测出来是1.30V,说明ADC增益偏高了,后面所有采样值都要按比例修正。
// 伪代码:漂移自校准
float v_ref_measured = read_voltage(REF_CHANNEL); // 内部参考通道
float v_ref_actual = 1.25; // 已知精密电压
float gain_error = v_ref_measured / v_ref_actual;
// 修正所有采样值
for (int i = 0; i < TOTAL_CELLS; i++) {
float raw = read_voltage(i);
float corrected = raw / gain_error;
store_voltage(i, corrected);
}
// 如果增益误差超过1%,报漂移故障
if (abs(gain_error - 1.0) > 0.01) {
set_fault(DRIFT_FAULT, SENSOR_MODULE);
}
避坑指南:我曾经在高温环境下(65°C)发现漂移误报率特别高。后来查出来是参考电压源本身的温漂太大。所以选型时一定要用低温漂的参考源(比如5ppm/°C以下),别为了省几毛钱给自己挖坑。
3.4 综合诊断策略:别让故障“串门”
实际项目中,这三种故障经常同时出现。比如一根线先接触不良(漂移),然后彻底断开(开路)。所以诊断逻辑不能孤立地看。
我建议用“状态机”来管理:
- 正常态:所有采样值在合理范围内(比如2.5V~4.2V),且相邻差分<50mV。
- 可疑态:某个采样值超出范围,但未触发阈值。启动“快速采样”(比如从1Hz提高到10Hz),观察变化趋势。
- 故障态:连续3个采样周期都异常,且自校准无法修正。锁定故障,上报BMS主控。
你想想看,如果一上来就报故障,系统可能因为一个噪声毛刺就误动作。但如果你给它一个“确认期”,误报率能降低90%以上。
最后说一句:电压采样故障诊断,核心不是“检测”,而是“定位”。你不仅要告诉系统“出问题了”,还要告诉它“哪根线、哪个通道、什么类型的故障”。这样维修人员才能快速处理。我在产线上见过太多因为定位不准确,把整个电池包拆了才发现只是连接器松了的案例。嗯,那真是血泪教训。