基于卡尔曼滤波与Matlab Simulink仿真的锂电池SOC估计优化与参数辨识实验研究
基于卡尔曼滤波的锂电池SOC估计 Matlab/Simulink仿真模型成品 扩展卡尔曼滤波EFK实验、参数辨识和仿真最近在搞锂电池SOC估计的仿真发现这玩意儿看起来简单实际坑不少。今天咱们直接上干货聊聊怎么在Simulink里搭卡尔曼滤波的SOC估计模型。先给个结论参数辨识比算法本身还重要搞不定这个后面全白搭。先说模型架构。典型的二阶RC等效电路模型是基础但千万别直接拿论文里的参数。我一般用电池测试仪做脉冲充放电实验抓取电压响应曲线。这里有个小技巧采样间隔别设太密5秒左右效果反而更好能过滤掉不必要的噪声。看这段参数辨识代码% 脉冲放电数据预处理 discharge_data smooth(V_response,sgolay); [~,peak_locs] findpeaks(-diff(discharge_data)); tau_init mean(diff(peak_locs))*0.8; % 时间常数初值 % 用系统辨识工具箱搞动态参数 sys_id ssest(discharge_data, 2, Ts,5); R0 sys_id.K(1); R1 sys_id.B(2)/(1-sys_id.A(2,2)); C1 5/(R1*(1-sys_id.A(2,2)));这里用了Savitzky-Golay滤波平滑数据比移动平均法保留了更多特征。注意tau_init乘的0.8是经验系数实际调试时可能需要根据电池类型调整。系统辨识出的状态空间模型要转换成等效电路参数这里涉及到拉普拉斯变换到离散域的转换新手容易在这里翻车。基于卡尔曼滤波的锂电池SOC估计 Matlab/Simulink仿真模型成品 扩展卡尔曼滤波EFK实验、参数辨识和仿真SOC-OCV曲线标定更是个精细活。建议用0.1C倍率充放电静置2小时再测电压。实测某三元锂电池的数据拟合soc_points [0:0.1:1]; ocv [3.2 3.45 3.6 3.7 3.75 3.83 3.92 4.0 4.1 4.18 4.2]; p polyfit(soc_points,ocv,7); dOCV_dSOC polyder(p); % 用于EKF的雅可比矩阵 figure scatter(soc_points,ocv,filled) hold on fplot((x) polyval(p,x),[0 1])7次多项式拟合要注意过拟合问题特别是SOC在20%以下和90%以上的区域。曾经遇到过充满电后OCV突然下降的情况后来发现是静置时间不够导致极化未消除。重点来了EKF的Simulink实现。状态方程部分建议用Matlab Function模块而不是普通的差分方程模块方便调试function [x_out, OCV] ekf_state(x, current, dt) % x: [soc; V1; V2] persistent param if isempty(param) param.R0 0.02; param.R1 0.015; param.C1 2400; param.Q 2.5; % Ah end soc_dot -current/(3600*param.Q); V1_dot -x(2)/(param.R1*param.C1) current/param.C1; x_out x dt*[soc_dot; V1_dot; 0]; OCV polyval(p,x_out(1)) - param.R0*current;这里故意把R0写成固定值实际应该做成随SOC变化的二维查表。注意第三个状态V2被简化处理了因为有些电池型号的二阶效应不明显。测量更新环节的雅可比矩阵要实时计算H [polyval(dOCV_dSOC, x_pre(1)), -1, -1]; % OCV对SOC的导数 K P_pre*H/(H*P_pre*H R);这里有个隐藏bug当SOC接近100%时dOCV_dSOC趋近于零会导致卡尔曼增益异常需要做数值截断处理。实测加入饱和限制后估计误差能降低40%以上。最后说下仿真验证的小技巧。在脉冲工况下SOC估计误差应该控制在1%以内。如果出现发散先别急着调Q、R矩阵检查安时积分项的初始值是否正确。曾经有个项目因为初始SOC设置偏差5%导致EKF迭代十次才收敛差点误了交付时间。模型验证通过后记得做参数敏感性分析。把R0上下浮动20%观察SOC估计曲线的变化幅度。好的模型应该在参数漂移15%时仍能保持3%以内的估计精度这对实际BMS系统至关重要。