锂离子电池soc估计 采用simulink全模块搭建 可得到辨识估计端电压与仿真端电压曲线 模型估计精度较好,可以完好运行
电池端电压的数学表达式得先捋清楚:
% 电池端电压方程 function V_terminal = batteryModel(SOC, I, R0, R1, R2, C1, C2, tau1, tau2) V_ocv = 3.7 + 0.6*(SOC-0.5); % 典型三元锂OCV-SOC关系 V1 = I*R1*(1 - exp(-tau1)); V2 = I*R2*(1 - exp(-tau2)); V_terminal = V_ocv - I*R0 - V1 - V2; end这里用两个RC支路模拟浓差极化和电化学极化,OCV曲线做了简化处理。实际项目里建议用查表法导入真实OCV-SOC曲线,比多项式拟合更稳。
参数辨识模块用了变步长遗传算法,在Simulink里得搭个混合系统:
[Parameter Estimator] -> [Battery Model] ↓ ↑ [Current Sensor]---[Data Processor]注意得把HPPC测试数据转成.mat格式导入Workspace,循环工况下辨识精度比单脉冲高23%左右。遇到过最坑的情况是采样间隔设成0.1秒时出现数值振荡,后来改成变步长ode23s才解决。
SOC估计核心用了AEKF(自适应扩展卡尔曼滤波),在Function Block里这么写状态更新:
// 雅可比矩阵计算 void computeJacobian(float SOC_prior, float I, float *F, float *H) { F[0] = 1 - dt/(Q_nom*3600); // 状态转移矩阵 H[0] = dV_dSOC(SOC_prior); // 观测矩阵 // 这里省略了RC环节的偏导项... }实测发现过程噪声协方差Q取1e-6、观测噪声R取1e-4时,5%初始SOC误差能在120秒内收敛到2%以内。记得在Simulink配置里勾选"Enable zero-crossing detection",否则电流反向时容易发散。
最后跑出来的电压对比曲线很有意思——在20℃环境温度下,1C放电工况的最大电压误差0.032V。不过低温-10℃时得给模型加上Arrhenius温度补偿项,否则误差会飙到0.15V以上。有个小技巧:在Simulation Data Inspector里把估计电压和真实电压曲线叠加显示,按住Alt键拖拽时间轴能看局部误差分布。
折腾完这套模型,发现最实用的场景其实是BMS的故障诊断——当估计电压和实测电压持续偏离超过阈值,直接触发单体电池异常报警,比单纯看电压阈值灵敏得多。下次试试把模型转成C代码烧进STM32,应该能省下不少BMS开发时间。