3、开路电压法:OCV-SOC曲线标定、OCV-SOC曲线拟合、OCV法的优缺点

聊到SOC估算,开路电压法(OCV法)是绕不开的基础。说白了,它就是利用电池静置时的端电压与剩余电量之间的对应关系来查表。这个方法听起来简单,但真正做起来,坑不少。

我记得刚入行那会儿,觉得OCV法太小儿科了。后来在量产项目上吃过亏,才老老实实回来把这块补扎实。今天咱们就把OCV法的三个核心环节掰开揉碎讲清楚。

3.1 OCV-SOC曲线标定

标定曲线,就是给电池做“体检”。你得知道它在不同电量下,电压到底是多少。这事急不得。

标定流程,我一般这么干:

  1. 满充静置:先把电池充到4.2V(或厂家规定的截止电压),然后静置2小时以上。让极化效应彻底消失。
  2. 阶梯放电:以0.05C(小电流)放电,每放出5%的SOC,就停下来。
  3. 静置记录:每次放电后,静置30-60分钟。等电压稳定了,记录下此时的端电压。
  4. 重复直到放空:一直放到截止电压(比如3.0V),记录下所有数据点。
  5. 充电方向也做一遍:从空电开始,阶梯充电,同样记录。你会发现充放电曲线有迟滞,取平均值更准。

关键点:标定时的温度必须控制。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的日常主力。