3. 开路电压法静置SOC查表估算与温度修正
OCV-SOC查表估算与温度修正的实现思路
开路电压法(OCV法)的核心前提是:电池经过足够长时间静置后,极化电压基本消散,端电压近似等于开路电压,而OCV与SOC之间存在单调对应关系。因此查表估算的输入是“静置后的OCV”和“环境温度”,输出是SOC。船舶电池长期处于机舱或舱底环境,温度常在5℃~40℃波动,同一SOC下低温OCV偏高、高温OCV偏低,若直接用25℃基准表查表,会产生系统性偏差,必须引入温度修正。
OCV-SOC基准表与温度补偿系数
下面给出一张用于教学示例的磷酸铁锂船舶电池OCV-SOC基准表(25℃标定,单体电压,假设16串成组后按单体查表)。表中数据为示例假设值,实际工程应以电池厂商标定数据为准。
| SOC(%) | OCV@25℃(V) | SOC(%) | OCV@25℃(V) |
|---|---|---|---|
| 0 | 3.000 | 60 | 3.270 |
| 10 | 3.180 | 70 | 3.285 |
| 20 | 3.220 | 80 | 3.300 |
| 30 | 3.240 | 90 | 3.320 |
| 40 | 3.252 | 100 | 3.350 |
| 50 | 3.262 | — | — |
温度补偿采用线性斜率模型:V_25 = V_meas + k·(T − 25),其中 k 为温度补偿斜率(V/℃)。对磷酸铁锂体系,低温段OCV偏高,取 k ≈ +0.0012 V/℃(即T<25℃时T−25为负,V_25被下调,抵消低温偏高)。该系数为示例值,实际应通过多温度标定拟合得到。
查表估算函数实现
核心函数分两步:先做温度修正得到25℃等效OCV,再在基准表上做线性插值并做边界钳位。以下Python代码自洽可运行,输入为单体电压与环境温度,输出SOC百分比。
import numpy as np
# 25℃ OCV-SOC 基准表(示例假设值)
SOC_TABLE = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100], dtype=float)
OCV_TABLE = np.array([3.000, 3.180, 3.220, 3.240, 3.252, 3.262,
3.270, 3.285, 3.300, 3.320, 3.350], dtype=float)
K_TEMP = 0.0012 # 温度补偿斜率,V/℃(示例值)
def temp_correct(v_meas, temp_c):
"""将实测OCV折算到25℃基准"""
return v_meas + K_TEMP * (temp_c - 25.0)
def ocv_to_soc(v_25):
"""在25℃基准表上线性插值,边界钳位"""
if v_25 <= OCV_TABLE[0]:
return 0.0
if v_25 >= OCV_TABLE[-1]:
return 100.0
return float(np.interp(v_25, OCV_TABLE, SOC_TABLE))
def estimate_soc(v_meas, temp_c, use_correction=True):
v_used = temp_correct(v_meas, temp_c) if use_correction else v_meas
return ocv_to_soc(v_used)
# 示例:静置后实测3.290V,环境温度5℃
v_meas, t = 3.290, 5.0
soc_raw = estimate_soc(v_meas, t, use_correction=False)
soc_cor = estimate_soc(v_meas, t, use_correction=True)
print(f"未修正SOC={soc_raw:.2f}% 修正后SOC={soc_cor:.2f}%")
按示例数据手算:V_25 = 3.290 + 0.0012×(5−25) = 3.290 − 0.024 = 3.266 V。未修正时3.290V落在70%~80%区间,插值得约73.3%;修正后3.266V落在50%~60%区间,插值得约54.0%。两者相差约19个百分点,说明低温下不修正会严重高估SOC。
修正前后偏差对比与判读
为量化修正效果,构造一组不同温度下的“参考SOC”场景:假设真实SOC已知(由高精度充放电仪标定),在对应温度下读取静置OCV,再分别用修正与不修正两条路径估算,计算绝对偏差。
| 场景 | 温度(℃) | 实测OCV(V) | 参考SOC(%) | 未修正SOC(%) | 修正后SOC(%) | 未修正偏差 | 修正后偏差 |
|---|---|---|---|---|---|---|---|
| A | 5 | 3.290 | 55.0 | 73.3 | 54.0 | 18.3 | 1.0 |
| B | 10 | 3.278 | 62.0 | 65.3 | 62.0 | 3.3 | 0.0 |
| C | 25 | 3.262 | 50.0 | 50.0 | 50.0 | 0.0 | 0.0 |
| D | 40 | 3.248 | 38.0 | 36.0 | 38.0 | 2.0 | 0.0 |
判读要点:25℃时修正项为零,两条路径一致;偏离25℃越远,未修正偏差越大,低温段尤为显著(场景A偏差18.3个百分点)。修正后各场景偏差收敛到1个百分点以内,说明线性斜率模型在示例参数下有效。若实际标定发现斜率随温度非线性变化,可将 K_TEMP 扩展为分段或查表形式,函数结构不变。