Forum: Digitale Signalverarbeitung / DSP / Machine Learning Abwärtswandler via Matlab Code


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Albert K. (teslace)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich will einen Abwärtswandler in Matlab per Code simulieren. Hab da 
einige Schwierigkeiten, allgemein wie gehe ich das an?
Kennt ihr vielleicht gute Tutorials oder ähnliches?

Vielen Dank

: Verschoben durch Moderator
von M.A. S. (mse2)


Bewertung
0 lesenswert
nicht lesenswert
Welcher Natur sind Deine Schwierigkeiten?

von Der Andere (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Nimm LTSpice

von Albert K. (teslace)


Bewertung
0 lesenswert
nicht lesenswert
Also ich weis nicht ganz wie ich das angehen soll. Ich könnte jetzt alle 
Formeln in Matlab beschreiben, doch wie schaffe ich diese dann dynamisch 
zu verbinden (sprich Spule, Kondensator und den ein und ausschaltenden 
Transistor)


Ich muss leider Matlab nutzen

von M.A. S. (mse2)


Bewertung
0 lesenswert
nicht lesenswert
Albert K. schrieb:
> Also ich weis nicht ganz wie ich das angehen soll. Ich könnte
> jetzt alle
> Formeln in Matlab beschreiben, doch wie schaffe ich diese dann dynamisch
> zu verbinden (sprich Spule, Kondensator und den ein und ausschaltenden
> Transistor)
>
> Ich muss leider Matlab nutzen
Die Antwort auf meine Frage lautet also, dass Du überhaupt keine Ahnung 
vom Umgang mit Matlab hast, richtig?!

Dann solltest Du in der Tat Matlab-Tutorials oder -Bücher durcharbeiten.
Mit Sicherheit gibt es unzählige davon, als pdf zum Lesen oder auf 
youtube zum Gucken, was auch immer Deinem Geschmack entspricht.
Was davon für Dich taugt, musst Du schon selber herausfinden, wir kennen 
Deinen Kenntnisstand und Deine genauen Probleme ja nicht.

Deinen Angaben nach brauchst Du aber Grundlagen.

von Albert K. (teslace)


Bewertung
0 lesenswert
nicht lesenswert
% Schaltkreis Daten
clear
L = [0.0005]; %Induktivität
C = [0.000033]; %Kapazität
Rc = [0.03]; %Widerstand Kapazität
Rl = [0.2]; %Widerstand Spule

Ue = [5]; %Eingangsspannung
Ua = [1.2]; %Ausgangsspannung
Ie = [2]; %Eingangsstrom
Ia = [0.4]; %Ausgangsstrom

T = [0.00005]; %Periode
D = [0.7]; %duty cycle
N = 20; %Anzahl der dargestellten Perioden

A = [ 0 1/C ; -1/L -(Rc+Rl)/L ];
B1 = [ 0 -1/C ; -1/L Rc/L ];
B2 = [ 0 -1/C ; 0 Rc/L ];
C = [ 1 Rc ; 0 1 ];

t = zeros(N,1);%start Zeit
iL0 = 0;
uC0 = 0;
iL = zeros(N,1);
uC = zeros(N,1);
ungerade = 1:2:N; %ungerade zahlen
gerade = 2:2:N;
tein0 = D.*T;
taus0 = T-tein0;
for k=1:N
    if k==1
        iL(k,1) = 0;
        uC(k,1) = 0;
        t(k,1) = 0;
    end

    if k>1
            t0 = ((k-1)-1).*T; %zeit nach k-1 Perioden
            tein = t0+D.*T; %tein nach Periode t0

        if max(k==gerade)==1
        t(k,1) = tein;
        iL(k,1) = 
(A(2,1)*uC(k-1,1)+A(2,2)*iL(k-1,1)+B1(2,1)*Ue+B1(2,2)*Ia)*tein0;
        uC(k,1) = 
(A(1,1)*uC(k-1,1)+A(1,2)*iL(k-1,1)+B1(1,1)*Ue+B1(1,2)*Ia)*tein0;
        end


        if max(k==ungerade)==1
        t(k,1) = t0;
        iL(k,1) = 
(A(2,1)*uC(k-1,1)+A(2,2)*iL(k-1,1)+B2(2,1)*Ue+B2(2,2)*Ia)*taus0;
        uC(k,1) = 
(A(1,1)*uC(k-1,1)+A(1,2)*iL(k-1,1)+B2(1,1)*Ue+B2(1,2)*Ia)*taus0;
        end

    end
end
    plot(t,iL)


Also um mein Probelm genauer zu beschreiben: wenn man (t,iL) plotet 
sollte iL eigentlich um den Augangsstrom schwingen. Irgendwo habe ich 
einen Wurm drin aber wo?

( A, B1, B2 stellen die Differentialgleichung des synchronen 
Abwärtswandlers dar, wobei B1 den geschlossenen Schaltkreis und B2 den 
offenen Schaltkreis beschreibt)

: Bearbeitet durch User
von Tilman K. (inginfo)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Albert,

ob deine Gleichungen stimmen oder nicht, habe ich nicht überprüft, 
sondern stattdessen selbst gerechnet. Ausgangspunkt ist der in 
schaltung.png dargestellte Aufbau. Mithilfe der in ausgangsspg.png 
aufgestellten Gleichung zur Berechnung der Ausgangsspannung werden die 
Differentialgleichungen für den Spulenstrom (spulenstrom.png) und für 
die Kondensatorspannung (kondensatorspg.png) aufgestellt.

Es ergibt sich ein System aus zwei Differentialgleichungen, die Lösung 
erfolgt mittels MATLAB/ode45:
1
% Simulation eines Step-Down-Wandlers
2
function stepdown
3
    global L R_L C R_C R_Last U_Bat f D
4
    L      = 0.0001;      % Induktivität (in H)
5
    R_L    = 0.25;        % Innenwiderstand Spule (in Ohm)
6
    C      = 0.00001;     % Kapazität (in F)
7
    R_C    = 0.25;        % Innenwiderstand Kondensator (in Ohm)
8
    R_Last = 25.0;        % Lastwiderstand (in Ohm)
9
    U_Bat  = 10.0;        % Eingangsspannung (in V)
10
    f      = 200000.0;    % Schaltfrequenz (in Hz)
11
    D      = 0.75;        % Tastgrad
12
    
13
    y_0    = [0.3; 7.5];  % Startwerte für i_L und u_C
14
    t_0    = 0.0000;      % Startzeitpunkt (in Sekunden)
15
    t_1    = 0.0003;      % Stoppzeitpunkt (in Sekunden)
16
    
17
    % DGL-System lösen, darauf achten, dass während jeder
18
    % Periode mindestens 50 Stützpunkte berechnet werden.
19
    t_step = 1 / (50 * f);
20
    options = odeset('MaxStep', t_step);
21
    [T,Y] = ode45(@dglsys, [t_0 t_1], y_0, options);
22
23
    i_L = Y(:,1);
24
    u_C = Y(:,2);
25
    u_Last = f1(i_L, u_C);
26
    
27
    subplot(3,1,1); plot(T, u_sw(T)); title('Spannung am Schalter');
28
    subplot(3,1,2); plot(T, i_L);     title('Spulenstrom');
29
    subplot(3,1,3); plot(T, u_Last);  title('Ausgangsspannung');
30
end
31
32
% Spannung am Schalter in Abhängigkeit von der Zeit berechnen
33
function u = u_sw(t)
34
    global L R_L C R_C R_Last U_Bat f D
35
    t_norm = mod(t, 1 / f);
36
    u = U_Bat * (t_norm < D / f);
37
end
38
39
% Spannung u_Last in Abhängigkeit von i_L und u_C berechnen
40
function u_Last = f1(i_L, u_C)
41
    global L R_L C R_C R_Last U_Bat f D
42
    u_Last = i_L * R_Last * R_C / (R_Last + R_C) + u_C * R_Last / (R_Last + R_C);
43
end
44
45
% DGL-System des Wandlers mit dem Zustandsvektor y = [i_L; u_C]
46
function dy_dt = dglsys(t, y)
47
    global L R_L C R_C R_Last U_Bat f D
48
    i_L = y(1);
49
    u_C = y(2);
50
    
51
    dy_dt(1,1) = 1 / L * u_sw(t) - R_L / L * i_L - f1(i_L, u_C) / L;
52
    dy_dt(2,1) = 1 / C * i_L - 1 / ( C * R_Last) * f1(i_L, u_C);
53
end

Viele Grüße!
Tilman

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.