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值。

具体做法是:

  1. 先做实验,测出不同SOC下的开路电压(OCV),做成一个表格
  2. 实际使用时,让电池静置一段时间(通常30分钟到2小时)
  3. 测量端电压,查表得到SOC

我习惯用多项式拟合OCV曲线,阶数一般取5-7阶。阶数太低拟合不准,阶数太高容易过拟合。嗯,这里要注意,不同化学体系的电池,OCV曲线差异很大。磷酸铁锂的OCV曲线特别平,中间段电压变化很小,查表法误差会很大。

优点:没有累积误差,精度取决于OCV表格的准确性。

缺点

  • 需要长时间静置。车在跑的时候,你没法用这个方法
  • 电池有迟滞效应。充电后的OCV和放电后的OCV不一样
  • 温度影响很大。同一个SOC,25℃和-10℃的OCV能差几十毫伏

我的经验:开路电压法最适合做「修正」用。比如车停了一晚上,早上启动时用OCV法校准一下安时积分的初始值。这样两个方法互补,效果最好。

1.2.3 卡尔曼滤波法

这是目前工业界的主流方法。卡尔曼滤波,说白了就是一个「最优估计算法」。它把安时积分法和开路电压法融合在一起,还考虑了噪声和误差。

核心思想是两步走:

  1. 预测步:用安时积分法预测下一时刻的SOC
  2. 更新步:用电压测量值修正预测值

代码实现大概是这样的(简化版):

// 预测步
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这行摸爬滚打十几年,最大的体会就是——算法好不好,最终要看能不能在实车上稳定跑三年。

咱们下节课见。