这篇博文来介绍一下如何使用Simulink来完成无迹卡尔曼滤波的搭建以估计锂电池非线性系统的SOC。
(1)KF估计电池老化。电池的容量会随着每次充放电循环而下降,从而导致SOC估计不准确。当电池在充电和放电之间转换时,使用基于事件的线性卡尔曼滤波器来估计电池容量。然后使用估计容量来反映电池的健康状况。
(2)UKF估计电池SOC。基于二阶RC模型所辨识的参数,使用UKF来实时估计电池的SOC。
1.电池模型
考虑具有以下等效电路的电池模型:
其中Uoc为OCV,Ub为终端电压,I为电流,T为温度,R0为内阻,R1、R2为极化电阻,C1、C2为极化电容。
模型总览:
电池模型的状态转移方程由下式给出:
其中,U1,U2分别为两个极化端的电压,Cn为容量,W为过程噪声。
输入电流在电池放电时随机产生脉冲,在充电时保持恒定。
测量方程如下所示:
2.SOC估计
要使用无迹卡尔曼滤波器模块,需要借助Matlab或function函数指定状态转移方程和量测方程。我们这里使用function函数,如下图所示:
由于无迹卡尔曼滤波器是离散时间滤波器,因此首先将状态方程离散化。在本例中,采用欧拉离散化。让采样时间不变。对于一般的非线性系统,系统可以离散为:
非线性电池系统的状态向量为:
应用欧拉离散化得到以下方程:
离散状态转移方程在Simulink函数batteryStateFcn中实现。函数输入x是状态向量,函数输出xNext是下一步的状态向量,使用离散状态转移方程计算。在函数中,需要指定x和xNext的信号维度和数据类型。在本例中,x和xNext的信号维数为3,数据类型为double。batteryStateFcn的其他输入是温度、估计容量和电流。请注意,额外的输入是状态转换方程的输入,而不是Unscented卡尔曼滤波器块所需要的。
同样,测量功能也在名为batteryMeasurementFcn的Simulink函数中实现。
配置Unscented Kalman Filter块参数,如下所示:
这里主要讲一下协方差矩阵、初始协方差与观测噪声协方差的确定过程,这在很多的文献里是没有讲到的,初学者可能会对这几个参数的调参过程表示迷茫,但其实调参是有规律的,并且是可以通过计算求出来的,而不是随机设置的。这也是该篇博文比较干货的部分。
(1)过程噪声。
基于电池系统的动态特性,对电池系统的过程噪声进行了估计。电池的标称容量为30Ah,在15A的平均电流幅值下进行放电或充电循环。因此,一次放电或充电过程大约需要2小时(7200秒)。SOC的最大值是100%,U1、U2的最大值是4V。SOC和U1、U2的每一步的最大变化是
max(|d(SOC)|)=Ts*100%/3600*2;
max(|d(U1)|)=Ts*4/3600*2;
max(|d(U2)|)=Ts*4/3600*2;
其中Ts为滤波器的采样时间。在本例中,Ts设置为1秒。因此,过程噪声可确定为:
(2)初始状态。设置为(1;0;0),这个没有什么好纠结的,初始SOC值设置为1,U1、U2分贝设置为0,因为我们没有任何的关于U1、U2的先验信息。
(3)初始协方差。初始协方差表示初始猜测的准确性和可靠性。假设SOC的最大初始猜测误差为10%,U1、U2的初始猜测误差均为1V,则初始的协方差可设置为:diag(0.1,1,1)。
(4)无迹变换参数。
Alpha:确定sigma点在x周围的扩散。将Alpha设置为1以获得更大的扩散。
Beta:用于结合分布的先验知识。一般设置为2。
Kappa:二级缩放参数。一般设置为0。
(5)量测噪声。测量噪声V根据测量设备的精度来估计。用于电池电压测量的电压表的精度约为1%。电池电压在4V左右。因此,我们可以计算出量测噪声为max(dEm)=1%*4V=0.04V,因此V=(max(dEm))^2≈1e-3。
3.估计电池退化
电池退化是通过容量递减来模拟的。在这个例子中,电池容量被设置为每个充放电循环减少1 Ah,以说明退化的影响。由于时间的关系,电池老化的详细介绍放在下一篇文章里。
4.结果
在每一个仿真步长内,Unscented卡尔曼滤波器提供了一个估计SOC,基于电压的测量值。绘制实际SOC与UKF预测的SOC的变化曲线,以及它们之间的差异。
% Synchronize two time series
[RealSOC, EstimatedSOC] = synchronize(RealSOC, EstimatedSOC, 'intersection');figure;
subplot(2,1,1)
plot(100*RealSOC,'b','LineWidth',1.5);
hold on
plot(100*EstimatedSOC,'r--','LineWidth',1);
title('State of Charge');
xlabel('Time (s)');
ylabel('SOC (%)');
legend('Actual','UKF estimate','Location','Best','Orientation','horizontal');
axis tightsubplot(2,1,2)
DiffSOC = 100*(RealSOC - EstimatedSOC);
plot(DiffSOC.Time, DiffSOC.Data, 'LineWidth', 1.5);
xlabel('Time(s)');
ylabel('\Delta SOC (%)','Interpreter','Tex');
legend('Difference between Real SOC and Estimated SOC','Location','Best')
axis tight
在初始估计误差后,SOC迅速收敛到实际SOC。最终估计误差在0.5%以内。因此,Unscented卡尔曼滤波器给出了一个准确的SOC估计。
在每次充放电转换时,对电池容量进行估计,以改进电池荷电状态的估计。电池系统输出指示灯信号,告知电池处于哪个进程。放电过程在指示灯信号中用-1表示,充电过程用1表示。在本例中,使用指示器信号的变化来确定何时启用或禁用卡尔曼滤波器进行容量估计。我们绘制了实际容量和估计容量以及充放电指示信号。
figure;
subplot(2,1,1);
plot(RealCapacity,'b','LineWidth',1.5);
hold on
plot(EstimatedCapacity,'r--','LineWidth',1.5);
xlabel('Time (s)');
ylabel('Capacity (Ah)');
legend('Actual','KF estimate','Location','Best');subplot(2,1,2);
plot(DischargeChargeIndicator.Time,DischargeChargeIndicator.Data,'b','LineWidth',1.5);
xlabel('Time(s)');
ylabel('Enable Signal');
一般情况下,卡尔曼滤波能够跟踪实际容量。估计容量与实际容量之间存在半个周期的延迟。这是因为当一个完整的充放电循环结束时,电池容量就会下降。而库仑计数给出了最后一次放电或充电周期的容量测量。
5.总结
这个模型展示了如何使用Unscented卡尔曼滤波块对锂电池进行SOC估计。此外,还开发用于电池容量估计的基于事件的卡尔曼滤波器。将新估计的容量用于改进无迹卡尔曼滤波器的SOC估计。
6.参考文献
[1] Huria, Tarun, et al. "High fidelity electrical model with thermal dependence for characterization and simulation of high power lithium battery cells." Electric Vehicle Conference (IEVC), 2012 IEEE International. IEEE, 2012.
[2] Wan, Eric A., and Rudolph Van Der Merwe. "The unscented Kalman filter for nonlinear estimation." Adaptive Systems for Signal Processing, Communications, and Control Symposium 2000. AS-SPCC. The IEEE 2000. Ieee, 2000.