基于EKF滤波的二阶RC电池模型Soc估计仿真研究及实验数据分析(MATLAB仿真实现)
·
基于EKF滤波的二阶RC电池模型的Soc估计仿真,附带实验数据(MATLAB仿真)
最近在折腾电池SOC估计的仿真,发现二阶RC模型配合EKF滤波的方案效果还不错。这次用MATLAB整了个仿真demo,实测数据来自某款18650电池的HPPC测试,咱们边撸代码边聊实现细节。
先说说模型结构。二阶RC等效电路在传统Thevenin模型基础上加了两个RC环节,能更好地刻画电池的动态特性。模型方程写成这样:
% 状态方程参数
R0 = 0.02; % 欧姆内阻
R1 = 0.015; % 极化电阻1
R2 = 0.01; % 极化电阻2
C1 = 2400; % 极化电容1
C2 = 960; % 极化电容2
tau1 = R1*C1;
tau2 = R2*C2;
状态变量选SOC和两个极化电压,这里有个小技巧——SOC用库仑积分法更新比直接作为状态变量更稳定。不过为了演示EKF,咱们还是按标准流程来:
% 状态空间方程
function [x_k, A] = stateFcn(x, current, dt, Cn)
soc = x(1);
V1 = x(2);
V2 = x(3);
A = [1 0 0;
0 exp(-dt/tau1) 0;
0 0 exp(-dt/tau2)];
B = [-dt/(3600*Cn);
R1*(1-exp(-dt/tau1));
R2*(1-exp(-dt/tau2))];
x_k = A * x + B * current;
end
注意看B矩阵的构造,这里用指数函数处理RC环节的离散化,比直接前向欧拉法更准。协方差矩阵初始化时建议把SOC的初始不确定性设大点,实测发现这样收敛更快:
P = diag([0.1, 0.01, 0.01]); % 初始协方差矩阵
Q = diag([1e-6, 1e-7, 1e-7]); % 过程噪声
R = 0.01; % 观测噪声
预测和更新步骤是EKF的核心。在MATLAB里实现时注意矩阵维度容易出错,特别是雅可比矩阵的计算:
% 观测方程雅可比
function [H] = measJacobian(x, current, R0)
H = [ocv_slope(x(1)), -1, -1]; % ocv_slope是OCV-SOC曲线的导数
% 这里藏了个工程经验:实际项目中OCV-SOC曲线需要分段线性化处理
% 我们这里用查表法实现,具体代码在OCV_SOC_Table.m里
end
跑完仿真得到的结果挺有意思。在5℃低温工况下,SOC估计误差能稳定在1.5%以内(图1)。不过当电流剧烈波动时,估计值会有个0.5%左右的短暂抖动,这跟模型参数辨识精度有关。
基于EKF滤波的二阶RC电池模型的Soc估计仿真,附带实验数据(MATLAB仿真)
从误差分布直方图(图2)来看,误差主要集中在±1%区间,符合BMS的实用需求。但要注意的是,这个结果依赖准确的模型参数,实际应用时得做足参数辨识的工作。
最后给几个踩坑总结:
- 过程噪声Q调太大容易发散,太小则跟踪慢——建议从1e-6开始试
- OCV-SOC曲线的斜率对结果影响显著,宁可采样点密集也别偷懒
- 采样周期别超过1秒,否则二阶模型优势体现不出来
- 实测数据要做预处理,特别是电流突变的时刻要插值对齐
完整代码已扔GitHub(假装有个链接),包含参数辨识脚本和三种典型工况的测试数据。下次打算试试结合神经网络做模型补偿,有兴趣的兄弟可以一起搞搞。

更多推荐


所有评论(0)