一、电池开路电压(OCV)建模:从测试到拟合,再到温度补偿
大家好,我是老张。做BMS这么多年,我始终觉得OCV建模是电热耦合模型的基石。你想想看,SOC估算不准,很多时候就是OCV曲线没搞对。今天咱们就聊聊这块内容,从测试方法到拟合技巧,再到温度补偿,一步到位。
1. OCV-SOC曲线测试方法:别小看这第一步
OCV-SOC曲线,说白了就是电池在静置状态下,开路电压与剩余电量的关系。这条曲线长什么样,直接决定了你的模型准不准。
测试方法主要有两种:
- 增量OCV测试:每隔一定SOC点(比如5%或10%),静置足够长时间(通常2小时以上),记录稳定后的OCV。我个人习惯用5%的步长,精度够用,时间也合理。
- 连续低倍率放电测试:用C/20甚至C/30的极小电流放电,近似认为端电压就是OCV。这个方法快,但精度稍差,适合快速摸底。
关键点:静置时间一定要够!我曾经在项目里图省事,只静置了30分钟,结果拟合出来的曲线在低SOC段偏差巨大,后来排查了三天才发现是极化没消除干净。
2. HPPC与OCV测试流程:实战中的标准操作
HPPC(混合脉冲功率特性)测试,是获取电池动态特性的标准方法。它不仅能测OCV,还能算内阻。我一般这样操作:
- 恒温箱设定:先设定目标温度(25°C是基准),让电池充分热平衡。
- 满充:以标准充电方式充到截止电压,静置1小时。
- 放电脉冲:以1C电流放电10秒,静置40秒,再以0.75C充电10秒。嗯,这里要注意,脉冲电流大小要根据电池规格书来定。
- 静置:记录脉冲前后的电压变化,用于计算内阻和OCV。
- 阶梯放电:以C/3电流放电到下一个SOC点(比如90%),重复步骤3-4。
整个流程下来,一个温度点大概需要8-10小时。我建议至少做三个温度点:0°C、25°C、45°C。
我的小技巧:测试前给电池做3次充放电循环活化,数据会更稳定。别问我怎么知道的,都是踩坑踩出来的。
3. 多项式与Nernst方程拟合:两种思路,各有千秋
拿到OCV-SOC数据后,下一步就是拟合。常用的方法有两种:
3.1 多项式拟合
简单粗暴,直接用多项式函数去逼近。我常用的是6阶或8阶多项式:
# Python示例:6阶多项式拟合
import numpy as np
from numpy.polynomial import polynomial as P
# soc和ocv是测试数据
soc = np.array([0, 0.1, 0.2, ..., 1.0])
ocv = np.array([3.0, 3.2, 3.4, ..., 4.2])
# 拟合6阶多项式
coeffs = P.polyfit(soc, ocv, 6)
# 生成拟合曲线
soc_fit = np.linspace(0, 1, 100)
ocv_fit = P.polyval(soc_fit, coeffs)
print("多项式系数:", coeffs)
多项式拟合的好处是计算快,嵌入式实现简单。但缺点也很明显——在SOC两端(0%和100%)容易过冲。我遇到过拟合出来的曲线在0% SOC时电压反而比10%还高,这显然不合理。
3.2 Nernst方程拟合
Nernst方程来源于电化学理论,形式更优雅:
# Nernst方程拟合示例
import numpy as np
from scipy.optimize import curve_fit
def nernst_ocv(soc, a, b, c, d):
# 简化的Nernst方程
return a + b * np.log(soc) + c * np.log(1 - soc) + d * soc
# 拟合
popt, _ = curve_fit(nernst_ocv, soc, ocv, p0=[3.5, 0.1, -0.1, 0.5])
a, b, c, d = popt
print(f"Nernst参数: a={a:.3f}, b={b:.3f}, c={c:.3f}, d={d:.3f}")
Nernst方程在物理意义上更合理,尤其在SOC两端表现更好。但它的计算量稍大,在低端MCU上要注意优化。
避坑指南:我曾经在某个项目中用8阶多项式拟合,结果在SOC=0.5附近出现了一个小波浪,导致SOC估算在50%附近来回跳。后来换成Nernst方程,问题迎刃而解。所以,如果你的SOC估算在某个点总是不准,先检查OCV曲线是不是有异常波动。
4. 温度对OCV的影响补偿:别忽略这个细节
温度对OCV的影响,很多人容易忽略。实际上,温度每变化10°C,OCV可能会有10-30mV的偏移。在SOC估算中,这个误差足以让你偏离5%以上。
补偿方法通常有两种:
- 查表法:在不同温度下分别测试OCV-SOC曲线,建立三维查表(SOC, T -> OCV)。精度高,但需要大量测试数据。
- 修正系数法:以25°C为基准,用一个温度修正系数来调整:
# 温度补偿示例
def ocv_with_temp_compensation(soc, temp_c):
# 基准OCV(25°C)
ocv_base = nernst_ocv(soc, a, b, c, d)
# 温度修正系数(经验公式)
# 每偏离25°C 1°C,修正约1.2mV
temp_coeff = 0.0012 # V/°C
delta_temp = temp_c - 25.0
ocv_compensated = ocv_base + temp_coeff * delta_temp
return ocv_compensated
# 使用示例
soc_test = 0.5
temp_test = 0 # 0°C
ocv_at_0c = ocv_with_temp_compensation(soc_test, temp_test)
print(f"50% SOC, 0°C下的OCV: {ocv_at_0c:.3f}V")
我个人更推荐查表法,虽然前期测试工作量大,但后期模型稳定性好。修正系数法适合快速原型验证,但要注意不同化学体系的电池,温度系数差异很大。
重要提醒:温度补偿不是线性的!在低温区(0°C以下),OCV的变化率会明显增大。我建议在0°C以下至少多测两个点,比如-10°C和-20°C。
知识体系总览
下面这张图,是我自己整理的OCV建模知识框架,帮你理清思路:
从测试到拟合,再到温度补偿,每一步都环环相扣。我个人觉得,OCV建模没有银弹,关键是根据你的应用场景选择合适的方案。比如消费电子,多项式拟合就够用;但如果是动力电池,我强烈建议上Nernst方程加查表补偿。
最后说一句:OCV建模做得好,后面的电热耦合模型就成功了一半。别嫌测试麻烦,数据质量决定了模型天花板。
公众号:蓝海资料掘金营,微信deep3321