„Szabályozástechnika - Laborjegyzetek” változatai közötti eltérés
lap létrehozása (először csak 3. labor jegyzetét töltöm fel) |
4.labor anyagának feltöltése Wiki-szintaktikával |
||
| 178. sor: | 178. sor: | ||
== 4. labor == | == 4. labor == | ||
2010-10-20 - 4. Labor | |||
Most stabil folyamatokhoz (P) akarunk szabályózt (C) tervezni, úgy hogy a P gyorsabb meg ilyesmibb legyen. A PID szabályzó elég a nem kritikus dolgokhoz: szoba hőmérséklet például) | |||
Ez a rész a gyakban használható. | |||
L = C*Pc=? | |||
PID = Proportional (arányos tag), D.. (deriváló tag), I.. (integráló tag) | |||
P -> (5) => 5*e (e=hiba) | |||
D -> a hibajel tendenciájának megfelelően "előredolgozik", így ha hirtelen váltásvan a hibajelben, akkor gyorsabban reagál | |||
I -> kiintegrálja a hibajelet. Megnézi a múltban mennyi votl a hiba. Megakadájozza, hogy offsettel álljon be a kimenet. Ez azét van mert egy idő után nem reagálna a rendszer az akkorra már túl kis arányos tag miatt. | |||
P (arányos) tag csinálás: | |||
P=k (k konstans) | |||
D (deriváló) tag csinálás: | |||
Y(s) = H(s)*U(s) | |||
D(s)=(s-Kd)/1 <-- ilyet nem tudunk csinálni, mert a számlálónak legalább annyinak kéne lennie mint a nevezőnek | |||
s*Kd | |||
D(s)=-------- <-- közelítő deriváló tag | |||
1+s*Tn | |||
Matlab: | |||
s=tf('s') | |||
C=1+s*10 | |||
Transfer function: | |||
10 s + 1 | |||
Matlab: | |||
step(C) | |||
% hiba... ??? Error using ==> rfinputs | |||
% Not supported for non-proper models. | |||
s*Ks 1+s*Tn + n*K1 1+s*Tn | |||
PD(s) = 1 + ---------- = ------------------ ~ ---------------- | |||
1+s*Tn 1+s*Tn 1+s* (Td/n) | |||
n1=3/2 n2=5 | |||
Matlab: | |||
C1= (1+3*s)/(1+2*s) | |||
Transfer function: | |||
3 s + 1 | |||
------- | |||
2 s + 1 | |||
C2=(1+s*10)/(1+2*s) | |||
Transfer function: | |||
10 s + 1 | |||
-------- | |||
2 s + 1 | |||
figure(1), step(C1, 'b', C2, 'r') | |||
figure(2), bode(C1, 'b', C2, 'r') | |||
Az n paraméterrel tetszőlegesen választható meg a pólus. | |||
Integráló szabályozó: | |||
1+s*Ti | |||
PI: 1+1/s*k = 1+1/(s*Ti) = -------- | |||
s*Ti | |||
k: mennyire büntetjük a hibát | |||
Matlab: | |||
C3=1+1/(s*2) | |||
Transfer function: | |||
2 s + 1 | |||
------- | |||
2 s | |||
step(C3) | |||
Együttes PID szabályozó: | |||
1+s*Ti 1+s*Td | |||
PID = k * ---------- * --------------- | |||
s*Ti 1+s*(Ts/m) | |||
Matlab: | |||
P=1/((1+10*s)*(1+s)*(1+0.2*s)) | |||
Transfer function: | |||
1 | |||
----------------------------- | |||
2 s^3 + 12.2 s^2 + 11.2 s + 1 | |||
step(P) | |||
kb 50mp alatt áll be oda ahova szeretne ez a P folyamat. | |||
p1 = -1 | |||
p2=-5 | |||
Az, hogy milyen gyorsan áll be, attól függ, hogy milyen messze vannak a pólusok az origótól. Ha közel van, lassabban áll be. | |||
e^(p^i*t) -> e^(-t)=1/e^(t) | |||
Azt szeretnénk, ha a pólusok minél nagyobbak és negatívak lennének. | |||
Megválasztható paraméterek a PID szabályzóban: k, Ti, Td, n | |||
Ti és Td (integráló és deriváló időállandók) megválasztásával kiüthetjük a nem tetsző, lassító pólusokat. | |||
Azt szeretjük, ha a nevező 1+T*s alakú, mert ebből leolvasható az időállandó. | |||
Akkor van baj, ha a T számok nagyok, mert akkor lesz a rendszer lassú. | |||
Matlab: | |||
n = 1; k = 1; Ti=10; Td = 1; | |||
C=k*(1+s*Ti)/(s*Ti)*(1+s*Td)/(1+s*Td/n) | |||
Transfer function: | |||
10 s^2 + 11 s + 1 | |||
----------------- | |||
10 s^2 + 10 s | |||
L=C*P | |||
Transfer function: | |||
10 s^2 + 11 s + 1 | |||
------------------------------------------- | |||
20 s^5 + 142 s^4 + 234 s^3 + 122 s^2 + 10 s | |||
L=zpk(L) | |||
Zero/pole/gain: | |||
0.5 (s+1) (s+0.1) | |||
----------------------- | |||
s (s+5) (s+1)^2 (s+0.1) | |||
L=minreal(L) % leegyszerűsíti a törtet | |||
Zero/pole/gain: | |||
0.5 | |||
------------- | |||
s (s+5) (s+1) | |||
T=L/(1+L) % negatívan visszacsatoljuk | |||
Zero/pole/gain: | |||
0.5 s (s+5) (s+1) | |||
--------------------------------------------- | |||
s (s+5) (s+5.025) (s+1) (s+0.8595) (s+0.1158) | |||
figure(2), step(T) | |||
n = | |||
2 | |||
C=k*(1+s*Ti).... % újra számoljuk | |||
Transfer function: | |||
10 s^2 + 11 s + 1 | |||
----------------- | |||
5 s^2 + 10 s | |||
L=C*P % újra számoljuk | |||
Transfer function: | |||
10 s^2 + 11 s + 1 | |||
------------------------------------------ | |||
10 s^5 + 81 s^4 + 178 s^3 + 117 s^2 + 10 s | |||
T=L/(1+L) % újra számoljuk | |||
Transfer function: | |||
100 s^7 + 920 s^6 + 2681 s^5 + 3209 s^4 + 1565 s^3 + 227 s^2 + 10 s | |||
------------------------------------------------------------------------ | |||
100 s^10 + 1620 s^9 + 10121 s^8 + 31276 s^7 + 51758 s^6 + 45953 s^5 | |||
: + 20458 s^4 + 3905 s^3 + 327 s^2 + 10 s | |||
[gr,pm,wg,wc]=margin(L) | |||
gr = | |||
70.0000 % erősítési tartalék --> ha 70x-re erősítjük, akkor is stabil marad (tip.nem kell) | |||
pm = % fázistartalék (ez lesz érdekes) | |||
85.9980 | |||
wg = | |||
3.1623 | |||
wc = | |||
0.0998 | |||
[mag, phase, w] = bode(L); | |||
g = margin(mag, phase-60, w) % ha csak egy paramétert adunk meg visszatérésnek a marginnak, akkor csak az elsőt adja vissza | |||
g = % ez az erősítési tartalék! | |||
8.3651 | |||
k=g; | |||
C=k*(1+s*Ti)... % újra számoljuk | |||
Transfer function: | |||
83.65 s^2 + 92.02 s + 8.365 | |||
--------------------------- | |||
5 s^2 + 10 s | |||
L=C*P % újra számoljuk | |||
Transfer function: | |||
83.65 s^2 + 92.02 s + 8.365 | |||
------------------------------------------ | |||
10 s^5 + 81 s^4 + 178 s^3 + 117 s^2 + 10 s | |||
T=L/(1+L) % újra számoljuk a negatív visszacsatolást | |||
Transfer function: | |||
836.5 s^7 + 7696 s^6 + 2.243e004 s^5 + 2.684e004 s^4 + 1.309e004 s^3 + 1899 s^2 + 83.65 s | |||
------------------------------------------------------------------------------------------- | |||
100 s^10 + 1620 s^9 + 10121 s^8 + 3.201e004 s^7 + 5.853e004 s^6 + 6.57e004 s^5 + 4.409e004 s^4 + 1.543e004 s^3 + 1999 s^2 + 83.65 s | |||
step(T) | |||
Ez már sokkal gyorsabban beáll. | |||
A k-t minél nagyobbra állítjuk annál gyorsabb lesz a rendszer, de ezzel együtt a beavatkozó jelek is megnőnek, ami nem jó ha korlátozni kell a beavatkozó jeleket. Azt fogjuk csinálni az egész félévben, hogy a k-t úgy választjuk meg, hogy maradjon meg a 60 foknyi fázistartalék, mert az nekünk valamiért marha jó lesz. | |||
A tervezésnek mindig az a szempontja, hogy a legnagyobb időállandót mindig az integráló tagban kell elsütni. Ebből: Ti = a legnagyobb T, Td = a második T, n = 2..15 (ha n nagy, nagy a beavatkozó jel, ha n kicsi, lassabb rendszer) | |||
Ha nem kell deriváló tag (PI szabályozó kell), akkor eldobjuk a szabályozó képletéből a második törtet, azt jóvan. | |||
Ha nem kell integráló tag (PD szabályozó kell), akkor fordítva hadjuk el, viszont ilyenkor a második legnagyobb T lesz a Td (ez amúgy ugye a Ti lenne ha lenne integráló tag) | |||
(A PID szabályózóval lehet pénzt is keresni...) | |||
Állapotegyenletesdi: | |||
x'= A*x + B*u | |||
y = C*x + D*u | |||
Matlab: | |||
P=6/((s+1)*(s+2)*(s+3)) | |||
Transfer function: | |||
6 | |||
---------------------- | |||
s^3 + 6 s^2 + 11 s + 6 | |||
P=ss(P) % a P átviteli fv-t áttranszformálja állapot mátrixokra | |||
a = | |||
x1 x2 x3 | |||
x1 -6 -2.75 -1.5 | |||
x2 4 0 0 | |||
x3 0 1 0 | |||
b = | |||
u1 | |||
x1 1 | |||
x2 0 | |||
x3 0 | |||
c = | |||
x1 x2 x3 | |||
y1 0 0 1.5 | |||
d = | |||
u1 | |||
y1 0 | |||
Continuous-time model. | |||
Olyan átviteli függvény kéne, ami a köv. pólusokat tudja: | |||
Pk = [-6 ; -4+i*4 ; -4-i*4] | |||
Pk = | |||
-6.0000 | |||
-4.0000 + 4.0000i | |||
-4.0000 - 4.0000i | |||
k=acker(P.a, P.b, Pk) | |||
k = | |||
8.0000 17.2500 46.5000 % ezzel a vektorral elvileg az előbbi pólusokat kapnánk | |||
x' = A*x + B(u-K^T*x) | |||
alfa=(a-B*K^T)*x + B*u | |||
Matlab: | |||
A1 = P.a-P.b*k | |||
A1 = | |||
-14 -20 -48 | |||
4 0 0 | |||
0 1 0 | |||
B1 = P.b | |||
B1 = | |||
1 | |||
0 | |||
0 | |||
C1 = P.c | |||
C1 = | |||
0 0 1.5000 | |||
D1 = P.d | |||
D1 = | |||
0 | |||
P2 = ss(A1,B1,C1,D1) | |||
a = | |||
x1 x2 x3 | |||
x1 -14 -20 -48 | |||
x2 4 0 0 | |||
x3 0 1 0 | |||
b = | |||
u1 | |||
x1 1 | |||
x2 0 | |||
x3 0 | |||
c = | |||
x1 x2 x3 | |||
y1 0 0 1.5 | |||
d = | |||
u1 | |||
y1 0 | |||
Continuous-time model. | |||
pzmap(P2) | |||
Az új rendszer az előzőhöz képest torzít: | |||
lp=dcgain(P) % megnézi mennyi a statikus átvitele a fv-nek (gyak az egységugrásra a váalsz) | |||
lp = | |||
1 | |||
lp2=dcgain(P2) | |||
lp2 = | |||
0.0313 | |||
Kell egy kis korrekció, hogy a statikus erősítés ugyanaz legyen, mint volt: | |||
P3=lp/lp2*P2 | |||
a = | |||
x1 x2 x3 | |||
x1 -14 -20 -48 | |||
x2 4 0 0 | |||
x3 0 1 0 | |||
b = | |||
u1 | |||
x1 1 | |||
x2 0 | |||
x3 0 | |||
c = | |||
x1 x2 x3 | |||
y1 0 0 48 | |||
d = | |||
u1 | |||
y1 0 | |||
Continuous-time model. | |||
step(P,'r',P2,'b',P3,'g') | |||
== 5. labor == | == 5. labor == | ||