You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
6.7 KiB
206 lines
6.7 KiB
% s_param_rf.m
|
|
%
|
|
% David Rowe Nov 2015
|
|
%
|
|
% Working for small signal VHF amplifier design using
|
|
% S-param techniques from "RF Circuit Design" by Chris Bowick
|
|
|
|
rfdesign; % library of helped functions
|
|
|
|
more off;
|
|
|
|
Ic = 0.014;
|
|
|
|
% BRF92 VCE=5V Ic=5mA 100MHz
|
|
|
|
if Ic == 0.005
|
|
S11 = 0.727*exp(j*(-43)*pi/180);
|
|
S12 = 0.028*exp(j*(69.6)*pi/180);
|
|
S21 = 12.49*exp(j*(147)*pi/180);
|
|
S22 = 0.891*exp(j*(-16)*pi/180);
|
|
end
|
|
|
|
% BRF92 VCE=10V Ic=14mA 100MHz
|
|
|
|
if Ic == 0.02
|
|
S11 = 0.548*exp(j*(-56.8)*pi/180);
|
|
S12 = 0.020*exp(j*(67.8)*pi/180);
|
|
S21 = 20.43*exp(j*(133.7)*pi/180);
|
|
S22 = 0.796*exp(j*(-18.5)*pi/180);
|
|
end
|
|
|
|
% Stability
|
|
|
|
Ds = S11*S22-S12*S21;
|
|
Knum = 1 + abs(Ds)^2 - abs(S11)^2 - abs(S22)^2;
|
|
Kden = 2*abs(S21)*abs(S12);
|
|
K = Knum/Kden % If > 1 unconditionally stable
|
|
% If < 1 panic
|
|
figure(1);
|
|
clf
|
|
scCreate;
|
|
|
|
if K < 1
|
|
C1 = S11 - Ds*conj(S22);
|
|
C2 = S22 - Ds*conj(S11);
|
|
rs1 = conj(C1)/(abs(S11)^2-abs(Ds)^2); % centre of input stability circle
|
|
ps1 = abs(S12*S21/(abs(S11)^2-abs(Ds)^2)); % radius of input stability circle
|
|
rs2 = conj(C2)/(abs(S22)^2-abs(Ds)^2); % centre of input stability circle
|
|
ps2 = abs(S12*S21/(abs(S22)^2-abs(Ds)^2)); % radius of input stability circle
|
|
|
|
s(1,1)=S11; s(1,2)=S12; s(2,1)=S21; s(2,2)=S22;
|
|
plotStabilityCircles(s)
|
|
end
|
|
|
|
% Gain circle
|
|
|
|
D2 = abs(S22)^2-abs(Ds)^2;
|
|
C2 = S22 - Ds*conj(S11);
|
|
GdB = 20; Glin = 10^(GdB/10); % lets shoot for 20dB gain
|
|
G = Glin/(abs(S21)^2);
|
|
r0 = G*conj(C2)/(1+D2*G); % centre of gain circle
|
|
p0 = sqrt(1 - 2*K*abs(S12*S21)*G + (abs(S12*S21)^2)*(G^2))/(1+D2*G); % radius of gain circle
|
|
|
|
scAddCircle(abs(r0),angle(r0)*180/pi,p0,'g')
|
|
printf("Green is the %3.1f dB constant gain circle for gammaL\n",GdB);
|
|
|
|
% Note different design procedures for different operating points
|
|
|
|
if Ic == 0.005
|
|
% Choose a gammaL on the gain circle
|
|
|
|
gammaL = 0.8 - 0.4*j;
|
|
|
|
% Caclulate gammaS and make sure it's stable by visual inspection
|
|
% compared to stability circle.
|
|
|
|
gammaS = conj(S11 + ((S12*S21*gammaL)/(1 - (gammaL*S22))));
|
|
end
|
|
|
|
if Ic == 0.014
|
|
|
|
% lets set zo (normalised Zo) based on Pout and get gammaL from that
|
|
|
|
Pout = 0.01;
|
|
Irms = 0.002;
|
|
Zo = Pout/(Irms*Irms);
|
|
zo = Zo/50;
|
|
[magL,angleL] = ztog(zo);
|
|
gammaL = magL*exp(j*angleL*pi/180);
|
|
|
|
% calculate gammaS
|
|
|
|
gammaS = conj(S11 + ((S12*S21*gammaL)/(1 - (gammaL*S22))));
|
|
|
|
end
|
|
|
|
[zo Zo] = gtoz(abs(gammaL), angle(gammaL)*180/pi,50);
|
|
[zi Zi] = gtoz(abs(gammaS), angle(gammaS)*180/pi,50);
|
|
|
|
scAddPoint(zi);
|
|
scAddPoint(zo);
|
|
|
|
% Transducer gain
|
|
|
|
Gt_num = (abs(S21)^2)*(1-abs(gammaS)^2)*(1-abs(gammaL)^2);
|
|
Gt_den = abs((1-S11*gammaS)*(1-S22*gammaL) - S12*S21*gammaL*gammaS)^2;
|
|
Gt = Gt_num/Gt_den;
|
|
|
|
if Ic == 0.005
|
|
|
|
% Lets design the z match for the input ------------------------------
|
|
|
|
% put input impedance in parallel form
|
|
|
|
Zip = zs_to_zp(Zi);
|
|
|
|
% first match real part of impedance
|
|
|
|
Rs = 50; Rl = real(Zip);
|
|
[Xs Xp] = z_match(Rs,Rl);
|
|
|
|
% Modify Xp so transistor input sees conjugate match to Zi
|
|
% Lets make Xp a capacitor, so negative sign
|
|
|
|
Xp_match = -Xp - imag(Zip);
|
|
|
|
% Now convert to real component values
|
|
|
|
w = 2*pi*150E6;
|
|
Ls = Xs/w; diameter_mm = 6.25;
|
|
Ls_turns = design_inductor(Ls*1E6, diameter_mm);
|
|
Cp = 1/(w*(-Xp_match));
|
|
|
|
printf("Transducer gain: %3.1f dB\n", 10*log10(Gt));
|
|
printf("Input: Zi = %3.1f + %3.1fj ohms\n", real(Zi), imag(Zi));
|
|
printf(" In parallel form Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), imag(Zip));
|
|
printf(" So for a conjugate match transistor input wants to see:\n Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), -imag(Zip));
|
|
printf(" Rs = %3.1f to Rl = %3.1f ohm matching network Xs = %3.1fj Xp = %3.1fj\n", Rs, Rl, Xs, Xp);
|
|
printf(" with conj match to Zi Xs = %3.1fj Xp = %3.1fj\n", Xs, Xp_match);
|
|
printf(" matching components Ls = %5.3f uH Cp = %4.1f pF\n", Ls*1E6, Cp*1E12);
|
|
printf(" Ls can be made from %3.1f turns on a %4.2f mm diameter air core\n", Ls_turns, diameter_mm);
|
|
|
|
% Now Z match for output -------------------------------------
|
|
|
|
Lo = -imag(Zo)/w;
|
|
Lo_turns = design_inductor(Lo*1E6, diameter_mm);
|
|
printf("Output: Zo = %3.1f + %3.1fj ohms\n", real(Zo), imag(Zo));
|
|
printf(" So for a conjugate match transistor output wants to see:\n Rl = %3.1f Xl = %3.1fj ohms\n", real(Zo), -imag(Zo));
|
|
printf(" Which is a series inductor Lo = %5.3f uH\n", Lo*1E6);
|
|
printf(" Lo can be made from %3.1f turns on a %4.2f mm diameter air core\n", Lo_turns, diameter_mm);
|
|
end
|
|
|
|
|
|
if Ic == 0.014
|
|
printf("Transducer gain: %3.1f dB\n", 10*log10(Gt));
|
|
|
|
% Lets design the z match for the input ------------------------------
|
|
|
|
% put input impedance in parallel form
|
|
|
|
Zip = zs_to_zp(Zi);
|
|
|
|
% first match real part of impedance
|
|
|
|
Rs = 50; Rl = real(Zip);
|
|
[Xs Xp] = z_match(Rl,Rs);
|
|
|
|
% Lets make Xs a capacitir to block DC, so Xp is an inductor.
|
|
% Modify Xs so transistor input sees conjugate match to Zi. Xs is a
|
|
% capacitor, so reactance is negative
|
|
|
|
Xs_match = -Xs - imag(Zip);
|
|
|
|
% Now convert to real component values
|
|
|
|
w = 2*pi*150E6; diameter_mm = 6.25;
|
|
Li = Xp/w;
|
|
Li_turns = design_inductor(Li*1E6, diameter_mm);
|
|
Ci = 1/(w*(-Xs_match));
|
|
|
|
printf("Input: Zi = %3.1f + %3.1fj ohms\n", real(Zi), imag(Zi));
|
|
printf(" In parallel form Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), imag(Zip));
|
|
printf(" So for a conjugate match transistor input wants to see:\n Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), -imag(Zip));
|
|
printf(" Rs = %3.1f to Rl = %3.1f ohm matching network Xs = %3.1fj Xp = %3.1fj\n", Rs, Rl, Xs, Xp);
|
|
printf(" with Xs a capacitor, and Xp and inductor Xs = %3.1fj Xp = %3.1fj\n", -Xs, Xp);
|
|
printf(" With a conj match to Zi Xs = %3.1fj Xp = %3.1fj\n", Xs_match, Xp);
|
|
printf(" matching components Li = %5.3f uH Ci = %4.1f pF\n", Li*1E6, Ci*1E12);
|
|
printf(" Li can be made from %3.1f turns on a %4.2f mm diameter air core\n", Li_turns, diameter_mm);
|
|
|
|
% Design output Z match ----------------------------------------------
|
|
|
|
Rs = real(Zo); Rl = 50;
|
|
[Xs Xp] = z_match(Rl,Rs);
|
|
|
|
% Lets make XP an inductor so it can double as a RF choke, and Xp as
|
|
% a capacitor will give us a convenient DC block
|
|
|
|
w = 2*pi*150E6; diameter_mm = 6.25;
|
|
Lo = Xp/w; Lo_turns = design_inductor(Lo*1E6, diameter_mm);
|
|
Co = 1/(w*Xs);
|
|
printf("Output: Zo = %3.1f + %3.1fj ohms\n", real(Zo), imag(Zo));
|
|
printf(" matching network Xp = %3.1f X = %3.1f ohms\n", Xp, Xs);
|
|
printf(" which is parallel Lo = %5.3f uH and series Co = %4.1f pF\n", Lo*1E6, Co*1E12);
|
|
printf(" Lo can be made from %3.1f turns on a %4.2f mm diameter air core\n", Lo_turns, diameter_mm);
|
|
end
|
|
|
|
|