1、SOC算法概述:从定义到实战
大家好,我是你们的老朋友。今天咱们聊聊SOC算法。说实话,做BMS这么多年,我见过太多工程师在SOC估算上栽跟头。有的项目都量产了,结果SOC跳变像过山车,客户投诉电话打爆。嗯,这节课我就把压箱底的经验掏出来,跟你们好好掰扯掰扯。
1.1 SOC定义与重要性
SOC,全称State of Charge,中文叫荷电状态。说白了,就是电池还剩多少电。我习惯用百分比表示,0%代表没电,100%代表满电。你手机右上角的电池图标,显示的就是SOC。
但这里有个坑——SOC不能直接测量。你拿万用表量电压,能测出3.7V,但测不出70%还是80%。所以SOC是个估算值,不是测量值。我在项目里经常跟硬件同事开玩笑:「你们测电压、测电流,我们算法组负责猜还剩多少电。」
为什么SOC这么重要?我给你们列几个场景:
- 续航里程计算:电动车仪表盘显示还能跑多少公里,全靠SOC
- 充放电策略:SOC太低要限功率,太高要停止充电
- 均衡控制:电池组里电芯SOC不一致,需要均衡
- 安全保护:SOC估算不准,可能导致过充或过放
核心观点:SOC是BMS的「眼睛」。眼睛瞎了,整个系统就废了。我见过一个项目,因为SOC误差超过10%,导致电池在低温下过放,直接报废了一批电芯。教训惨痛啊。
1.2 常见SOC估算方法
市面上SOC估算方法五花八门,但真正工程上常用的,其实就三种。我一个个给你们讲。
1.2.1 安时积分法
这是最基础的方法,原理简单到令人发指:
SOC(t) = SOC(0) - ∫(η·I(t) / Q_n) dt
其中:
- SOC(0)是初始SOC
- η是库仑效率(充电约1.0,放电约0.98-0.99)
- I(t)是电流(放电为正)
- Q_n是额定容量
说白了,就是「流进去多少电,流出来多少电,一算就知道还剩多少」。我在早期做电动工具BMS时,用的就是纯安时积分法。那时候MCU资源紧张,卡尔曼滤波根本跑不动。
优点:实现简单,计算量小,短期精度不错。
缺点:
- 误差会累积。电流传感器有零点漂移,积分时间长了,误差越来越大
- 需要准确的初始SOC。如果初始值错了,后面全错
- 容量会老化。Q_n不是常数,用久了容量衰减,积分就不准了
避坑指南:我曾经在一个项目中,电流传感器零点漂移达到5mA。你以为很小?但积分24小时后,误差累积到3%以上。所以用安时积分法,一定要定期校准,或者配合其他方法修正。
1.2.2 开路电压法
这个方法利用了电池的一个特性:静置足够长时间后,端电压和SOC有稳定的对应关系。你想想看,手机充满电是4.2V,没电是3.0V,中间每个电压对应一个SOC值。
具体做法是:
- 先做实验,测出不同SOC下的开路电压(OCV),做成一个表格
- 实际使用时,让电池静置一段时间(通常30分钟到2小时)
- 测量端电压,查表得到SOC
我习惯用多项式拟合OCV曲线,阶数一般取5-7阶。阶数太低拟合不准,阶数太高容易过拟合。嗯,这里要注意,不同化学体系的电池,OCV曲线差异很大。磷酸铁锂的OCV曲线特别平,中间段电压变化很小,查表法误差会很大。
优点:没有累积误差,精度取决于OCV表格的准确性。
缺点:
- 需要长时间静置。车在跑的时候,你没法用这个方法
- 电池有迟滞效应。充电后的OCV和放电后的OCV不一样
- 温度影响很大。同一个SOC,25℃和-10℃的OCV能差几十毫伏
我的经验:开路电压法最适合做「修正」用。比如车停了一晚上,早上启动时用OCV法校准一下安时积分的初始值。这样两个方法互补,效果最好。
1.2.3 卡尔曼滤波法
这是目前工业界的主流方法。卡尔曼滤波,说白了就是一个「最优估计算法」。它把安时积分法和开路电压法融合在一起,还考虑了噪声和误差。
核心思想是两步走:
- 预测步:用安时积分法预测下一时刻的SOC
- 更新步:用电压测量值修正预测值
代码实现大概是这样的(简化版):
// 预测步
x_pred = x_est + (I * dt / Q_n); // 安时积分
P_pred = P_est + Q; // 误差协方差预测
// 更新步
K = P_pred * H / (H * P_pred * H + R); // 卡尔曼增益
x_est = x_pred + K * (V_meas - h(x_pred)); // 状态更新
P_est = (1 - K * H) * P_pred; // 协方差更新
你可能会问:「为什么要搞这么复杂?」原因很简单——卡尔曼滤波能自动平衡「模型预测」和「测量值」之间的权重。当电压测量值可信时,多信测量值;当模型预测可信时,多信预测值。
优点:
- 精度高,能抑制噪声
- 能在线估计电池内阻、容量等参数
- 误差不会累积
缺点:
- 计算量大,对MCU有要求
- 需要准确的电池模型(比如RC等效电路模型)
- 参数调优比较麻烦(Q、R矩阵怎么设?)
个人建议:如果你刚开始做BMS,先从安时积分+开路电压修正开始。等把基础搞扎实了,再上卡尔曼滤波。我见过太多人一上来就搞卡尔曼,结果参数调了三个月,还不如简单的安时积分准。
1.3 算法精度评价指标
算法做完了,怎么评价好不好?不能光靠感觉。我一般用三个指标来衡量。
1.3.1 RMSE(均方根误差)
公式:
RMSE = sqrt( (1/N) * Σ(SOC_est - SOC_true)² )
RMSE对大的误差特别敏感。你想想看,误差平方之后,大误差会被放大。所以RMSE能很好地反映算法的「稳定性」。我习惯要求RMSE < 3%。
1.3.2 MAE(平均绝对误差)
公式:
MAE = (1/N) * Σ|SOC_est - SOC_true|
MAE反映的是平均偏差。它不像RMSE那样惩罚大误差,所以更直观。比如MAE=2%,意思就是平均每个点偏差2%。我一般要求MAE < 2%。
1.3.3 最大误差
这个最简单,就是所有采样点中,最大的那个绝对误差:
Max_Error = max(|SOC_est - SOC_true|)
最大误差反映的是算法的「最差情况」。我特别看重这个指标。为什么?因为BMS是安全件,你不能说「平均精度很好,但偶尔会跳变10%」。客户不会接受的。我一般要求最大误差 < 5%。
这三个指标怎么用?我给你们一个表格参考:
| 指标 | 优秀 | 良好 | 及格 | 不及格 |
|---|---|---|---|---|
| RMSE | < 1% | 1-3% | 3-5% | > 5% |
| MAE | < 0.5% | 0.5-2% | 2-4% | > 4% |
| Max Error | < 2% | 2-5% | 5-8% | > 8% |
小技巧:验证算法精度时,不要只在常温下测。我建议至少做三组测试:25℃恒温、-10℃低温、45℃高温。很多算法在常温下表现很好,一到极端温度就露馅了。
好了,这一章的内容就到这里。下一章我会详细讲安时积分法的实现细节,包括怎么处理电流传感器噪声、怎么在线修正容量。到时候我会拿一个实际项目的代码出来,咱们一起分析。
记住一句话:SOC算法没有银弹。每种方法都有适用场景,关键是要理解原理,然后根据你的项目需求做取舍。我在BMS这行摸爬滚打十几年,最大的体会就是——算法好不好,最终要看能不能在实车上稳定跑三年。
咱们下节课见。