|  | 
 
| 
本帖最后由 一路上 于 2023-3-24 17:30 编辑
x
路线栈欢迎您!您需要 登录 才可以下载或查看,没有帐号?立即注册 
  
 A.前言
 
 动力电池SOC作为能量管理的重要决策因素之一,对于提高电池能量利用率以及防止电池过充和过放等方面起着重要作用。但由于电池SOC无法直接测量,只能通过可观测变量简单估计,目前SOC估计方法可大致分为四类:基于表征参数的方法、安时积分法、基于模型的方法以及基于数据驱动的方法[1]。
 
 如下图所示:
 
 本文选择基于模型的SOC估计方法,该方法主要利用模型和状态估计算法完成动力电池SOC估计。对于其性能模型,本文选择的一阶RC等效电路模型,该模型结构如下:
 
 
 根据基尔霍夫定律得:
 
 
 B.模型参数化
 
 对于等效电路模型的参数化,本文是基于25℃下的HPPC实验数据,利用带遗忘因子的递推最小二乘法(FFRLS),其参数化主要步骤如下:
 
 辨识模型开路电压:
 
 电池开路电压主要是指无负载电流,电池内部处于化学平衡状态时的端电压。本文认为静置2h后电池内部已近似处于平衡状态,所以通过提取该时刻的端电压,可得:
 
 
 开路电压与电池SOC之间的关系可用下面的多项式进行表示:
 
 
 利用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)
 
 
 辨识模型内阻和电容:
 
 基于FFRLS算法辨识模型内阻和电容的具体内容已在前面的文章中详细阐述,下面给出在不同倍率电流下的辨识结果:
 
 
 
 
 从上面的参数辨识结果可以看出,在25℃下电模型参数随电流倍率的变化较小(尤其是欧姆内阻)。
 
 C.估计器设计
 
 根据扩展卡尔曼滤波器的基本原理,其计算过程主要分为时间更新和测量更新这两个核心步骤。其估计算法如下:
 
 
 复制代码%% 基于EKF算法估计电池SOC
clear
clc
%% 载入数据和矩阵初始化
%载入数据
load('MSCC.mat');
load('R0.mat');
load('R1.mat');
load('C1.mat');
name = MSCC;
% MSCC中的电流、电压、soc值
current = name(:,1);
voltage = name(:,2);
soc_ref = name(:,3);
%当前温度下电池的容量
Cn = 8.7;     
%数据长度
L_data = length(current);
%采样时间
delta_T = 1;
% 插值初始化
x = [0.9;0.8;0.7;0.6;0.5;0.4;0.3;0.2;0.1];
y = [8;16;32;48;64];
z1 = R0;
z2 = R1;
z3 = C1;
R0 = zeros(L_data,1);
R1 = zeros(L_data,1);
C1 = zeros(L_data,1);
%% 系统矩阵初始化
% 状态矩阵的先验估计
x_pri = zeros(2,L_data);
% x_pri(:,1) = [0.7;0;0];
% 状态矩阵的后验估计
x_pos = zeros(2,L_data);
x_pos(:,1) = [0;0];
% soc误差矩阵初始化
soc_error = zeros(1,L_data);
soc_error(:,1) = x_pos(1,1)-soc_ref(1,:);
% 过程噪声误差协方差初始化
Q = diag([1e-6 0]);
% 测量噪声误差协方差初始化
R = 1e3;
% 系统状态误差矩阵初始化
P = diag([1e-4 0]);
%% EKF算法
for k = 2:L_data
    % 通过插值找到当前温度和SOC点下的电阻和电容
    R0(k,:) = interp2(x,y,z1,x_pos(1,k-1),current(k-1,:),'makima');
    R1(k,:) = interp2(x,y,z2,x_pos(1,k-1),current(k-1,:),'makima');
    C1(k,:) = interp2(x,y,z3,x_pos(1,k-1),current(k-1,:),'makima');
    % 系统矩阵更新
    time_constant_1 = R1(k-1,:)*C1(k-1,:);
    A = [1 0;
        0 exp(-delta_T/time_constant_1)];
    B = [delta_T/(3600*Cn)
        R1(k-1,:)*(1-exp(-delta_T/time_constant_1))];
    % 状态变量的先验估计
    x_pri(:,k) = A*x_pos(:,k-1)+B*current(k-1,:);
    % 预测系统状态误差协方差
    P_pri = A*P*A'+Q;
    % 系统测量状态转换矩阵计算
    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-...
        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;
    C = [f,1];      
    % 卡尔曼增益矩阵的计算
    K = P_pri*C'*(C*P_pri*C'+R)^(-1);
    % 系统状态的最佳估计
    V_model = C*x_pri(:,k)+R0(k,:)*current(k,:);
    x_pos(:,k) = x_pri(:,k)+K*(voltage(k,:)-V_model);
    % 更新系统状态误差协方差
    P = (eye(2)-K*C)*P_pri;
    soc_error(:,k) = x_pos(1,k)-soc_ref(k,:);
end
RMSE = sqrt(mean(soc_error.^2));
MAE = sum(abs(soc_error))/L_data;
%% 绘图
figure
hold on;
box on;
plot(soc_ref,'LineWidth',2);
plot(x_pos(1,:),'LineWidth',2);
legend('SOC Ah','SOC EKF');
xlabel('时间/s');
ylabel('SOC');
% 误差分析
figure
hold on;
box on;
plot(soc_error,'LineWidth',2);
xlabel('时间/s');
ylabel('SOC偏差');
D.估计结果与讨论
 
 电池荷电状态的估计结果和误差如下图所示:
 
 
 
 利用平均绝对误差(MAE)和均方根误差(RMSE)对电池SOC估计进行分析:
 
 
 
 E.结论
 
 因此,估计结果表明扩展卡尔曼滤波器具有较好的估计精度。
 
 参考:自适应无迹卡尔曼滤波的锂电池SOC估计 作者:超哥
 
 | 
 |