Magnetic Loop Antennas

Magnetic Loop Antennas – a brief theory and a practical antenna for 3.5 to 14MHz

ABSTRACTS u2013 2017 | 2018 by Marica Martella is licensed under CC-BY-NC-ND 4.0

For Radio Amateurs wishing to use HF bands below 30MHz, the physical size and height above ground of conventional antennas can be a problem. They require towers or at least a support to allow the antenna to be a substantial fraction of a wavelength above ground. For the lower frequencies this is impractical for most domestic installations. An unbalanced antenna such as a vertical or long wire fed against ground will require a low resistance earth or radial system which may present its own problems. Even an extensive radial system may have significant earth resistance (20-30 ohms). If the antenna is much less than a quarter wavelength in height it will have low radiation resistance in the order of a few ohms and reduced efficiency when fed against a lossy ground. A balanced antenna such as a dipole or beam will not perform well if it is much less than a wavelength above ground due to a high angle of radiation.

Some locations will not allow antennas at all due to council or strata regulations or neighbour objections.

Magnetic loop antennas have become popular in recent years as they solve many of these problems. They have long been used in military or shipboard applications where space is at a premium or where the antenna must be discreet. They can be used as a “stealth” antenna and hidden in a roof space for example.

They are physically small, balanced and can perform well at relatively low heights above ground.

But of course as the old adage says – “you dont get something for nothing”.

In this case bandwidth and radiation resistance are sacrificed for small physical size.

Loop antennas must be carefully designed but their performance can rival conventional full size antennas.

Apart from small physical size and good performance at low heights they have the advantage of good noise immunity and are directional to some extent.

Theory

Magnetic vs electrostatic fields

Conventional antennas respond essentially to electrostatic fields. On the other hand a “magnetic loop” antenna responds to the magnetic field and the flux through the loop – it can be thought of as a 1 turn secondary of a transformer, with the primary being the radiation source for the received signal. Indeed a magnetic loop may be completely shielded with a grounded electrostatic shield and it will still function. This property makes it less sensitive to electrostatic noise sources such as nearby electronic equipment, motors and power lines. The Loop equivalent circuit is shown in Fig 1.

Equivalent circuit (Fig 1)

The loop acts as a lumped inductance – in most designs this is tuned with a capacitor to resonate the loop on a particular frequency. Inductance is proportional to loop area, which in turn is determined by circumference (assuming a circular loop) or the length of the loop conductor for other shapes. There is also an equivalent series resistance which is comprised of ohmic losses in the loop components and radiation resistance. Radiation resistance is low for loops which are a fraction of a wavelength at the frequency of operation – typical values are in the order of 0.1 Ohm. Ohmic losses in joints and the connection between the capacitor rotor plates and terminal should be small but should be considered due to the high RF currents involved. If high quality materials such as heavy copper tubing and silver soldered joints are used in the loop construction, ohmic losses can be minimized.

Due to the low equivalent resistance in the circuit, the loop acts as a very high Q tuned circuit. This may be an advantage for fixed frequency operation as it will attenuate unwanted strong signals off frequency. At low frequencies the 2:1 SWR bandwidth may only be a few KHz. However if the loop is to be tuned this imposes design challenges as the tuning is very critical.

A typical loop can be tuned over a 2 octave (4:1) frequency range. The loop shown in this article will tune from 3.3 to 14.8MHz with a variable capacitor of approximately 20-350 pF

RF Current and Voltage

RF Current is high in the loop due to the low radiation resistance. It may be up to 100A with a 1KW input to the antenna. Thus ohmic losses are important for higher power use and for efficiency. There is a well known “RF Skin effect” in conductors – the best results are obtained with a wide diameter conductor such as the 20 mm copper pipe used in this project.

To minimize ohmic losses use a single smooth piece of copper and silver solder joints where possible rather than screw or press connections. For practical purposes, the RF current is constant around the loop.

On the other hand, RF voltage is maximum at the tuning capacitor and minimum (approaching zero) opposite the capacitor as the loop is balanced. For high power the RF voltage across the tuning capacitor is substantial and may be as high as 10KV peak to peak for a 1 KW power input. For high power transmitting, a capacitor with wide plate spacing must be used. The ideal is a vacuum variable capacitor with an appropriate voltage rating

Matching the loop

Clearly no antenna is useful unless it can be attached to a feedline. Various matching schemes have been devised. (ref 1)

Gamma match

Because voltage varies around the loop and current is relatively constant, the impedance varies around the loop. Both balanced and unbalanced schemes have been proposed to connect the feedline to a point in the loop where there is a best match . In theory a balanced feed would give better noise immunity, but in practice this seems difficult to quantify.

Loop match (Fig 3)

This appears to be the simplest in practice and most widely used. The impedance transformation is proportional to inverse of magnetic flux through the two loops which in turn is proportional to the ratio of the loop areas. The Impedance transformation ratio appears experimentally to be roughly the inverse of the ratio of the two loop areas squared. I used a 1m length of RG6/U 75 Ohm coax for the matching loop. This is cheap, insulated and fairly rigid. In this application it is simply a length of conductor. I joined shield and centre conductor together at both ends.

The feedline centre conductor connects to one end while the feedline shield connects to the other. In my case I used RG58/U as the feedline.

While the matching loop area affected the match, various other factors dominated.

I spent some time experimenting with various size loops.

The distance of the main loop conductor from matching loop was important – best results were obtained with the matching loop applied against the main loop. Height above ground and proximity to other metal objects affected the match as is the case with other antennas.

The loop and matching loop must be in the same plane – indeed one author (ref) tuned the match by rotating the plane of the matching loop.

Matching is relatively constant over several octaves of bandwidth. By adjusting loop area a good match can be obtained at least in middle of the operating range. In my case I obtained a near perfect match on 14MHz but a less than perfect match on other frequencies with the SWR as high as 1.7 on 3.5MHz

It will be necessary to finalize matching by trial and error

A Practical Magnetic Loop antenna for 3.5 to 14MHz

The Loop

I used 20mm copper tubing in this antenna with a length of approximately 4.9m. This length can be changed to achieve the desired range of frequencies. Be careful to use soft copper tubing – hard annealed copper will be difficult to bend. I did not take any particular care to get a perfectly round loop but a pipe bender could be used to do so. Copper tubing is available from hardware or plumbing suppliers.

Use a continuous length – any joints will have ohmic losses and any discontinuities will increase losses due to the “skin effect” at RF. I used 40mm plastic plumbing pipe as a support for the loop – it may be necessary to use something (nonmetallic) more substantial for high wind situations. A hole is drilled at the top for the copper and matching loop and I used a plastic cap on the pipe to prevent water ingress. I soldered heavy silvered copper wire to the ends of the loop for attachment to the tuning capacitor via terminals which were crimped and soldered. The ends of the loop are then covered with heavy heatshrink and fixed to the capacitor box with brackets and U Bolts. (see photo)

Tuning Capacitor

A local amateur (Greg VK8MD) kindly donated a surplus high power 20-350pF tuning capacitor. The voltage rating of the tuning capacitor is important in this application.

This capacitor has a plate spacing of 1.2mm. In air the breakdown voltage rating is approx 3KV/mm.

This should be adequate for power to 100W or so though I have only tested the system with 5W so far. Various authors recommend vacuum capacitors in this application. These are generally “multiturn” for an automatic vernier effect, low loss and high voltage. But they are fragile and expensive – it was going to cost AU$1000 to land a single capacitor in Australia from one US supplier. I did source some massive high voltage Russian devices for a reasonable cost from Poland – I will investigate using these in a future project

Motor Drive for tuning

A Polulu Stepper Motor ( Unipolar/Bipolar, 200 Steps/Rev, 42×48mm (NEMA17) , 4V, 1.2 A/Phase – Polulu #1200) was used to drive the capacitor. The capacitor traverses its adjustment range in half a turn and can be rotated continuously. Capacitors that have a “hard” endstop such as a some “broadcast” types or a vacuum capacitor may have to have some sort of sensing so that the motor does not drive past the endstop and damage the capacitor – these stepper motors have quite a lot of torque. While it is possible to detect a motor “stall” this does not seem to be very reliable. For a multiturn capacitor some sort of linear actuator would have to be devised – I have not investigated this. Another possibility is to limit the motor drive current – this can be set in software. In this application motor speed is not an issue.

Using a motor driver board, this motor can be configured in “microstep” mode. The motor has 200 steps per revolution and the microstep option allows 32 “microsteps” per step of the motor. Thus 3200 steps are available over the range of the loop (1/2 X 200 X 32) – this is sufficient for tuning even though the loop is very “sharp”. The motor is mounted in a plastic box using Polulu hardware.

Insulated Coupling

The motor and associated circuitry must be insulated from the Loop and tuning capacitor because of the high RF voltages involved. I used a surplus plastic kitchen cutting board to make an insulated coupling, but there are no doubt other options. Three circular pieces of 40mm diameter were cut from the board using a hole saw.

Two metal couplings (Pololu Universal Aluminum Mounting Hub for 5mm Shaft, M3 Holes (2-Pack) #1998) were bolted to the plastic discs with the third disc acting as an insulator between them. Using M3 hardware the components were assembled and the shafts of the motor and tuning capacitor fixed using grubscrews. The motor shaft has a “flat” to allow firm fixation. A small depression was drilled in the shaft of the tuning capacitor to allow the grubscrew firm purchase (Fig). The diameter of the tuning capacitor shaft was such that the hole in the metal coupling had to widened slightly using a drill.

Control Logic

An Arduino Leonardo board was available from a previous project

The motor itself was driven by a second board (Polulu Tic T825 #3130) which allows proper sequencing of the coils in the stepper motor, has a rich instruction set, a motor driver and a interface circuitry which allows the board to be driven by various logic protocols including USB, I2C, TTL and serial

I used this as the first prototype for the motor control. A Polulu Stepper Motor Library is available for Arduino which simplified coding considerably. I set up push buttons for large steps and fine tuning up and down. I used the NanoVNA to find the current resonance of the loop and tune it.

The tuner requires 9-12V at 1.5A max – supply voltage and control signals are sent to the antenna via a multicore cable designed for garden irrigation controller use.

The Arduino software sketch is listed in the appendix

I am using the Tic T825 stepper control board in serial mode. The Motor serial device number must be set to its default value of 14. The Control board is an Arduino Leonardo with 4 pushbuttons normally open on lines 2,3,4,5

The Tic’s control mode must be set to “Serial/I2C/USB”. The baud rate should be set to 9600 and CRC should not be enabled. This example uses the compact protocol, so the Tic’s device number is not used, and can be set to anything.

Several libraries are included

#include <Tic.h>

at https://github.com/pololu/tic-arduino

#include <Pushbutton.h>

https://github.com/pololu/pushbutton-arduino

Originally I intended to calibrate the system so it could jump to a known position in terms of microsteps. This would allow the loop to be set to a known frequency. However I found that there was “slippage” in position and some backlash in the tuning mechanism. There is lots of scope for improvement of this system. Using the NanoVNA for tuning is somewhat slow and tedious for routine use – at some point I will develop an automatic antenna tuner – this is one of many projects for later!

I plan to use an Arduino board, an Adafruit SI5351 module as a tunable signal source and my Power Meter as a detector (see this website)

Using the Antenna

I found the antenna to be very sharp with a bandwidth of 20 KHz or so on 14 MHz

NanoVNA image -SWR on 14 MHz

So in practice I had to have some way of tuning it – I used a NanoVNA available from China. There are various copies of this device – the design is Open Source and is being constantly developed. This is a cheap but very capable Vector Network Analyser. It takes some getting used to with the small touch screen interface but it probably impossible to design and build an antenna such as this without such an instrument. So far I have made contacts on 5W SSB to all Australian states from Central Australia on 14 MHz and some contacts on 3.5 MHz from Central Australia – none would be less than 1500KM. Using low power modes such as WSPR and FT-8 on 20 and 30m I have been able to communicate worldwide. I have had less success on 80 and 40m but here I am competing using low power (5W) and noise and high power stations. Match was near perfect on 30m and 20m but less so on the lower bands

  • The Antenna on a temporary mount for testing

References

(1) Frank Dorenberg N4SPP – a very comprehensive reference. The author has gone to a lot of trouble with experiments and detailed explanations of theory

https://www.nonstopsystems.com/radio/frank_radio_antenna_magloop.htm

(2) Software libraries

https://github.com/pololu/tic-arduino

https://github.com/pololu/pushbutton-arduino

(3) Nano VNA

https://nanovna.com/

(4) Parts for motor drive – these were obtained from Core Electronics

Pololu Tic T825 USB Multi-Interface Stepper Motor Controller (Connectors Soldered)POLOLU-3130
Pololu Universal Aluminum Mounting Hub for 5mm Shaft, M3 Holes (2-Pack)POLOLU-1998
Stepper Motor: Unipolar/Bipolar, 200 Steps/Rev, 42×48mm, 4V, 1.2 A/PhasePOLOLU-1200
Pololu Stamped Aluminum L-Bracket for NEMA 17 Stepper Motors

(5) Arduino sketch

// Stepper motor control of Magnetic Loop Antenna tuning
//
// Variable capacitor which tunes loop can be rotated continuously
// Using Polulu #1200 motor 
// 200 steps/revolution - can be used in microstep mode to 1/32 steps 
// Effective number of steps 3200 as capacitor goes through full adjustment in half a rotation
//
// Using Tic T825 stepper control board in I2C serial mode 
// Motor serial device number must be set to its default value of 14.
//
// Control board Arduino Leonardo with 4 pushbuttons
// normally open on lines 2,3,4,5

// The Tic's control mode must be set to "Serial/I2C/USB".  The
// baud rate should be set to 9600 and CRC should not be enabled.
// This example uses the compact protocol, so the Tic's device
// number is not used, and can be set to anything.

#include <Tic.h>
#include <Pushbutton.h>

Pushbutton buttonA(2);
Pushbutton buttonB(4);
Pushbutton buttonC(5);
Pushbutton buttonD(6);

// Define a variable that we can use to keep track of whether we
// are in speed control or position control mode.
enum class Mode {
  Off,
  Position,
  Velocity
};
auto mode = Mode::Off;

// This is a series of positions to step to, in units of
// microsteps.  Pressing button A makes the stepper motor cycle
// through these positions.
int32_t positionTable[] = {
  0,
  5,
  7,
  35,
  75,
  -100
};

// Keep track of which position in the position table is selected.
uint8_t positionIndex = 0;
// Current position 
uint32_t position = 0;

#define POSITION_TABLE_SIZE (sizeof(positionTable)/sizeof(positionTable[0]))

// On boards with a hardware serial port available for use, use
// that port to communicate with the Tic. For other boards,
// create a SoftwareSerial object using pin 10 to receive (RX)
// and pin 11 to transmit (TX).
#ifdef SERIAL_PORT_HARDWARE_OPEN
#define ticSerial SERIAL_PORT_HARDWARE_OPEN
#else
#include <SoftwareSerial.h>
SoftwareSerial ticSerial(10, 11);
#endif

TicSerial tic(ticSerial);

void setup()
{
   // Need to wait a second or so after powerup to let serial port on
   //TIC controller board to start up 
   // delay(1000);
   // Set the baud rate.
  ticSerial.begin(9600);

  // Give the Tic some time to start up.
  delay(1000);
  
  // Using Tic T825 board  
  tic.setProduct(TicProduct::T825);
  //tic.reset();
  
  // 1/32 step microsteps 
  tic.setStepMode(TicStepMode::Microstep32);
  // Current limit 1000mA
  tic.setCurrentLimit(1000);
  // Max Rotation speed - 400 steps/sec approx 8 sec to do a complete //tune of the antenna
  tic.setTargetVelocity(400000); 
  // Will jump to this speed at start - 50 steps/sec
  tic.setStartingSpeed(50000);
  // Accelerate at 100 steps/sec/sec
  tic.setMaxAccel(10000);
  
       
  // Set the Tic's current position to 0, so that when we command
  // it to move later, it will move a predictable amount.
  // - do this once only with the capacitor set to max
  //tic.haltAndSetPosition(0);
  
  // Tells the Tic that it is OK to start driving the motor.  The
  // Tic's safe-start feature helps avoid unexpected, accidental
  // movement of the motor: if an error happens, the Tic will not
  // drive the motor again until it receives the Exit Safe Start
  // command.  The safe-start feature can be disbled in the Tic
  // Control Center.
  //tic.exitSafeStart();
}

// Sends a "Reset command timeout" command to the Tic.  We must
// call this at least once per second, or else a command timeout
// error will happen.  The Tic's default command timeout period
// is 1000 ms, but it can be changed or disabled in the Tic
// Control Center.
void resetCommandTimeout()
{
  tic.resetCommandTimeout();
}

// Delays for the specified number of milliseconds while
// resetting the Tic's command timeout so that its movement does
// not get interrupted by errors.
void delayWhileResettingCommandTimeout(uint32_t ms)
{
  uint32_t start = millis();
  do
  {
    resetCommandTimeout();
  } while ((uint32_t)(millis() - start) <= ms);
}

// Polls the Tic, waiting for it to reach the specified target
// position.  Note that if the Tic detects an error, the Tic will
// probably go into safe-start mode and never reach its target
// position, so this function will loop infinitely.  If that
// happens, you will need to reset your Arduino.
void waitForPosition(int32_t targetPosition)
{
  do
  {
    resetCommandTimeout();
  } while (tic.getCurrentPosition() != targetPosition);
}

void loop()
{
   if (buttonA.isPressed() && buttonB.isPressed())
  {
         
    // Both button A and button B are pressed.
    // Set current position as zero 
      tic.haltAndSetPosition(0);
  }
  
  if (buttonA.isPressed())
  {
       // Move up in frequency by 200 steps with each press of button B 
 
    digitalWrite(LED_BUILTIN, HIGH);   // turn the data LED on
    tic.energize();
    tic.exitSafeStart();
    mode = Mode::Position;    
    position = tic.getCurrentPosition();
    position = position + 200;
    tic.setTargetPosition(position);    
   
    waitForPosition(position);
    tic.deenergize();
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off    

  }
  else if (buttonB.getSingleDebouncedPress())
  {
      // Move down in frequency by 200 steps with each press of button B 
 
    digitalWrite(LED_BUILTIN, HIGH);   // turn the data LED on
    tic.energize();
    tic.exitSafeStart();
    mode = Mode::Position;    
    position = tic.getCurrentPosition();
    position = position - 200;
    tic.setTargetPosition(position);    
   
    waitForPosition(position);
    tic.deenergize();
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off    
  }
  else if (buttonC.getSingleDebouncedPress())
  {
    // Move up 1 step with each press of Button C  
 
    digitalWrite(LED_BUILTIN, HIGH);   // turn the data LED on
    tic.energize();
    tic.exitSafeStart();
    mode = Mode::Position;
    position = tic.getCurrentPosition();
    tic.setTargetPosition(position + 1);
    //waitForPosition(position+1);
    
    // If the button is still pressed - continue to move one step at a time
    delay(100);
    while (buttonC.isPressed())
    {
        position = tic.getCurrentPosition();
        tic.setTargetPosition(position + 1);
        //waitForPosition(position+1);
    }
    // 
    tic.deenergize();
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off    
    

  }
    else if (buttonD.getSingleDebouncedPress())
  {
    // Move down one step with each press of Button D 
 
    digitalWrite(LED_BUILTIN, HIGH);   // turn the data LED on
    tic.energize();
    tic.exitSafeStart();
    mode = Mode::Position;
    position = tic.getCurrentPosition();
    tic.setTargetPosition(position-1);
    //waitForPosition(position-1);
    // If the button is still pressed - continue to move one step at a time
    delay(100);
    while (buttonD.isPressed())
    {
        position = tic.getCurrentPosition();
        tic.setTargetPosition(position - 1);

    }    
 
    tic.deenergize();
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off    
  }
}


/*  // Use debouncing to detect distinct presses of button A.
  if (buttonA.getSingleDebouncedPress())
  {
    // Button A was pressed.
    // Advance to the next position in the table.
    positionIndex++;
    if (positionIndex >= POSITION_TABLE_SIZE)
    {
      positionIndex = 0;
    }
    tic.setTargetPosition(positionTable[positionIndex]);
    tic.exitSafeStart();
    mode = Mode::Position;
  }

  // Prevent the command timeout error from happening.
  tic.resetCommandTimeout();

*/
//}