Szabályozástechnika - Diszkrétidejű állapotteres szabályozók tervezése
A VIK Wikiből
Simulink modellek
- Töltsd le!
- Csomagold ki!
- 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.
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 állapotmegfigyelpné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