4、电流采集技术:霍尔传感器与分流器原理、电流采样电路设计、电流积分与库仑计数法
电流测量,是BMS里最基础也最要命的一环。
你想想看,SOC算得准不准,很大程度上取决于电流采得准不准。我见过不少项目,算法模型建得漂漂亮亮,结果一上实车,SOC飘得跟风筝似的。查到最后,问题都出在电流采样上。
这一章,咱们就把电流采集这件事彻底聊透。
4.1 霍尔传感器 vs 分流器:两种主流方案
目前主流的电流传感器就两种:霍尔传感器和分流器。各有各的脾气,选型时得看场景。
4.1.1 霍尔传感器
霍尔传感器利用的是霍尔效应。说白了,就是电流流过导线时会产生磁场,霍尔元件感应磁场强弱,再反推出电流大小。
优点很明显:
- 隔离测量,不用直接接触母线,安全性高
- 几乎没有插入损耗,大电流场景特别香
- 响应速度快,适合高频动态电流
缺点也让人头疼:
- 温漂大。温度一变,零点就飘。我曾在-20℃环境下测过,零点偏移能到满量程的2%
- 线性度不如分流器,尤其是靠近量程两端时
- 成本高,精度高的闭环霍尔传感器价格不菲
我的经验:霍尔传感器适合做总电流的粗测,或者用在需要隔离的场合。但如果你要精确计算SOC,单靠霍尔传感器,心里得打个问号。
4.1.2 分流器
分流器原理更简单——欧姆定律。在电流回路里串一个精密电阻,测它两端的压降,I = U / R。
优点:
- 精度高,线性度好。好的分流器温漂能做到几十ppm/℃
- 成本低,几块钱就能买到不错的
- 长期稳定性好,用几年漂移都很小
缺点:
- 有插入损耗,大电流时发热严重。100A电流过1mΩ电阻,功耗就是10W
- 没有隔离,采样电路需要做隔离处理
- 机械安装要求高,接触电阻会影响精度
| 对比项 | 霍尔传感器 | 分流器 |
|---|---|---|
| 精度 | 中等(1%~3%) | 高(0.1%~0.5%) |
| 温漂 | 大 | 小 |
| 隔离 | 自带隔离 | 需额外隔离 |
| 插入损耗 | 几乎无 | 有 |
| 成本 | 高 | 低 |
| 适用场景 | 大电流、高频动态 | 高精度、小电流 |
我的建议:如果项目对SOC精度要求高,我习惯用分流器做主采样,霍尔传感器做冗余或故障诊断。两条腿走路,稳当。
4.2 电流采样电路设计
传感器选好了,电路设计才是真正的坑。我见过太多人,传感器买的是高精度型号,结果电路一搭,噪声比信号还大。
4.2.1 分流器采样电路
分流器输出的信号是毫伏级的。比如1mΩ分流器过100A电流,压降才100mV。这么小的信号,很容易被噪声淹没。
关键设计要点:
- 差分采样。必须用差分放大器,不能用单端。共模噪声能干掉一大半
- 低通滤波。在ADC前端加一阶RC滤波,截止频率通常设在1kHz~10kHz
- Kelvin连接。采样线要单独走,不能和功率回路共用走线。否则接触电阻会引入误差
// 典型差分采样电路配置
// 分流器电阻:Rshunt = 0.001Ω
// 差分放大器增益:G = 50
// ADC参考电压:Vref = 3.3V
// 满量程电流:I_max = Vref / (Rshunt * G) = 3.3 / (0.001 * 50) = 66A
// 实际采样值计算
uint16_t adc_value = read_adc(); // 0~4095 (12-bit)
float voltage = (adc_value / 4095.0) * 3.3; // 放大器输出电压
float current = voltage / 50.0 / 0.001; // 实际电流值
我曾经踩过的坑:有一次采样值总是偏大,查了两天,最后发现是采样线走线和功率线并行了很长一段,感应噪声耦合进来了。后来把采样线改成双绞线,问题解决。记住,采样线越短越好,越远离功率回路越好。
4.2.2 霍尔传感器采样电路
霍尔传感器输出通常是电压信号,比如0~5V对应0~200A。电路设计相对简单,但要注意几点:
- 输出阻抗匹配。霍尔传感器输出阻抗一般不高,但ADC输入阻抗要足够大,避免分压
- 零点校准。霍尔传感器零点会漂,建议在系统初始化时做一次零点校准
- 温度补偿。如果精度要求高,需要加温度传感器做软件补偿
4.3 电流积分与库仑计数法
电流采回来,怎么用?最经典的方法就是库仑计数法。
原理很简单:SOC(t) = SOC(0) + (1/Q_n) * ∫I(t)dt
说白了,就是把电流对时间积分,算出充进去了多少电量,再除以电池总容量,得到SOC变化量。
4.3.1 离散化实现
实际代码里,积分要离散化。每隔固定时间采一次电流,累加:
// 库仑计数法实现
#define SAMPLE_INTERVAL_MS 100 // 采样间隔100ms
#define BATTERY_CAPACITY_AH 100 // 电池总容量100Ah
float soc = 50.0; // 初始SOC,单位%
float accumulated_ah = 0.0; // 累计电量,单位Ah
void coulomb_counting(float current_a) {
// 电流单位A,时间单位小时
// 100ms = 0.00002778小时
float delta_ah = current_a * (SAMPLE_INTERVAL_MS / 3600000.0);
accumulated_ah += delta_ah;
// 更新SOC
soc = 50.0 + (accumulated_ah / BATTERY_CAPACITY_AH) * 100.0;
// 限幅
if (soc > 100.0) soc = 100.0;
if (soc < 0.0) soc = 0.0;
}
4.3.2 库仑计数法的致命缺陷
这个方法看着简单,但实际用起来问题一堆:
- 误差累积。电流采样有误差,积分时间长了,误差会越积越大。我见过一个项目,跑了两个月,SOC误差到了15%
- 初始SOC不准。如果不知道初始SOC,后面全白搭
- 电池容量会衰减。用了两年的电池,实际容量可能只有标称的80%,但代码里还是用100Ah算,结果可想而知
我的做法:库仑计数法不能单独用。我一般会结合开路电压法(OCV)做定期校准。比如每次车辆静置超过2小时,就用OCV查表修正一次SOC。这样误差就不会无限累积下去。
4.3.3 采样频率的选择
采样频率怎么定?这是个好问题。
理论上,采样频率越高,积分越准。但频率太高,MCU扛不住,功耗也大。
我个人习惯:
- 静态电流(车辆休眠):1Hz采样就够了
- 动态电流(车辆行驶):10Hz~100Hz
- 大电流脉冲(比如急加速):建议100Hz以上
如果MCU资源紧张,可以用变频率采样。电流变化快时提高频率,变化慢时降低频率。这样既保证精度,又不浪费算力。
4.4 本章知识体系
下面这张图,把电流采集的核心逻辑串起来了:
电流采集这件事,说难不难,说简单也不简单。传感器、电路、算法,三个环节环环相扣。任何一个环节出问题,最终SOC都算不准。
我个人习惯是:先定精度目标,再反推传感器和电路设计。比如目标SOC误差在5%以内,那电流采样误差就不能超过1%。有了这个指标,选型、设计、测试就都有据可依了。
一个小技巧:量产前,一定要做温度循环测试。把BMS放在高低温箱里,从-40℃到85℃跑几个循环,看看电流采样值漂了多少。这一步能帮你发现很多隐藏问题。