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:
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.
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:
Vervollständigen Sie als Nächstes den Vorhersageteil (Zeitaktualisierung) von KF.
1. Sagen Sie den zukünftigen Zustand voraus (a priori):
2. Prognosefehlerkovarianz:
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:
2. Aktualisieren Sie die Schätzung Zk (das Posterior) mit dem gemessenen Wert:
3. Aktualisieren Sie die Fehlerkovarianz:
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:
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
2. Simulationsspannungsfehler
3. SOC-Vergleich
4. SOC-Fehler
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