Thursday, September 19, 2019

Notes on VNA Cal-kit SOL Standards

I was recently wondering what the effect was of the various VNA Cal-kit parameters (used to define the non-ideal nature of a VNA Calibration Kit's Short, Open, and Load standards) on a VNA measurement.

Were some parameters more important than others, and which could be ignored if measuring, say, below a certain frequency?

Some googling took me to this Keysight application note, Specifying Calibration Standards and Kits for Keysight Vector Network Analyzers, and its terminated transmission-line one-port model for SOL (Short, Open, Load) standards:


From this model and a set of givens, Keysight has derived the application note's equation 1.4, shown below:


How do we use this equation?  First, we need to look at how cal-kit standards are defined...


Specifying a Calibration Kit's Open and Short Standards:

Keysight specifies its Open and Short cal-kit standards using the following parameters:

Open: 

  • C0   (Farads(e-15))
  • C1   (Farads(e-27)/Hz)
  • C2   (Farads(e-36)/Hz^2)
  • C3   (Farads(e-45)/Hz^3)
  • (Offset) Delay   (Sec)
  • (Offset) Loss   (Gohm/Sec)
  • (Offset) Zo   (Ohm)

Short: 

  • L0   (Henries(e-12))
  • L1   (Henries(e-24)/Hz)
  • L2   (Henries(e-33)/Hz^2)
  • L3   (Henries(e-42)/Hz^3)
  • (Offset) Delay   (Sec)
  • (Offset) Loss   (Gohm/Sec)
  • (Offset) Zo   (Ohm)

How do I apply these parameters to the Application Note's Equation 1.4?


Applying Equation 1.4:

Solving equation 1.4 requires calculating ΓT, Γ1, and e-2γl.  Let's first look at finding  ΓT.

1.  Calculating ΓT:

First, recognize that ΓT for the Open and the Short standards is calculated as follows:

For an Open standard:

ΓT =  (Zopen - Zr)/(Zopen + Zr)

where Zr is our system's reference impedance (50 ohms), and Zopen is defined to be:

Zopen = -j/(2πf*(C0 + C1*f + C2*f2 + C3*f3))

given C0, C1, C2, and C3 coefficients specified by the open-standard's supplier.

Similarly, for a Short standard:

ΓT =  (Zshort - Zr)/(Zshort + Zr)

where

Zshort = j2πf*(L0 + L1*f + L2*f2 + L3*f3)

and given L0, L1, L2, and L3 coefficients specified by the short-standard's supplier.


So ΓT for either the Open or the Short is easily calculated.

2.  Calculating  Γ1 and e-2γl:

From the app note's equations, we know:


So, using the supplied-values and the formulas, above, we can calculate αl, βl, and Zc, from which we can then calculate γl (which we can then plug into e-2γl) and Γ1.

This, then, gives us all the values we need to solve the app note's equation 1.4.


Simplifying the Model...

Keysight's equation 1.4 is a fairly complex equation.  I was wondering...for the frequencies used, for example, by the NanoVNA (up to 900 MHz "stock" and 1500 MHz "modified"), how important are the various parameters?

That is, could we ignore some of the parameters?  Simplify the model?

If we assume that we are working at frequencies in which loss is negligible (i.e.  α essentially equals 0), and if we assume Zc = Zr (i.e. Γ1 = 0), then equation 1.4 reduces to:

Γi = e-2jβl ΓT

Much simpler!

Note that β has units of radians/meter and l has units of meters.  Therefore βl has units of radians (of delay).  And the factor of 2 in the exponent represents, from the perspective of the standard's input, a wave first traveling the distance l down the line, and then its reflection traveling back that same distance, for a total travel-distance of 2l.

But -- the delays of SOL standards are typically defined in terms of time (e.g. picoseconds), not length.  How do we convert this equation into one that is a function of time?

First, recognize that β = 2π/λ (where λ is the wavelength, in the transmission-medium, at the frequency of interest -- i.e. λ = c*VF/f, where c is the speed-of-light (m/s), VF is the Velocity Factor (unitless), and f is frequency in cycles-per-second).  Thus λ's units are meters/cycle.

Making this substitution for lambda into the equation for beta, we get:

 β = 2πf/(c*VF)


Now, note that if the transmission-medium's relative permeability is 1, then VF = 1/√εr, where εr is the relative permittivity of the transmission-medium.

We can now rewrite the equation for beta as:

β = (2πf√εr )/c


Thus:

βl =  (2πf√εr )l/c


Next, note that the Keysight app note (referenced above) defines "Offset-delay" as:

offset-delay = √εr / c     (Keysight's equation 1.5)


Substituting this into our equation for βl, we get:

βl =  2πf*(offset-delay)

And thus our earlier equation for Γi, expressed in terms of βl, becomes (when expressed in terms of frequency and offset-delay):

Γi = e-2j(2πf)*(offset_delay) ΓT


So now we can calculate Γin terms of frequency, the specified offset-delay, and ΓT using a much simpler equation to solve than equation 1.4!


An even Simpler Model:

In the simplified model, above, I tossed out Keysight's "Offset Loss" and "Offset Zo" parameters by assuming loss is 0 and Offset Zo equals Zr (thus Γ1 = 0).

Can I simplify the model even further?

Let's assume that, for the Open model, only C0 is important at our frequencies of interest (e.g. up to 900 MHz).  Thus, I'll set C1, C2, and C3 to 0.

And let's also assume that the Short model's inductance terms (L0, L1, L2, and L3) can all be set to 0 -- in other words, the actual short is modeled as an ideal short.

Now the model is very simple.  But have I simplified it too far?

Let's run some calculations and compare the models, using values from actual Keysight cal-kits...


Comparing the Models:

Matlab Code to Perform the Comparisons:

Here's my Matlab code for calculating gamma for my simplified models and for Keysight's complete ("full") model, per the equations, above.

% **************************************
% Comparison of VNA Cal-Standard Models
% **************************************

clear
% First -- Cal standard values from Rune's v0.0.8 python code:

% C0 = 50e-15;
% C1 = 0;
% C2 = 0;
% C3 = 0;
% Delay_Open = 0;
% Loss_Open = 0;
% Offset_Zo_Open = 50;
%
% L0 = 0;
% L1 = 0;
% L2 = 0;
% L3 = 0;
% Delay_Short = 0;
% Loss_Short = 9.99e20;
% Offset_Zo_Short = 50;

% % From Keysight Board Message for 85032B, per 8753C
% C0 = 62e-15;
% C1 = 17e-27;
% C2 = 28e-36;
% C3 = 0;
% Delay_Open = 17.544e-12;
% Loss_Open = 0;
% Offset_Zo_Open = 50;
%
% L0 = 0;
% L1 = 0;
% L2 = 0;
% L3 = 0;
% Delay_Short = 17.8e-12;
% Loss_Short = 9.99e20;
% Offset_Zo_Short = 50;


% Now -- standards for 8753D from Keysight Website...

% 85031B 7mm Cal Kit

% C0 = 92.85e-15;
% C1 = 0;
% C2 = 7.2e-36;
% C3 = 4.3e-45;
% Delay_Open = 0;
% Loss_Open = 0.7E9;
% Offset_Zo_Open = 50;
%
% L0 = 0;
% L1 = 0;
% L2 = 0;
% L3 = 0;
% Delay_Short = 0;
% Loss_Short = 2.1002e9;
% Offset_Zo_Short = 50;


% 85032B/E N Standards, Male, Keysight PNA85032B/E

% % Std No. 2, Male Open
% C0 = 62.14e-15;
% C1 = -143.07e-27;
% C2 = 82.92e-36;
% C3 = 0.76e-45;
% Delay_Open = 17.4e-12;
% Loss_Open = 0.7E9;
% Offset_Zo_Open = 50;
%
% % Std No. 3, Male Short
% L0 = 0;
% L1 = 0;
% L2 = 0;
% L3 = 0;
% Delay_Short = 17.8e-12;
% Loss_Short = 2.1002e9;
% Offset_Zo_Short = 50.209;

% % Std No. 5, Female Open
% C0 = 119.09e-15;
% C1 = -36.955e-27;
% C2 = 26.258e-36;
% C3 = 5.5136e-45;
% Delay_Open = 0;
% Loss_Open = 0.7E9;
% Offset_Zo_Open = 50;
%
% % Std No. 6, Female Short
% L0 = 0;
% L1 = 0;
% L2 = 0;
% L3 = 0;
% Delay_Short = 0.093e-12;
% Loss_Short = 0.7e9;
% Offset_Zo_Short = 49.992;


% 85032F N Standards, Male, Keysight PNA85032F

% % Standard 8, Male Open
% C0 = 89.939e-15;
% C1 = 2536.8e-27;
% C2 = -264.99e-36;
% C3 = 13.4e-45;
% Delay_Open = 40.8563e-12;
% Loss_Open = 0.93e9;
% Offset_Zo_Open = 50;
%
% % Standard 7, Male Short
% L0 = 3.3998e-12;
% L1 = -496.4308e-24;
% L2 = 34.8314e-33;
% L3 = -0.7847e-42;
% Delay_Short = 45.955e-12;
% Loss_Short = 1.087e9;
% Offset_Zo_Short = 49.992;

% % Standard 2, Female Open
% C0 = 89.939e-15;
% C1 = 2536.8e-27;
% C2 = -264.99e-36;
% C3 = 13.4e-45;
% Delay_Open = 40.117e-12;
% Loss_Open = 0.93e9;
% Offset_Zo_Open = 50;
%
% % Standard 1, Female Short
% L0 = 3.3998e-12;
% L1 = -496.4308e-24;
% L2 = 34.8314e-33;
% L3 = -0.7847e-42;
% Delay_Short = 45.955e-12;
% Loss_Short = 1.087e9;
% Offset_Zo_Short = 49.99;


% 85033D/E 3.5mm standards (per Keysight PNA 85033DE)

% Open, Male
C0 = 49.433e-15;
C1 = -310.13e-27;
C2 = 23.168e-36;
C3 = -0.15966e-45;
Delay_Open = 29.2e-12;
Loss_Open = 2.2E9;
Offset_Zo_Open = 50;

% Short, Male
L0 = 2.0765e-12;
L1 = -108.54e-24;
L2 = 2.1705e-33;
L3 = -0.01e-42;
Delay_Short = 31.8e-12;
Loss_Short = 2.36e9;
Offset_Zo_Short = 50;

% % Open, Female
% C0 = 49.433e-15;
% C1 = -310.13e-27;
% C2 = 23.168e-36;
% C3 = -0.15966e-45;
% Delay_Open = 29.2e-12;
% Loss_Open = 2.3E9;
% Offset_Zo_Open = 50;
% %
% % % Short, Female
% L0 = 2.0765e-12;
% L1 = -108.54e-24;
% L2 = 2.1705e-33;
% L3 = -0.01e-42;
% Delay_Short = 31.8e-12;
% Loss_Short = 2.36e9;
% Offset_Zo_Short = 50;


zr = 50;    % reference impedance
f = 900e6;  % frequency

% *****************************
% Calculations for Open Standard
% *****************************

% First,  calculate the Short's Gamma
%assuming no Loss and Offset_Zo = 50 ohms.
divisor = (2*pi*f * (C0 + C1*f + C2*f^2 + C3*f^3));
Zop = -1i / divisor;
GammaOpen = ((Zop/50) - 1) / ((Zop/50) + 1);
abs(GammaOpen);
angle(GammaOpen)*180/pi;
delayedOpenGamma = GammaOpen * ...
    exp(-1i*2*2*pi*f*Delay_Open);
% Magnitude of Gamma
rho_NoLoss_Open = abs(delayedOpenGamma)
% Angle of Gamma (degrees)
theta_NoLoss_Open = angle(delayedOpenGamma)*180/pi

% Repeat open calculation, but make C1-C3 zero:
divisor2 = (2 * pi * f * C0);
Zop2 = -1i / divisor2;
GammaOpen2 = ((Zop2/50) - 1) / ((Zop2/50) + 1);
abs(GammaOpen2);
angle(GammaOpen2)*180/pi;
delayedOpenGamma = GammaOpen2 *...
    exp(-1i*2*2*pi*f*Delay_Open);
rho_C0_Only_Open = abs(delayedOpenGamma)
theta_C0_Only_Open = angle(delayedOpenGamma)*180/pi


% Now, let's repeat the calculation for the
% Open's Gamma, but now assuming loss and
% specified Offset_Zo.
%
% Per equation 1.10 in Keysight's
% "Specifying Calibration Standards
% and kits for Keysight Vector Network Analyzers".

al_op = ((Loss_Open*Delay_Open)/...
    (2*Offset_Zo_Open))*sqrt(f/1e9);
Bl_op = 2*pi*f*Delay_Open + al_op;
zc_open = Offset_Zo_Open +...
    (1-1i)*(Loss_Open/(4*pi*f))*sqrt(f/1e9);

% From the givens of eq. 1.1:
gammaEl_op = al_op + 1i*Bl_op;

% Next, calculate a common exponential term...
e2gammaEl_op = exp(-2*gammaEl_op);

% Then applying to equation 1.4:
% Now, calculate Gamma-sub-1 and Gamma-sub-i
% (the latter equation 1.4 in  Keysight doc.
Gamma_1_op = (zc_open-zr)/(zc_open+zr);

Open_Gamma_i = (Gamma_1_op*...
    (1-e2gammaEl_op-Gamma_1_op*GammaOpen)...
    +(e2gammaEl_op*GammaOpen)) / ...
    (1-Gamma_1_op*(e2gammaEl_op*Gamma_1_op +...
    GammaOpen*(1-e2gammaEl_op)));

rho_FullModel_open = abs(Open_Gamma_i)
theta_FullModel_open = angle(Open_Gamma_i)*180/pi


% *****************************
% Repeat for the short Standard
% *****************************

% First, calculate the Short's Gamma assuming
% no Loss and Offset_Zo = 50 ohms.
Zsh = 1i * (2*pi*f * (L0 + L1*f + L2*f^2 + L3*f^3));
GammaShort = ((Zsh/50) - 1) / ((Zsh/50) + 1);
abs(GammaShort);
angle(GammaShort)*180/pi;
delayedShortGamma = GammaShort *...
    exp(-1i*2*2*pi*f*Delay_Short);
% Gamma magnitude
rho_NoLoss_Short = abs(delayedShortGamma)
% Gamma angle (degrees0
theta_NoLoss_Short = angle(delayedShortGamma)*180/pi

% Repeat short calculation, but make L0-L3 zero
% (i.e. perfect short):
GammaShort2 = ((0/50) - 1) / ((0/50) + 1);
abs(GammaShort2);
angle(GammaShort2)*180/pi;
delayedShortGamma = GammaShort2 *...
    exp(-1i*2*2*pi*f*Delay_Short);
rho_PerfectShort = abs(delayedShortGamma)
theta_PerfectShort = angle(delayedShortGamma)*180/pi


% Now, let's repeat the calculation for the
% Short's Gamma, but now assuming loss and
% specified Offset_Zo.
%
% Per equation 1.10 in Keysight's
% "Specifying Calibration Standards
% and kits for Keysight Vector Network Analyzers".

al_sh = ((Loss_Short*Delay_Short)/...
    (2*Offset_Zo_Short))*sqrt(f/1e9);
Bl_sh = 2*pi*f*Delay_Short + al_sh;
zc_short = Offset_Zo_Short + ...
    (1-1i)*(Loss_Short/(4*pi*f))*sqrt(f/1e9);

% From the givens of eq. 1.1:
gammaEl_sh = al_sh + 1i*Bl_sh;

% Next, calculate a common exponential term...
e2gammaEl_sh = exp(-2*gammaEl_sh);

% Then applying to equation 1.4:
% Now, calculate Gamma-sub-1 and Gamma-sub-i
% (the latter equation 1.4 in the Keysight app note.
Gamma_1_sh = (zc_short-zr)/(zc_short+zr);

Short_Gamma_i = (Gamma_1_sh*...
    (1-e2gammaEl_sh-Gamma_1_sh*GammaShort)+ ...
    (e2gammaEl_sh*GammaShort)) / ...
    (1-Gamma_1_sh*(e2gammaEl_sh*Gamma_1_sh + ...
    GammaShort*(1-e2gammaEl_sh)));

rho_FullModel_short = abs(Short_Gamma_i)
theta_FullModel_short = angle(Short_Gamma_i)*180/pi
rho_NoLoss_Open =

    1.0000


theta_NoLoss_Open =

  -20.5147


rho_C0_Only_Open =

    1.0000


theta_C0_Only_Open =

  -20.5231


rho_FullModel_open =

    1.0000


theta_FullModel_open =

  -20.5163


rho_NoLoss_Short =

    1.0000


theta_NoLoss_Short =

  159.3679


rho_PerfectShort =

     1


theta_PerfectShort =

  159.3936


rho_FullModel_short =

    0.9972


theta_FullModel_short =

  159.2065



Note that the above block ends with the calculated values of Gamma for the 85033D/E Male SMA standards at 900 MHz.


Comparison Results at 900 MHz:

Here are the Matlab results for various cal-kit standards:


Notes:

1.  The "Simple" model uses C0-C3 and L0-L3, but not (offset) Loss nor (offset) Zo (i.e.  α essentially equals 0).  Also, Zc is assumed to equal Zr (refer to Keysight equations).
2.  The "Very Simplified" model is the "Simple" model but with C1-C3 and all the L terms zeroed-out.
3.  The "Keysight" Model is the "full" model I've created using the equations in their app note.
4.The very last "cal kit" represents the NanoVNA's compensation, as gleaned by looking at its firmware (note that I set Loss to 0 ohms/S to force α to be 0).


Conclusion:

In the above results, the worst case Gamma differences between the "Full" and "Very Simplified" models, calculated at 900 MHz, are:

  • rho (magnitude):  Less than 0.003
  • theta (degrees):  Less than 0.2 degrees.

Note that at 900 MHz, an S11 angle of 0.2 degrees (for an Open Standard) is roughly equal to a one-way delay of 0.3 picoseconds (i.e. a length of about 90 nano-meters, assuming a Velocity Factor of 1).

So, in my opinion, these differences are insignificant.

Note:  To calculate the above values...
  seconds_of_delay (one way) = angle (degrees) / 360 (degrees/cycle) / f (cycles/sec) / 2,
where the 2 represents the fact that the overall delay is two times the one-way delay.  Thus the final calculated value is the one-way delay.
We can then calculate the equivalent length using this one-way delay value:
  length (meters) = seconds_of_delay (sec) * speed_of_light (m/sec) * Velocity_Factor.


And here is another reason why I believe these errors to be insignificant...

Per Keysight, the electrical specifications of their 85033E cal-kit are:


Note that the Opens can have an error (from nominal) of +/- 0.55 degrees and the Shorts can have an error (from nominal) of +/- 0.48 degrees.  My calculated error under 0.2 degrees is less than half of either of these errors (errors for which we usually do not compensate).


Comparison Results at 1500 MHz:

Some users have modified their NanoVNA firmware to support operation up to 1500 MHz.  How important are the differences between the "Full" model's parameters and my "Very Simplified" model at this higher frequency limit?

Here's the data from the Matlab calculations:


As you can see, the worst-case Gamma angle-error of an Open (SMA, in this case) is about a quarter of a degree at 1500 MHz.  This angle represents an equivalent one-way delay of about 0.24 picoseconds, or a length of 72 nano-meters, assuming a Velocity Factor of 1.

Again, fairly insignificant differences.


Other Notes:

Similar equations can be found at these URL's:

Effect of Loss on VNA Calibration Standards, Raul Monsalve

One Port Direct/Reverse Method for Characterizing VNA Calibration Standards, Raul Monsalve, et al. (see Appendix at end of paper).

Calibration values for all the Keysight standards can be found here: Keysight Cal Kit Page


Standard Caveat:

As always, I might have made a mistake in my equations, assumptions, drawings, or interpretations.  If you see anything you believe to be in error or if anything is confusing, please feel free to contact me or comment below.

And so I should add -- this information is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Thursday, September 12, 2019

N Connectors for the NanoVNA

The NanoVNA is a cute little handheld VNA at an incredibly low price (given its performance).  One small issue, though, is that it uses SMA connectors, which can be a bit fragile.


Thinking that this might become an issue, I thought I would change the connector type to N by using N-to-SMA adapters.

But I wanted to ensure that the weightier N-connectors (and whatever might be attached to them) were not physically supported only by the NanoVNA’s SMA connectors themselves.  That could increase the chances of future SMA connector failure.

So I purchased two N-to-SMA bulkhead adapters, and, after they arrived, I made a simple chassis from PCB stock onto which to mount both my NanoVNA and the two adapters: 


I used two pieces of copper-clad PCB stock.  One piece (double-sided) serves as the bottom plate onto which the NanoVNA attaches (using 4 screws -- these screws are longer than the stock ones used to attach the NanoVNA’s back cover).  

The original back cover is still attached (so that I wouldn’t lose it) – you just cannot see it.

The second piece of copper-clad is single-sided, and upon it the two N-to-SMA bulkhead adapters mount.  I chose single-sided stock because, on the NanoVNA PCB itself, the grounds for the two SMA connectors split apart, and I wanted to continue this “separate-ground” approach out to the N adapters and their mounting hardware.

Thus, if you look at the next two pictures, you will see how each N-connector has its body and mounting hardware isolated from the other N-connector as well as from the ground-plate holding the NanoVNA.

No conductive copper on the front side:


And mounting hardware isolated on the backside. (I used a Dremel tool with an engraving bit to create the copper "islands", but you could use an Xacto knife, too.  It’s just a bit more work.)  Note that only two screws hold each adapter to the front plate.


If you look closely at the photo, above, you’ll see the solder-seam connecting the two boards.  There is an identical seam on the other side of the bottom plate, as you can see in the photo, below:


Solder on both sides makes this joint mechanically rigid, relieving any mechanical stress on the NanoVNA's SMA connectors.

By the way, the only change I made to the NanoVNA, itself, was to use slightly longer screws (I believe the thread size is M2.5, but don’t quote me!).

That's it!  Hopefully this will spur your own ideas!



Standard Caveat:

As always, I might have made a mistake in my equations, assumptions, drawings, or interpretations.  If you see anything you believe to be in error or if anything is confusing, please feel free to contact me or comment below.

And so I should add -- this information is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.