,

SOC 估算算法深度对比:安时积分法 vs 卡尔曼滤波

SOC 估算算法深度对比:安时积分法 vs 卡尔曼滤波

电池管理系统(BMS)里,SOC(State of Charge,荷电状态)是几乎所有上层策略的锚点:SOC 估不准,SOP 功率限值跟着错、均衡策略跟着错、剩余续航和充电预警全都跟着漂。而这一切的起点,是一个看起来再朴素不过的问题——”电池里还剩多少电”。围绕这个问题,工程上打了几十年的补丁,最终沉淀出两条主流路线:以安时积分(库仑计数)为代表的开环法,和以卡尔曼滤波(及其变体)为代表的闭环估计算法。本文把这两条路线放在一起掰开揉碎,讲清楚各自的原理、误差来源、工程取舍,以及实践中为什么往往要把它们拧成一股绳。


1. 先把 SOC 这个”百分比”定义清楚

在谈算法之前,必须先明确 SOC 到底在量什么,否则后面的误差讨论全是空中楼阁。业内通行的定义是:

SOC = 剩余可用容量 / 当前可用总容量 × 100%

这里”当前可用总容量”是个关键细节——它不是出厂标称容量,而是随温度、老化、放电倍率动态变化的值。同样一辆车,冬天和夏天、新电池和用了五年的电池,满充能放出的电量差一大截。所以 SOC 的困难,本质上不是”算还剩多少”,而是“总容量这个分母本身在不停地变,还得实时把它也估出来”。这也是为什么 SOC 估算往往会跟 SOH(健康状态)、容量标定绑在一起做——分开做,两头都做不好。

工程上常用的 SOC 估算方法大致有这几类:

  • 开环法:安时积分(库仑计数)、开路电压(OCV)查表;
  • 闭环法:卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)、粒子滤波等;
  • 数据驱动法:神经网络、模糊逻辑、最小二乘参数辨识(通常跟等效电路模型配合)。

本文聚焦最核心的两条主线——安时积分和卡尔曼滤波,其余方法作为它们的延伸来理解。


2. 安时积分:简单、便宜,但会”越攒越多地漂”

2.1 原理就一句话

安时积分(Ah counting / Coulomb counting)的数学本质是对电流做时间积分:

SOC(t) = SOC(t0) - ∫(t0→t) I(τ) dτ / Cn

其中 Cn 是当前可用总容量,I 是电池电流(放电为正、充电为负)。它只依赖一件事:电流采样。原理简单到不需要任何电池模型,因此对算力要求极低,至今仍是绝大多数量产 BMS 的”底层主算”。

2.2 误差的来源:积分器的天生弱点

积分器的问题在于,误差只进不出。下面三个误差源,每一个都会随时间线性累积,最终叠成一个越来越大的 SOC 偏置:

  1. 电流采样偏置:传感器(分流器或霍尔传感器)的零点漂移,哪怕只有 10 mA,积分 10 小时就是 0.1 Ah 的纯误差。高精度库仑计之所以贵,贵就贵在零点稳、温漂小。
  2. 采样噪声与量化误差:离散采样的量化噪声虽然零均值,但经过积分后不再相互抵消,会累积成随机游走。
  3. 容量 Cn 估计不准:分母错了,积分结果整体等比例地错。而 Cn 又随温度和老化在变,不用闭环校正就会一直用错的分母。

安时积分还有个更隐蔽的坑:它假设”充进来的就是能放出去的”。实际上充电效率和放电效率都不为 1,低温、大倍率下的库仑效率(库仑效率 = 放电容量 / 充电容量)会明显偏离,这部分损失如果不补偿,SOC 会在反复充放中悄悄”虚高”。

2.3 优点也不该被抹杀

安时积分最大的价值在于短时相对精度高、响应快、不依赖模型。在两次校正点之间,它对 SOC 变化的刻画是很准的——今天下午开的那 30 公里,SOC 掉了 8%,这个”掉了多少”安时积分算得很靠谱。它真正怕的是”长时间没有校准点”。

所以工程上对安时积分的正确用法从来不是”单独用”,而是“用它提供短时分辨率,再用别的信号周期性地把漂移拉回来”。这个”别的信号”,最常见的候选就是 OCV 查表和卡尔曼滤波。


3. 从安时积分到卡尔曼滤波:把”估”变成”闭环校正”

3.1 为什么要闭环

安时积分是开环的:它只往一个方向输出,从不根据外部测量来修正自己。一旦某个时刻的 SOC 初始值给错了(比如上次停车时没来得及做满充校准),这个错误会被原封不动地带下去,直到下一次强制校准。

卡尔曼滤波要解决的核心,就是“如何用带噪声的测量,来不断纠正一个带噪声的估计”。它同时拿着两个信息源:一个是”模型预测”(比如安时积分推出来的 SOC),一个是”外部测量”(比如端电压通过 OCV 关系反推的 SOC)。然后根据各自的噪声大小动态加权,噪声小的多信一点,噪声大的少信一点,得到一个在统计意义上最优的估计。

3.2 卡尔曼滤波的五个公式,一句话讲清

标准卡尔曼滤波的迭代结构是”预测 + 更新”两步,五条公式。不展开矩阵推导,只讲每步在干什么:

  1. 状态预测:用上一时刻的状态和模型,推出当前时刻的先验估计 x̂⁻
  2. 协方差预测:把过程噪声 Q 加进去,计算先验误差协方差 P⁻(表示”我现在有多不确定”);
  3. 卡尔曼增益:根据 P⁻ 和测量噪声 R 算出增益 KK 越大意味着越相信测量;
  4. 状态更新:用 K 把”测量值”和”预测值”的差(又称新息,innovation)加权叠到先验估计上,得到后验估计
  5. 协方差更新:更新后验误差协方差 P

关键就两个参数:过程噪声 Q测量噪声 R。Q 大,说明模型不太靠谱,K 会偏向相信测量;R 大,说明测量噪声大,K 会偏向相信模型。这两个值的设定,直接决定滤波器的收敛速度和稳定性——也是工程上最需要”调出来的手感”。

3.3 前提:得先有一个电池模型

卡尔曼滤波本身不产生 SOC,它需要测量方程把”可测的量”和”待估的状态”连起来。对锂电池,这个测量方程通常来自等效电路模型(ECM)

端电压 Vt = OCV(SOC) - R0·I - Σ Ri·Ii(各 RC 环节的极化电压)

也就是用一阶或二阶 RC 网络来描述电池的动态电压响应。状态向量里通常包含 SOC 和各个 RC 环节的极化电压,输出(测量)则是端电压 Vt。滤波器通过不断比较”模型预测的端电压”与”实测的端电压”,来反推 SOC 应该往哪修、修多少。

到这里就能看出卡尔曼滤波的代价了:它需要先拟合出一个足够准的电池模型(OCV-SOC 曲线、内阻、RC 参数都要在线辨识或离线标定),而模型本身就是误差的另一个来源。模型不准,滤波器的校正方向就是歪的。


4. 正面硬刚:两条路线的工程属性对比

维度 安时积分 卡尔曼滤波(EKF/UKF)
原理 电流时间积分 状态空间滤波,模型 + 测量闭环
依赖的输入 电流 电流、电压(+ 温度修正)
是否需要电池模型 是(等效电路模型)
算力需求 极低 中高(矩阵运算)
长时间误差 线性累积,无界漂移 有界收敛,但受模型精度制约
短时精度 高、响应快 依赖模型动态描述
初始值鲁棒性 差(错初值会一直带下去) 好(能收敛回真值)
对采样噪声 敏感(累积) 有滤波平滑作用
典型精度(稳态) 依赖校准点,5%~10% 漂移风险 3%~5%(模型好时 2%~3%)
工程门槛 高(建模、调参、标定)

这张表不是为了分出高下,而是说明:它们在错误的地方互补。安时积分短时准、长时漂;卡尔曼短时依赖模型、长时能闭环收束。这也是为什么成熟的量产方案几乎都是”混合”的。


5. 实践中的真正常态:混合策略

现实中很少见到”纯安时积分”或”纯卡尔曼”的产品,更多是按工况切换、按信息可用性组合的混合方案。一个典型的工程框架长这样:

// 混合 SOC 估算框架(简化示意)
float estimate_soc(float I, float Vt, float T, uint32_t rest_ms, bool charge_flag) {
    // 1. 底层主算:安时积分提供短时分辨率
    soc_ah = soc_prev - (I * dt) / Cn_fast(T, soh, I);

    // 2. 条件触发:静置足够久时用 OCV 校一次(硬校准点)
    if (rest_ms > REST_MIN_MS) {
        soc_ocv = ocv_lookup(Vt_hysteresis_corrected(Vt, charge_flag), T);
        soc_ah  = blend(soc_ah, soc_ocv, rest_quality(rest_ms));  // 静置越久越信 OCV
    }

    // 3. 动态工况:Kalman 闭环,用端电压新息持续纠偏
    if (dynamic_condition(I)) {
        soc_kf = ekf_predict_update(soc_ah, Vt, I, T, ecm_params, Q, R);
        soc_ah = soc_kf;
    }

    // 4. 硬端点兜底:满充/满放强制归位
    if (charge_cutoff())  soc_ah = 100.0f;
    if (discharge_cutoff()) soc_ah = 0.0f;

    soc_prev = soc_ah;
    return soc_ah;
}

这个框架的每一层都在回答一个具体问题:

  • 安时积分回答”这一小段时间里 SOC 变了多少”;
  • OCV 查表回答”停了一会儿,现在到底在曲线的哪个位置”;
  • 卡尔曼滤波回答”跑起来的时候,端电压的偏差说明 SOC 该往哪修”;
  • 硬端点回答”满充满放时,别再猜了,直接归零/归满”。

其中 OCV 校正和硬端点校正是最廉价也最可靠的”锚点”,卡尔曼滤波负责在两个锚点之间维持精度,安时积分负责给这一切提供实时脉动。少了任何一个,系统都会在某个特定工况下露馅。

5.1 LFP 的特别提醒

如果电池是磷酸铁锂(LFP),这套混合策略要格外小心。LFP 的 OCV 曲线在 30%~80% SOC 区间近乎平坦,端电压对 SOC 的变化极不敏感——这意味着卡尔曼滤波的测量方程在这一段几乎没有可用的新息,滤波器会”失明”,甚至把采样噪声当有效信息放大。对 LFP,工程上通常要:

  • 弱化平坦区的电压校正权重,只在两端陡峭区(膝点附近)启用 OCV/电压校正;
  • 依赖更多的满充满放校准机会,用硬端点周期性收束漂移;
  • 补偿明显的电压迟滞(充放不同的 OCV),否则校正方向系统性地偏。

一句话:算法框架可以通用,但模型参数和校正策略必须跟着化学体系走。


6. 卡尔曼滤波的变体与更”高级”的路线

EKF 是 BMS 里最常用的卡尔曼实现(因为电池模型的 OCV 关系是非线性的,需要线性化),但它有两个已知短板:线性化会引入误差、需要计算雅可比矩阵、且对强非线性(如迟滞)处理不佳。于是有了变体:

  • UKF(无迹卡尔曼滤波):不线性化模型,而是用一组 sigma 点近似状态分布,对强非线性更稳健,代价是计算量更大;
  • 粒子滤波 / 扩展类:理论上能处理任意分布,但计算成本高,量产嵌入式上用得少;
  • 双卡尔曼/自适应卡尔曼:同时估计 SOC 和模型参数(如内阻、容量),把 SOH 也一并在线辨识。

真到了要”更高精度”的场合,还有模型侧和数据侧两条路:更精细的电化学模型(P2D 等)能刻画更多物理细节,但实时算力吃紧;数据驱动(神经网络、高斯过程)能用历史数据学到 OCV-SOC 的非参数关系,但泛化和可解释性差、需要大量标定数据。对大多数量产场景,EKF/UKF + 安时积分 + 硬端点校准的组合,已经能在成本、算力、精度之间取得足够好的平衡。


7. 落地建议:别把 SOC 估算做成”炫技”

回到工程实际,几句体会:

第一,校准点比算法更值钱。 一个准确的满充/满放校准点,顶得上算法精调半天。系统设计上要为”制造校准机会”创造条件(提示用户规律满充等),而不是指望算法把漂移凭空抹掉。

第二,模型参数要能在线更新,别一标定管终身。 电池会老化,内阻和容量都在变,滤波器参数(乃至 OCV 表)必须跟着 SOH 做在线修正,否则越用越偏。

第三,噪声参数 Q、R 不是拍脑袋定的。 它们应该从真实标定数据的残差统计里算出来,而不是抄个经验值。Q、R 定得不准,滤波器轻则震荡、重则不收敛。

第四,用冗余交叉验证兜底。 关键系统里,SOC 往往不只有一条估算链——可以并行跑安时积分 + EKF 两条线,或拿单体平均电压、静置 OCV、历史积分互相校核,一旦分歧超阈值就切到安全降级。功能安全(ISO 26262)语境下,这种冗余不是浪费,是必须。

SOC 估算是 BMS 里少数几个”原理不复杂、做精极难”的领域。安时积分教你认清单个误差如何随时间放大,卡尔曼滤波教你学会用噪声信息做闭环权衡。理解了这两者各自的边界,你才能真正理解那些量产车上”±3%”的标称精度背后,藏了多少道补偿和兜底。


本文面向 BMS 软件与算法工程师,聚焦 SOC 估算两条核心路线(安时积分与卡尔曼滤波)的原理、误差来源与工程取舍。文中涉及的 SOC 定义、等效电路模型、EKF/UKF 等概念,是动力与储能电池管理系统的主流实践框架。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Navigation

About

Writing on the Wall is a newsletter for freelance writers seeking inspiration, advice, and support on their creative journey.