exercise 5.13
ZIP with MATLAB scripts and note:
exercise 5.13 notes:
1.- calculation of l/4 transformer characteristic impedance Z1
ZL=350;Z0=100;f0=4e9;
Z1=(ZL*Z0)^.5
SWR=2;g_mod=(SWR-1)/(SWR+1)
2.- Fractional Bandwidth Df/f0, as defined [POZAR] 248pg
df_over_f0=2-4/pi*acos((g_mod)/(1-g_mod^2)^.5*(2*(Z0*ZL)^.5)/abs(ZL-Z0))
This expression of fractional bandwidth is only valid when
-
approximating l/4 |G| transformer general expression with (sec(q))^2>>1, q=b*L
-
TEM line only; q=b*L=2*p*f/vp*vp/(4*f0)= p*f/(2*f0)
Checking frequency response
c0=2.998*10^8;
df=1e6;
f0=2e9;f1=0;f2=2*f0;
dfrel=df/f0;
frel=[f1/f0:dfrel:f2/f0];
D1=.25;L1=D1*c0/f0
Zin=Z1*(ZL+1j*Z1*tan(2*pi*frel.*f0/c0.*L1))./...
(Z1+1j*ZL*tan(2*pi*frel.*f0/c0.*L1))
gamma1=(Zin-Z0)./(Zin+Z0)
hf1=figure(1);ax1=gca
plot(ax1,frel,abs(gamma1));grid on
title(['|gamma| ZL/Z0=' num2str(ZL/Z0)])
xlabel('f/f0')
axis([0 2 0 1])
Z0=100;ZL1=10*Z0;Z1_1=(ZL1*Z0)^.5
Zin1=Z1_1*(ZL1+1j*Z1_1*tan(2*pi*frel.*f0/c0.*L1))./...
(Z1_1+1j*ZL1*tan(2*pi*frel.*f0/c0.*L1));
gamma1_mod=abs((Zin1-Z0)./(Zin1+Z0));
hf2=figure(2);ax2=gca
plot(ax2,frel,gamma1_mod);grid on
ZL2=4*Z0;Z1_2=(ZL2*Z0)^.5
Zin2=Z1_2*(ZL2+1j*Z1_2*tan(2*pi*frel.*f0/c0.*L1))./...
(Z1_2+1j*ZL2*tan(2*pi*frel.*f0/c0.*L1));
gamma2_mod=abs((Zin2-Z0)./(Zin2+Z0));
hold(ax2,'on')
plot(ax2,frel,gamma2_mod);grid on
ZL3=2*Z0;Z1_3=(ZL3*Z0)^.5
Zin3=Z1_3*(ZL3+1j*Z1_3*tan(2*pi*frel.*f0/c0.*L1))./...
(Z1_3+1j*ZL3*tan(2*pi*frel.*f0/c0.*L1));
gamma3_mod=abs((Zin3-Z0)./(Zin3+Z0));
plot(ax2,frel,gamma3_mod);grid on
str1=['ZL/Z0=' num2str(ZL1/Z0)]
str2=['ZL/Z0=' num2str(ZL2/Z0)]
str3=['ZL/Z0=' num2str(ZL3/Z0)]
egend(str1,str2,str3)
axis(ax2,[0 2 0 1]);xlabel('f/f0');ylabel('|\Gamma|')
3.- µ-strip dimensioning
A first approximation, sometimes valid, would be manual iteration suggested in the solutions manual:
Let be Wd for W/d:
for the microstrip already with Z0=100 generator side:
guess that W/d<2 for instance W/d=.5
d=1.59e-3;Wd0=.5;er=2.2
ee0=(er+1)/2+(er-1)/2*1/(1+12*1/Wd0)^.5
for the microstrip on the generator side
Z0=100;
A100=Z0/60*((er+1)/2)^.5+(er-1)/(er+1)*(.23+.11/er)
B100=377*pi/(2*Z0*er^.5)
then
Wd100=8*exp(A100)/(exp(2*A100)-2)
W1=Wd100*d
check
60/ee0^.5*log(8/Wd100+.24*Wd100)
quite close to Z0=100
for the l/4 transformer microstrip, also guess W/d<2
Z1=187;
A187=Z1/60*((er+1)/2)^.5+(er-1)/(er+1)*(.23+.11/er)
B187=377*pi/(2*Z1*er^.5)
Wd187=8*exp(A187)/(exp(2*A187)-2)
W187=Wd187*d
check
60/ee0^.5*log(8/Wd187+.24*Wd187)
again close enough to Z1=187
Then the length [metre] of the transformer would be
c0=2.998e8;f0=4e9;
lambda0=c0/f0
lambdag=lambda0/ee0^.5
L_trf=lambdag/4
er = 2.200000000000000
ee0 = 1.720000000000000
A100 = 2.213185106778920
B100 = 3.992545616410477
Wd100 = 0.896248722160686
W100 = 0.001425035468235
= 1.012342362687005e+02
A187 = 4.047306149676580
B187 = 2.135051131770309
Wd187 = 0.139840322091229
W187 = 2.223461121250534e-04
= 1.851614198712142e+02
L_trf = 0.014287209808036
The guessing whether W/d<2 is a try-and-error manual process that can be somehow simplified sweeping all possible values, in same way when seeking function roots.
Copy of the support function iter_Wovd appended to this note. Start values Wd=1.5 (W/d) and the step d_Wd=0.01
d=1.59e-3 %mm thick
er=2.2
% 1st round
Wd0=1.5
d_Wd=.01
% dZ1=.01*Z1
ee0=(er+1)/2+(er-1)/2*1/(1+12*1/Wd0)^.5
if Wd0>=1
Z1_t2=120*pi/(ee0^.5*(Wd0+1.393+.667*log(Wd0+1.444))); %W/d>=1
else
Z1_t2=60/ee0^.5*log(8/Wd0+.24*Wd0); % W/d<1
end
Z1_v=Z1_t2
errZ1_v=abs(Z1_t2-Z1) % .5*Z1 % Z1 error vector
Wd_v=Wd0 % W/d vector
k=1
while errZ1_v(end)>.01 && k<2e3 % && k<2e3 safety switch or the loop doesn't stop
[Z1_2,Wd1]=iter_Z1_Wovd(Z1_v(end),Wd_v(end),er)
[Z1_2_dZup,Wd1_dZup]=iter_Z1_Wovd(Z1_v(end),Wd_v(end)+d_Wd,er)
[Z1_2_dZdown,Wd1_dZdown]=iter_Z1_Wovd(Z1_v(end),Wd_v(end)-d_Wd,er)
if abs(Z1-Z1_2_dZup)<abs(Z1-Z1_2_dZdown)
errZ1_v=[errZ1_v abs(Z1-Z1_2_dZup)];
Wd_v=[Wd_v Wd1_dZup];
Z1_v=[Z1_v Z1_2_dZup];
end
if abs(Z1-Z1_2_dZup)>abs(Z1-Z1_2_dZdown)
errZ1_v=[errZ1_v abs(Z1-Z1_2_dZdown)];
Wd_v=[Wd_v Wd1_dZdown];
Z1_v=[Z1_v Z1_2_dZdown];
end
k=k+1;
end
figure(3);stem(errZ1_v);grid on;title('Z1 error vector')
figure(4);stem(Z1_v);grid on;title('Z1')
figure(5);stem(Wd_v);grid on;title('W/d')
When W/d step is too small the convergence of Z1 happens with offset dZ1=85 ohm.
85 ohm away from the expected Z1 is an excessive deviation.
Let's increase step: d_Wd=.1
When starting with larger W/d step Z1 is eventually reached
% 13.2 Microstrip
d=1.59e-3 %mm thick
er=2.2
% 1st round
Wd0=1.5
d_Wd=.1
% dZ1=.01*Z1
ee0=(er+1)/2+(er-1)/2*1/(1+12*1/Wd0)^.5 % eff rel diel permittivity
if Wd0>=1
Z1_t2=120*pi/(ee0^.5*(Wd0+1.393+.667*log(Wd0+1.444)));
%W/d>=1
else
Z1_t2=60/ee0^.5*log(8/Wd0+.24*Wd0); % W/d<1
end
Z1_v=Z1_t2
errZ1_v=abs(Z1_t2-Z1) % .5*Z1 % Z1 error vector
Wd_v=Wd0 % W/d vector
k=1
while errZ1_v(end)>.01
[Z1_2,Wd1]=iter_Z1_Wovd(Z1_v(end),Wd_v(end),er)
[Z1_2_dZup,Wd1_dZup]=…
iter_Z1_Wovd(Z1_v(end),Wd_v(end)+d_Wd,er)
[Z1_2_dZdown,Wd1_dZdown]=…
iter_Z1_Wovd(Z1_v(end),Wd_v(end)-d_Wd,er)
if abs(Z1-Z1_2_dZup)<abs(Z1-Z1_2_dZdown)
errZ1_v=[errZ1_v abs(Z1-Z1_2_dZup)];
Wd_v=[Wd_v Wd1_dZup];
Z1_v=[Z1_v Z1_2_dZup];
end
if abs(Z1-Z1_2_dZup)>abs(Z1-Z1_2_dZdown)
errZ1_v=[errZ1_v abs(Z1-Z1_2_dZdown)];
Wd_v=[Wd_v Wd1_dZdown];
Z1_v=[Z1_v Z1_2_dZdown];
end
% if abs(Z1-Z1_2_dZup)==abs(Z1-Z1_2_dZdown)
% return;
% end
figure(6);hold all;stem(errZ1_v);grid on;title('Z1 error vector')
figure(7);hold all;stem(Z1_v);grid on;title('Z1')
figure(8);hold all;stem(Wd_v);grid on;title('W/d')
k=k+1;
end
Same result if W/d>2 W/d=2.5 Wd0=2.5 and d_Wd=0.1
The error threshold to stop is too small compared to the step the span is a bit too wide, yet when attempting to reduce both, again convergence is too far from Z1.
The point that this basic solver loop doesn't stop for some W/d and error threshold values or the span of the correct convergence can be narrowed, are points that can be improved is about diverting time on the algorithm, for instance adding variable steps.
Yet since Z1 values eventually hang around the expected Z1 and the error close to zero, we can focus on the smallest errors and from there get W/d:
the following ends up within a few seconds and converges to Z1
find(errZ1_v<.2)
Wd_v(find(errZ1_v<.2))
so the result is
Wd=mean(Wd_v(find(errZ1_v<.2)))
d
W=Wd*d
er
ee1=(er+1)/2+(er-1)/2*1/(1+12*1/Wd)^.5
lambda0=c/f0;lambda_eff=lambda0/(ee1)^.5
and with c=3e8
L_transformer=lambda_eff/4 % m
= 497 628 957 1683 2400
2612 2882 2980 3119 3375
3422 3831 4083 4235 5663
= 0.140344773157983 0.140416696611814 0.140182123411192
0.140392081104524 0.140193473954178 0.139486015946577
0.139983812519741 0.140263297911968 0.139605857141912
0.139484812310120 0.140322941984743 0.139283038977218
0.140218003471145 0.139906790481617 0.139859977987934
Wd = 0.139996246464844
d = 0.001590000000000
W = 2.225940318791026e-04
er = 2.200000000000000
ee1 = 1.664431786024021
lambda_eff = 0.058133739859052
L_transformer = 0.014533434964763
-
L_transformer=14.55 mm
-
W transformer track width 0.22mm
Again, single shot approach, compact, for instance W/d=.5 Wd=.5
d=1.59e-3;Wd=.5,Z1=187;er=2.2
A1=Z1/60*((er+1)/2)^.5+(er-1)/(er+1)*(.23+.11/er)
Wd_check=8*exp(A1)/(exp(2*A1)-2) % <1, ok
% since Wd is also <1
ee=(er+1)/2+(er-1)/2*1/(1+12*Wd_check)^.5
Z1=60/ee^.5*log(8/Wd_check+.24*Wd_check)
W_Z1=Wd*d
Z1=173 ohm, rather close to 187 ohm, the solutions manual leaves this as good enough
d=1.59e-3;Z0=100;Wd=.5,Z1=Z0;er=2.2
A0=Z1/60*((er+1)/2)^.5+(er-1)/(er+1)*(.23+.11/er)
Wd_check=8*exp(A0)/(exp(2*A0)-2) % <1, ok
% since Wd is also <1
ee=(er+1)/2+(er-1)/2*1/(1+12*Wd_check)^.5
Z0_check=60/ee^.5*log(8/Wd_check+.24*Wd_check)
W_Z0=Wd_check*d
A1 = 4.047306149676580
Wd_check = 0.139840322091229
ee = 1.966639425647109
Z1 = 1.731619051045303e+02
W_Z1 = 7.950000000000000e-04
A0 = 2.213185106778920
Wd_check = 0.896248722160686
ee = 1.775000873695489
Z0_check = 99.653452321549082
W_Z0 = 0.001425035468235
In any case it's highly recommended to validate results with a real prototype or with reliable microstrip calculators like LineCalc.
LineCalc is ADS microstrip utility, also used in this solution.
Another microstrip application that may turn useful is the free online microstrip calculator Chemandy:
http://chemandy.com/calculators/microstrip-transmission-line-calculator.htm.
The online microstrip calculator Chemandy uses Z0(W/d) slightly different a bit more compact expressions than POZAR.
Now calculating ee(er) and ee(W/d)
first ee(W/d)
Wd=[.5:.5:3];er=[1:.1:15];
ee=zeros(numel(Wd),numel(er))
hold all
for s=1:1:numel(Wd)
ee(s,:)=(er+1)/2+(er-1)/2*1/(1+12*Wd(s))^.5;
semilogy(er,ee(s,:));
end
grid on;
str1=['W/d= ' num2str(Wd(1))];str2=['W/d= ' num2str(Wd(2))];
str3=['W/d= ' num2str(Wd(3))];str4=['W/d= ' num2str(Wd(4))];
str5=['W/d= ' num2str(Wd(5))];str6=['W/d= ' num2str(Wd(6))];
legend(str1,str2,str3,str4,str5,str6)
and now ee(er)
er=[1:1:6];Wd=[.5:.01:3];
ee=zeros(numel(er),numel(Wd));hold all
for s=1:1:numel(er)
ee(s,:)=(er(s)+1)/2+(er(s)-1)/2*1./(1+12*Wd).^.5;
semilogy(Wd,ee(s,:));
end
grid on;
str1=['er= ' num2str(er(1))];str2=['er= ' num2str(er(2))];
str3=['er= ' num2str(er(3))];str4=['er= ' num2str(er(4))];
str5=['er= ' num2str(er(5))];str6=['er= ' num2str(er(6))];
evalin('base','legend(str1, str2 , str3 , str4 , str5)')
legend(str1,str2,str3,str4,str5,str6)
evalin is a powerful function that enables code generation.
Support function iter_Z1_Wovd
function [Z1_t2,Wd_t2]=iter_Z1_Wovd(Z1_t1,Wd_t1,er)
ee=(er+1)/2+(er-1)/2*1/(1+12*Wd_t1)^.5 % effective relative dielectric permittivity
if Wd_t1>=1
Z1_t2=120*pi/(ee^.5*(Wd_t1+1.393+.667*log(Wd_t1+1.444))); %W/d>=1
else
Z1_t2=60/ee^.5*log(8/Wd_t1+.24*Wd_t1); % W/d<1
end
A=Z1_t2/60*((er+1)/2)^.5+(er-1)/(er+1)*(.23+.11/er)
B=377*pi/(2*Z1_t2*er^.5)
if (Wd_t1>2)
Wd_t2=2/pi*(B-1-log(2*B-1)+(er-1)/(2*er)*(log(B-1)+.39-.61/er));
else
Wd_t2=8*exp(A)/(exp(2*A)-2);
end
% err_Z1=abs(Z1-Z1_t2)
end