tr_osc.mws

Colpittsův oscilátor (s bipolárním tranzistorem v zapojení SE)

© Jiří Hospodka

Naším úkolem bude určit velikost induktoru a převodní vodivosti tranzistoru (klidový kolektorový proud) pro Colpittsův oscilátor v zapojení SE. Kmitočet oscilací ja zadán   f = 100  kHz. Ostatní velikosti prvků budeme vhodně volit. Schéma oscilátoru je nakresleno na následujícím obrázku. C[b]  a C[e]  jsou oddělovací kapacitory (pro oscilační kmitočet můžeme jejich impedanci zanedbat).    

[Maple Bitmap]  

Načtení knihovny Syrup.

>    with(Syrup);

[deindex, makeckttable, printdeck, reindex, syrup]

Výpočet podmínek oscilací

Jeikož se jedná o zpětnovazební soustavu, bude pro odvození nejvýhodnější použít Nyquistovo kritérum. Nakreslíme tedy linearizovaný náhradní obvod oscilátoru pro malé změny obvodových veličin a rozpojíme zpětnovazební (ZV) smyčku. Pro její rozpojení je nejvýhodnější místo řízení proudového zdroje. Vstup budeme budit z nezávislého zdroje napětí V . Odpor R[p]  představuje paralelní spojení vstupního diferenciálního odporu tranzistoru r[Pi]  a odporů R[1]  a R[2] .   

[Maple Bitmap]     

Zadání obvodu otevřené ZV smyčky.

>    bA:=TEXT(`oscilator`,
`V 1 0`,
`Gm 2 0 1 0 gm`,
`Rc 2 0`,
`C1 2 0`,
`L 2 3`,
`C2 3 0`,
`Rp 3 0`,
`.end`):

Analýza obvodu (sestavení a řešení obvodových rovnic).

>    napeti:=syrup(bA, ac, 'curr_ac'):

Syrup/parsedeck:   Analyzing SPICE deck "oscilator" (ignoring this line)

syrup:   There may be an unconnected component.
The following component(s) have zero current: {V}.

Přenos otevřené ZV smyčky.

>    Pos:=collect(subs(napeti,v[3])/V,s);

Pos := -gm*Rc*Rp/(s^3*C2*Rp*L*C1*Rc+(L*C1*Rc+C2*Rp*L)*s^2+(C2*Rc*Rp+C1*Rc*Rp+L)*s+Rc+Rp)

Substituce úhlového kmitočtu ( s = I*omega ) místo Laplaceova operátoru s .

>    PosI:=subs(s=I*omega,Pos);

PosI := -gm*Rc*Rp/(-I*omega^3*C2*Rp*L*C1*Rc-(L*C1*Rc+C2*Rp*L)*omega^2+(C2*Rc*Rp+C1*Rc*Rp+L)*omega*I+Rc+Rp)

Výpočet úhlového kmitočtu oscilací řešením rovnice Im(PosI) = 0 . V našem případě stačí řešit tuto rovnici pouze pro jemnovatel přenosu (čitatel je reálný).

>    reseni1:=solve(evalc(Im(denom(PosI)))=0,omega);

reseni1 := 0, sqrt(C2*Rp*L*C1*Rc*(C2*Rc*Rp+C1*Rc*Rp+L))/(C2*Rp*L*C1*Rc), -sqrt(C2*Rp*L*C1*Rc*(C2*Rc*Rp+C1*Rc*Rp+L))/(C2*Rp*L*C1*Rc)

První řešení je pro stejnosměrný signál, kdy se však jedná o ZZV ( phi[beta*A] = 180 ). Jelikož kmitočet musí vyjít kladný, vybereme jediné možné řešení - druhé. Pokud vyjádříme jeho kvadrát, dostaneme již poměrně jednoduchý vztah.

>    om0:=reseni1[2]:
expand(om0^2);

1/(L*C1)+1/(C2*L)+1/(C2*Rp*C1*Rc)

Vyřešíme-li nyní rovnici PosI(om0) = 1  pro proměnnou g[m] , dostaneme minimální "zesílení", resp. transkonduktanci nutnou pro rozkmitání soustavy.

>    gm_min:=expand(simplify(solve(subs(omega=om0,PosI)=1,gm)));

gm_min := C1/(C2*Rp)+L/(C2*Rp^2*Rc)+C2/(C1*Rc)+L/(Rp*C1*Rc^2)

Pokud zvolíme velikost proudového zesilovacího činitele tranzistoru beta , můžeme zavést ještě vztah mezi Gm  a Rp . Dále zvolíme velikost kolektorového odporu Rc  a dostaneme pro minimální transkonduktanci následující vztah:  

>    beta:=100;

>    reseni2:=solve(subs({Rc=5000,Rp=beta/gm},gm_min)=gm,gm):

>    gm_min2:=reseni2[2];

beta := 100

gm_min2 := 1/100*(-25000000*C1^2-L*C2+2500000000*C2*C1-sqrt(625000000000000*C1^4+50000000*C1^2*L*C2-125000000000000000*C1^3*C2+L^2*C2^2-5100000000*L*C1*C2^2+6250000000000000000*C1^2*C2^2))/(L*C1)
gm_min2 := 1/100*(-25000000*C1^2-L*C2+2500000000*C2*C1-sqrt(625000000000000*C1^4+50000000*C1^2*L*C2-125000000000000000*C1^3*C2+L^2*C2^2-5100000000*L*C1*C2^2+6250000000000000000*C1^2*C2^2))/(L*C1)

Ve skutečnosti má daná rovnice dvě řešení, přičemž obě jsou reálná. Vybrali jsme to, které povede na nižší kolektorový proud. V tom případě je, jak se dále ukáže, vliv rezistoru Rp  zanedbatelný, narozdíl od druhého řešení.      

Pokud tyto vztahy ( gm_min2  a Rp = beta/gm_min2 ) dosadíme do vztahu pro úhlový kmitočet, můžeme pro zadaný kmitočet ( f = 100  kHz) vypočítat velikost indukčnosti, při volených hodnotách kapacitorů.

>    Lv:=solve(subs({C1=1e-8,C2=1e-6,Rc=5000,Rp=beta/subs({C1=1e-8,C2=1e-6},gm_min2)},om0)=2*Pi*1e5);

Lv := .2558385815e-3

Dosadíme-li zpětně do vztahu pro gm_min2 , dostaneme jeho numerickou hodnotu, resp. hodnotu minimálního kolektorového proudu. Ten, prostřednictvím transkonduktance tranzistoru g[m]  a při zvolené velikosti kolektorového odporu Rc , udává minimální zesílení, nutné pro rozkmitání soustavy. Dále můžeme určit i odpovídající hodnotu odporu Rp .

>    gm_min2_num:=subs({C1=1e-8,C2=1e-6,L=Lv},gm_min2);

>    Ic_min:=gm_min2_num/40;

>    Rp_num:=beta/gm_min2_num;

gm_min2_num := .2001261878e-1

Ic_min := .5003154695e-3

Rp_num := 4996.847294

Druhé řešení

Pokud bychom vybrali druhé (v posloupnosti reseni2  první) z možných řešení gm_min , dostaneme následující výsledky.

>    Lv2:=solve(subs({C1=1e-8,C2=1e-6,Rc=5000,Rp=beta/subs({C1=1e-8,C2=1e-6},reseni2[1])},om0)=2*Pi*1e5);

>    gm_min2_num2:=subs({C1=1e-8,C2=1e-6,L=Lv2},reseni2[1]);

>    Ic_min2:=gm_min2_num2/40;

>    Ic_min2^2*5000;

>    Rp_num:=beta/gm_min2_num2;

Lv2 := .2555744451e-1

gm_min2_num2 := 1954.161472

Ic_min2 := 48.85403680

11933584.56

Rp_num := .5117284392e-1

V tomto případě se jedná sice o reálné řešení, ale vzhledem k výdeldkům prakticky nerealizovatelné. Proud kolektoru v pracovním bodě totiž vyjde téměř 50A! (výkonová ztráta na kolektorovém odporu vyjde 1,2MW!!!). Vstupní diferenciální odpor tranzistoru v tom případě vyjde (velmi teoreticky) 50 m Omega , tudíž jeho vliv rozhodně nelze zanedbat. Na tom je založeno toto řešení - nehledá se gm , ale právě Rp , což je pravý opak prvního řešení. Hodnota gm  je potom "vedlejší produkt řešení" a na její velikosti nebude příliž záležet.    

Nyní můžeme dokázat, že pro první řešení, lze při vhodně zvolených hodnotách ostatních součástek zanedbat vliv rezistoru Rp .

Přibližný výpočet

Při námi zvolených hodnotách (zejména poměru hodnot kapacitotrů C1/C2 ), můžeme výše uvedené vztahy zjednodušit. Pokud zanedbáme vliv druhého členu ve vztahu pro kvadrát kmitočtu om0 , tak se vztah pro tento kmitočet dále zjednodušší (všimněte si ve vztahu výrazu, udávajícíto výslednou kapacitu dvou sériově zapojených kapacitorů).

>    om0_pribl:=sqrt(simplify(limit(om0,Rp=infinity)^2));

om0_pribl := sqrt((C2+C1)/(L*C2*C1))

Numerickým dosazením si můžeme ověřit, že způsobená chyba je skutečně minimální (5e-3 %).

>    evalf(subs({C1=1e-8,C2=1e-6,L=Lv},om0_pribl/2/Pi));

>    evalf(subs({C1=1e-8,C2=1e-6,L=Lv,Rc=5000,Rp=beta/gm_min2_num},om0/2/Pi));

>    rel_chyba1:=(%%-%)/%%*100;

99999.49324

100000.0002

rel_chyba1 := -.5069625691e-3

Díky vhodně volenému poměru hodnot kapacitotrů C1/C2 , můžeme ve vztahu pro Gm_min  zanedbat všechny členy obsahující odpor Rp . Chyba je opět zanedbatelná.

>    gm_min_pribl:=limit(gm_min,Rp=infinity);

>    gm_min_pribl_num:=subs({C1=1e-8,C2=1e-6,Rc=5000},gm_min_pribl);

>    rel_chyba2:=(gm_min_pribl_num-gm_min2_num)/gm_min2_num;

gm_min_pribl := C2/(C1*Rc)

gm_min_pribl_num := .2000000000e-1

rel_chyba2 := -.6305411670e-3

Podle těchto vztahů lze tedy velmi jednoduše (i "ručně") uskutečnit návrh daného oscilátoru.  

Vypočtená minimální hodnota kolektorového proudu vyšla 0,5 mA, tudíž budeme volit např. 0,6 mA. Velikost rezistoru Rp  vyjde potom cca 4k Omega , ale jak vyplývá z předchzí úvahy, jsou výsledné vztahy na jeho prakticky nezávislé. To je i důkaz toho, že v odvození lze zanedbat vliv "bázového děliče" (rezistorů R[1]  a R[2] ).    

>    Rp_num:=beta/(40*0.6e-3);

Rp_num := 4166.666667

Zpět na začátek začátek sekce.

Ověření funkčnosti (podmínek oscilací)

Nyní opět spojíme ZV a budeme analyzovat vlastnosti takovéhoto obvodu.

[Maple Bitmap]   

Zadání zapojení lineárního náhradního obvodu oscilátoru. Pokud budeme chtít tento obvod analyzovat střídavou (AC) analýzou, pak je nutné obvod budit z nějakého nezávislého pomocného zdroje, přičemž tento zdroj nesmí narušit impedanční poměry v obvodu. To vede na proudový zdroj (v našem případě označen Ip ). Pokud budeme navíc požadovat přechodovou analýzu, je pro rozkmitání nutné buď ponechat v obvodu zapojen tento budící zdroj Ip  nebo lépe, zadat nějakou nenulovou počáteční podmínku (např. napětí na kapacitoru jako v našem případě: U[C2] = .1 V). Jinak by vyšly všechny uzlová napětí nulová.  

>    osc:= " oscilator
Ip 3 0
Gm 2 0 3 0 0.0006*40
Rc 2 0 5e3
C1 2 0 1e-8
L 2 3 0.000256
C2 3 0 1e-6 ic=0.1
Rp 3 0 4e3
.end":

Střídavá analýza pro malé změny obvodových veličin (AC analýza).

>    napeti_osc:=syrup(osc, ac);

Syrup/parsedeck:   Analyzing SPICE deck " oscilator" (ignoring this line)

napeti_osc := {v[2] = 200000000000*Ip*(-1953125+12*s)/(9550781250000000+394536250000*s+20250*s^2+s^3), v[3] = -1000000*Ip*(390625000000+s^2+20000*s)/(9550781250000000+394536250000*s+20250*s^2+s^3)}
napeti_osc := {v[2] = 200000000000*Ip*(-1953125+12*s)/(9550781250000000+394536250000*s+20250*s^2+s^3), v[3] = -1000000*Ip*(390625000000+s^2+20000*s)/(9550781250000000+394536250000*s+20250*s^2+s^3)}

Napěťový přenos obvodu má póly v pravé polorovině, tj. KMITÁ.

>    poly:=evalf(solve(denom(subs(napeti_osc,v[3]))));

poly := -24201.7473, 1975.8737-628194.2258*I, 1975.8737+628194.2258*I

Kmitočet odpovídá zvolené hodnotě (chyba je dána vyšší hodnotou Gm , resp. kolektorového porudu Ic ).

>    evalf(Im(poly[3])/2/Pi);

99980.21623

Nestabilitu lze dokázat i zmíněnou přechodovou analýzou.

>    osc_tran:=syrup(osc, tran);

Syrup/parsedeck:   Analyzing SPICE deck " oscilator" (ignoring this line)

osc_tran := {v[C1](0) = 0, v[C2](0) = .1, diff(v[C1](t),t) = -2400000*v[C2](t)-20000*v[C1](t)-100000000*i[L](t), diff(i[L](t),t) = 15625/4*v[C1](t)-15625/4*v[C2](t), diff(v[C2](t),t) = -250*v[C2](t)-10...
osc_tran := {v[C1](0) = 0, v[C2](0) = .1, diff(v[C1](t),t) = -2400000*v[C2](t)-20000*v[C1](t)-100000000*i[L](t), diff(i[L](t),t) = 15625/4*v[C1](t)-15625/4*v[C2](t), diff(v[C2](t),t) = -250*v[C2](t)-10...

Obecné řešení této soustavy diferenciálních rovnic bude asi chvilku trvat.

>    res_osc:=dsolve(osc_tran):

Ze vztahu pro výstupní napětí je evidentní, že obvod kmitá a kmitočet (úhlových) oscilací odpovídá imaginární složce pólu "přenosu" obvodu (nelze mluvit o přenosu, protože obvod je nestabilní).

>    u_out:=combine(evalf(subs(Ip=0,subs(res_osc,v[C1](t)))));

u_out := -.3773174609*exp(1975.8736*t)*sin(628194.2257*t)-.1135072478*exp(1975.8736*t)*cos(628194.2257*t)+.1135072477*exp(-24201.74724*t)
u_out := -.3773174609*exp(1975.8736*t)*sin(628194.2257*t)-.1135072478*exp(1975.8736*t)*cos(628194.2257*t)+.1135072477*exp(-24201.74724*t)

Následuje vykreslení výstupního napětí pro různá měřítka času.

>    plot(u_out,t=0..1e-4);

[Maple Plot]

>    plot(u_out,t=0.945e-4..1.046e-4);

[Maple Plot]

Dále lze funkčnost ověřit na konkrétním zapojení se skutečným tranzistorem při správně nastaveném pracovním bodu pomocí programu WINSPICE. Tam už není nutné zadávat ani počáteční podmínky na kondenzátorech, ani nějaký "budící" pulz, protože počáteční podmínky jsou implicitně nulové a v nulovém čase je přivedeno nenulové napájecí napětí. To znamená, že nastane přechodový děj, obvod je vychýlen ze svého počátečního stavu a rozkmitá se (pokud jsou správně nasveny podmínky oscilací).

Zpět na začátek  sekce.  

Zpět na začátek.