3、开路电压法:OCV-SOC曲线标定、OCV-SOC曲线拟合、OCV法的优缺点
聊到SOC估算,开路电压法(OCV法)是绕不开的基础。说白了,它就是利用电池静置时的端电压与剩余电量之间的对应关系来查表。这个方法听起来简单,但真正做起来,坑不少。
我记得刚入行那会儿,觉得OCV法太小儿科了。后来在量产项目上吃过亏,才老老实实回来把这块补扎实。今天咱们就把OCV法的三个核心环节掰开揉碎讲清楚。
3.1 OCV-SOC曲线标定
标定曲线,就是给电池做“体检”。你得知道它在不同电量下,电压到底是多少。这事急不得。
标定流程,我一般这么干:
- 满充静置:先把电池充到4.2V(或厂家规定的截止电压),然后静置2小时以上。让极化效应彻底消失。
- 阶梯放电:以0.05C(小电流)放电,每放出5%的SOC,就停下来。
- 静置记录:每次放电后,静置30-60分钟。等电压稳定了,记录下此时的端电压。
- 重复直到放空:一直放到截止电压(比如3.0V),记录下所有数据点。
- 充电方向也做一遍:从空电开始,阶梯充电,同样记录。你会发现充放电曲线有迟滞,取平均值更准。
关键点:标定时的温度必须控制。25℃是行业标准。温度一变,曲线就漂。我在项目中遇到过,同一批电芯,在0℃和45℃下测出的OCV-SOC曲线,在中间段能差出2%-3%的SOC误差。
标定完成后,你会得到一张这样的表:
| SOC (%) | OCV (V) @ 25℃ | OCV (V) @ 0℃ | OCV (V) @ 45℃ |
|---|---|---|---|
| 100 | 4.200 | 4.180 | 4.210 |
| 95 | 4.120 | 4.095 | 4.130 |
| 90 | 4.050 | 4.020 | 4.060 |
| ... | ... | ... | ... |
| 5 | 3.400 | 3.350 | 3.420 |
| 0 | 3.000 | 2.950 | 3.020 |
我的小技巧:标定数据点别只取20个。我习惯在SOC 10%-90%区间加密,每2%取一个点。因为中间段曲线平缓,查表容易引入误差。两头(0-10%和90-100%)可以5%取一个点,因为电压变化剧烈,反而好查。
3.2 OCV-SOC曲线拟合
标定完拿到的是离散点。但BMS运行时,电压是连续变化的。你不能每次都去查表插值,太慢了。所以需要拟合出一条数学曲线。
常用的拟合方法:
- 多项式拟合:最简单。用5-9阶多项式去逼近。阶数太低,误差大;阶数太高,容易过拟合。
- 分段线性拟合:把曲线切成几段,每段用直线近似。适合资源受限的MCU。
- 查表+线性插值:工业界最常用。不拟合,直接存表,运行时用线性插值算。
我个人习惯用查表+线性插值。为什么?因为OCV-SOC曲线不是光滑的数学函数,尤其是磷酸铁锂,中间有一段几乎水平的平台区。你用多项式去拟合,反而会引入震荡。
给你看一段我常用的插值代码(C语言风格):
// OCV查表结构体
typedef struct {
float ocv; // 开路电压 (V)
float soc; // 对应的SOC (%)
} OCV_Table_Point;
// 假设表已按ocv升序排列
float GetSOC_FromOCV(float ocv_measured, OCV_Table_Point *table, int table_size) {
// 边界处理
if (ocv_measured <= table[0].ocv) return table[0].soc;
if (ocv_measured >= table[table_size-1].ocv) return table[table_size-1].soc;
// 二分查找
int low = 0, high = table_size - 1, mid;
while (high - low > 1) {
mid = (low + high) / 2;
if (table[mid].ocv < ocv_measured) low = mid;
else high = mid;
}
// 线性插值
float ratio = (ocv_measured - table[low].ocv) / (table[high].ocv - table[low].ocv);
return table[low].soc + ratio * (table[high].soc - table[low].soc);
}
注意:查表时一定要做边界保护。我曾经见过一个案例,因为电压采样值略高于表内最大值,插值直接溢出,SOC跳到了120%。这种低级错误,在产线上能让你排查三天三夜。
3.3 OCV法的优缺点
聊完怎么做,咱们客观评价一下这个方法。你想想看,为什么现在纯靠OCV法的BMS几乎绝迹了?
优点:
- 精度高:静置充分时,误差可以控制在1%以内。这是安时积分法比不了的。
- 无累积误差:每次静置后查表,相当于把SOC“归零”校准一次。不会像安时积分那样越跑越偏。
- 实现简单:不需要复杂的卡尔曼滤波,一个查表函数搞定。对MCU算力要求极低。
缺点:
- 需要静置:这是最大的硬伤。电池必须静置30分钟以上,极化电压才能消散。车在跑的时候,你没法用。
- 对温度敏感:前面说了,温度一变,曲线就漂。如果不做温度补偿,误差能到5%以上。
- 电池老化影响:随着循环次数增加,OCV-SOC曲线会整体下移。新电池标定的曲线,用了一年后就不准了。
- 平台区分辨率低:磷酸铁锂电池在SOC 20%-80%区间,电压变化不到50mV。你ADC采样稍微有点噪声,SOC就能跳好几个点。
一句话总结:OCV法是个好工具,但只能当“校准器”用。实际BMS中,都是把它和安时积分法结合——平时用安时积分,停车静置后用OCV法修正。这叫“组合法”,后面章节会详细讲。
嗯,关于OCV法,今天就聊这么多。记住,标定要细致,拟合要务实,使用要谨慎。下一章咱们讲安时积分法,那个坑更多,但也是BMS的日常主力。