da pređemo na vektorsku grafiku . . .
%plot inline -f "svg"
da importujemo prethodno izveden model buck konvertora za rc = 0.01 ohm i rl = 0.01 ohm, najmanje prigušen, najteži za podešavanje, izvođenje modela je na sajtu, http://tnt.etf.bg.ac.rs/~ms1ee2/averaged-models-ccm.zip; samo copy-paste
L = 10e-6;
C = 1000e-6;
rc = 0.01;
rl = 0.01;
G = 0;
A1 = [-(G*rc*rl+rl+rc)/(L*(G*rc+1)), -1/(L*(G*rc+1)); 1/(C*(G*rc+1)), -G/(C*(G*rc+1))];
B1 = [1/L, rc/(L*(G*rc+1)); 0, -1/(C*(G*rc+1))];
C1 = [rc/(G*rc+1), 1/(G*rc+1); 1, 0];
D1 = [0, -rc/(G*rc+1); 0, 0];
A2 = [-(G*rc*rl+rl+rc)/(L*(G*rc+1)), -1/(L*(G*rc+1)); 1/(C*(G*rc+1)), -G/(C*(G*rc+1))];
B2 = [0, rc/(L*(G*rc+1)); 0, -1/(C*(G*rc+1))];
C2 = [rc/(G*rc+1), 1/(G*rc+1); 0, 0];
D2 = [0, -rc/(G*rc+1); 0, 0];
# we are done with the parameters, variable names will be reused
# DC Operating point, specify
Vin = 10;
Iout = 2;
D0 = 0.5;
U0 = [Vin; Iout];
# Averaged matrices
A = D0 * A1 + (1 - D0) * A2;
B = D0 * B1 + (1 - D0) * B2;
C = D0 * C1 + (1 - D0) * C2;
D = D0 * D1 + (1 - D0) * D2;
# DC model
X0 = -inv(A) * B * U0;
# Remaining AC model vectors
E = (A1 - A2) * X0 + (B1 - B2) * U0;
F = (C1 - C2) * X0 + (D1 - D2) * U0;
# Expand B and D matrices to cover for d hat
B = [B E];
D = [D F];
# let's use the control package
pkg load control
# form the state space model
converter = ss(A, B, C, D);
# get the transfer functions
Hs = tf(converter)
izdvojimo funkciju prenosa $\frac{\widehat{v}_{OUT}}{\widehat{d}}$:
T0 = Hs(1,3)
na šta ta funkcija prenosa liči? to je funkcija prenosa u otvorenoj sprezi, polazna
bode(T0)
da nađemo $\omega_C$, $f_C$ i marginu faze, pretraživanjem; posle će biti razvijena i funkcija za to
[mag, pha, w] = bode(T0);
for i = 1 : length(mag) - 1
if log(mag(i)) > 0 && log(mag(i + 1)) < 0
wc = w(i);
break
endif
endfor
wc
fc = wc / (2 * pi)
pm = 180 + pha(i)
imamo diskretne vrednosti za $\omega$; kakve su susedne vrednosti amplitude?
T01 = 20 * log10(mag(i))
T02 = 20 * log10(mag(i+1))
nije tako loše nađena nula, mada može i bolje, ili numerički ili linearnom interpolacijom
gde bi bili polovi u otvorenoj sprezi?
pzmap(feedback(T0))
legend('location', 'northwest')
i kakav bi bio step odziv?
step(feedback(T0))
mnogo oscilacija, ne baš brzo, greška ustaljenog stanja
postavljamo $\omega_C$; nađemo amplitudu $T_0$ na željenom $\omega_C$ i podesimo $k$ da amplituda postane 1
fc = 10e3
k = 1 / abs(T0(2 * pi * fc))
da nemamo analitički oblik $T_0$, već samo eksperimentalne rezultate, ovo bi išlo pretraživanjem!
funkcija prenosa u otvorenoj sprezi kada smo odredili $k$
T1 = k * T0
bode(T1)
da vidimo šta smo uradili, koliko je sada $\omega_C$ i phase margin (pm, $\varphi_m$)?
[mag, pha, w] = bode(T1);
for i = 1 : length(mag) - 1
if log(mag(i)) > 0 && log(mag(i + 1)) < 0
wc = w(i);
break
endif
endfor
wc
fc = wc / (2 * pi)
pm = 180 + pha(i)
kako bi to izgledalo u closed loop?
H1 = feedback(T1)
a step response?
step(H1)
mnogo ringinga i greška ustaljenog stanja, mada ne mnogo velika
da podesimo marginu faze, lead kompenzator, predavanja . . .
finalpm = 58
philead = finalpm - pm
pl = pi / 180 * philead;
t = tan(pl);
p = t + sqrt(1 + t^2);
Hlead = 1 / p * tf([p / wc, 1], [1 / (p * wc), 1])
povežemo sada lead kompenzator, ciljna margina 58 stepeni . . . nova open loop transfer function je $T_2$
T2 = series(Hlead, T1)
bode(T2)
da proverimo šta smo uradili
[mag, pha, w] = bode(T2);
for i = 1 : length(mag) - 1
if log(mag(i)) > 0 && log(mag(i + 1)) < 0
wc = w(i);
break
endif
endfor
wc
fc = wc / (2 * pi)
pm = 180 + pha(i)
manje više to je to; $f_C$ je dobro kakvim je metodom određeno, . . . biće još rada na tome
kako je to u closed loop?
H2 = feedback(T2)
gde su polovi i nule u zatvorenoj sprezi?
pzmap(H2)
legend('location', 'northwest')
kakav je odskočni (step) odziv?
step(H2)
standardno; malo smiren ringing, povecana greška ustaljenog stanja, to je ono što zna da uradi lead kompenzator; nije baš kao na tabli za taj Q faktor; jasno što nije, nije ni ta funkcija prenosa kao ona na tabli; ipak, liči!
da kažemo da je ringing ok; idemo da popravimo grešku ustaljenog stanja lag kompenzatorom; sve prema uputstvu sa sajta, koristimo PI regulator kao lag kompenzator
wl = wc / 10;
Hlag = parallel(1, tf([wl], [1 0]))
dodamo lag kompenzator i dobijamo:
T3 = series(Hlag, T2)
to je open loop funkcija prenosa; kako izgleda?
bode(T3)
da vidimo šta smo uradili?
[mag, pha, w] = bode(T3);
for i = 1 : length(mag) - 1
if log(mag(i)) > 0 && log(mag(i + 1)) < 0
wc = w(i);
break
endif
endfor
wc
fc = wc / (2 * pi)
pm = 180 + pha(i)
to je manje više ono što smo hteli!
kako to izgleda u zatvorenoj sprezi?
H3 = feedback(T3)
raspored polova
pzmap(H3)
legend('location', 'northwest')
i step odziv
step(H3)
malo jači ringing od očekivanog, ali to je načelno to!
bode plot u zatvorenoj sprezi:
bode(H3)
do koje frekvencije imamo dobar tracking?
zabave radi, kako izgleda komprimovani Nyquist po mom algoritmu za finalno dobijenu funkciju prenosa u otvorenoj sprezi?
dodato_nestabilnih_polova = pypass(T3)
cute!
motiv: da probamo da smanjimo ringing? dižem marginu faze na 76 stepni, puštam još 6 stepeni lufta (književno: margine) da ih pokvari lag kompenzator; šta smoimali od ranije? neće se promeniti pojačanje koje doteruje $\omega_C$
[mag, pha, w] = bode(T1);
for i = 1 : length(mag) - 1
if log(mag(i)) > 0 && log(mag(i + 1)) < 0
wc = w(i);
break
endif
endfor
wc
fc = wc / (2 * pi)
pm = 180 + pha(i)
da podesimo lead kompenzator za novu marginu faze . . .
finalpm = 82
philead = finalpm - pm
pl = pi / 180 * philead;
t = tan(pl);
p = t + sqrt(1 + t^2);
Hlead = 1 / p * tf([p / wc, 1], [1 / (p * wc), 1])
povežemo lead kopenzator . . .
T2 = series(Hlead, T1)
bode(T2)
da proverimo šta smo uradili? ovo se već ponavlja, ima smisla napraviti funkciju koja traži $\omega_C$ i fazu na $\omega_C$, uz linearnu interpolaciju da popravi rezultat; može i analitički, ali možda bolje ne, da se ostavi prostor za snimljena kružna pojačanja kao ulaz
[mag, pha, w] = bode(T2);
for i = 1 : length(mag) - 1
if log(mag(i)) > 0 && log(mag(i + 1)) < 0
wc = w(i);
break
endif
endfor
wc
fc = wc / (2 * pi)
pm = 180 + pha(i)
da vidimo closed loop response . . .
H2 = feedback(T2)
step(H2)
smanjen ringing, povećana greška ustaljenog stanja; očekivano, to je ono što lead kompenzator radi
dodajemo lag kompenzator, recept sa predavanja, . . .
wl = wc / 10;
Hlag = parallel(1, tf([wl], [1 0]))
dobijamo open loop transfer function:
T3 = series(Hlag, T2)
bode(T3)
da proverimo šta smo uradili?
[mag, pha, w] = bode(T3);
for i = 1 : length(mag) - 1
if log(mag(i)) > 0 && log(mag(i + 1)) < 0
wc = w(i);
break
endif
endfor
wc
fc = wc / (2 * pi)
pm = 180 + pha(i)
to je to, ono što smo hteli!
da vidimo kako je ovo u zatvorenoj petlji?
H3 = feedback(T3)
dođosmo do četvrtog reda: drugog reda sistem, još jedan red za lead kompenzator, još jedan red za lag kompenzator
step(H3)
bolji step response od prethodnog, posmatrajte tačku 1.2, vidi se razlika, manji overshoot
da vidimo closed loop Bode plot? do koje frekvencije je tracking dobar?
bode(H3)
raspored nula i polova na kraju?
pzmap(H3)
legend('location', 'northwest')
kako izgleda komprimovani Nyquist za dobijeni open loop transfer function?
dodato_nestabilnih_polova = pypass(T3)
sve očekivano, povećana margina faze, stabilno
idemo na marginu faze od 90 stepeni; uz to, uvodimo funkciju koja računa $\omega_C$ i fazu na $\omega_C$; dodata je i linearna interpolacija, da dobijemo tačniji rezultat; može i bolje, samo nema potrebe, a ovakav metod omogućava i merena kružna pojačanja kao ulaz, ne samo analitički opisane funkcije
da počnemo od početka, sa $T_0$, da lepo nađemo $\omega_C$
T0
ovo je ta nova funkcija, atwc(), imate je u direktorijumu
[wc, fc, pm] = atwc(T0)
da nađemo pojačanje $k$
k = 1 / abs(T0(2 * pi * 10e3))
da ubacimo element pojačanja . . .
T1 = series(k, T0)
da vidimo šta smo uradili?
[wc, fc, pm] = atwc(T1)
ovo je mnogo bolje nego pre, tačnije; postavljamo marginu faze 96 stepeni za lead kompenzator, ostavljamo 6 stepeni lufta za lag kompenzator, ciljna margina faze je 90 stepeni
finalpm = 96
philead = finalpm - pm
pl = pi / 180 * philead;
t = tan(pl);
p = t + sqrt(1 + t^2);
Hlead = 1 / p * tf([p / wc, 1], [1 / (p * wc), 1])
kako izgleda frekvencijska karakteristika ovog kompenzatora?
bode(Hlead)
da dodamo kompenzator i proverimo efekte . . .
T2 = series(Hlead, T1)
bode(T2)
provera:
[wc, fc, pm] = atwc(T2)
to je tačno ono što smo hteli!
da vidimo closed loop response sada?
H2 = feedback(T2)
step(H2)
to je to, smanjena margina faze je popravila step response! samo, steady state error je dodatno povećan; uobičajen efekat lead kompenzatora: što veća popravka faze, to veća pokvarka pojačanja na niskim frekvencijama i greške ustaljenog stanja
dodajemo lag kompenzator
wl = wc / 10;
Hlag = parallel(1, tf([wl], [1 0]))
da povežemo lag kompenzator, open loop transfer function postaje:
T3 = series(Hlag, T2)
opet sistem četvrtog reda; da proverimo šta smo uradili?
[wc, fc, pm] = atwc(T3)
da, to je to!
da vidimo closed loop response?
H3 = feedback(T3)
step(H3)
sve očekivano! dodatno smanjen ringing! nije kao po knjizi za sistem drugog reda, ali sistem i nije drugog reda!
closed loop Bode plot, do koje frekvencije je tracking dobar?
bode(H3)
konačni raspored polova?
pzmap(H3)
legend('location', 'northwest')
da dodamo i komprimovan open loop Nyquist plot?
dodato_nestabilnih_polova = pypass(T3)
da, to je to! povećana margina faze, smanjen ringing; zadovoljni smo, ali . . .
ovde nije kraj! proverite sistem na tranzijente od znacaja, tipa 20% step u ulaznom naponu ili potrošač sa 50% na 75%, ili . . . pogledajte nelinearna ograničenja, da ne izlazi $d$ izvan opsega (puno), $0 \le d \le 1$ ili neka druga komponenta ne ide u zasićenje? ako ide, smanjite $\omega_C$ i krenite iz početka . . .
pokušajte sve ovo da uradite ručno; shvatićete značaj softverskih alata u elektronici!