4、电流采样技术:霍尔传感器与分流器原理、电流采样电路设计、积分法与库仑计数法

电流采样,是BMS里最基础也最要命的一环。你想想看,SOC算不准、保护误动作、甚至电池过充起火,十有八九都是电流没测准。我个人习惯把电流采样比作BMS的「听诊器」——听不准心跳,后面所有诊断都是瞎扯。

这一章,咱们就掰开揉碎聊聊:霍尔传感器和分流器到底怎么选?采样电路怎么搭?库仑计数法又该怎么落地?

4.1 霍尔传感器 vs 分流器:两种主流方案

先说结论:没有绝对的好坏,只有合不合适的场景。

4.1.1 分流器(Shunt Resistor)

原理很简单——欧姆定律。在电流回路里串一个精密电阻,测它两端的压降,I = V/R。我最早做铅酸BMS时用的就是分流器,便宜、线性度好、低温漂,精度能做到0.5%以内。

但有个坑:它不隔离。分流器两端直接和高压回路共地,采样电路必须做隔离处理。另外,大电流下发热严重,我记得有一次做200A持续电流测试,分流器温度飙到85°C,阻值漂了将近1%,SOC直接跳变。

避坑指南:我曾经在选型时只看常温精度,忽略了温漂系数。结果高温环境下电流采样偏差越来越大。后来学乖了,分流器必须选±50ppm/°C以内的,最好用锰铜或康铜材质。

4.1.2 霍尔传感器(Hall Effect Sensor)

霍尔传感器利用的是洛伦兹力——电流流过导体产生磁场,霍尔元件感应磁场强度,输出与电流成正比的电压。它最大的优点是电气隔离,不需要额外隔离电路。

但霍尔传感器也有短板:零点漂移严重。我遇到过一款开环霍尔,上电后零点能漂移±20mV,折算成电流误差就是好几安培。闭环霍尔(磁平衡式)会好很多,但价格也翻倍。

对比项 分流器 霍尔传感器(开环) 霍尔传感器(闭环)
精度 0.1% ~ 0.5% 1% ~ 3% 0.5% ~ 1%
隔离 无(需外置隔离)
温漂 低(±50ppm/°C) 高(零点漂移严重) 中等
成本 中等
适用场景 中低功率、高精度需求 大电流、隔离优先 高精度+隔离
我的建议:如果做家用储能或低速电动车,分流器+隔离ADC是性价比之王。如果做车载主驱或工业级应用,闭环霍尔更稳妥,省去隔离设计的麻烦。

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,需要分压或选更低增益
注意:我曾经在PCB布局时把差分走线拉得太长,结果引入噪声,采样值跳得像心电图。后来强制要求:差分线等长、等宽、紧贴走,底下铺地平面。

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%以上。

为什么会这样?因为积分是开环的,没有反馈校正。每次采样误差都会「存」到累计电量里,时间越长,误差越大。

解决办法:定期校准。比如每次电池充满电时,强制把SOC设为100%。或者结合开路电压法,在静置状态下修正SOC。我习惯的做法是:每10分钟用开路电压查表修正一次,把积分误差「清零」。

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;
}
一个小技巧:我习惯在代码里同时维护两个SOC值——一个是用库仑计数法算的「动态SOC」,另一个是用开路电压法算的「静态SOC」。两者差值超过5%时,触发校准流程。这样既保证了动态响应,又防止了长期漂移。

4.4 本章小结

电流采样这事,说难不难,说简单也不简单。分流器和霍尔各有千秋,选型时得看精度、隔离、成本三者的平衡。电路设计上,差分采样、低通滤波、隔离方案一个都不能马虎。至于库仑计数法,说白了就是个积分器,但要做好误差补偿,才能真正用起来。

下一章咱们聊聊电压采样和电池均衡,那又是另一番天地了。