3. 安时积分法详解
安时积分法,说白了就是「数着电量过日子」。你想想看,电池充进去多少电,放出来多少电,我们拿个计数器一直累加,不就能知道还剩多少电了吗?这个思路很直观,也是目前工业界用得最广的SOC估算方法之一。
我个人习惯把安时积分法叫做「电量记账本」。每次充电就往账本上加一笔,每次放电就减一笔。但问题来了——这个账本准不准?我踩过不少坑,今天跟你好好聊聊。
3.1 安时积分法的原理
核心公式其实就一行:
SOC(t) = SOC(0) - (1/Qn) * ∫ η * I(t) dt
其中:
- SOC(t) — 当前时刻的荷电状态
- SOC(0) — 初始SOC值
- Qn — 电池额定容量(单位:Ah)
- η — 库仑效率(充放电效率)
- I(t) — 瞬时电流(充电为正,放电为负)
离散化之后,我们在嵌入式系统里通常这么写:
SOC_k = SOC_{k-1} - (η * I_k * Δt) / (Qn * 3600)
这里Δt是采样周期,单位是秒。为什么要除以3600?因为电流单位是安培,时间单位是秒,乘出来是安秒,要转成安时。
关键点:安时积分法本质上是一个开环积分器。没有反馈校正,误差会一直累积下去。
3.2 累积误差分析
我在项目中遇到过最头疼的问题,就是积分误差。你想想看,一个积分器,输入端有噪声,输出端就会漂。漂着漂着,SOC就不知道跑到哪里去了。
误差来源主要有三个:
- 电流传感器误差 — 霍尔传感器通常有±1%~±5%的偏移和增益误差。这个误差被积分后,会随时间线性增长。
- 采样时间误差 — 单片机定时器不准,或者任务调度有抖动,导致Δt不恒定。
- 量化误差 — ADC采样位数有限,比如12位ADC,最低有效位对应的电流值就是量化步长。
举个例子:假设电流传感器有10mA的零偏误差,电池容量100Ah,积分1小时后:
误差 = 0.01A * 3600s / (100Ah * 3600) = 0.01% / 小时
看起来不大?但积分10小时就是0.1%,100小时就是1%。如果传感器零偏是50mA呢?10小时就漂了0.5%。
注意:我曾经在一个项目中,因为霍尔传感器温度漂移,常温下标定好好的,到了-20℃零偏直接飙到200mA。SOC一天能漂5%以上。后来加了温度补偿才搞定。
3.3 初始SOC标定
安时积分法最怕什么?怕初始值不准。你想想,起点都歪了,后面再怎么积分也是白搭。
初始SOC标定通常有三种方法:
| 方法 | 原理 | 精度 | 适用场景 |
|---|---|---|---|
| 开路电压法 | 根据OCV-SOC曲线查表 | ±5%~±10% | 静置时间足够长(>2小时) |
| 满充标定 | 充电到截止电压时SOC=100% | ±1% | 每次充满电时重置 |
| 空电标定 | 放电到截止电压时SOC=0% | ±2% | 深度放电场景 |
我个人习惯的做法是:优先用满充标定。因为充满电这个状态最容易检测——电压到了、电流小了、时间到了,三个条件一组合,基本不会误判。
小技巧:开路电压法查表时,记得考虑温度和老化。同一个OCV值,25℃和0℃对应的SOC可能差5%以上。我一般会建一个三维表:OCV × 温度 × 循环次数 → SOC。
3.4 库仑效率补偿
库仑效率,说白了就是「充进去的电能不能全部放出来」。锂电池的库仑效率通常在99%以上,但磷酸铁锂在低温下可能降到95%。
为什么会这样?因为有一部分电能消耗在了副反应上——比如SEI膜的生长、电解液的分解。这些电充进去了,但放不出来。
库仑效率η的定义:
η = 放电容量 / 充电容量
实际应用中,我们通常把η拆成充电效率和放电效率:
- 充电效率η_chg:一般取0.98~0.995
- 放电效率η_dis:一般取0.995~1.0
代码实现时,我习惯这样处理:
if (I > 0) { // 充电
dSOC = (I * η_chg * dt) / (Qn * 3600);
} else { // 放电
dSOC = (I * dt) / (η_dis * Qn * 3600);
}
嗯,这里要注意:库仑效率不是常数。它跟温度、电流倍率、老化程度都有关。我见过有人用一个固定值0.99跑到底,结果低温下SOC越算越偏。
建议:建一个库仑效率查找表,输入是温度和电流倍率,输出是η值。这样虽然麻烦点,但精度能提升不少。
3.5 容量衰减补偿
电池用久了,容量会衰减。新电池100Ah,用了两年可能只剩80Ah。如果还用100Ah去算SOC,那肯定不准。
容量衰减补偿的核心就是:实时更新Qn的值。
更新方法主要有两种:
- 满充满放法:从SOC=0%充到SOC=100%,记录充入的总容量,这就是当前的实际容量。
- 部分充放电法:记录一段已知SOC变化区间内的容量变化,反推总容量。
举个例子,满充满放法的代码逻辑:
if (检测到充满电) {
if (上次是空电状态) {
Qn_actual = 本次充电累计容量;
// 更新容量衰减系数
SOH = Qn_actual / Qn_rated;
}
}
我在实际项目中发现,满充满放的机会其实不多。用户可能充到80%就拔枪了。所以更实用的方法是部分充放电法:
// 记录一段SOC变化区间
if (SOC从30%充到80%) {
ΔSOC = 0.5; // 50%
ΔQ = 本次充电累计容量;
Qn_estimated = ΔQ / ΔSOC;
}
注意:部分充放电法的精度取决于SOC估计的准确性。如果SOC本身就有误差,那算出来的容量也会偏。我一般会加一个置信度判断——只有SOC变化超过30%且电流稳定的区间,才用来更新容量。
知识体系总览
下面这张图,是我梳理的安时积分法核心知识结构。你可以把它当成一张「地图」,哪里不懂就回来看:
安时积分法看起来简单,但真正做好不容易。我做了这么多年BMS,最大的体会就是:细节决定成败。传感器选型、采样频率、补偿策略、标定逻辑,每一个环节都要认真对待。
如果你刚开始接触这块,建议先从基础公式入手,把代码跑通。然后逐步加入误差补偿、容量更新这些高级功能。别想着一步到位,BMS这东西,得慢慢磨。
公众号:蓝海资料掘金营,微信deep3321