Szabályozástechnika - Diszkrétidejű állapotteres szabályozók tervezése

A VIK Wikiből
A lap korábbi változatát látod, amilyen David14 (vitalap | szerkesztései) 2014. január 6., 13:05-kor történt szerkesztése után volt.

Simulink modellek

Simulink modellek

  1. Töltsd le!
  2. Csomagold ki!
  3. Másold be a Matlab aktuális munkakönyvtárába!

A mechanikai lengőrendszer leírása

%% Állapotteres szabályozás diszkrét időben

%% Mechanikai lengőrendszer leírása

% A rendszer paraméterei 
m=2;    % A test tömege
k=0.75;  % Rugóállandó
b=0.25; % Csillapítás  

% A folytonos idejű állapotteres leírás mátrixai:

Ac = [0 1; -k/m -b/m]
Bc = [0; 1/m]
Cc = [1 0]
Dc = 0

sys=ss(Ac,Bc,Cc,Dc); % A folytonos idejű rendszer összeállítása

Ts=0.2;                 % Mintavételi idő
dsys=c2d(sys,Ts,'zoh'); % Áttérés diszkrét időre

step(sys,dsys); % A folytonos és diszkrét idejű rendszer ugrásválasza

% A diszkrét idejű állapotteres leírás mátrixai:
[Phi,Gamma,C,D]=ssdata(dsys)

Állapotvisszacsatolás tervezése

% Gyorsabb, de jobban csillapított zárt kört szeretnénk - az előírásokat
% folytonos időben adjuk meg!
w0=1;
xi=0.8;

% A zárt kör sajátértékei s-ben
% Ha a rendszernek 2-nél több állpotváltozója van, akkor n-2 segédpólust
% (scinf) is fel kell vennünk, melyek 3-5ször gyorsabbak mint a domináns póluspár.
sdom1=-w0*xi+j*w0*sqrt(1-xi^2);
sdom2=conj(sdom1);

% Áttérés z-re
zdom1=exp(sdom1*Ts);
zdom2=exp(sdom2*Ts);
% zcinf=exp(scinf*Ts);

% A zárt kör sajátértékeit tartalmazó vektor, valamint ha n>2,
% akkor n-2 multiplicitással a zcinf pólusok is
phic=[zdom1 zdom2];

% Az irányíthatóság ellenőrzése
Mc=ctrb(Phi,Gamma); % Az irányíthatósági mátrix...
rank(Mc)            % ... és rangja
% Ha rank(Mc)=n, akkor a rendszer irányítható

% Állapotvisszacsatolás tervezése az Ackermann-képlet segítségével
K=acker(Phi,Gamma,phic)

% A megfelelő Simulink-modell megnyitása
open('discrete_1');
% Ugyanaz az feladat, mint a folytonos esetben...
% VIGYÁZAT: Minden építőelemnél, ami nem a szakasz része, meg kell
% adni a Ts mintavételi periódusidőt!!!

% Várakozás billentyűlenyomásra
pause

Állapotmegfigyelő tervezése

% A megfigyelő sajátértéke s-ben
soinf=-5

% Áttérés z-tartományra
zoinf=exp(soinf*Ts);

% A megfigyelő karakterisztikus gyökei: soinf megfelelő multiplicitással (n)
phio=[zoinf zoinf]

% A megfigyelhetőség ellenőrzése
Mo=obsv(Phi,C); % A megfigyelhetőségi mátrix...
rank(Mo)      % ... és rangja
% Ha rank(Mo)=n, akkor a rendszer megfigyelhető

% Megfigyelő tervezése - VIGYÁZAT: Itt a paraméterezés nem analóg a folytonos esettel!
G=acker(Phi',Phi'*C',phio)'
F=Phi-G*C*Phi
H=Gamma-G*C*Gamma;

% A megfelelő Simulink-modell megnyitása
open('discrete_2');
% VIGYÁZAT: Itt nem lehet discrete state space objektumként megadni az állapotmegfigyelőt!
% Elemenként kell azt összeraknunk azt, a differenciaegyenlete alapján!
%
% ^          ^
% x[k] = F * x[k-1] + G * y[k] + H * u[k-1]

% FIGYELEM: Mivel aktuális megfigyelőt terveztünk, így az y[k] nincs késleltetve!

% Várakozás billentyűlenyomásra
pause

Alapjel miatti korrekció

% Tervezés
% n*n-es egységmátrix, és az oszlopvektorban n darab nulla,
% majd fixen 1 darab egyes.
% FIGYELEM! eltérés a folyotonos időtől: '-eye(2)'
NxNu=inv([Phi-eye(2) Gamma; C 0])*[0;0;1];

% Az Nx-et és Nu-t tartalmazó vektor szétválasztása
Nx=NxNu(1:2) % Annyi elem, ahány állapotunk van (n)
Nu=NxNu(end) % Skalár

% A megfelelő Simulink-modell megnyitása
open('discrete_3');

% Várakozás billentyűlenyomásra
pause

Terhelésbecslő tervezése

% A kibővített rendszer mátrixai
Phitilde=[Phi Gamma; 0 0 1]; % n darab nulla és fixen 1 darab egyes (SISO)
Gammatilde=[Gamma;0]; % Fixen 1 darab nulla a végére (SISO)
Ctilde=[C 0]; % Fixen 1 darab nulla a végére (SISO)

% A megfigyelő sajátértékeit tartalmazó vektorban soinf most egyel nagyobb
% multiplicitással szerepel, hiszen felvettünk egy új (fiktív) állapotot
phiotilde=[zoinf zoinf zoinf];

% Megfigyelőtervezés a kibővített rendszerhez
% Ugyanaz, mint az állapotmegfigyelőnél, csak most a 'tilde rendszerre
Gtilde=acker(Phitilde',Phitilde'*Ctilde',phiotilde)'
Ftilde=Phitilde-Gtilde*Ctilde*Phitilde;
Htilde=Gammatilde-Gtilde*Ctilde*Gammatilde;

% A megfelelő Simulink-modell megnyitása
open('discrete_4');

% Várakozás billentyűlenyomásra
pause

Integráló szabályozás tervezése

% A kibővített rendszer mátrixai
% n*1-es nullmátrix, a végén fixen 1 darab egyes (SISO)
Phii=[Phi zeros(2,1);C*Ts 1];
Gammai=[Gamma;0];

% Az integrátor állapotának s=-3-nak megfelelő sajátértéket írunk elő
phictilde=[zdom1 zdom2 exp(-3*Ts)];

% Állapotvisszacsatolás számítása
Ktilde=acker(Phii,Gammai,phictilde);

% Az állapotvisszacsatolás vektorának felbontása
Kt=Ktilde(1:2); % Annyi eleme van, ahány valódi állapotunk
Ki=Ktilde(3);   % Skalár 

% A megfelelő Simulink-modell megnyitása
open('discrete_5');
% Ebben nincs terhelésbecslő, hiszen mind a terhelésbecslő, mind
% az integrátor zavarelnyomási célokat szolgál, így a kettő együtt felesleges

% Várakozás billentyűlenyomásra
pause