Erstellt am: 31.03.2008 | Editiert am: 02.04.2008

Zustandsraumdarstellung

Modellieren eines Systems in die Zustandsraumdarstellung am Beispiel eines Gleichstrommotors in Matlab

  1. Kommentar
  2. Funktion gleichstrommotor()
  3. Funktion daten()
  4. Funktion convert( obj )
  5. Funktion identify( obj )
  6. Funktion ausgabe( obj )
  7. Funktion grafik( obj )
  8. Funktion stable_check( obj )
  9. Kommentar schreiben

Kommentar

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ausarbeitung zum Thema Prozessanalyse Modellierung Matlab 7.1
% Vorlesung: Entwurfmethoden für Regler
% Copyright 2007 Thomas Ludwig, Slawa Braun
% This file is distributed under the terms of the GNU General Public License,
% see http://www.gnu.org/copyleft/gpl.txt
%
% Beschreibung: Modellieren eines Systems in die Zustandsraumdarstellung
%               am Beispiel eines Gleichstrommotors.
%
%               1. Systemzerlegung - Zerlege das System in Komponenten
%               2. Beschreibe das Verhalten der Komponenten
%                  (physikalische, chemische... Grundlagen)
%               3. Beschreibe die Beziehungen zwischen den Komponenten
%               4. Fasse Gleichungen zu einer DGL zusammen
%               5. Normieren
%               6. DGL in Matrixschreibweise der Zustandsraumdarstellung bringen
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Funktion gleichstrommotor()

function gleichstrommotor();

    % Allgemeine Optionen
    format long;
    close all;
    clear all;
    clc

    help gleichstrommotor
   
    % Daten laden
    obj= daten();

    % Kovertiere Daten nach SS, TF, FRD und ZPK
    obj= convert( obj );   
   
    % System abfragen
    obj= identify( obj );
   
    % Ausgabe im Command Window
    ausgabe( obj );   
    
    % Grafiken ausgeben
    switch input('  >>  Diagramme mit LTIView [L], SISOTOOL [S] oder einzeln [E] generieren?  ','s');
        case 'L'
            ltiview( obj.ss.sys );
        case 'S'
            sisotool( obj.ss.sys );
        case 'E'
            disp('Die Grafiken werden nun generiert....');
            grafik( obj );           
    end
   
    % Regler Vergleich
    %regler( obj );
   
    % Objekt an Workspace uebergeben
    assignin( 'base', 'obj', obj );
   
end

Funktion daten()

%% Daten - Fuer Zustandsraum
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function obj= daten();
    %Parameter der Aufgabenstellung
    R = 0.5;    %Ohms
    L = 0.05;   %mHenrys
    Km = 0.03;    %Vs/rad
    Kt = 30*10^(-3);    %Nm/A
    Kr = 30*10^(-6);    %Nms
    J = 10*10^(-4);     %Nms^2
    % Zustandsdifferentialgleichung: d/dt*x(t)= A*x(t) + b*u(t)
    % Ausgangsgleichung: y(t)= c'*x(t) + d*u(t)
    % x(t) - Zustandsvektor
    % u(t) - Eingangsvariable
    % y(t) - Ausgangsvariable
   
    A=[ -R/L     -Km/L;
         Kt/J    -Kr/J];   % Systemmatrix

    b=[ 1/L;
         0 ];               % Eingangsvektor

    c=[ 0 1 ];              % Ausgangsvektor

    d=[ 0 ];                % Durchgangsfaktor
   
    % Ts = 0 - Continuous-Time State-Space Model
    % Ts > 0 - Discrete-Time Model
    Ts= 0;                  % Abtastzeit: 0.01s -> Ts= 0.01
   
    t = 0:Ts:10;            % Simulationszeit: 0~10s
   
    % Daten an Objekt uebergeben
    obj.A= A;
    obj.b= b;
    obj.c= c;
    obj.d= d;
    obj.t= t;
    obj.Ts= Ts;

end

Funktion convert( obj )

%% Konvertierung
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function obj= convert( obj );

    % Zustandsraum
    obj.ss.sys = ss(obj.A, obj.b, obj.c, obj.d, obj.Ts);
    obj.ss.tfsys= tf( obj.ss.sys );

    % Frequenzgang-Daten Modell
    obj.frd.sys= frd(obj.ss.sys, obj.Ts,'Units','Hz');
   
    % Uebertragungsfunktion
    [obj.tf.zaehler, obj.tf.nenner]= ss2tf(obj.A, obj.b, obj.c, obj.d);     % Zaehler / Nenner
    obj.tf.GS=  tf(obj.tf.zaehler, obj.tf.nenner, obj.Ts);

    % Pol-Nullstellenmodell
    [obj.zpk.z, obj.zpk.p, obj.zpk.k] = ss2zp(obj.A, obj.b, obj.c, obj.d);  % Zero / Pole / Gain
    obj.zpk.GS= zpk(obj.zpk.z, obj.zpk.p, obj.zpk.k, obj.Ts);
   
end

Funktion identify( obj )

%% System Identifizieren
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function obj= identify( obj );

    % Nullstellen
    obj.nullstellen= zero(obj.ss.sys);

    % Polstellen
    obj.polstellen= pole(obj.ss.sys);

    % Eigenwerte
    [obj.eigenvektor, obj.eigenwerte]= eig(obj.ss.sys.a);

    % Dämpfung
    [obj.daempfung.Wn, obj.daempfung.Z, obj.daempfung.P]= damp(obj.ss.sys); % Spuckt mehr aus als bei obj.ss.sys
    obj.daempfung.matrix= [obj.daempfung.Z, obj.daempfung.P, obj.daempfung.Wn];

    % Verstärkungsfaktor
    obj.kp= dcgain(obj.ss.sys);
   
    % Amplitudenrand: GainMargin und GMFrequency
    % Phasenrand: PhaseMargin und PMFrequency
    % Totzeitrand: DelayMargin und DMFrequency
    % Stabilitat: Stable, 1 bei Stabilitat, 0 sonst.       
    obj.allmargin= allmargin(obj.ss.sys);
   
    % Bode Daten
    [obj.bode.mag, obj.bode.phase, obj.bode.w]= bode(obj.ss.sys);

    % Nyquist Daten
    [obj.nyquist.mag, obj.nyquist.phase, obj.nyquist.w]= bode(obj.ss.sys);
   
    % Wurzelortskurve Daten
    [obj.Wok.r, obj.Wok.k]= rlocus(obj.ss.sys);

end

Funktion ausgabe( obj )

%% Ausgabe im Command Window
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ausgabe( obj );

    % System ausgeben
    disp('Das gewählte Zustandsmodell:')
    printsys(obj.A, obj.b, obj.c, obj.d)

    % Abtastzeit
    disp(sprintf('Die gewählte Abtastzeit Ts=%ds', obj.Ts))
   
    % Single Input, Single Output (SISO)
    disp(sprintf('Ist dies ein Single Input Single Ouput System? [J/N]: %i', issiso(obj.ss.sys)))

    % Verstärkungsfaktor
    disp('-> Verstärkungsfaktor'), disp(sprintf('   Kp= %f', obj.kp));

    % Uebertragungsfunktion - TF
    disp('-> Übertragungsfunktion - TF'), obj.tf.GS
    disp('********************************************************************')

    % Übertragungsfunktion - SS
    disp('-> Übertragungsfunktion - SS - Zustandsdarstellung'), obj.ss.tfsys
    disp('********************************************************************')
   
    % Übertragungsfunktion - ZPK
    disp('-> Übertragungsfunktion - ZPK - Nullstellen-Polstellen-Darstellung'), obj.zpk.GS 
    disp('********************************************************************')

    % Frequenz
    disp('-> Frequenz Daten Modelle - FRD - Ausgang'), obj.frd.sys
    disp('********************************************************************')   
   
    % Nullstellen
    disp('-> Nullstellen'), disp(obj.nullstellen)
   
    % Polstellen
    disp('-> Polstellen - Nullstellen der Charakterlichen Gleichung'), disp(obj.polstellen)
   
    % Eigenwerte
    disp('-> Eigenwerte'), disp(obj.eigenwerte)
   
    % Eigenvektor
    disp('-> Eigenvektor'), disp(obj.eigenvektor)

    % Daempfung
    disp('-> Dämpfung           Eigenwerte          Frequenz (rad/s)'), disp(obj.daempfung.matrix)
  
    % Stabilitaet
    disp('-> Amplitudenrand/Phasenrand/Totzeitrand/Stabilität'), disp(obj.allmargin)
   
end

Funktion grafik( obj )

%% Grafik
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function grafik( obj );

    % Bode-diagramm
    figure('Name','Bode Diagramm','NumberTitle','off'), ch_bode= bodeplot(obj.ss.sys,'r');
    setoptions(ch_bode,'FreqUnits','Hz');
   
    % Nyquist-Kurve
    figure('Name','Nyquist','NumberTitle','off'), ch_nyquist= nyquistplot(obj.ss.sys);      
    setoptions(ch_nyquist,'FreqUnits','Hz', 'PhaseUnits','deg', 'MagUnits','dB', 'ShowFullContour','on', 'Grid','on');
   
    % Wurzelortskurve
    figure('Name','Wurzelortskurve','NumberTitle','off'), rlocusplot(obj.ss.sys), sgrid;       

    % Nichols
    %figure('Name','Nichols Kurve','NumberTitle','off'), nicholsplot(obj.ss.sys);
   
    % Null-Polstellen Verteilung
    figure('Name','Null-Polstellen Verteilung','NumberTitle','off'), ch_pzplot= pzplot(obj.ss.sys);      
    setoptions(ch_pzplot,'FreqUnits','Hz'), sgrid;;
   
    % Sprungantwort
    figure('Name','Sprungantwort','NumberTitle','off'), stepplot(obj.ss.sys);

    % Impulsantwort
    figure('Name','Impuslantwort','NumberTitle','off'), impulseplot(obj.ss.sys);

    % Sigma
    figure('Name','Sigma','NumberTitle','off'), sigmaplot(obj.ss.sys);

    % Initial
    %figure('Name','Initial [1; 0]','NumberTitle','off'), initialplot(obj.ss.sys, [1; 0]);

    % Hankel singular values
    %figure('Name','Hankel singular values','NumberTitle','off'), hsvplot(obj.ss.sys);

end

Funktion stable_check( obj )

% Ueberpruefung der Stabilitätskriterien
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function obj= stable_check( obj );

    % Dämpfung überprüfen
    if (D > 1)
        status= 'Aperiodischer Fall';
    elseif (D == 1)
        status= 'Aperiodischer Grenzfall';
    elseif ( (D > 0) && (D < 1) )
        status= 'Periodischer Grenzfall - Schwingfall';
    end

end

Kommentar schreiben

  • Benötigte Felder sind mit einem Stern (*) markiert.
Sollte der Sicherheitscode unleserlich sein, kann durch einen Klick auf das Bild ein neuer Sicherheitscode erzeugt werden.

Sicherheitscode:
 

Database: 0.0168 s, 16 Anfragen, PHP: 0.3172 s, total: 0.3339 s