4、开路电压法(OCV):OCV-SOC曲线标定、查表法实现、温度补偿
开路电压法,圈内人常叫它OCV法。说白了,就是利用电池静置时的端电压来反推当前电量。这个方法很直观,也很可靠。我在项目里经常把它作为SOC估算的“压舱石”——尤其是在车辆刚上电、电池静置充分的时候,OCV法给出的结果几乎就是标准答案。
4.1 OCV-SOC曲线标定
每款电芯都有自己的“性格”。这个性格,就藏在OCV-SOC曲线里。你想想看,电池从满电放到没电,电压会怎么变化?不是线性的,而是带着几个“平台区”和“陡坡区”。
标定这条曲线,我一般分三步走:
- 小电流充放电:用0.05C甚至更小的电流,把电池从满充放到截止电压,再充回来。电流越小,极化效应越弱,测出来的OCV越准。
- 静置取点:每放出(或充入)5%或10%的容量,就停下来静置1-2小时。等电压稳定了,记录下这个点的OCV值。
- 曲线拟合:把离散的点连成平滑曲线。我习惯用多项式拟合,阶数选6到8阶就够用了。阶数太高反而容易过拟合,低电量区会抖得厉害。
核心要点:OCV-SOC曲线不是一成不变的。不同批次、不同老化程度的电芯,曲线会有偏移。量产项目中,我建议每批电芯至少抽测3-5条曲线,取平均后作为标定基准。
这里我贴一段标定数据的示例格式,实际项目中你会用到的:
// OCV-SOC 标定表 (25°C)
// SOC(%) OCV(V)
0 3.000
5 3.120
10 3.250
20 3.450
30 3.580
40 3.650
50 3.700
60 3.740
70 3.780
80 3.820
90 3.900
100 4.200
4.2 查表法实现
标定完曲线,怎么在代码里用?最直接的方法就是查表。查表法说白了就是“空间换时间”——把曲线离散化成表格,运行时直接查,不用实时算多项式。
我常用的查表策略有两种:
- 线性插值查表:如果OCV落在两个标定点之间,按比例线性插值。精度够用,计算量小。
- 最近邻查表:直接取最接近的标定点。速度快,但精度稍差,适合资源受限的MCU。
给你看一段我实际项目里用过的查表代码,C语言写的,跑在STM32上:
/**
* @brief 通过OCV查SOC(线性插值)
* @param ocv 当前测量的开路电压 (mV)
* @param table OCV-SOC标定表
* @param table_size 表格行数
* @return SOC值 (0.0 ~ 100.0)
*/
float ocv_to_soc(uint16_t ocv, const OCV_Table_t *table, uint8_t table_size)
{
// 边界检查
if (ocv <= table[0].ocv_mv) return 0.0f;
if (ocv >= table[table_size-1].ocv_mv) return 100.0f;
// 二分查找区间
uint8_t low = 0, high = table_size - 1, mid;
while (high - low > 1) {
mid = (low + high) >> 1;
if (table[mid].ocv_mv <= ocv) low = mid;
else high = mid;
}
// 线性插值
float ratio = (float)(ocv - table[low].ocv_mv) /
(table[high].ocv_mv - table[low].ocv_mv);
return table[low].soc + ratio * (table[high].soc - table[low].soc);
}
我的小技巧:查表时别忘了做输入滤波。OCV测量值往往带有噪声,直接查表会导致SOC跳变。我习惯先对OCV做一阶低通滤波,时间常数设2-5秒,效果很好。
4.3 温度补偿
OCV-SOC曲线对温度非常敏感。你想想看,同一块电池,在-20°C和40°C下测出来的开路电压能差多少?我实测过磷酸铁锂电芯,低温时OCV整体偏低,尤其是低电量区,偏差能到50mV以上。如果不做补偿,SOC估算误差会大得离谱。
温度补偿的核心思路是:建立不同温度下的OCV-SOC曲线族。一般标定三个温度点就够了:-20°C、25°C、45°C。中间温度用线性插值。
我曾经在一个项目中踩过坑:只标定了25°C的曲线,冬天客户反馈SOC跳变严重。后来加上温度补偿,问题就解决了。嗯,这里要注意,补偿不是简单的加减一个固定值,而是整条曲线在电压轴上的平移加缩放。
补偿公式我一般这样写:
// 温度补偿后的OCV
OCV_compensated = OCV_measured + delta_V(T);
// delta_V(T) 通过查表获得
// 例如:-20°C时补偿 +80mV,0°C时补偿 +30mV,25°C时补偿 0mV,45°C时补偿 -20mV
避坑指南:我曾经在低温快充场景下吃过亏。电池刚充完电,表面温度低但内部温度高,OCV测量值会“虚高”。这时候查表得到的SOC会偏大。我的解决办法是:充电结束后强制静置5分钟再启用OCV法,或者用电池内部温度(通过热模型估算)来做补偿,而不是用表面NTC测的温度。
4.4 知识体系总览
下面这张图,是我梳理的OCV法核心逻辑。你可以把它当作本章的“思维导图”:
从这张图你能看出来,OCV法不是孤立存在的。标定是基础,查表是手段,温度补偿是保障。三者缺一不可。我在实际项目中,通常把OCV法作为SOC估算的“初始化”和“校准”手段——车辆上电时用OCV法确定初始SOC,运行过程中再用安时积分法跟踪,定期用OCV法修正累积误差。
总结一句话:OCV法精度高,但依赖静置条件。把它用好,你的SOC估算就稳了一半。