锂电池SOC估计:基于扩展卡尔曼滤波与马里兰数据的查表法估算,涵盖多种温度与工况参数
锂电池SOC估计扩展卡尔曼滤波估算SOC 马里兰数据 三种温度:0 25 45 三套查表离线参数 两种工况:HPPC 1C放电

锂电池SOC估计这活儿挺有意思的,特别是用扩展卡尔曼滤波(EKF)搞实时估算。咱们今天拿马里兰大学的实测数据开刀,温度选了0℃、25℃、45℃三个典型场景,正好试试不同温度对参数的影响。

先看硬件配置:三组离线标定好的RC参数表,对应不同温度。这设计挺聪明——锂电池这玩意儿跟温度关系太大了,直接查表比在线辨识省事儿。咱们的EKF实现里,核心就两个方程:
def state_eq(soc_prev, current, delta_t):
Q = 2.3*3600 # 电池容量
return soc_prev - (current * delta_t)/Q
# 观测方程
def obs_eq(soc, current, params):
OCV = ocv_table(soc) # OCV-SOC查表
return OCV - current * params['R0']
这里有个小技巧,OCV-SOC曲线得用三次样条插值才能保证平滑。见过有人直接用线性插值,结果卡尔曼增益算出来抖得跟筛糠似的。

锂电池SOC估计扩展卡尔曼滤波估算SOC 马里兰数据 三种温度:0 25 45 三套查表离线参数 两种工况:HPPC 1C放电

实战中发现个有意思的现象:温度越低,过程噪声得调得越大。特别是0℃时,如果直接用25℃的Q矩阵参数,SOC估计值会比真实值滞后3%左右。看这段协方差更新代码就明白了:
% 协方差矩阵更新
P = A*P*A' + Q;
K = P*H'/(H*P*H' + R);
P = (eye(2) - K*H)*P;
这里的Q矩阵要是没根据温度调整,低温时模型误差会明显累积。后来我们做了个温度补偿系数,效果立竿见影:
def temp_compensate_Q(temp):
base_Q = 1e-6
return base_Q * (1 + 0.05*(25 - temp)) # 温度每降1度,Q增大5%
测试数据用了HPPC工况和1C恒流放电。HPPC的脉冲特性对参数辨识挺友好,特别是能准确抓出R0的变化。来看段实际运行时的参数切换逻辑:
def get_params(temp, soc):
if temp < 10:
table = cold_table
elif temp > 35:
table = hot_table
else:
table = normal_table
# 二分法查SOC对应参数
idx = bisect.bisect_left(table['soc_points'], soc)
return {
'R0': table['R0'][idx],
'R1': table['R1'][idx],
'C1': table['C1'][idx]
}
这查表策略比多项式拟合稳定多了,特别是SOC在10%以下时,极化电阻变化剧烈,多项式容易飞。
对比45℃和0℃的估计结果,高温时收敛速度更快,但初始误差更大。后来发现是高温下的OCV曲线平台区更长,加了个滑动窗口方差检测才解决:
if std(OCV_window) < 0.002
R *= 0.8; // 降低观测噪声权重
else
R = 1e-4;
end
实测1C放电时,EKF在95%到20% SOC区间表现最好,误差能压在1%以内。但接近充放截止电压时,得加个滞后补偿,不然会出现0.5%左右的跳变。
最后给个忠告:别迷信单一算法。我们试过把EKF和安时积分做混合估计,当电流传感器飘移时,加权系数自动偏向EKF,效果比纯算法强至少30%。不过那就是另一个故事了。
更多推荐
所有评论(0)