3、SOC估算方法(上):开路电压法(OCV)、安时积分法(库仑计数)的原理与实现

各位同学,咱们今天聊点实在的。

SOC——电池荷电状态,说白了就是「电池还剩多少电」。你手机右上角的百分比,电动车仪表盘上的电量条,都是SOC。但你知道吗?这个看似简单的数字,背后其实藏着不少坑。我做了这么多年BMS,踩过的坑能写本书。今天先讲两种最基础、也最常用的方法:开路电压法和安时积分法。

核心观点:没有一种SOC估算方法是完美的。开路电压法准,但不能实时用;安时积分法能实时算,但会越算越偏。实际工程中,两者必须配合使用。

3.1 开路电压法(OCV)—— 静态的「温度计」

开路电压法,原理很简单:电池静置足够久之后,端电压和SOC之间存在一一对应的关系。你测出电压,查表就知道还剩多少电。

为什么会这样?因为电池的化学反应决定了开路电压和荷电状态之间的非线性关系。锂离子电池的OCV-SOC曲线,通常是一条S形曲线。

关键点:电池必须静置足够长时间。一般锂离子电池需要静置1-2小时,磷酸铁锂电池甚至需要更久。为什么?因为极化效应消失需要时间。我记得有一次在项目中,客户说「我停车5分钟测出来的电压怎么不准?」——嗯,这就是典型的没等极化消失。

我的经验:实际项目中,OCV法主要用于两个场景:一是车辆刚上电时做初始SOC校准;二是长时间静置后唤醒时做SOC修正。千万别在动态工况下用OCV法,那结果会让你怀疑人生。

OCV-SOC曲线的获取

获取OCV-SOC曲线,通常有两种方式:

  1. 小电流充放电法:用0.05C甚至更小的电流充放电,每隔一定SOC点静置1小时,记录开路电压。
  2. 增量容量分析法:通过dQ/dV曲线反推OCV,精度更高但计算复杂。

我个人习惯用第一种,简单粗暴,工程上够用。但要注意温度影响——同一SOC下,0℃和40℃的开路电压能差出20mV以上。所以实际工程中,我们通常要建立OCV-SOC-T的三维查找表。

代码实现:OCV查表法

// OCV-SOC查找表(25℃典型值)
// 电压单位:mV,SOC单位:%
const int ocv_table[11][2] = {
    {3000, 0},   // 3.0V -> 0%
    {3200, 10},  // 3.2V -> 10%
    {3350, 20},  // 3.35V -> 20%
    {3450, 30},  // 3.45V -> 30%
    {3550, 40},  // 3.55V -> 40%
    {3650, 50},  // 3.65V -> 50%
    {3750, 60},  // 3.75V -> 60%
    {3850, 70},  // 3.85V -> 70%
    {3950, 80},  // 3.95V -> 80%
    {4050, 90},  // 4.05V -> 90%
    {4200, 100}  // 4.2V -> 100%
};

// 线性插值函数
float ocv_to_soc(int voltage_mv) {
    // 边界处理
    if (voltage_mv <= ocv_table[0][0]) return 0.0;
    if (voltage_mv >= ocv_table[10][0]) return 100.0;
    
    // 查找区间并线性插值
    for (int i = 0; i < 10; i++) {
        if (voltage_mv >= ocv_table[i][0] && voltage_mv < ocv_table[i+1][0]) {
            float ratio = (float)(voltage_mv - ocv_table[i][0]) / 
                         (ocv_table[i+1][0] - ocv_table[i][0]);
            return ocv_table[i][1] + ratio * (ocv_table[i+1][1] - ocv_table[i][1]);
        }
    }
    return -1; // 异常情况
}

注意:上面的表格只是示例。实际项目中,OCV-SOC曲线需要针对具体电芯型号实测标定。不同厂家的电芯,甚至同一厂家不同批次的电芯,曲线都有差异。我曾经因为偷懒用了供应商提供的「典型值」,结果量产时SOC偏差达到8%以上……后来老老实实自己测了一遍。

3.2 安时积分法(库仑计数)—— 动态的「流量计」

安时积分法,说白了就是「流进去多少电,流出来多少电,剩下的就是当前电量」。公式很简单:

SOC(t) = SOC(0) - (1/Q_n) × ∫η×I(t)dt

其中:

  • SOC(0) —— 初始SOC
  • Q_n —— 电池额定容量(Ah)
  • η —— 库仑效率(充电时约0.98-0.99,放电时约1.0)
  • I(t) —— 电流(充电为正,放电为负)

你想想看,这个方法是不是很直观?电流传感器测到电流,乘以时间,累加起来,就得到了消耗或充入的电量。

但问题来了——误差会累积。电流传感器有零点漂移,ADC采样有量化误差,时间基准有晶振偏差……这些误差虽然单个很小,但积分时间长了,就会越滚越大。我见过一个项目,跑了3个月后,安时积分法的SOC误差达到了15%。

避坑指南:我曾经在一个项目中,发现SOC在满充后显示只有95%。排查了三天,最后发现是电流传感器的零点偏移了5mA。5mA啊兄弟们!但一天下来就是0.12Ah,一个月就是3.6Ah——对于一块50Ah的电池包,这就是7%的误差。

代码实现:离散安时积分

// 安时积分法实现(离散化)
// 采样周期:100ms
#define SAMPLE_PERIOD_MS  100
#define CAPACITY_AH       50.0f  // 电池额定容量
#define COULOMB_EFF       0.985f // 库仑效率

static float soc_integral = 50.0f; // 初始SOC,假设50%
static float current_ma = 0.0f;    // 当前电流,单位mA

void ah_integration_update(void) {
    // 读取电流(假设已通过ADC获取)
    current_ma = read_current_ma();
    
    // 计算本周期充放电量(单位:mAh)
    float delta_ah = current_ma * (SAMPLE_PERIOD_MS / 3600000.0f);
    
    // 考虑库仑效率
    if (current_ma > 0) { // 充电
        delta_ah *= COULOMB_EFF;
    }
    
    // 更新SOC
    soc_integral -= (delta_ah / CAPACITY_AH) * 100.0f;
    
    // 限幅处理
    if (soc_integral > 100.0f) soc_integral = 100.0f;
    if (soc_integral < 0.0f)   soc_integral = 0.0f;
}

工程建议:安时积分法的精度,很大程度上取决于电流传感器的精度。我建议至少使用0.5%精度的电流传感器,采样频率不低于10Hz。另外,每次充满电或放空电时,记得做一次SOC校准——把积分值强制设为100%或0%,这样可以「清零」累积误差。

3.3 两种方法的对比与选择

咱们来做个对比,你一看就明白了:

对比项 开路电压法 安时积分法
实时性 差(需静置) 好(可实时计算)
长期精度 好(无累积误差) 差(误差会累积)
动态适应性 差(仅静态可用) 好(动态工况可用)
实现复杂度 低(查表即可) 中(需积分运算)
硬件依赖 电压采样 电流采样+时间基准
典型误差 2%-5% 5%-15%(长期)

看到没?两种方法各有优劣。实际工程中,没人只用一种方法。常见的做法是:用OCV法做初始化和定期校准,用安时积分法做实时跟踪。这就是所谓的「OCV+安时积分」联合估算。

3.4 知识体系总览

下面这张图,帮你理清今天讲的内容:

SOC估算方法(上)知识体系 SOC估算方法 开路电压法(OCV) 原理:电压→SOC查表 需静置1-2小时 受温度影响大 安时积分法 原理:电流×时间积分 误差会累积 需高精度电流传感器 工程实践:OCV做校准 + 安时积分做实时跟踪 两者互补,才能获得高精度SOC

3.5 工程实践中的注意事项

最后,我把自己这些年踩过的坑,总结成几条实用建议:

  • 初始SOC一定要准:安时积分法的起点错了,后面全错。每次上电时,如果电池静置超过30分钟,优先用OCV法校准初始SOC。
  • 电流传感器要定期校准:我建议每3个月做一次零点校准。方法很简单——断开负载,测到的电流应该为0,如果不为0,记录偏移量并在软件中补偿。
  • 考虑电池老化:电池用久了,容量会衰减。如果还用出厂时的额定容量做安时积分,SOC会越算越偏。我一般会在BMS中加入容量学习算法,定期更新Q_n值。
  • 温度补偿不能省:低温下电池可用容量会下降,OCV曲线也会偏移。没有温度补偿的SOC估算,在冬天就是个笑话。

重要提醒:以上两种方法只是SOC估算的「基本功」。实际产品中,还需要结合卡尔曼滤波、神经网络等更高级的算法。但别急——先把基础打牢,后面的内容我们慢慢聊。

好了,今天的内容就到这里。记住:OCV法是静态的「温度计」,安时积分法是动态的「流量计」。两者结合,才能做出靠谱的SOC估算。下次见!


公众号:蓝海资料掘金营,微信deep3321