锂电池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%。不过那就是另一个故事了。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐