电池模型与卡尔曼滤波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测试简要流程:
- 将电芯调整到目标SOC(如90%)
- 静置1小时(极化消退)
- 施加脉冲电流 I_pulse(如1C = 100A),持续10~30秒
- 静置40秒,观察电压恢复
- 在不同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变小 → 收敛慢但平滑
推荐资源:
- B站:电池管理系统之卡尔曼滤波SOC估计 --- 找播放量高的中文视频教程
- Github:`github.com/robinvanemden/Kalman-Filter-for-Beginners`(https://github.com搜索 battery kalman filter soc) --- 找带Python仿真代码的repo
- CSDN:搜索
扩展卡尔曼滤波 SOC Python仿真--- 找带完整可运行代码的
第五阶段:从理论回到实践(可选,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月