Testing HR360 Analyzer
I finished the build a few days ago, (waiting on the DDS module from China.. 6 weeks!) and was testing it out on my antenna and few dummy loads.
- 6ft RG8X with a 56 Ohm terminator (no 49 or 51 Ohm resistors in my junk box that I could find!)
- 6ft RG8X with 150 Ohm terminator
- Inverted V dipole for 40m, fed with 300 Ohm twin-lead. Tuned with a MFJ-969 tuner to ~7.16 MHz
- HR360 Analyzer
- MFJ-269c Analyzer
All tests were done on the 40m band (~7MHz).
Dummy loads, note that I checked the resistor values with my digital multi meter and they were confirmed to be within a few percent. Unfortunately I don't remember if they are carbon or metal film resistors. If they are carbon film then it wouldn't be unexpected to observe a impedance drop at RF frequencies due to stray capacitance within the resistor.
56 Ohm: 1.088, 1.1 SWR, for the HR-360 and MFJ respectively
150 Ohm: 1.78, 3.0 SWR, for the HR-360 and MFJ respectively.
For my antenna at one tuner setting, with the HR-360, I measured a minimum SWR of 1.12 at a frequency of 7.17 MHz, at the edge of the band, 7.300 MHz, I measure an SWR of 1.8.
With the MFJ analyzer I also measure a minimum SWR of 1.1 at 7.17 MHz, however at higher frequencies I measure consistently higher SWR values and at the edge of the band it is measuring an SWR of 3.1 @7.300 MHz.
I'm not making any assumptions about which instrument is correct, it might be neither. The MFJ-269 is borrowed from a friend and may need calibration, maybe I screwed up the assembly of the HR-360, etc. I simply want to start a discussion and get some other folks to run similar experiments to see if they get similar results. The dummy load test should be pretty easy to set up. Thanks for reading!
As you suggested, I made some measurements using various values of resistors as load. The nominal values and measured values along with the SWR values obtained using both the original firmware and KJ6WEX firmware are shown in the table below. The resistors were measured with an HP VOM with 0.7% accuracy.
nominal measured SWR(KJ6WEX) SWR (original) theoretical
10 10.0 3.8 :1 3.73:1 5.0:1
20 19.8 1.8:1 1.79:1 2.5:1
50 49.2 1.1:1 1.11:1 1.0:1
100 98.5 1.3:1 1.35:1 2.0:1
150 149.7 1.8:1 1.82:1 3.0:1
200 198.6 2.3:1 2.32:1 4.0:1
The results with 50 and 150 are similar to your results. Both the original firmware and KJ6WEX version produce same results (KJ6WEX version only displays SWR to one decimal place to fit display).
I suspect part of the problem is calibration/compensation which is absent in the code. You had asked me earlier today for some testing against known load values in the 40M band. The following table, a bit like Warren's above, was made this evening:
The loads are +/- 0.8% and the VSWR calculations were done against that value using for the purely resistive load.
Looks like as we get away from the 50Ω characteristic impedance of the analyzer, our output becomes significantly more in error; about 1% error at 50Ω climbing to almost 50% at 10Ω and 200Ω. Luckily, our area of interest is likely to be close to that 50Ω sweet spot anyway and this is more of a qualitative piece of gear that quantitative, no?
Ha, the OCD engineer in me doesn't want to hear that anyway. I'm going to try a few calibration ideas in the local code and see how that helps. I see three areas for software compensation:
1. What noise exists on the lines in the absence of an output signal and an absence of load?
2. What imbalance exists in the responses of the two diodes? Second order issue: what about non-linearity of the diode response curve?
3. What gain differences exist between the two MCP6002 stages?
I think these three are pretty simple to measure and implement in code, but we'll see. Anyone else have any ideas?
Even with its shortcomings, I found the HR360 antenna analyzer very useful. I have a DX-88 8 band vertical with lots of adjustable traps!
But like you my engineering background tells me that half the fun in building something is in getting it to work better than intended!
I agree with your assessment of error sources and the likelihood of being able to make corrections in the firmware.
At an SWR of 1.00 the reflected voltage should be zero. The forward voltage, diode drops and non linearity, and amplifier gain differences should be irrelevant. The primary source of error in my unit was offset voltage in the reverse op-amp. In order to correct this, during setup() I set the dds frequency to zero which, since the dds output is ac coupled, should result in zero at the output of both op-amps. The firmware reads the offset of each op-amp and saves the value of each. Later these offsets are subtracted from each reading. Now my readings with 50 ohm load resistor are right on.
This offset correction did not help much with the other loads though. It did seem to make my readings a little closer to your readings though.
So far I have not experimentally determined other errors though. I am thinking that the diode forward voltage drop and non-linearity are probably the major source, since the voltages involved are in the low millivolt range. Maybe non-linearity can be corrected using experimental values in a lookup table with interpolation between table values.
Will continue playing around as time permits.
Great minds do think alike...I'd put in the idle offset routine today as well.
The diode forward voltage drop compensation doesn't have a great impact on the large errors that crop up just a few ohms away from 50Ω, as you can see in my updated table below. I did a test run to look at the diode drop mismatch ; grounded the antenna port and run the 1-30 scan. This let me boil down the data to a simple equation I can use in the code to correct for the diode's mismatch. One more compensation TODO for tomorrow is to look at mismatched gain in the opamps; short the cathodes together (making the amplifier non-inverting inputs look the same.
There is a way to calibrate for non-linear operation, I'm certain, but I haven't quite figured it out yet. Lookup tables may work, once we can break the data down, or do piece-wise regressions and if/else equations...I just don't have the test gear to run out the sort of data on the diodes. This is the compensation approach that may not generalize to every analyzer, like the other three methods which can be done at run time without user input, or with very limited user input.
Also, general note...this thing is very sensitive to noises. On some of my longer data collection runs (10k+ measurements), I picked out occasional random noise hits on the FWD/REV, but also a very clock-steady 10 Hz annoyance.
That said, I'll agree with you ...a great tool that we've shown will do exactly what it is supposed to do: locate the resonant point(s) of my antenna. Everything else is just geeky icing on the cake.
I'm also getting good agreement with an MFJ analyzer and rig SWR reading for SWR near 1:1 but the HR360 analyzer reads low by about a factor of 2.
I like the approach you guys took with the various resistors. I took some readings with open and short on the BNC and looked at the results in Excel (after capture with my Python code listed elsewhere on the forum). I thought that perhaps a constant factor on the reflected voltage would do the trick but it didn't so I think you are right that there is a non-linearity which we would need a little more work to compensate. But, as you say, we are looking for where the best match occurs and it seems fully capable of telling us that. I would like to use it to generate accurate SWR curves for my beam but this analyzer is probably at its best in the go-kit for use in tuning up an end-fed or Alex-Loop.
I took your suggestion and did a linear regression on your data. This is quick and dirty and could be frequency dependent but it gets the SWR measurements closer. I combined all your data and got
VSWR = -1.31869 + 2.46578 * measured VSWR
Add these lines to the Perform_sweep() routine
double slope = 2.46578;
double intercept = -1.31869;
and modify the VSWR calculation line
// Calculate VSWR
VSWR = intercept + slope * ((double)FWD + (double)REV) / ((double)FWD - (double)REV);
I did this with some of my measurements across 20m on my beam and the measurements look much better although still not right on with an MFJ 969.
I really expected that quadratic or log fit would be needed but the linear fit looks pretty good.
Here is the Python code to do the regression. Excel can also do it.
Takes SWR measured by HR360 analyzer and gives proper SWR
Uses fit of data from Chris on HR360 forum using different resistors
Created on Fri Feb 10 15:43:47 2017
@author: rmsuggs KB5EZ
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
# setup arrays, resistance is not used but included for completeness
r = np.array([10.1,18.5,38.3,47.0,49.3,69.0,100.7,150.1,196.9]) # not used
meas = np.array([2.5472,1.603,1.0485,1.0175,1.0175,1.063,1.2834,1.7279,2.1721])
act = np.array([4.9505,2.7027,1.3055,1.0638,1.0142,1.38,2.0140,3.002,3.938])
slope, intercept, r_val, p_val,std_err = stats.linregress(meas,act)
print 'Slope = ', slope, ' Intercept = ',intercept
fit_SWR = intercept + slope * meas
Let me know how this works for you.
Just tried your method of correcting aa360 VSWR calculations and had very good results when using resistors as test loads. I have also been playing around with improving the accuracy and found I could get much better results if I take the square root of the measured voltages prior to the VSWR calculation. Seems like at the low voltage levels we have, the diodes are operating in the "square law" detector region. The following table compares results that I obtained with the original calculation with results that I obtained from my square root method and your best straight line method.
Original calculation: VSWR=(FWD+REV)/FWD-REV)
Square root method: VSWR=(sqrt(FWD)+sqrt(REV))/(sqrt(FWD)-sqrt(REV))
Straight line method: VSWR=intercept+slope*(FWD+REV)/(FWD-REV), intercept=-1.31869, slope=2.46578.
R(nominal) FWD REV Original SquareRoot StraightLine
10 229 107 2.77 5.36 5.53
25 267 33 1.29 2.10 1.87
50 313 0 1.00 1.00 1.15
100 380 42 1.25 2.00 1.77
150 423 111 1.72 3.11 2.72
200 450 166 2.18 4.12 4.06
250 470 211 2.63 5.07 5.16
I've got an analyser going and get similar results with the resistor set above using KJ6WEX firmware. I tried some hardware changes to see what difference they make.
1) I put an amplifier in the DDS o/p to raise the level that the bridge works at. I used a MSA0486 mmic which has 8dB or so of gain and I'm now driving the bridge with about 2v p-p instead of 0.5. I reduced the gain of the MCP6002 from 50 to 20. Results show an improvement for high SWR:
10R 5 4.2 3.6 (calculated value/amplified value/unamplified value)
20R 2.5 1.9 1.7
50R 1 1.1 1.1
100R 3 1.6 1.4
150R 4 2.4 1.8
2) I swapped the diodes for BAT85 schottky. That made it no better than with the AA413 diodes. I have some SMS7630 diodes which have lower Vfwd at low currents, but they have a reverse breakdown of only 1 volt!
Looks like fiddling with the hardware won't fix the measurement at higher SWR.
I tried the SQRT method of calculation and get strange answers eg VSWR with 50ohms is 1.5 (that's with the amplifier in or out)
I've done some more measurements on the hardware.:
1) The offset voltages of the two section of my MCP6002 op amp are about 0.5mV and 1.3mV. The spec says +/- 4.5mV. When amplified by 50 this is a big error and must be calibrated out.
2) I removed the DDS and Arduino and drove the bridge from a 2MHz signal generator with buffer amplifier. I measured the dc voltages at the MCP6002 inputs and calculated VSWR from those. I tested with loads of 50ohms, 20.8ohms and 100ohms. I had to drive the bridge with 100mW to get reasonable SWR answers around VSWR of 2:
2.2 (should be 2.4) at 20.8ohms
1.9 (should be 2.0) at 100ohms
3) I plotted the characteristic of D2 (from zero up to 450mV - the likely operating range provided by the DDS) by lifting its anode and connecting the sig gen there. I measured across C6. The hopefully attached graphs show the results, one graph is the dc o/p vs ac i/p; the other is log dc o/p vs log ac i/p. The gradient of the log-log graph is 1.9 calculated from the end points, or 1.8 calculated over the straight bit from X = 1.6 up.
I will repeat this at 28MHz and also at 70MHz which is where my principal interest lies (the 4m band in the UK/EU)
Looks like one attachment only! Here's the other which is the plain (not log) plot
AA143 at 28MHz. The kink at the bottom of the curve is definitely there. No real idea why. I could suspect the dc meter which is a basic digital multimeter, but the measurement is repeatable. Gradient of the straight bit is 1.8
Perhaps the above gives us some ideas for a calibration procedure, disable the DDS and measure the offsets; that could be done at switch on every time. Then for a calibration function, connect two or three resistors as loads and assume square law to interpolate, possibly with a frequency correction.
I have been following your posts with great interest and appreciate the work you have been doing. The chart of SWR vs. resistor loads that I posted earlier were all obtained on values that I obtained after I added offset correction to the sketch. Should have mentioned that. Offset correction improves the SWR readings at low SWR's where reflected voltage is near zero, but did not have very much effect at high SWR's. Perhaps that is why your results using square root method produced strange answers? Keep up the good work!