使用扩展卡尔曼滤波(EKF)估计电池SOC(附MATLAB程序及详解)part1主函数篇

一、数据导入      

       这个脚本的主要目标是提供一个使用扩展卡尔曼滤波器(EKF)的电池荷电状态(SOC)估计的程序。使用二阶RC等效电路模型来分析电池在使用中的SOC和端电压(Vt),并考虑到电池表面温度的影响。该分析中使用的电池数据可在https://data.mendeley.com/datrxm/1.上公开获得。

       首先,加载实验测量的电池时间、电压、电流和温度数据。这将作为EKF_SOC_Estimation函数的输入。由于真实的SOC不能直接测量并与EKF估计的SOC进行比较,因此使用颜色计数进行计算。 在这个程序中,真实的数据以前被组织成一个结构类型,然后保存为一个.mat文件。一旦执行“load”命令,工作区中的“meas”数据将加载,其中包含电池时间、电压、电流和温度数据。如果将数据保存在Excel电子表格中,则使用命令“xlsread”,并相应地将数据分配给相应的LiPoly结构。 

load('04-12-19_04.45 765_LA92_40degC_Turnigy_Graphene.mat');
LiPoly.RecordingTime            = meas.Time;
LiPoly.Measured_Voltage         = meas.Voltage;
LiPoly.Measured_Current         = meas.Current;
LiPoly.Measured_Temperature     = meas.Battery_Temp_degC;

nominalCap                      = 4.81; % Battery capacity in Ah taken from data.
LiPoly.Measured_SOC             = (nominalCap + meas.Ah).*100./nominalCap;  % Calculate the SOC using Coloumb Counting for comparison

       根据数据的大小,可能需要重新采样以节省计算时间。在下面的代码行中,数据从10 Hz重新采样到1 Hz。如果需要,可以对这部分进行更改。

LiPoly.RecordingTime            = LiPoly.RecordingTime(1:10:end);
LiPoly.Measured_Voltage         = LiPoly.Measured_Voltage(1:10:end);
LiPoly.Measured_Current         = LiPoly.Measured_Current(1:10:end);
LiPoly.Measured_Temperature     = LiPoly.Measured_Temperature(1:10:end);
LiPoly.Measured_SOC             = LiPoly.Measured_SOC(1:10:end);

        本脚本将电流的正值作为放电电流,将负值作为充电电流。如果用户记录的数据具有相反的定义,那么使用第17行中的命令来反转此定义,否则则注释第17行。为了绘图目的,将采样时间从秒转换为小时。

% 电流定义: (+) 放电, (-) 充电
LiPoly.Measured_Current_R       = - LiPoly.Measured_Current;

% 将秒转化成小时
LiPoly.RecordingTime_Hours      = LiPoly.RecordingTime/3600;

EKF_SOC_Estimation Function

       给定测量的电流、电压、SOC和温度,以下函数输出SOC和Vt的估计值,以及与测量相关误差。EKF_SOC_Estimation Function模块的详细设计将在下一篇博客进行讲解。

[SOC_Estimated, Vt_Estimated, Vt_Error] = EKF_SOC_Estimation(LiPoly.Measured_Current_R, LiPoly.Measured_Voltage, LiPoly.Measured_Temperature);

二、绘制结果并计算误差

1.测量端电压vs估计端电压

figure
plot(LiPoly.RecordingTime_Hours,LiPoly.Measured_Voltage);
hold on
plot(LiPoly.RecordingTime_Hours,Vt_Estimated);
hold off;
legend('Measured','Estimated EKF');
ylabel('Terminal Voltage[V]');xlabel('Time[hr]');
title('Measured vs. Estimated Terminal Voltage (V) at 40 Deg C')
grid minor

 2.端电压误差

figure
plot(LiPoly.RecordingTime_Hours,Vt_Error);
legend('Terminal Voltage Error');
ylabel('Terminal Voltage Error');
xlabel('Time[hr]');

 3.真实SOC vs EKF估计的SOC

figure
plot (LiPoly.RecordingTime_Hours,LiPoly.Measured_SOC);
hold on
plot (LiPoly.RecordingTime_Hours,SOC_Estimated*100);
hold off;
legend('Coulomb Counting','Estimated EKF');
ylabel('SOC[%]');xlabel('Time[hr]');
title('Coulomb Counting vs. SOC Estimated at 40 Deg C')
grid minor

 4.SOC误差

figure
plot(LiPoly.RecordingTime_Hours,(LiPoly.Measured_SOC - SOC_Estimated*100));
legend('SOC Error');
ylabel('SOC Error [%]');
xlabel('Time[hr]');
grid minor

 5.计算端电压(Vt)和SOC的均方根误差(RMSE)和最大误差(MAX)

RMSE_Vt     = sqrt((sum((LiPoly.Measured_Voltage - Vt_Estimated).^2)) /(length(LiPoly.Measured_Voltage)))*1000 % mV
RMSE_SOC    = sqrt((sum((LiPoly.Measured_SOC - SOC_Estimated*100).^2)) /(length(LiPoly.Measured_SOC))) % (%)
Max_Vt      = max(abs(LiPoly.Measured_Voltage - Vt_Estimated))*1000 % mV
Max_SOC     = max(abs(LiPoly.Measured_SOC - SOC_Estimated*100)) % (%)

RMSE_vt = 1.3154;

RMSE_soc = 1.9440;

Max_vt = 17.7890;

Max_soc = 2.8007;

猜你喜欢

转载自blog.csdn.net/m0_60354177/article/details/128328377