电池老化限制了其储能和功率输出能力,以及电动汽车的性能,包括成本和寿命。如何对动力电池进行寿命管理和资产评估已成为电动汽车行业的关键问题。为了更好地检测和评估动力电池在电动汽车上应用后的性能,寻找一种有效的电池组寿命估算方法至关重要。
电池寿命估算包括容量估算和内阻估算。
容量是电池健康状态(SOH)评估的重要指标,用于评估电池的老化程度。当容量下降到一定程度时,电池达到寿命终止(EOL),无法继续正常工作。电池寿命估算方法可分为基于经验模型的方法和数据驱动的方法。基于经验模型的方法使用实验数据估计和预测容量。由于一般的经验模型是开环模型,很难保证估计结果的准确性。数据驱动方法通常涉及建立模型来描述电池退化过程,这可以实现更高的估计精度,但受到实际应用中电化学建模复杂性的限制。此外,该方法一般需要一定的工作环境来估计电池寿命。
内阻可通过电化学阻抗谱(EIS)分析获得,但由于记录频率较低,该方法难以应用于云数据。内阻也可以通过直接电压响应直接计算。此外,还有基于电化学模型、等效电路模型、神经网络模型等的方法。
电池容量是电池性能的重要指标。锂离子电池的性能会在工作环境和使用时间的影响下逐渐退化,表现为电池容量的退化和内阻的增加。电池容量通常呈线性或指数衰减规律。一般认为,当电池的电流容量降至额定容量的70%-80%时,电池将达到其寿命终点(EOL)。
SOH量化了电池与新电池相比的物理健康状况,通常通过容量或阻抗计算。在本文中,我们将SOH定义为当前最大可用容量与额定容量之比。
式中,Cα表示当前最大可用容量,Cβ表示电池的额定容量。
1、电池容量的初步估算
安时积分法是一种常用的方法。SOC是通过在充电或放电过程中累积电量来估算的。如果充电或放电的起始SOC为,则当前SOC为:
式中,Cn表示额定容量,I(t)表示时间t时的电池电流。
因此,可以使用安培–小时积分法根据充电数据估算容量。
式中,t1表示充电起始时间,t2表示充电结束时间,I(t)表示时间t时的电池电流。
2、基于温度的电池容量校正方法
锂离子电池在实际车辆行驶条件下,由于放电速率和工作环境的不同,会导致电池内部参数发生变化。温度是对电池性能有很大影响的因素。锂离子电池在高温环境下工作时,电极间反应速度较快;当工作温度较低时,锂离子活度较低。当温度变化时,蓄电池的可用容量和内阻将发生很大的波动。
根据电池的温度特性测试,电池的放电容量在低温环境下明显降低,在高温环境下明显增大。因此,将25°C设置为温度校正的标准温度,并根据温度数据校正,以获得标准容量。
3、电池容量估算和预测方法
基于卡尔曼滤波算法对基于温度校正的电池容量进行优化,得到最终的电池容量。考虑到电池容量变化缓慢,在建立EKF状态方程时,认为i+1时间的容量等于i时间的容量。但模型中存在系统噪声,电池容量的状态方程为:
式中,xi表示最佳估计电池容量,ωi表示系统噪声。
由于单次充电间隔之间的容量变化较小,系统噪声ω通过取较小的值来满足滤波要求。
模糊逻辑模仿人脑的不确定性概念判断和推理思维方式,实现模糊综合判断,主要包括三个部分:模糊化、模糊规则算法和反模糊化。卡尔曼滤波–模糊控制算法的输入参数包括SOCmin,SOCmax和电池容量观测的相对误差这三个数值。具体的模糊控制规则下文将以代码的方式展示。
%% 卡尔曼滤波+模糊逻辑 (KF+FL)
function new_SOH = KF_FL(minSOC,maxSOC,Time,SOH)
% 参数初始化
x1 = minSOC; % 起始SOC ********
x2 = maxSOC ; % 终止SOC ********
n = length(Time); % 计算连续n个时刻 ********
sz = [n, 1]; % n行,1列
Q = 0.03^2; % 本模型中输入噪声w的方差。
P(1) = 1; % 误差方差为1,反应波动程度。
% 加入模糊逻辑控制算法
% maxSOC大于99模糊控制算法
a = newfis('fuzzy SOC_Capmax');
a = addvar(a,'input','minSOC',[0,50]);
a = addmf(a,'input',1,'NB','zmf',[0,8.333]);
a = addmf(a,'input',1,'NS','trimf',[0,16.67,33.33]);
a = addmf(a,'input',1,'ZO','trimf',[8.333,25,41.67]);
a = addmf(a,'input',1,'PS','trimf',[16.67,33.33,50]);
a = addmf(a,'input',1,'PB','smf',[41.67,50]);
a = addvar(a,'input','e',[0,0.15]);
a = addmf(a,'input',2,'NB1','zmf',[0,0.1125]);
a = addmf(a,'input',2,'PB1','smf',[0.1125,0.15]);
a = addvar(a,'output','alpha',[0.01,0.6]);
a = addmf(a,'output',1,'NB','zmf',[0.01,0.1575]);
a = addmf(a,'output',1,'NS','trimf',[0.01,0.1575,0.305]);
a = addmf(a,'output',1,'ZO','trimf',[0.1575,0.305,0.4525]);
a = addmf(a,'output',1,'PS','trimf',[0.305,0.4525,0.6]);
a = addmf(a,'output',1,'PB','smf',[0.4525,0.6]);
a = addmf(a,'output',1,'NB1','zmf',[0.01,0.1]);
a = addmf(a,'output',1,'PB1','trimf',[0.541,5.91,11.81]);
% 建立模糊规则
rulelist=[1 1 1 1 1; % 矩阵第一二列表示输入e
1 2 5 1 1; % 矩阵第三列表示输出alpha
2 1 2 1 1; % 第四列为规则的权重
2 2 5 1 1; % 第五列为AND模糊运算(1对应AND,2对应OR)
3 1 4 1 1;
3 2 7 1 1;
4 1 4 1 1;
4 2 5 1 1;
5 1 5 1 1;
5 2 5 1 1];
a = addRule(a,rulelist);
% 设置反模糊化算法
a1 = setfis(a,'DefuzzMethod','mom');
writeFIS(a1,'SOC_Capmax');
a2 = readfis('SOC_Capmax');
% maxSOC小于99模糊控制算法
b = newfis('fuzzy SOC_Capmin');
b = addvar(b,'input','minSOC',[0,50]);
b = addmf(b,'input',1,'NB','zmf',[0,8.333]);
b = addmf(b,'input',1,'NS','trimf',[0,16.67,33.33]);
b = addmf(b,'input',1,'ZO','trimf',[8.333,25,41.67]);
b = addmf(b,'input',1,'PS','trimf',[16.67,33.33,50]);
b = addmf(b,'input',1,'PB','smf',[41.67,50]);
b = addvar(b,'input','e',[0,0.15]);
b = addmf(b,'input',2,'NB1','zmf',[0,0.1125]);
b = addmf(b,'input',2,'PB1','smf',[0.1125,0.15]);
b = addvar(b,'output','alpha',[0.5,1]);
b = addmf(b,'output',1,'NB','zmf',[0.5,0.625]);
b = addmf(b,'output',1,'NS','trimf',[0.5,0.625,0.75]);
b = addmf(b,'output',1,'ZO','trimf',[0.625,0.75,0.875]);
b = addmf(b,'output',1,'PS','trimf',[0.75,0.875,1]);
b = addmf(b,'output',1,'PB','smf',[0.875,1]);
b = addmf(b,'output',1,'NB1','zmf',[0.5,0.575]);
b = addmf(b,'output',1,'PB1','trimf',[0.95,5.5,10.5]);
% 建立模糊规则
rulelist=[1 1 1 1 1; % 矩阵第一列表示输入e
1 2 5 1 1; % 矩阵第二列表示输出alpha
2 1 2 1 1; % 第三列为规则的权重
2 2 5 1 1; % 第四列为AND模糊运算(1对应AND,2对应OR)
3 1 4 1 1;
3 2 7 1 1;
4 1 4 1 1;
4 2 5 1 1;
5 1 5 1 1;
5 2 5 1 1];
b = addRule(b,rulelist);
% 设置反模糊化算法
b1 = setfis(b,'DefuzzMethod','mom');
writeFIS(b1,'SOC_Capmin');
b2 = readfis('SOC_Capmin');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
z = SOH; % z修正SOH结果 ********
% 对数组进行初始化
new_SOH = zeros(sz); % 滤波结果
P = zeros(sz); % 后验估计的方差
xhatminus = zeros(sz); % SOH的先验估计。即在k-1时刻,对k时刻SOH做出的估计
Pminus = zeros(sz); % 先验估计的方差
K = zeros(sz); % 卡尔曼增益。
alpha = zeros(sz); % SOH权重
% 初始估计
new_SOH(1) = max(SOH); % 理论上是取平均值,由于原始估计不理想,故在此取最大值 ****
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 模糊卡尔曼滤波 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k = 2:n
% 时间更新(预测)
xhatminus(k) = new_SOH(k-1); % 用上一时刻的最优估计值来作为对当前时刻的SOH的预测
Pminus(k) = P(k-1)+Q; % 预测的方差为上一时刻SOH最优估计值的方差与过程方差之和
% 测量更新(校正)
e1 = abs(z(k)-new_SOH(k-1))/new_SOH(k-1);
if x2(k) >= 99
if x1(k) > 50 || e1 > 0.15
alpha(k) = 100;
R = (alpha(k)*1.5)^2;
K(k) = Pminus(k)/( Pminus(k)+R ); % 计算卡尔曼增益
new_SOH(k) = xhatminus(k)+K(k)*(z(k)-xhatminus(k)); % 结合当前时SOH计算值,对上一时刻的预测进行校正,得到校正后的最优估计。该估计具有最小均方差
P(k) = (1-K(k))*Pminus(k); % 计算最终估计值的方差
else
alpha(k) = evalfis([x1(k),e1],a2);
R = (alpha(k)*1.5)^2;
K(k) = Pminus(k)/( Pminus(k)+R ); % 计算卡尔曼增益
new_SOH(k) = xhatminus(k)+K(k)*(z(k)-xhatminus(k)); % 结合当前时SOH计算值,对上一时刻的预测进行校正,得到校正后的最优估计。该估计具有最小均方差
P(k) = (1-K(k))*Pminus(k); % 计算最终估计值的方差
end
else
if x1(k) > 50 || e1 > 0.15
alpha(k) = 100;
R = (alpha(k)*1.5)^2;
K(k) = Pminus(k)/( Pminus(k)+R ); % 计算卡尔曼增益
new_SOH(k) = xhatminus(k)+K(k)*(z(k)-xhatminus(k)); % 结合当前时SOH计算值,对上一时刻的预测进行校正,得到校正后的最优估计。该估计具有最小均方差
P(k) = (1-K(k))*Pminus(k); % 计算最终估计值的方差
else
alpha(k) = evalfis([x1(k),e1],b2);
R = (alpha(k)*1.5)^2;
K(k) = Pminus(k)/( Pminus(k)+R ); % 计算卡尔曼增益
new_SOH(k) = xhatminus(k)+K(k)*(z(k)-xhatminus(k)); % 结合当前时SOH计算值,对上一时刻的预测进行校正,得到校正后的最优估计。该估计具有最小均方差
P(k) = (1-K(k))*Pminus(k); % 计算最终估计值的方差
end
end
end
end
考虑到温度对容量和内阻估算结果的影响,根据温度数据对估算结果进行修改,使容量和内阻估算结果更符合动力电池的真实变化。此外,由于初步估计后不可避免地会产生较大的噪声,因此采用模糊控制算法实时控制卡尔曼滤波算法的观测噪声,使估计结果收敛到真实趋势。
原文始发于微信公众号(新能源汽车仿真团队):电池SOH仿真系列-基于模糊控制卡尔曼滤波算法的电池寿命预测