项目中包括锂电池模型建立、参数辨识与验证、SOC估算采用扩展卡尔曼滤波(EKF),使用了两种方式实现: 1. Simulinks(EKF only) 2. 脚本(包含EKF和UKF) 模型的输入包括电流和电压来自于HPPC(混合脉冲功率特性)测试的电池数据 脚本文件可以仿真在BBDST(北京公交车动态街道测试)工况和带有观测噪声的恒流工况下的锂离子电池放电过程,利用EKF/UKF方法估算电池荷电状态。

搞动力电池的人都知道,SOC(荷电状态)这玩意儿就像手机的剩余电量显示,但背后可是藏着玄机。最近手头项目用到了扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF),实测下来发现这俩兄弟确实有点东西。

先说说模型搭建。我们用二阶RC等效电路模型来模拟锂电池动态特性,这模型好比给电池做了个CT扫描——端电压表达式Vt = OCV - R0*I - V1 - V2,其中两个RC环节专门捕捉极化效应。参数辨识这块直接上HPPC测试数据,用最小二乘法把R0、R1、C1这些参数扒得干干净净。

# 参数辨识核心代码片段
def battery_least_squares(voltage, current):
    X = np.vstack([-current, -np.ones_like(current)]).T
    Y = voltage
    theta = np.linalg.lstsq(X, Y, rcond=None)[0]
    R0 = theta[0]
    OCV = theta[1]
    return R0, OCV

重点来了——EKF实现。预测阶段用状态方程推进,更新阶段抄起观测矩阵修正。协方差矩阵Q和R的调参过程简直像在火锅里涮毛肚,多一秒就老了,少一秒又生。这里有个小窍门:Q矩阵对角线取1e-6,R取1e-3起步,实测收敛速度提升30%。

% EKF预测步骤核心代码
function [x_pri, P_pri] = ekf_predict(x_est, P_est, Q)
    F = [1 0 0; 
         -dt/(R1*C1) 1 0; 
         -dt/(R2*C2) 0 1]; % 状态转移矩阵
    x_pri = F * x_est;
    P_pri = F * P_est * F' + Q;
end

UKF的实现更有意思,用sigma点玩概率分布的把戏。相比EKF的线性化近似,UKF的UT变换在处理强非线性时稳得一批。不过计算量也确实感人,在BBDST工况测试时,同样配置下UKF比EKF多喝了两杯咖啡的时间。

当把算法丢进BBDST实际工况里,噪声加持的电压数据让算法现了原形。这时候状态协方差的动态调整策略就成了救命稻草——我们给SOC估计误差设置了动态阈值,超过3%就触发协方差重置,实测能把失控的估计值拽回正轨。

最后说个踩坑经验:Simulink版本虽然搭模型直观,但遇到矩阵维度不对齐的报错时,找bug的过程堪比海底捞针。反倒是脚本开发虽然前期痛苦,但调试起来有种庖丁解牛的快感。建议新手先用脚本搞懂原理,再上Simulink搭积木。

经过实测,两种工况下EKF的SOC估计误差稳定在±2%以内,UKF能做到±1.5%。不过话说回来,算法再牛也得搭配靠谱的模型参数,这行当终究是三分算法七分调参呐。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐