Schätzung des Ladezustands von Lithium-Ionen-Batterien basierend auf dem adaptiven erweiterten Kalman-Filter (AEKF) (mit MATLAB-Code)

Die Funktion AEKF_SOC_Estimation schätzt die Klemmenspannung (Vt) und den Ladezustand (SOC) einer Batterie mithilfe eines RC-Ersatzschaltbildmodells (ECM) zweiter Ordnung und eines adaptiven erweiterten Kalman-Filters (AEKF). Die Funktion benötigt Folgendes als Eingabe: 

Strom (A)
Spannung (V)
Temperatur (℃)

Die Ausgabe dieser Funktion ist:

·  Geschätzter SOC

Geschätzte Spannung Vt

· Spannungs-VT-Fehler

function [SOC_Estimated, Vt_Estimated, Vt_Error] =AEKF_SOC_Estimation(Current, Vt_Actual, Temperature)

Laden Sie die Batteriemodellparameter und die relationale SOC-OCV-Datenbank bei verschiedenen Temperaturen. Wenn keine Temperaturdaten verfügbar sind oder eine einzelne Temperatur verwendet wird, wird empfohlen, 25 °C als Referenz zu verwenden. Der Benutzer sollte die Variable Cn anpassen, die die maximal gemessene Kapazität bei einer bestimmten Temperatur angibt. 

Standardmäßig lädt die Funktion die bereitgestellte Datei „BatteryModel\_Sample‘.mat“, bei der es sich um eine beschriftete Tabelle handelt. Die Tabelle enthält OCV-, SOC-, R0-, R1-, C1-, R2- und C2-Daten in den Spalten 1 bis 7. Der SOC-Bereich liegt zwischen 0 % und 100 %, mit einem Intervall von etwa 10 %, aber Benutzer können den SOC je nach Bedarf erhöhen oder verringern.

load 'BatteryModel.mat'; % Load the battery parameters and SOC-OCV
curve

Die SOC-OCV-Kurve wird durch den Pulscharakteristiktest der Batteriezelle erstellt. Typischerweise handelt es sich dabei um einen C/20-Entlade- und Ladetest, wobei jede Entlade- und Ladekurve einen SOC-OCV pro Temperatur durchschnittlich ergibt. Es ist wichtig sicherzustellen, dass keine doppelten SOC-Punkte vorhanden sind (insbesondere, wenn die Punkte unterschiedliche OCV-Werte haben), da dies beim Ausführen der Funktion zu Interpolationsfehlern führt. Modellieren Sie die Batterie mithilfe von Simulink- und Simscape-Simulationen, um Batterieparameter durch HPPC oder andere Charakterisierungstests abzuschätzen. Weitere verfügbare Methoden umfassen Optimierungsalgorithmen wie den genetischen GA-Algorithmus. T ist die während des Fahrzyklustests gemessene Batterietemperatur. 

1. Modellierung der Initialisierung der Batterieparameter

Stellen Sie den anfänglichen SOC zwischen 0 und 1 ein, wobei 0 0 % und 1 100 % bedeutet. Dies kann auf den anfänglichen SOC des Fahrzyklus oder auf einen Wert von weniger als etwa 20 % eingestellt werden, um Konvergenz und Robustheit zu testen. ΔT ist die Zeitdifferenz zwischen jedem Wert im aktuellen Vektor und dem Vt-Vektor, der zur Berechnung der A- und B-Matrizen verwendet wird. 

SOC_Init = 1; % intial SOC
X = [SOC_Init; 0; 0]; % state space x parameter intializations
DeltaT = 1; % sample time in seconds
Qn_rated = 4.81 * 3600; % Ah
% initialize scatteredInterpolant functions for battery parameters and
SOC-OCV curve
% this function also allows for extrapolation
F_R0 = scatteredInterpolant(param.T,param.SOC,param.R0);
F_R1 = scatteredInterpolant(param.T,param.SOC,param.R1);
F_R2 = scatteredInterpolant(param.T,param.SOC,param.R2);
F_C1 = scatteredInterpolant(param.T,param.SOC,param.C1);
F_C2 = scatteredInterpolant(param.T,param.SOC,param.C2);
F_OCV = scatteredInterpolant(param.T,param.SOC,param.OCV);

Der Kalman-Filter verfügt über drei Parameter, die angepasst werden können: R, P und Q. Diese Parameter müssen für jede Zelle entweder manuell oder durch einen Optimierungsalgorithmus angepasst/abgestimmt werden. R sollte auf das Quadrat des Fehlers der zum Testen der Batteriezelle verwendeten Ausrüstung eingestellt werden. Sobald der Wert von Q angepasst wurde, kann R nicht aktualisiert werden. 

n_x = size(X,1);
R_x = 2.5e-5;
P_x = diag(1e-10);
Q_x = [1.0000e-10 0 0;
0 1.0000e-10 0;
0 0 1.0000e-10];

Initialisiert den Ausgabevektor und legt die Länge der for-Schleife basierend auf der Größe des aktuellen Vektors fest. Kommentieren Sie Zeile 25 aus, um einen Stromoffset von 0,1 A zu testen. Aktualisieren Sie die Offsets nach Bedarf. 

SOC_Estimated = [];
Vt_Estimated = [];
Vt_Error = [];
ik = length(Current);
% Current = Current+0.1;

2. Kalman-Filteralgorithmus

Dies ist der Beginn des Adaptive Extended Kalman Filter-Algorithmus. Der Zyklus basiert auf der aktuellen Eingangsdatenlänge.

for k=1:1:ik
T = Temperature(k); % C
U = Current(k); % A
SOC = X(1);
V1 = X(2);
V2 = X(3);
% Evaluate the battery parameter scatteredInterpolant
% functions for the current temperature & SOC
R0 = F_R0(T,SOC);
R1 = F_R1(T,SOC);
R2 = F_R2(T,SOC);
C1 = F_C1(T,SOC);
C2 = F_C2(T,SOC);
OCV = F_OCV(T,SOC);
% OCV = pchip(param.SOC,param.OCV,SOC); % pchip sample for unknown or
single temperature
The following is used to calculate the A and B matrices below on line 66 and 69.
Tao_1 = C1 * R1;
Tao_2 = C2 * R2;
a1 = exp(-DeltaT/Tao_1);
a2 = exp(-DeltaT/Tao_2);
b1 = R1 * (1 - exp(-DeltaT/Tao_1));
b2 = R2 * (1 - exp(-DeltaT/Tao_2));

3. Führen Sie das Update-Modell aus

Die Vt-Gleichung basiert auf:

77b1685dd85840d08898701c6742dc27.png

 

TerminalVoltage = OCV - R0*U - V1 - V2;

Wenn U(Strom) positiv ist, wird die Batterie entladen und der Coulomb-Wirkungsgrad (η) wird auf 0,99 eingestellt. Wenn U (Spannung) negativ ist, wird die Batterie geladen und der Coulomb-Koeffizient (η) beträgt. 

if U > 0
eta = 0.99; % eta for discharging
elseif U <= 0
eta = 1; % eta for charging
end

Linearisieren Sie das Modell, indem Sie die C-Matrix linearisieren. Diese Funktion gibt den interpolierten Wert einer eindimensionalen Funktion an einem bestimmten Abfragepunkt mithilfe linearer Interpolation zurück. 

2f8f2570584f4c33838b148a9e74c46e.png

 

OCV = interp1(param.SOC,param.OCV,SOC,'linear','extrap');
C_x = [OCV -1 -1];
Calculate the Vt error.
Error_x = Vt_Actual(k) - TerminalVoltage;
if abs(Error_x) < 0.01
Error_x = 0.000;
end

SOC- und Spannungsschätzungen im Vektor mit Vt-Fehler speichern/aktualisieren. Dies sind die Ausgabevektoren der Funktion. 

Vt_Estimated = [Vt_Estimated;TerminalVoltage];
SOC_Estimated = [SOC_Estimated;X(1)];
Vt_Error = [Vt_Error;Error_x];

4. EKF

EKF verwendet einen zweistufigen Vorhersagekorrekturalgorithmus. Berechnen Sie die A- und B-Matrizen mit den oben genannten Variablen: 

0b4ffb65cfcc489f92e77e6088c74563.png1264bdf1640f4d4fb5a8058d9ba479e3.png

 Vervollständigen Sie als Nächstes den Vorhersageteil (Zeitaktualisierung) von KF. 

1. Sagen Sie den zukünftigen Zustand voraus (a priori):

0bdaed308f334e04a01eece39a1ba2f9.png

 2. Prognosefehlerkovarianz:

502c2d10e9ab4e37b692251719fcef41.png

A = [1 0 0;
0 a1 0;
0 0 a2];
B = [-(eta * DeltaT/Qn_rated); b1; b2];
X = (A * X) + (B * U);
P_x = (A * P_x * A') + Q_x;

Als nächstes schließen Sie den Korrekturteil (Messaktualisierung) von KF ab.

1. Berechnen Sie den Kalman-Gewinn:

2edb922445f444449a4617701f5efb29.png

 2. Aktualisieren Sie die Schätzung Zk (das Posterior) mit dem gemessenen Wert:

c3171310fc3242129baabf5faee7e48b.png

 3. Aktualisieren Sie die Fehlerkovarianz:

72d2c6e5f40f4625afae762f1066e02d.png

 

KalmanGain_x = (P_x) * (C_x') * (inv((C_x * P_x * C_x') + (R_x)));
X = X + (KalmanGain_x * Error_x);
P_x = (eye(n_x,n_x) - (KalmanGain_x * C_x)) * P_x;

5. Kovarianzanpassung nach adaptivem Gesetz (AEKF)

Das Adaptive-Law-Kovarianz-Matching ist gegeben durch: 

e3c749d06279471f9fac676c8aaff176.png

 

Q_x = KalmanGain_x * Error_x * KalmanGain_x';
end

6. Das Zeichenprogramm und die Ergebnisse des adaptiven erweiterten Kalman-Filters sind unten aufgeführt:

% Terminal Voltage Measured vs. Estimated
figure
plot(LiPoly.RecordingTime_Hours,LiPoly.Measured_Voltage);
hold on
plot(LiPoly.RecordingTime_Hours,Vt_Estimated);
hold off;
legend('Measured','Estimated AEKF');
ylabel('Terminal Voltage[V]');xlabel('Time[hr]');
title('Measured vs. Estimated Terminal Voltage (V) at 40 Deg C')
grid minor
% Terminal Voltage Error
figure
plot(LiPoly.RecordingTime_Hours,Vt_Error);
legend('Terminal Voltage Error');
ylabel('Terminal Voltage Error');
xlabel('Time[hr]');
% SOC Coulomb Counting vs. Estimated
figure
plot (LiPoly.RecordingTime_Hours,LiPoly.Measured_SOC);
hold on
plot (LiPoly.RecordingTime_Hours,SOC_Estimated*100);
hold off;
legend('Coulomb Counting','Estimated AEKF');
ylabel('SOC[%]');xlabel('Time[hr]');
title('Coulomb Counting vs. SOC Estimated at 40 Deg C')
grid minor
% SOC Error
figure
plot(LiPoly.RecordingTime_Hours,(LiPoly.Measured_SOC - SOC_Estimated*100));
legend('SOC Error');
ylabel('SOC Error [%]');
xlabel('Time[hr]');
grid minor

1. Simulationsspannungsvergleich

a86d8d4895274a18bf9ba6c0ab058b41.png

 2. Simulationsspannungsfehler

8498cbe6a634425b91e7f3621ae5d304.png

 3. SOC-Vergleich

ccda8787174440c48593ba603b275a34.png

 4. SOC-Fehler

ee15300a40cc465b8c48e84b0bef5be3.png

 

Alle Programmcodes während der Master- und Promotionszeit betragen insgesamt mehr als 2 g. Sie können Ihnen Orientierung geben und Ihnen einen halbstündigen Sprachanruf zur Beantwortung von Fragen geben. Darin sind Batteriedaten + Identifizierungsprogramm + verschiedene Kalman-Filteralgorithmen enthalten, und neue Modelle werden in Zukunft aktualisiert. Schnellstart-BMS-Software. Eine Gans: 2629471989

おすすめ

転載: blog.csdn.net/m0_60354177/article/details/127890424