EKF_SoC:基于MATLAB/Similink的扩展卡尔曼滤波器EKF的锂电池SoC计算仿真模型。 仿真条件:MATLAB/Simulink R2015b
打开Simulink看到满屏的方块连线就头疼?别慌,咱们今天来拆解一个硬核但实用的锂电池SoC估算方案。搞锂电池状态估计的朋友们应该都懂,传统安时积分法那误差积累简直让人崩溃,EKF(扩展卡尔曼滤波)这货才是真香选择。
这个EKF_SoC模型结构其实挺清爽,主要分三大模块:电池模型、EKF算法、验证环节。核心代码藏在EKF模块的MATLAB Function里,咱们重点看看状态预测部分的代码:
function [x_hat, P] = ekf_predict(x_prev, P_prev, current, dt) R0 = 0.0032; % 欧姆内阻 Q = 0.8*eye(2); % 过程噪声 % 状态方程 soc_pred = x_prev(1) - (current*dt)/30000; % 30000mAh容量 vrc_pred = x_prev(2)*exp(-dt/(R0*0.2)) + current*(1-exp(-dt/(R0*0.2))); F = [1, 0; 0, exp(-dt/(R0*0.2))]; % 状态转移矩阵 x_hat = [soc_pred; vrc_pred]; P = F*P_prev*F' + Q; % 协方差更新 end这里有个坑要注意:电池模型的二阶RC参数(0.2秒那个时间常数)得和实际电芯特性匹配。我调试时发现如果把0.2改成0.15,SOC估计曲线会出现明显的相位滞后。
EKF_SoC:基于MATLAB/Similink的扩展卡尔曼滤波器EKF的锂电池SoC计算仿真模型。 仿真条件:MATLAB/Simulink R2015b
观测更新部分的雅可比矩阵计算是重点,直接影响了EKF的收敛速度。看这段代码:
H = [ocv_slope, -1]; % OCV-SOC曲线斜率 K = P*H'/(H*P*H' + 0.01); % 0.01是观测噪声 x_corrected = x_hat + K*(voltage_meas - (ocv + H*x_hat));这里的ocv_slope可不是固定值,得实时查表获取。建议用插值法处理OCV-SOC表,比直接查表精度高至少0.5%。实测数据表明,加入温度补偿后,-10℃环境下的最大误差能从8%压缩到3%以内。
模型跑起来后,在Simulink里能看到电压跟踪效果。重点观察这两个现象:1)大电流突变时估计值是否出现毛刺 2)静置阶段是否收敛到真实值。调参时别死磕Q和R矩阵,试试用粒子群优化算法自动整定,效率能提升三倍。
最后提醒用老版本Simulink的同仁,2016a之后版本运行这个模型可能会报错,解决方法是在Configuration Parameters里把solver改成fixedStep。源码已打包放在Github(地址见评论区),下回咱们聊聊如何把仿真模型部署到STM32硬件上跑实时估计。