4、电流采样技术:霍尔传感器与分流器原理、电流采样电路设计、积分法与库仑计数法
电流采样,是BMS里最基础也最要命的一环。你想想看,SOC算不准、保护误动作、甚至电池过充起火,十有八九都是电流没测准。我个人习惯把电流采样比作BMS的「听诊器」——听不准心跳,后面所有诊断都是瞎扯。
这一章,咱们就掰开揉碎聊聊:霍尔传感器和分流器到底怎么选?采样电路怎么搭?库仑计数法又该怎么落地?
4.1 霍尔传感器 vs 分流器:两种主流方案
先说结论:没有绝对的好坏,只有合不合适的场景。
4.1.1 分流器(Shunt Resistor)
原理很简单——欧姆定律。在电流回路里串一个精密电阻,测它两端的压降,I = V/R。我最早做铅酸BMS时用的就是分流器,便宜、线性度好、低温漂,精度能做到0.5%以内。
但有个坑:它不隔离。分流器两端直接和高压回路共地,采样电路必须做隔离处理。另外,大电流下发热严重,我记得有一次做200A持续电流测试,分流器温度飙到85°C,阻值漂了将近1%,SOC直接跳变。
4.1.2 霍尔传感器(Hall Effect Sensor)
霍尔传感器利用的是洛伦兹力——电流流过导体产生磁场,霍尔元件感应磁场强度,输出与电流成正比的电压。它最大的优点是电气隔离,不需要额外隔离电路。
但霍尔传感器也有短板:零点漂移严重。我遇到过一款开环霍尔,上电后零点能漂移±20mV,折算成电流误差就是好几安培。闭环霍尔(磁平衡式)会好很多,但价格也翻倍。
| 对比项 | 分流器 | 霍尔传感器(开环) | 霍尔传感器(闭环) |
|---|---|---|---|
| 精度 | 0.1% ~ 0.5% | 1% ~ 3% | 0.5% ~ 1% |
| 隔离 | 无(需外置隔离) | 有 | 有 |
| 温漂 | 低(±50ppm/°C) | 高(零点漂移严重) | 中等 |
| 成本 | 低 | 中等 | 高 |
| 适用场景 | 中低功率、高精度需求 | 大电流、隔离优先 | 高精度+隔离 |
4.2 电流采样电路设计
电路设计这块,我踩过的坑比走过的路还多。说几个关键点。
4.2.1 差分采样与共模抑制
分流器的压降通常只有几十毫伏,而共模电压可能高达几百伏。这时候必须用差分放大器或隔离ADC。我习惯用INA282这类高共模抑制比的仪表放大器,CMRR做到120dB以上。
举个实际电路:
// 分流器差分采样电路示意
// 分流器两端分别接INA282的IN+和IN-
// 输出端接MCU的ADC引脚
// 注意:IN-端必须接一个偏置电阻到GND,防止共模电压超出范围
Vout = (V+ - V-) * Gain
// 增益通常设为50或100倍
// 例如:分流器1mΩ,电流100A,压降100mV
// 放大100倍后输出10V,ADC满量程参考3.3V,需要分压或选更低增益
4.2.2 低通滤波与抗混叠
电流信号里高频噪声很多,尤其是电机驱动场景。我一般会在ADC输入端加一阶RC低通滤波,截止频率设在100Hz左右。别设太低,否则会滤掉真实的电流变化,影响SOC动态响应。
// 低通滤波参数计算
// 截止频率 fc = 1 / (2 * π * R * C)
// 取 R = 1kΩ, C = 1μF
// fc ≈ 159Hz
// 这个频率既能滤除开关噪声,又不影响10Hz以内的电流变化
4.2.3 隔离方案选择
如果用了分流器,隔离是必须的。我常用的方案有两种:
- 隔离ADC:比如AMC1301,内部带隔离,直接输出数字信号。省事,但贵。
- 隔离运放+普通ADC:比如ISO124隔离运放,输出模拟信号再接普通ADC。成本低一些,但需要额外隔离电源。
我个人更倾向隔离ADC,因为集成度高,PCB面积小,而且隔离耐压能做到5kV以上。
4.3 积分法与库仑计数法
电流采到了,怎么算SOC?最经典的方法就是库仑计数法——说白了就是「积分」。把电流对时间积分,得到充入或放出的电量。
4.3.1 基本原理
公式很简单:
SOC(t) = SOC(0) + (1 / Q_max) * ∫ I(t) dt
其中:
- SOC(0) 是初始荷电状态
- Q_max 是电池最大可用容量(单位:Ah)
- I(t) 是瞬时电流(充电为正,放电为负)
- 积分结果单位是 Ah
嗯,这里要注意:积分是离散的。MCU每隔一定时间(比如100ms)采样一次电流,然后累加。说白了就是:
// 库仑计数法伪代码
float soc = 80.0; // 初始SOC,单位%
float capacity = 100.0; // 电池容量,单位Ah
float accumulated_charge = 0.0; // 累计电量,单位Ah
void timer_isr() {
float current = read_current(); // 读取电流,单位A
float delta_t = 0.1; // 采样间隔,单位小时(100ms = 0.0000278h)
accumulated_charge += current * delta_t; // 单位Ah
soc = (capacity - accumulated_charge) / capacity * 100.0;
}
4.3.2 误差累积问题
库仑计数法最大的毛病——误差会累积。电流采样有误差,积分时间长了,SOC会越偏越远。我做过一个测试:用1%精度的电流传感器,连续运行24小时,SOC误差能到15%以上。
为什么会这样?因为积分是开环的,没有反馈校正。每次采样误差都会「存」到累计电量里,时间越长,误差越大。
4.3.3 实际工程中的改进
光靠纯积分肯定不行。我总结了几条实战经验:
- 动态补偿:不同电流下,库仑效率不一样。小电流放电时效率高,大电流放电时效率低。我一般会建一个效率查找表,根据电流大小动态调整积分系数。
- 温度补偿:低温下电池可用容量会下降。如果不做补偿,SOC会显示偏高。我习惯在-20°C时把容量折减到80%。
- 休眠唤醒处理:系统休眠时电流采样停止,但电池还在自放电。我每次唤醒后会先估算休眠期间的漏电量,加到累计电量里。
// 带补偿的库仑计数法
float get_compensated_soc(float raw_soc, float current, float temp) {
float efficiency = lookup_efficiency(current); // 查库仑效率表
float capacity_factor = lookup_capacity_factor(temp); // 查温度容量系数
float compensated_soc = raw_soc * capacity_factor / efficiency;
return compensated_soc;
}
4.4 本章小结
电流采样这事,说难不难,说简单也不简单。分流器和霍尔各有千秋,选型时得看精度、隔离、成本三者的平衡。电路设计上,差分采样、低通滤波、隔离方案一个都不能马虎。至于库仑计数法,说白了就是个积分器,但要做好误差补偿,才能真正用起来。
下一章咱们聊聊电压采样和电池均衡,那又是另一番天地了。