一、电池开路电压(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,还能算内阻。我一般这样操作:

  1. 恒温箱设定:先设定目标温度(25°C是基准),让电池充分热平衡。
  2. 满充:以标准充电方式充到截止电压,静置1小时。
  3. 放电脉冲:以1C电流放电10秒,静置40秒,再以0.75C充电10秒。嗯,这里要注意,脉冲电流大小要根据电池规格书来定。
  4. 静置:记录脉冲前后的电压变化,用于计算内阻和OCV。
  5. 阶梯放电:以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建模知识体系 OCV-SOC测试方法 HPPC测试流程 温度影响测试 多项式拟合 Nernst方程拟合 温度补偿模型 阶数选择 / 过冲控制 物理意义 / 两端精度 查表法 / 修正系数法 高精度OCV-SOC模型

从测试到拟合,再到温度补偿,每一步都环环相扣。我个人觉得,OCV建模没有银弹,关键是根据你的应用场景选择合适的方案。比如消费电子,多项式拟合就够用;但如果是动力电池,我强烈建议上Nernst方程加查表补偿。

最后说一句:OCV建模做得好,后面的电热耦合模型就成功了一半。别嫌测试麻烦,数据质量决定了模型天花板。


公众号:蓝海资料掘金营,微信deep3321