电池模型与卡尔曼滤波

电池模型与卡尔曼滤波SOC估算 --- 几小时快速学习方案

适用前提:已掌握安时积分+多源修正的SOC估算方法(如本工程 SOCRENew 中的实现),希望进一步了解基于模型的卡尔曼滤波方案。


学习路线总图

复制代码
你已有的知识                         本方案新增
─────────────                      ────────────
安时积分 (Ah counting)    ─→    状态方程 (State Equation)
OCV-SOC 查表              ─→    观测方程 (Observation Equation)
多源校准修正               ─→    卡尔曼增益 (Kalman Gain)
固定系数追踪               ─→    误差协方差迭代 (P matrix)
安时积分累加器             ─→    离散时间状态空间模型

核心认知:卡尔曼滤波SOC估算本质上就是"安时积分 + 动态自适应的加权修正"------安时积分提供预测值,电压测量提供修正值,卡尔曼增益动态决定"信安时积分多一点还是信电压多一点"。


第一阶段:电池等效电路模型(约1.5小时)

1.1 为什么需要模型

安时积分法只有一个"状态":SOC本身。但真实电池的行为更复杂------电流变化后,电压不会立刻稳定到OCV,而是要经过一个动态过程(极化效应)。你代码中均衡关断后的"死区等待"本质上就是在等极化消退。

电池等效电路模型(ECM,Equivalent Circuit Model)用R、C元件来描述这个动态过程,让BMS可以"预测"电压的瞬态行为。

1.2 Thevenin模型(一阶RC)--- 起点

复制代码
电路结构:

        R0(欧姆内阻)     R1(极化内阻)
OCV ───[≈2mΩ]───┬──────[≈3mΩ]────── + 端
                 │                   │
                 C1(极化电容)        V_terminal
                 [≈5kF]             (可测量的端电压)
                 │                   │
                 └─────────────────── - 端

物理含义

  • OCV:开路电压,仅与SOC和温度相关,是我们要估计的"真值"
  • R0:欧姆内阻,电流突变的瞬间电压跳变就由它产生。τ ≈ 0(瞬时)
  • R1 × C1:极化环节,时间常数 τ₁ = R₁×C₁ ≈ 10~60s,描述电压的慢速恢复过程

数学描述(连续时间)

极化电压的微分方程:

d V 1 d t = − V 1 R 1 C 1 + I C 1 \frac{dV_1}{dt} = -\frac{V_1}{R_1 C_1} + \frac{I}{C_1} dtdV1=−R1C1V1+C1I

端电压方程:

V t e r m i n a l = O C V ( S O C ) − V 1 − I ⋅ R 0 V_{terminal} = OCV(SOC) - V_1 - I \cdot R_0 Vterminal=OCV(SOC)−V1−I⋅R0

1.3 二阶RC模型 --- 更精确

在一阶基础上再加一个时间常数不同的RC环节:

复制代码
OCV ──[R0]──┬──[R1∥C1](τ₁≈1~100ms, 欧姆恢复)──┬──[R2∥C2](τ₂≈10~600s, 扩散极化)── + 端
             │                                   │
             └─────────────────────────────────────────────────────────────────── - 端

两个RC分别对应上一节"均衡关断后的电压恢复"中提到的快速恢复和慢速恢复。二阶模型对LFP电池尤其重要,因为极化效应更复杂。

学习建议

  • 先掌握一阶模型(Thevenin),理解R0、R1、C1各自的物理意义
  • 二阶模型只是加了一个RC,数学形式一样,不影响后续卡尔曼滤波的理解
  • 不用一开始就纠结"参数怎么辨识",第二阶段再学

推荐阅读(优先前2个):

  • CSDN:搜索 电池等效电路模型 Thevenin PNGV 区别 --- 找对比图最多的那篇
  • CSDN:搜索 锂电池二阶RC等效电路模型详解 --- 找有电路图+公式推导的
  • Youtube:搜索 Battery Equivalent Circuit Model Lecture --- Colorado Boulder大学Greg Plett的公开课,这个领域最权威的人
  • 论文:Plett G L., "Extended Kalman filtering for battery management systems of LiPB-based HEV battery packs" (2004) --- EKF做SOC的开山之作

第二阶段:参数辨识 --- HPPC测试与最小二乘(约1小时)

2.1 模型参数从哪来

上面列了R0、R1、C1等参数,这些值不是从数据手册查的------是测出来的。标准方法叫 HPPC(Hybrid Pulse Power Characterization)测试

HPPC测试简要流程

  1. 将电芯调整到目标SOC(如90%)
  2. 静置1小时(极化消退)
  3. 施加脉冲电流 I_pulse(如1C = 100A),持续10~30秒
  4. 静置40秒,观察电压恢复
  5. 在不同SOC点(90%, 80%, ..., 20%, 10%)重复上述步骤

从HPPC脉冲响应中提取参数

复制代码
电流 I
  ▲        ┌─── 10s 脉冲 ───┐
  │        │                 │
──┼────────┘                 └──────────
  │  ← 静置 →                ← 静置 →
  └──────────────────────────────────→ t

电压 V
  ▲  ← ΔV_R0 (瞬时跳变,由 R0 产生)
  │   ╲
  │    ╲___ ← ΔV_R1 (指数衰减,由 R1∥C1 产生)
  │         ╲_____________
  │                         ╱  ← 恢复(对称过程)
  │                        ╱
──┼───────────────────────────────→ t
  │← R0 →│←── R1∥C1 指数 ──→│

参数计算公式

R 0 = Δ V R 0 I p u l s e = V ( t 1 ) − V ( t 0 ) I p u l s e R_0 = \frac{\Delta V_{R0}}{I_{pulse}} = \frac{V(t_1) - V(t_0)}{I_{pulse}} R0=IpulseΔVR0=IpulseV(t1)−V(t0)

R 1 = Δ V R 1 I p u l s e = V ( t 2 ) − V ( t 1 ) I p u l s e R_1 = \frac{\Delta V_{R1}}{I_{pulse}} = \frac{V(t_2) - V(t_1)}{I_{pulse}} R1=IpulseΔVR1=IpulseV(t2)−V(t1)

C 1 = τ 1 R 1 , τ 1 由指数拟合得到 C_1 = \frac{\tau_1}{R_1}, \quad \tau_1 \text{由指数拟合得到} C1=R1τ1,τ1由指数拟合得到

2.2 多SOC/多温度下参数变化的规律

做完HPPC后你会发现:R0、R1、C1都不是常数------它们随SOC和温度显著变化:

条件 R0 R1 说明
SOC 90%, 25°C 1.5mΩ 2mΩ 正常值
SOC 50%, 25°C 1.8mΩ 3mΩ LFP平台区内阻稍大
SOC 10%, 25°C 2.5mΩ 8mΩ 低SOC时内阻急剧增大
SOC 50%, 0°C 4mΩ 20mΩ 低温下内阻翻倍以上
SOC 50%, -20°C 10mΩ 80mΩ 极低温下内阻巨大

这就是为什么需要查表 :你代码中 CellVPlatformLimUpdate 根据温度查电压平台限制,思路相同------ECM参数也要根据 SOC 和温度做二维查表。

2.3 在线参数辨识 --- RLS(递归最小二乘)

离线HPPC测试的局限:电芯老化后参数会漂移,离线标定的表就过时了。**RLS(Recursive Least Squares,递归最小二乘)**可以在线更新模型参数。

核心思想:用最近一段时间内的电压、电流数据,持续递推更新R0、R1、C1,使模型预测的端电压与实际测量值误差最小。

RLS的递推公式(了解即可,不必背):

K ( k ) = P ( k − 1 ) φ ( k ) λ + φ T ( k ) P ( k − 1 ) φ ( k ) K(k) = \frac{P(k-1)\varphi(k)}{\lambda + \varphi^T(k)P(k-1)\varphi(k)} K(k)=λ+φT(k)P(k−1)φ(k)P(k−1)φ(k)

θ ^ ( k ) = θ ^ ( k − 1 ) + K ( k ) y ( k ) − φ T ( k ) θ \^ ( k − 1 ) \hat{\theta}(k) = \hat{\theta}(k-1) + K(k)y(k) - \\varphi\^T(k)\\hat{\\theta}(k-1) θ^(k)=θ^(k−1)+K(k)y(k)−φT(k)θ\^(k−1)

P ( k ) = 1 λ I − K ( k ) φ T ( k ) P ( k − 1 ) P(k) = \frac{1}{\lambda}I - K(k)\\varphi\^T(k)P(k-1) P(k)=λ1I−K(k)φT(k)P(k−1)

其中 λ \lambda λ 是遗忘因子(通常0.95~0.995),决定"忘掉旧数据的速度"。

学习建议

  • 先理解HPPC测试流程和参数提取方法(这是基础)
  • RLS作为进阶了解------知道有这么个东西能在运行中自动更新参数就行
  • 实际嵌入式实现时,RLS对算力要求比离线查表高得多,很多产品仍然是"出厂标定+温度SOC二维查表"方案

推荐阅读

  • CSDN:搜索 HPPC测试 电池参数辨识 R0 R1 C1 --- 找有电压曲线截图标注ΔV的文章
  • CSDN:搜索 遗忘因子最小二乘法 FFRLS 电池模型 --- RLS在电池中的应用
  • B站:搜索 HPPC测试方法 --- 看实验过程视频,比文字直观

第三阶段:卡尔曼滤波做SOC估算(约2小时,核心)

3.1 卡尔曼滤波的直觉理解(先别碰公式)

一句话:卡尔曼滤波 = 加权平均,权重由"谁更可信"动态决定。

具体到SOC估算:

  • 安时积分告诉你一个SOC预测值,但你知道它有累积误差

  • 电压测量通过OCV-SOC曲线反推另一个SOC值,但你知道动态工况下电压不准(极化未消退)

  • 卡尔曼滤波计算一个权重 K(卡尔曼增益),动态融合两者

    SOC_kf = SOC_ah + K × (SOC_from_voltage - SOC_ah)
    ↑ ↑ ↑
    安时积分预测 电压换算的SOC 卡尔曼增益

    K 接近 0 → 信安时积分更多(动态工况,电压不可靠)
    K 接近 1 → 信电压更多(静置工况,OCV准确)

与你现有代码的类比

你代码中的概念 卡尔曼滤波中的对应
deltaSysEQ 安时积分累加 状态预测(先验估计)
SOCShape 各校准条件修正 观测更新(后验估计)
trackFactor 动态追踪系数 卡尔曼增益 K
MAX_SOC_CHANGE_PME 变化率限制 过程噪声协方差 Q
校准值的"可信程度"判断 测量噪声协方差 R

你的 trackFactor 本质上是一个启发式的"类卡尔曼增益"------充电时距最高SOC越近跑得越慢(K小),放电时距最低SOC越近跑得越快(K大)。卡尔曼滤波把这个"调节"用概率论严谨化了。

3.2 状态空间模型(把电池问题翻译成数学)

状态方程 (描述SOC如何随时间变化):

S O C k + 1 = S O C k − η ⋅ Δ t C n o m ⋅ I k + w k SOC_{k+1} = SOC_k - \frac{\eta \cdot \Delta t}{C_{nom}} \cdot I_k + w_k SOCk+1=SOCk−Cnomη⋅Δt⋅Ik+wk

这就是安时积分! w k w_k wk 是过程噪声,代表电流采样误差、容量不准等因素。

观测方程 (描述如何从SOC推算出我们能测量的电压):

V t e r m i n a l , k = O C V ( S O C k ) − V 1 , k − I k ⋅ R 0 + v k V_{terminal,k} = OCV(SOC_k) - V_{1,k} - I_k \cdot R_0 + v_k Vterminal,k=OCV(SOCk)−V1,k−Ik⋅R0+vk

这就是端电压方程! v k v_k vk 是测量噪声,代表电压采样误差。

状态向量 (把未知量打包在一起):

x k = S O C k V 1 , k x_k = \begin{bmatrix} SOC_k \\ V_{1,k} \end{bmatrix} xk=SOCkV1,k

通常把SOC和极化电压V₁都作为状态量------因为两者都是未知的,都需要估计。

3.3 卡尔曼滤波五步迭代(真正的核心)

每来一个新数据点(电压+电流),做以下五步:

复制代码
┌─────────────────────────────────────────────────┐
│  Step 1: 状态预测(先验)                        │
│  x̂⁻ = A·x̂ + B·I                                 │
│  用安时积分预测SOC,用RC方程预测V₁                │
├─────────────────────────────────────────────────┤
│  Step 2: 误差协方差预测(先验)                   │
│  P⁻ = A·P·Aᵀ + Q                                │
│  预测值的不确定性在增加(因为模型不完美)          │
├─────────────────────────────────────────────────┤
│  Step 3: 卡尔曼增益计算                          │
│  K = P⁻·Cᵀ / (C·P⁻·Cᵀ + R)                      │
│  ★ 最核心的一步:K = 模型不确定性 / (模型不确定性 + 测量不确定性)│
├─────────────────────────────────────────────────┤
│  Step 4: 状态更新(后验)                        │
│  x̂ = x̂⁻ + K·(V_measured - V_predicted)          │
│  用实际测量的电压来修正预测的SOC                  │
├─────────────────────────────────────────────────┤
│  Step 5: 误差协方差更新(后验)                   │
│  P = (I - K·C)·P⁻                                │
│  修正后不确定性减小                               │
└─────────────────────────────────────────────────┘

关键理解------Q和R的作用

  • Q(过程噪声协方差)大 → "我不太信安时积分" → K变大 → 更多依赖电压修正
  • R(测量噪声协方差)大 → "我不太信电压测量" → K变小 → 更多依赖安时积分
  • Q/R 的比值决定稳态行为,绝对值决定收敛速度

与你现在代码的逻辑完全对应

  • 你的 TrackFactorUpdate 让充电末期跟踪变慢(信安时积分更多) → 等效于电压误差R在小电流充电时变大
  • 你的 SOCShape 在满足OCV条件时触发修正 → 等效于R突然变小(此时电压特别可信)

3.4 EKF(扩展卡尔曼滤波)--- 处理非线性

前面假设OCV-SOC是线性关系,但实际OCV曲线是强烈非线性的(尤其LFP平台区)。EKF通过对OCV函数做一阶泰勒展开(求导)来处理非线性。

EKF比标准KF多的一步:在每个时间步计算OCV对SOC的导数(雅可比矩阵),用于更新C矩阵。

为什么LFP电池用EKF反而有坑 :LFP平台区OCV斜率趋近于零 → 导数趋近于零 → C矩阵趋近于零 → K趋近于零 → 电压无法有效修正SOC → 卡尔曼滤波退化为纯安时积分。所以在LFP平台区,必须结合其他修正手段(满充/放空等)来打破"不可观测"的死局。

这就是你现有代码的优势所在------你的多源校准(满充脉冲、放空脉冲、OCV校准等)不依赖OCV斜率,在平台区也能工作。如果用EKF做LFP,平台区SOC会漂,需要配合OCV校准条件来重置。


第四阶段:动手实验(约2小时,纸上或Python)

4.1 纸上推导(1小时)

找一个NCM电芯的数据(OCV斜率大,数学上友好),或者用简化数据:

  • OCV = 3.3 + 0.5 × SOC(线性简化,SOC范围0~1)
  • R0 = 2mΩ, R1 = 3mΩ, C1 = 5000F
  • 电流取 -100A(充电)和 50A(放电)交替
  • 初始SOC = 0.5,但滤波器初始化为SOC = 0.3(故意给错初始值)

手算前3个时间步(Δt = 1s)的卡尔曼滤波迭代,观察SOC如何从0.3收敛到真实值附近。

纸算这个比读十篇博客有用,因为你会真正理解每一步在做什么。

4.2 Python仿真(1小时)

python 复制代码
# 最简EKF-SOC仿真框架(约80行,不用装任何特殊库)
import numpy as np
import matplotlib.pyplot as plt

# 1. 定义电池参数
R0, R1, C1 = 0.002, 0.003, 5000  # 简化值
tau1 = R1 * C1                    # 15s
C_nom = 100 * 3600                # 100Ah → 库仑
SOC_init_true = 0.5

# 2. 生成模拟数据(真实SOC + 模拟的端电压)
# 自己做,先线性OCV,后换成真实OCV曲线

# 3. 实现EKF五步迭代
# Step 1: x_pred = A @ x + B @ I
# Step 2: P_pred = A @ P @ A.T + Q
# Step 3: K = P_pred @ C.T / (C @ P_pred @ C.T + R)
# Step 4: x = x_pred + K * (V_measured - V_predicted)
# Step 5: P = (I - K @ C) @ P_pred

# 4. 对比 SOC_true vs SOC_ekf
# 验证:初始SOC猜错(0.3 vs 真值0.5)→ 预期几分钟内收敛到真值

# 5. 调参实验(感受Q和R)
# - R固定,增大Q → K变大 → 收敛快但噪声大
# - Q固定,增大R → K变小 → 收敛慢但平滑

推荐资源


第五阶段:从理论回到实践(可选,1小时)

5.1 卡尔曼滤波 vs 工程中的安时积分+多源修正

维度 安时积分+多源修正 EKF/UKF
数学复杂度 低(整数运算) 高(矩阵求逆、浮点)
嵌入式算力需求 极低 高(尤其UKF需要Sigma点采样)
LFP平台区表现 ★★★ 满充/放空+OCV校准仍有效 ★ 斜率→0导致不可观测
初始SOC收敛 依赖OCV校准条件满足 ★★★ 从任意初始值自动收敛
模型不确定性的量化 无(或隐式) ★★★ 输出SOC的同时输出方差
SOH在线更新 需额外逻辑 可联合估计SOC+SOH
调试可解释性 ★★★ 直观(查表+限幅) ★ 黑盒感强

5.2 实际产品中的"混合方案"

绝大多数量产BMS采用混合方案:

复制代码
安时积分 + EKF预测
     ↓
OCV校准条件满足? ──Yes──→ 用OCV重置EKF(相当于R突然设很小)
     ↓ No
满充/放空条件? ──Yes──→ SOC硬校准至100%/0%
     ↓ No
继续正常运行

你代码中的架构其实已经为引入卡尔曼滤波做好了铺垫

  • 三值SOC体系天然适合"多状态联合估计"(可以把SOC_Max和SOC_Min作为状态量的上下界)
  • 多源校准条件可作为EKF的"测量更新触发条件"
  • TrackFactor的思想可以平滑过渡到卡尔曼增益

学习时间分配建议

阶段 时间 方式 产出
1. ECM电池模型 1.5h 读博客+画电路图 能画出Thevenin模型并写出公式
2. HPPC与参数辨识 1h 读博客+看实验视频 能解释R0/R1/C1怎么测出来的
3. 卡尔曼滤波核心 2h 手算3步 + 读推导 能默写5步迭代并解释K的物理意义
4. Python仿真 2h 写代码+调Q/R 能看到收敛曲线、理解调参
5. 回到实践 1h 对比现有代码 理解两种方案的互补关系
总计 ≈7.5h 从"会用"到"理解为什么"

如果压缩到最低限度(4h):阶段1→1h + 阶段3→2h(含手算) + 阶段4→1h(跑别人的代码)。


推荐资料汇总

视频(优先):

  • B站搜索 卡尔曼滤波 直观理解 --- 找有动画的,先理解"加权平均"的本质
  • B站搜索 电池SOC估算 扩展卡尔曼滤波 --- 找用中文讲解且有仿真的
  • Youtube搜索 Greg Plett Battery Management Systems --- Plett在Colorado Boulder的BMS课程,业内最权威

文字

  • CSDN搜索 卡尔曼滤波 SOC 安时积分 OCV --- 找到把三者串起来讲的文章
  • 知乎搜索 如何通俗地理解卡尔曼滤波 --- 有篇用温度计的例子讲的,非常直观
  • github.com/fangfufu/LinuxBattery --- 一个开源BMS项目,有EKF实现可以看代码

如果你只想读一篇最核心的论文

Plett G L. "Extended Kalman filtering for battery management systems of LiPB-based HEV battery packs. Part 2. Modeling and identification." Journal of Power Sources, 2004, 134(2): 262-276.

Part 1 讲模型,Part 2 讲参数辨识,Part 3 讲EKF实现------三篇构成完整的电池EKF方案。


2026年6月