Stabilita zpětnovazební soustavy
© Jiří Hospodka
Autorská práva: Uživatel může tento text používat jako studijní materiál bez omezení. Distribbuce a tisk je možný pouze se svolením autora.
> | restart; |
Nejdříve načteme potřebné knihovny.
> | with(Syrup):with(plots): |
Warning, the name changecoords has been redefined
Stabilitu budeme zkoumat na soustavě, obsahující zesilovač se třemi póly a odporovou zápornou zpětnou vazbu (ZZV) podle následujícího obrázku. Pro další analýzy budeme potřebovat jednak přenos celkového zapojení (se ZV) - a jednak přenos otevřené zpětnovazevbní smyčky - .
Zadání soustav pro analýzu
První pól zesilovače je zadán obecně, další dva jsou na 2MHz a 4MHz. Zpětnovazební odpor je také zadán obecně (bez numerické hodnoty). Ostatní prvky jsou zadány s numerickými hodnotami.
> | ZZ:= "zesilovač se ZZV V 1 0 R01 1 2 10E3 Rp1 2 3 Rz1 3 0 10E3 Rp2 4 5 Rz2 4 0 10E3 R02 5 0 10E3 Ra2 5 0 100E3 X1 2 3 0 zesilovac X2 1 4 0 zesilovac .subckt zesilovac a b c Ra a c 100E3 Ri d b 100 E1 d c a c -2E4/(1+s/omega1)/(1+s/(2*Pi*2E6))/(1+s/(2*Pi*4E6)) .ends .end": |
Analýza systému pro a
Analýza a výpočet napěťového přenosu zesilovače se ZV a otevřené ZV smyčky.
> | napeti:=syrup(ZZ, ac): |
> | Pzv:=simplify(subs(napeti,v[3]/v[1])): |
> | Pos:=simplify(subs(napeti,v[5]/v[1])): |
parsedeck: Analyzing SPICE deck "zesilovač se ZZV" (ignoring this line)
Modulová charakteristika zesilovače pro a (zesilení přibližně 1). Ale je to opravdu modulová charakteristika, resp. je to stabilní soustava? Takto to nepoznám.
> | modul_zv:=simplify(evalc(abs(subs({omega1=2*Pi*3E3,Rp1=10E3,s=I*omega},Pzv)))): |
> | semilogplot(20*log10(modul_zv),omega=1E5..1E8,title=`MODUL`); |
Podle polohy pólů přenosu to kmitá!!!
> | poly:=solve(denom(subs({omega1=2*Pi*3E3,Rp1=10E3},Pzv))); |
> | plot |
Vykreslení polohy pólů.
> | complexplot([poly],style=POINT,symbol=CROSS,symbolsize=30); |
Podle vykreslení přenosu to musí samozřejmě kmitat také.
> | modul_os:=simplify(evalc(abs(subs({omega1=2*Pi*3E3,Rp2=10E3,s=I*omega},Pos)))): |
> | faze_os:=simplify(evalc(argument(subs({omega1=2*Pi*3E3,Rp2=10E3,s=I*omega},Pos)))): |
> | semilogplot(20*log10(modul_os),omega=1E7..1E8,title=`MODUL otevřené smyčky`); |
> | semilogplot(faze_os*180/Pi,omega=1E7..1E8,title=`FAZE otevřené smyčky ve stupnich`); |
Tady to je vidět lépe.
> | complexplot(subs({omega1=2*Pi*3E3,Rp2=10E3,s=I*omega},Pos),omega=1E7..1E8); |
Takto je potom přenos otevřené smyčky vykreslen ještě pro větší rozsah kmitočtů.
> | complexplot(subs({omega1=2*Pi*3E3,Rp2=10E3,s=I*omega},Pos),omega=1E2..1E7,numpoints=200); |
Kmitočet pro který je lze spočítat jednoduše např. takto. Reálná složka přenosu pak vyjde větší než 4.
> | om:=solve(evalc(Im(subs({omega1=2*Pi*3E3,Rp2=10E3,s=I*omega},Pos)))); evalf(evalc(Re(subs({omega1=2*Pi*3E3,Rp2=10E3,s=I*om[3]},Pos)))); |
Soustava tedy kmitá a kmitočet oscilací lze určit z pólů přenosu . Pozor! Kmitočet oscilací se NEROVNÁ kmitočtu , pro který je !! (Pozor! Výsledky nemusí být vždy stejně uspořádány.)
> | om[3]; uhlovy_kmitocet_oscilaci:=Im(poly[3]); |
Skutečnost, že je systém nestabilní lze také jednoduše určit Laplaceovou transformací přenosu (impulzní charakteristikou). Takto lze samozřejmě zjistit i kmitočet oscilací.
> | with(inttrans); |
Impulzní charakteristika obsahuje i Diracův impulz, protože výstupní odpor zesilovače není nulový (není nulvový přenos K3). Úhlový kmitočet oscilací se správně rovná imag. hodnotě kořenů jmenovatele přenosu (vyšlo).
> | odezva:=simplify(invlaplace(subs({omega1=2*Pi*3E3,Rp1=10E3},Pzv),s,t)); |
Že násobná konstanta je skutečně koeficientem K3 se lze přesvědčit jednoduchým výpočtem.
> | K3:=Ra/(R0+Ra)*Ri*Rz/(Ri+Rz)/(R0*Ra/(R0+Ra)+Rp+Ri*Rz/(Ri+Rz)); evalf(subs({Ra=100E3,R0=10E3,Rp=10E3,Ri=100,Rz=10E3},%)); |
Takto pak vypadá impulzní charakteristika. Díky poloze pólů se amplituda kmitů musí stále zvětšovat (pro lineární systém).
> | plot(odezva,t=1E-10..1E-6, title=`Impulzni charakteristika`); |
Soustava na mezi stability
Nyní vyřešíme minimální (kritickou) hodnotu zpětnovazebního odporu (pro minimální zesílení systému), pro který systém ještě nekmitá, resp. je na mezi stability.
> | rov1:=evalc(Re(subs({omega1=2*Pi*3E3,s=I*omega},Pos)))=1: rov2:=evalc(Im(subs({omega1=2*Pi*3E3,s=I*omega},Pos)))=0: |
> | reseni1:=solve({rov1,rov2},{Rp2,omega}); |
Reálná je tato hodnota. (Pozor! Výsledky nemusí být opět vždy stejně uspořádány.)
> | Rp_krit:=subs(reseni1[2],Rp2); |
Takto vyjdou póly přenosu , pro kritickou hodnotu zpětnovazebního odporu (systém na mezi stability), samozřejmě je zde konečná přesnost.
> | reseni2:=solve(denom(subs({omega1=2*Pi*3E3,Rp1=Rp_krit},Pzv))); |
Právě a pouze v tomto případě (mez stability) se rovná kmitočet, pro který platí kmitočtu oscilací!! (porovnej s imaginární hodnotou pólu přenosu - reseni2 ). (Pozor! Výsledky nemusí být opět vždy stejně uspořádány.)
> | reseni1[5][2]; |
> | Im(reseni2[3]); |
Přenos pro . Na modulové charakteristice to je teď znát. Patrné to musí být i z přenosu otevřené smyčky (nyní vynesené jen v komplexní rovině).
> | modul_krit:=simplify(evalc(abs(subs({omega1=2*Pi*3E3,Rp1=Rp_krit,s=I*omega},Pzv)))): |
> | semilogplot(20*log10(modul_krit),omega=1E5..1E8,title=`MODUL`); complexplot(subs({omega1=2*Pi*3E3,Rp2=Rp_krit,s=I*omega},Pos),omega=1E7..1E8); |
Odvodili jsme, hodnotu pro systém, který je právě na mezi stability. "Zesílení" takovéhoto systému pro stejnosměrný signál je potom:
> | Pzv0:=evalf(subs({Rp1=Rp_krit,s=0},Pzv)); |
Z předchozích výpočtů je zřejmé, že pro stabilní systém musí platit , resp. . Pokusme se nyní kompenzovat zesilovač tak aby byl stabilní i pro zesílení (ve SKP).
Závislost polohy pólů zesilovače na vlivu ZV
Výpočet pólů přenosu ZV soustavy pro různé hodnoty odporu
> | poly1:=seq([solve(denom(subs({omega1=2*Pi*3E3,Rp1=R0},Pzv)),s)],R0=[100,Rp_krit,1e6,1.5e6,10e6]); |
> | barva:=[violet,red,magenta,green,orange]; |
Je nutné sledovat póly podle barev. Stejné barvy = stejná hodnota , resp. vratného rozdílu .
> | for i from 1 to 5 do graf[i]:=complexplot([poly1[i][]], style=point, thickness=20, title=`Poloha pólů přenosu ZV soustavy v závislosti na Rp`,xtickmarks=0,ytickmarks=0,color=barva[i],symbolsize=20); od: display(graf[1],graf[2],graf[3],graf[4],graf[5]); |
Lépe to bude vidět na následující animaci.
Nejprve si připravíme sekvenci čísel - jednotlivé hodnoty odporu (to je nutné udělat nelineárně, abyby potom póly byly rozloženy téměř rovnoměrně v clém rozsahu).
> | Rp_seq:=evalf(seq(8^((R0+18)/4),R0=1..15)): |
Výpočet pólů a vykreslení jednotlivých obrázků (zde obrátíme pořadí, abychom postupovali od reálných pólů k pólům komplexně združeným).
> | vv:=seq([fsolve(denom(subs({omega1=2*Pi*3E3,Rp1=Rp_seq[nops([Rp_seq])+1-i]},Pzv)),s,complex)],i=1..nops([Rp_seq])): |
> | obrazky:=seq([op(1,complexplot(vv[i]))],i=1..nops([Rp_seq])): |
Vykreslení (v Maple klikněte na obrázek a potom vyberte volbu "přehrávat" sekvenci dokola).
> | PLOT(ANIMATE(obrazky), AXESTICKS(0,0), TITLE(`Poloha pólů přenosu ZV soustavy v závislosti na Rp`), THICKNESS(20), AXESLABELS("",""), SYMBOL(DEFAULT,20), STYLE(POINT), VIEW(DEFAULT,DEFAULT)); |
Kompenzace zesilovače pro stabilni provoz i při zesílení -1
Aby měl zesilovač zesílení rovno -1, je nutné zapojit do ZV odpor . (Pozor! Výsledky nemusí být opět vždy stejně uspořádány.)
> | Rp1_1:=solve(simplify(subs(s=0,Pzv))=-1); |
Aby zesilovač při tomto zesílení nekmital, a měl naopak fázovou jistotu např. , je nutné změnit kmitočet prvního zlomu na hodnotu (tj. výše uvedená kompenzace). (Pozor! Výsledky nemusí být opět vždy stejně uspořádány.)
> | rov1:=evalc(abs(subs({Rp2=Rp1_1,s=I*omega},Pos)))=1: rov2:=evalc(argument(subs({Rp2=Rp1_1,s=I*omega},Pos)))=Pi/4: fsolve({rov1,rov2},{omega1,omega},omega=1E6..1E9);omega1_1:=subs(%,omega1); |
Že to Maple spočítal dobře se můžeme ještě přesvědčit z průběhu modulové a fázové charakteristiky přenosu otevřené ZV smyčky.
> | modul_os_45:=simplify(evalc(abs(subs({omega1=omega1_1,Rp2=Rp1_1,s=I*omega},Pos)))): |
> | faze_os_45:=simplify(evalc(argument(subs({omega1=omega1_1,Rp2=Rp1_1,s=I*omega},Pos)))): |
> | semilogplot(20*log10(modul_os_45),omega=1E6..1E8,title=`MODUL otevřené smyčky`); |
> | semilogplot(faze_os_45*180/Pi,omega=1E6..1E8,title=`FAZE otevřené smyčky ve stupnich`); |
Mužeme si to ještě ověřit numerickým výpočtem. (Pozor! Výsledky nemusí být opět vždy stejně uspořádány.)
> | om_45:=solve(modul_os_45=1,omega); |
> | evalf(subs(omega=om_45[6],faze_os_45)*180/Pi); |
Není to elegantní a přitom jednoduché?
> |