4、开路电压法(OCV):OCV-SOC曲线标定、查表法实现、温度补偿

开路电压法,圈内人常叫它OCV法。说白了,就是利用电池静置时的端电压来反推当前电量。这个方法很直观,也很可靠。我在项目里经常把它作为SOC估算的“压舱石”——尤其是在车辆刚上电、电池静置充分的时候,OCV法给出的结果几乎就是标准答案。

4.1 OCV-SOC曲线标定

每款电芯都有自己的“性格”。这个性格,就藏在OCV-SOC曲线里。你想想看,电池从满电放到没电,电压会怎么变化?不是线性的,而是带着几个“平台区”和“陡坡区”。

标定这条曲线,我一般分三步走:

  1. 小电流充放电:用0.05C甚至更小的电流,把电池从满充放到截止电压,再充回来。电流越小,极化效应越弱,测出来的OCV越准。
  2. 静置取点:每放出(或充入)5%或10%的容量,就停下来静置1-2小时。等电压稳定了,记录下这个点的OCV值。
  3. 曲线拟合:把离散的点连成平滑曲线。我习惯用多项式拟合,阶数选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曲线标定 查表法实现 温度补偿 小电流充放电 静置取点 曲线拟合 线性插值 最近邻查表 输入滤波 多温度标定 线性插值补偿 内部温度修正 输出:补偿后的SOC估算值

从这张图你能看出来,OCV法不是孤立存在的。标定是基础,查表是手段,温度补偿是保障。三者缺一不可。我在实际项目中,通常把OCV法作为SOC估算的“初始化”和“校准”手段——车辆上电时用OCV法确定初始SOC,运行过程中再用安时积分法跟踪,定期用OCV法修正累积误差。

总结一句话:OCV法精度高,但依赖静置条件。把它用好,你的SOC估算就稳了一半。

专注资料整理