第3章:电压采样技术
电压采样,是BMS最基础也最关键的环节。你想想看,SOC估算准不准、SOH判断靠不靠谱,根子上都取决于电压采得准不准。我在项目里见过太多因为电压采样出问题,导致整个系统误判的案例。今天咱们就把这块彻底聊透。
3.1 电压采样原理
电池包里的电压采样,说白了就是要把几十甚至上百串电芯的电压,准确、安全地读出来。这里有两个核心难点:一是高压隔离,二是共模干扰。我习惯把采样方案分成两大类来讲。
3.1.1 差分采样
差分采样是最常用的方案。它的原理很简单——用差分放大器直接测量电芯正负极之间的电位差。
核心公式:
V_cell = V_plus - V_minus
其中:
V_cell = 电芯电压
V_plus = 正极对地电压
V_minus = 负极对地电压
我在早期的一个项目中,就吃过差分采样的亏。当时用的是普通运放搭的差分电路,结果发现采样值总是飘。后来才意识到,问题出在共模电压上——串联电芯越多,共模电压越高,普通运放的共模抑制比(CMRR)根本扛不住。
差分采样的关键参数:
- 共模抑制比(CMRR):至少80dB以上,我建议选100dB+的专用芯片
- 输入阻抗:越高越好,避免影响电芯平衡
- 失调电压:直接影响精度,要选低温漂的
注意:差分采样虽然简单,但有个致命弱点——它不隔离。如果电芯对地出现短路,整个采样电路都可能被高压击穿。所以,差分采样通常只用在低压系统(60V以下)或者配合隔离ADC使用。
3.1.2 隔离采样
隔离采样,才是高压BMS的标配。它的核心思想是:把高压侧和低压侧完全隔开,中间通过磁或光来传递信号。
常见的隔离方案有三种:
| 方案类型 | 隔离方式 | 优点 | 缺点 |
|---|---|---|---|
| 隔离ADC | Σ-Δ调制 + 数字隔离 | 精度高、集成度高 | 成本较高 |
| 光耦隔离 | 光电转换 | 成本低、技术成熟 | 寿命有限、速度慢 |
| 磁耦隔离 | 变压器耦合 | 速度快、寿命长 | EMI问题需注意 |
我个人比较推荐隔离ADC方案。为什么?因为它的采样精度和可靠性都最好。虽然贵一点,但BMS这种安全关键系统,不值得在隔离上省钱。
我的经验:选隔离采样芯片时,别只看隔离电压等级。还要关注隔离寿命和共模瞬态抑制(CMTI)。我曾经在一个项目中用了某款光耦隔离方案,结果运行两年后,光耦老化导致采样偏差越来越大。后来换成磁耦隔离,再没出过问题。
3.2 采样误差来源与校准
电压采样误差,是BMS算法工程师的噩梦。我见过太多人花大量精力调算法,结果问题出在采样上。咱们先看看误差从哪来。
3.2.1 误差来源
硬件误差:
- 分压电阻精度:1%的电阻就能带来10mV的误差
- 参考电压漂移:温度变化导致基准电压偏移
- PCB漏电流:潮湿环境下,PCB表面漏电流会引入额外误差
- 接触电阻:连接器氧化或松动,导致采样值偏低
软件误差:
- ADC量化误差:12位ADC的理论分辨率只有1.22mV(以3V参考为例)
- 采样时序误差:多路复用切换时,电容充放电需要时间
- 数字滤波引入的延迟:滤波越强,响应越慢
避坑指南:我曾经在一个项目中,发现某串电芯的电压总是比其他串低5mV。查了三天,最后发现是采样线束的端子氧化了。从那以后,我要求所有采样线束必须用镀金端子,并且每半年做一次接触电阻测试。
3.2.2 校准策略
校准,说白了就是给采样系统做一次「体检」和「矫正」。我习惯分两步走:
第一步:出厂校准
在产线上,用高精度万用表(6位半以上)测量每串电芯的实际电压,然后和ADC读数做对比,生成校准系数。
// 校准系数计算示例
// V_real: 万用表实测电压
// V_adc: ADC原始读数
// gain: 增益校准系数
// offset: 偏移校准系数
gain = (V_real_max - V_real_min) / (V_adc_max - V_adc_min);
offset = V_real_min - gain * V_adc_min;
// 校准后的电压
V_calibrated = gain * V_adc + offset;
第二步:在线校准
系统运行时,定期用内部基准源或外部参考电压进行自校准。我建议每10分钟做一次。
小技巧:在线校准不要用平均值,用中位数滤波。因为偶尔的尖峰干扰会严重拉偏平均值,但中位数不受影响。这是我踩过坑之后才学到的。
3.3 硬件滤波与软件滤波策略
滤波,是电压采样的最后一道防线。硬件滤波负责把高频噪声挡在门外,软件滤波负责把残留的毛刺清理干净。
3.3.1 硬件滤波
硬件滤波的核心是RC低通滤波器。我一般这样设计:
// 截止频率计算
// f_c = 1 / (2 * π * R * C)
// 示例:R=10kΩ, C=0.1μF
// f_c = 1 / (2 * 3.14 * 10000 * 0.0000001) ≈ 159Hz
设计要点:
- 截止频率:我一般选100-200Hz,既能滤除工频干扰,又不影响电压变化
- 电阻值:不要太大,否则会引入热噪声。10kΩ左右比较合适
- 电容类型:用C0G或NP0材质的陶瓷电容,温度稳定性好
注意:RC滤波会引入延迟。如果截止频率是100Hz,那么阶跃响应时间大约在3-5ms。对于快速变化的电压(比如脉冲充放电),这个延迟可能会影响控制精度。我建议在需要快速响应的场景下,适当提高截止频率到500Hz。
3.3.2 软件滤波
软件滤波,是硬件滤波的补充。我常用的几种方法:
1. 移动平均滤波
// 移动平均滤波
#define FILTER_WINDOW 8
uint16_t buffer[FILTER_WINDOW];
uint8_t index = 0;
uint32_t sum = 0;
uint16_t moving_average(uint16_t new_sample) {
sum -= buffer[index];
buffer[index] = new_sample;
sum += new_sample;
index = (index + 1) % FILTER_WINDOW;
return sum / FILTER_WINDOW;
}
2. 中位数滤波
// 中位数滤波(取5个样本的中位数)
uint16_t median_filter(uint16_t *samples, uint8_t len) {
// 排序
for (uint8_t i = 0; i < len - 1; i++) {
for (uint8_t j = i + 1; j < len; j++) {
if (samples[i] > samples[j]) {
uint16_t temp = samples[i];
samples[i] = samples[j];
samples[j] = temp;
}
}
}
// 返回中位数
return samples[len / 2];
}
3. 一阶低通滤波
// 一阶低通滤波
// alpha = 0.1 ~ 0.3,值越小滤波越强
uint16_t low_pass_filter(uint16_t new_sample, uint16_t last_filtered, float alpha) {
return (uint16_t)(alpha * new_sample + (1 - alpha) * last_filtered);
}
我的组合策略:硬件RC滤波 + 软件中位数滤波 + 一阶低通滤波。硬件先干掉高频噪声,中位数滤掉偶发毛刺,一阶低通做平滑。这套组合拳,我在三个量产项目里都用过,效果很稳定。
3.4 知识体系总览
下面这张图,是我自己总结的电压采样知识体系。你可以把它当作一个检查清单,看看自己还有哪些地方没覆盖到。
嗯,以上就是电压采样技术的核心内容。从原理到误差分析,再到滤波策略,每一步都有讲究。记住一句话:采样不准,后面全是白搭。希望今天的分享能帮你少走一些弯路。
公众号:蓝海资料掘金营,微信deep3321