基于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仿真)

!SOC估计曲线对比

从误差分布直方图(图2)来看,误差主要集中在±1%区间,符合BMS的实用需求。但要注意的是,这个结果依赖准确的模型参数,实际应用时得做足参数辨识的工作。

最后给几个踩坑总结:

  1. 过程噪声Q调太大容易发散,太小则跟踪慢——建议从1e-6开始试
  2. OCV-SOC曲线的斜率对结果影响显著,宁可采样点密集也别偷懒
  3. 采样周期别超过1秒,否则二阶模型优势体现不出来
  4. 实测数据要做预处理,特别是电流突变的时刻要插值对齐

完整代码已扔GitHub(假装有个链接),包含参数辨识脚本和三种典型工况的测试数据。下次打算试试结合神经网络做模型补偿,有兴趣的兄弟可以一起搞搞。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐