基于MATLAB的双卡尔曼滤波算法:电池SOC估计
基于matlab的双卡尔曼滤波算法。 第一步使用了卡尔曼滤波算法用电池电压来修正SOC然后将修正后的SOC作为第二个卡尔曼滤波算法的输入对安时积分法得到的SOC进行修正最终得到双卡尔曼滤波算法SOC估计值。 结合EKF算法和安时积分法的优点能够得到更稳定、更精确的估计结果。电池SOC估计就像给手机显示电量百分比但电动汽车的BMS系统需要更复杂的操作。今天咱们来拆解一个实战案例——用Matlab实现的双卡尔曼滤波算法看看怎么把电压测量和电流积分两套方法玩出花来。先上核心思路第一个卡尔曼滤波器负责用电压读数修正SOC第二个专门处理安时积分法的误差。两者结果互相矫正比单用任何一种方法都靠谱。来看第一阶段的电压修正部分。这里用扩展卡尔曼滤波EKF建立电池的等效电路模型% 电池模型参数 R0 0.05; % 内阻(Ω) C 2500; % 容量(Ah) dt 1; % 采样间隔(s) % 状态方程: SOC(k1) SOC(k) - (i*dt)/C stateModel (soc,i) soc - (i*dt)/(C*3600); % 观测方程: V OCV(SOC) - i*R0 measureModel (soc,i) interp1(soc_table,ocv_table,soc) - i*R0;这里用了查表法处理OCV-SOC曲线比多项式拟合更灵活。注意电流单位换算3600是把小时转秒这个细节坑过不少新手。基于matlab的双卡尔曼滤波算法。 第一步使用了卡尔曼滤波算法用电池电压来修正SOC然后将修正后的SOC作为第二个卡尔曼滤波算法的输入对安时积分法得到的SOC进行修正最终得到双卡尔曼滤波算法SOC估计值。 结合EKF算法和安时积分法的优点能够得到更稳定、更精确的估计结果。接下来是经典EKF的预测-更新流程% 预测步骤 predictedSOC stateModel(currentSOC, currentI); F 1; % 状态转移雅可比矩阵这里恰好是1 P_pred F * P_prev * F Q; % 更新步骤 H (measureModel(predictedSOC0.01, currentI) - ... measureModel(predictedSOC, currentI)) / 0.01; % 数值求导 K P_pred * H / (H * P_pred * H R); correctedSOC predictedSOC K * (measuredV - estV); P (eye(1) - K*H) * P_pred;这里用数值微分代替解析求导适合快速验证方案。实际工程中建议提前计算好OCV-SOC曲线的导数表毕竟查表比实时计算快得多。第二阶段的安时积分修正更有意思。把第一阶段的输出SOC作为观测值建立另一个KF% 状态量直接是SOC偏移量 Ah_SOC Ah_SOC_prev currentI*dt/(C*3600); % 传统安时法 % 第二个KF的测量更新 K_ah P_ah / (P_ah R_ah); Ah_SOC_corrected Ah_SOC K_ah * (EKF_SOC - Ah_SOC); P_ah (1 - K_ah) * P_ah Q_ah;这里的巧妙之处在于把安时积分法本身作为预测模型把第一个EKF的结果当作带噪声的观测值。两个滤波器形成闭环既抑制了安时法的误差累积又平滑了电压突变带来的抖动。调参时发现几个关键点过程噪声Q和观测噪声R需要根据传感器精度调整一般电压表的R比电流表小一个数量级安时积分KF的Q_ah要略大于EKF的Q反映其误差累积特性OCV-SOC曲线的温度补偿不能忘冬季低温下曲线偏移会导致系统性误差实测某磷酸铁锂电池数据传统安时法1小时漂移2.3%单EKF最大误差1.8%双卡尔曼组合后稳定在0.5%以内。特别是在电流剧烈波动时比如急加速电压突变被两个滤波器交替修正效果比单独使用任一种方法明显提升。最后留个思考题如果把第二个KF改成自适应卡尔曼滤波根据电流波动幅度自动调整Q参数会不会更香下回咱们试试这个改进方案。