• 注册 / 登录
  • 切换到窄版
  • 查看: 1720|回复: 0

    基于扩展卡尔曼滤波器估计电池SOC

    [复制链接]

    665

    主题

    679

    帖子

    6476

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6476
    发表于 2023-3-24 17:29:09 | 显示全部楼层 |阅读模式

    路线栈欢迎您!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 一路上 于 2023-3-24 17:30 编辑

    A.前言

    动力电池SOC作为能量管理的重要决策因素之一,对于提高电池能量利用率以及防止电池过充和过放等方面起着重要作用。但由于电池SOC无法直接测量,只能通过可观测变量简单估计,目前SOC估计方法可大致分为四类:基于表征参数的方法、安时积分法、基于模型的方法以及基于数据驱动的方法[1]。

    如下图所示:
    1.png

    本文选择基于模型的SOC估计方法,该方法主要利用模型和状态估计算法完成动力电池SOC估计。对于其性能模型,本文选择的一阶RC等效电路模型,该模型结构如下:

    2.png

    根据基尔霍夫定律得:

    3.png

    B.模型参数化

    对于等效电路模型的参数化,本文是基于25℃下的HPPC实验数据,利用带遗忘因子的递推最小二乘法(FFRLS),其参数化主要步骤如下:

    辨识模型开路电压:

    电池开路电压主要是指无负载电流,电池内部处于化学平衡状态时的端电压。本文认为静置2h后电池内部已近似处于平衡状态,所以通过提取该时刻的端电压,可得:

    4.png

    开路电压与电池SOC之间的关系可用下面的多项式进行表示:

    5.png

    利用matlab中的curve fitting工具箱拟合曲线可得其参数和拟合图像为:

    Coefficients (with 95% confidence bounds):
    p1 = 96.48 (67.32, 125.6)        
    p2 = -361.6 (-463.9, -259.4)
    p3 = 545.5 (403.8, 687.3)        
    p4 = -426.5 (-524.9, -328)
    p5 = 186.6 (150.9, 222.3)        
    p6 = -45.91 (-52.23, -39.59)
    p7 = 6.43 (5.997, 6.863)         
    p8 = 3.126 (3.119, 3.134)

    6.png

    辨识模型内阻和电容:

    基于FFRLS算法辨识模型内阻和电容的具体内容已在前面的文章中详细阐述,下面给出在不同倍率电流下的辨识结果:

    7.png

    8.png

    9.png

    从上面的参数辨识结果可以看出,在25℃下电模型参数随电流倍率的变化较小(尤其是欧姆内阻)。

    C.估计器设计

    根据扩展卡尔曼滤波器的基本原理,其计算过程主要分为时间更新和测量更新这两个核心步骤。其估计算法如下:

    1. %% 基于EKF算法估计电池SOC
    2. clear
    3. clc

    4. %% 载入数据和矩阵初始化
    5. %载入数据
    6. load('MSCC.mat');
    7. load('R0.mat');
    8. load('R1.mat');
    9. load('C1.mat');
    10. name = MSCC;
    11. % MSCC中的电流、电压、soc值
    12. current = name(:,1);
    13. voltage = name(:,2);
    14. soc_ref = name(:,3);
    15. %当前温度下电池的容量
    16. Cn = 8.7;     
    17. %数据长度
    18. L_data = length(current);
    19. %采样时间
    20. delta_T = 1;
    21. % 插值初始化
    22. x = [0.9;0.8;0.7;0.6;0.5;0.4;0.3;0.2;0.1];
    23. y = [8;16;32;48;64];
    24. z1 = R0;
    25. z2 = R1;
    26. z3 = C1;
    27. R0 = zeros(L_data,1);
    28. R1 = zeros(L_data,1);
    29. C1 = zeros(L_data,1);
    30. %% 系统矩阵初始化
    31. % 状态矩阵的先验估计
    32. x_pri = zeros(2,L_data);
    33. % x_pri(:,1) = [0.7;0;0];
    34. % 状态矩阵的后验估计
    35. x_pos = zeros(2,L_data);
    36. x_pos(:,1) = [0;0];
    37. % soc误差矩阵初始化
    38. soc_error = zeros(1,L_data);
    39. soc_error(:,1) = x_pos(1,1)-soc_ref(1,:);
    40. % 过程噪声误差协方差初始化
    41. Q = diag([1e-6 0]);
    42. % 测量噪声误差协方差初始化
    43. R = 1e3;
    44. % 系统状态误差矩阵初始化
    45. P = diag([1e-4 0]);
    46. %% EKF算法
    47. for k = 2:L_data
    48.     % 通过插值找到当前温度和SOC点下的电阻和电容
    49.     R0(k,:) = interp2(x,y,z1,x_pos(1,k-1),current(k-1,:),'makima');
    50.     R1(k,:) = interp2(x,y,z2,x_pos(1,k-1),current(k-1,:),'makima');
    51.     C1(k,:) = interp2(x,y,z3,x_pos(1,k-1),current(k-1,:),'makima');
    52.     % 系统矩阵更新
    53.     time_constant_1 = R1(k-1,:)*C1(k-1,:);
    54.     A = [1 0;
    55.         0 exp(-delta_T/time_constant_1)];
    56.     B = [delta_T/(3600*Cn)
    57.         R1(k-1,:)*(1-exp(-delta_T/time_constant_1))];
    58.     % 状态变量的先验估计
    59.     x_pri(:,k) = A*x_pos(:,k-1)+B*current(k-1,:);
    60.     % 预测系统状态误差协方差
    61.     P_pri = A*P*A'+Q;
    62.     % 系统测量状态转换矩阵计算
    63.     f = 7*96.48*x_pri(1,k)^6-6*361.6*x_pri(1,k)^5+5*545.5*x_pri(1,k)^4-...
    64.         4*426.5*x_pri(1,k)^3+3*186.6*x_pri(1,k)^2-2*45.91*x_pri(1,k)+6.43;
    65.     C = [f,1];      
    66.     % 卡尔曼增益矩阵的计算
    67.     K = P_pri*C'*(C*P_pri*C'+R)^(-1);
    68.     % 系统状态的最佳估计
    69.     V_model = C*x_pri(:,k)+R0(k,:)*current(k,:);
    70.     x_pos(:,k) = x_pri(:,k)+K*(voltage(k,:)-V_model);
    71.     % 更新系统状态误差协方差
    72.     P = (eye(2)-K*C)*P_pri;
    73.     soc_error(:,k) = x_pos(1,k)-soc_ref(k,:);
    74. end

    75. RMSE = sqrt(mean(soc_error.^2));
    76. MAE = sum(abs(soc_error))/L_data;

    77. %% 绘图
    78. figure
    79. hold on;
    80. box on;
    81. plot(soc_ref,'LineWidth',2);
    82. plot(x_pos(1,:),'LineWidth',2);
    83. legend('SOC Ah','SOC EKF');
    84. xlabel('时间/s');
    85. ylabel('SOC');
    86. % 误差分析
    87. figure
    88. hold on;
    89. box on;
    90. plot(soc_error,'LineWidth',2);
    91. xlabel('时间/s');
    92. ylabel('SOC偏差');
    复制代码

    D.估计结果与讨论

    电池荷电状态的估计结果和误差如下图所示:

    10.png

    11.png

    利用平均绝对误差(MAE)和均方根误差(RMSE)对电池SOC估计进行分析:

    • MAE = 0.68%
    • RMSE = 0.75%


    E.结论

    因此,估计结果表明扩展卡尔曼滤波器具有较好的估计精度。

    参考:自适应无迹卡尔曼滤波的锂电池SOC估计 作者:超哥
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|路丝栈 ( 粤ICP备2021053448号 )

    GMT+8, 2024-9-17 03:31 , Processed in 0.047109 second(s), 21 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表