TCXO and hotspot frequency accuracy: why the modem drifts
The hotspot is assembled, provisioning went through, the logs look clean, the radio is sitting half a metre from the board — and there's no link. Or there is a link, but the data quality is terrible: packets drop, Last Heard flickers, SMS don't arrive, and the modem's BER in the logs keeps climbing. In nine cases out of ten the root of the problem isn't "buggy software" or a "bad radio" but frequency drift: the hotspot transmitter's actual frequency differs from the one the radio is listening on by several kilohertz. And the main culprit behind this drift is the reference oscillator on the modem board. Let's work out why a cheap crystal "wanders", what a TCXO is, and how to fix drift both in software and in hardware.
Symptom: the radio is right there, but there's no link
The classic picture of frequency drift looks like this:
- The radio and hotspot are on the same desk, RSSI is excellent (-40…-50 dBm), but decoding falls apart.
- BER in the modem logs is consistently high — not occasional spikes but a steady 3–10 % and above, whereas the norm for confident reception is a few tenths of a percent.
- Reception works worse in one direction than the other: the radio hears the hotspot but the hotspot doesn't hear the radio, or vice versa.
- In the morning there's a link; by evening (once the board has warmed up inside its case) it's gone. Or the other way around: a "cold" hotspot is silent, then comes alive after 10–15 minutes of warming up.
That last point is an almost certain diagnosis of temperature drift. If the behaviour depends on how long the modem has been running and how hot it has become, the problem is precisely the stability of the reference oscillator.
Cause: the crystal drifts with temperature and tolerance
The heart of any radio modem is the reference oscillator, which sets the baseline for the frequency synthesizer. On budget boards this is an ordinary crystal resonator (XO) at 12 МГц or 14,7456 МГц with no compensation whatsoever. Such a crystal has two flaws.
Initial tolerance. The rated accuracy of a cheap crystal is on the order of ±20…±50 ppm (parts per million). At an operating frequency of 434 МГц, even 10 ppm already amounts to 4,34 кГц of drift. That means two identical boards from the same batch can leave the factory differing in frequency by several kilohertz simply because of the manufacturing tolerance of the resonator.
Temperature drift. A crystal's frequency wanders with temperature along a characteristic parabolic curve. With an ordinary XO the coefficient can reach the same ±20…±40 ppm across the operating temperature range. When the board heats up — from its own consumption, from the Pi processor underneath it, from a closed case, from summer heat — the carrier creeps away. This is exactly why a hotspot "drifts" during operation: a cold start gives one frequency, the warmed-up state gives another.
Add the tolerance and the drift together, and you get a modem that neither sits on the factory frequency nor stays put.
What a TCXO is and how it fixes this
TCXO (Temperature Compensated Crystal Oscillator) is a temperature-compensated crystal oscillator. Inside the package, besides the resonator itself, there's a compensation circuit: it measures temperature and adjusts the load on the crystal to compensate for that very parabolic drift curve. The output is a stable frequency regardless of warm-up.
The numbers speak for themselves. A typical TCXO for MMDVM boards has an accuracy of ±0,5…±2 ppm against ±20…±50 ppm for a bare crystal. At 434 МГц that's the difference between drifting by hundreds of hertz and drifting by several kilohertz. And, more importantly, the TCXO holds that frequency across the temperature range — the hotspot behaves the same whether cold or warmed up.
The practical takeaway: a TCXO doesn't eliminate calibration (you still need to dial in the initial offset in software), but it removes the wandering. Without it you calibrate once when cold, and an hour later everything has shifted again.
How this shows up on ADF7021 boards
Most amateur hotspots are built around the ADF7021 transceiver — this includes both the HS_Hat (single-band boards for the Raspberry Pi) and the Dual_Hat (dual-band). The ADF7021 itself is a good chip, but its frequency stability depends entirely on the external reference oscillator fed to its REF input.
This is where the main difference between board versions lies:
- Boards without a TCXO (early and the cheapest HS_Hat clones) are clocked by an ordinary crystal. They're cheaper but suffer from all the problems described: they absolutely must be calibrated, and they tend to drift when warmed up.
- Boards with a TCXO (quality HS_Hat and most Dual_Hat) fit a ±1…±2 ppm oscillator on the reference input. These hold frequency stably and need only a one-time offset adjustment.
If you're choosing between options, the difference between boards is covered in detail in the article on HS_Hat or Dual_Hat. For fighting frequency drift, the presence of a TCXO is a far more significant criterion than the number of bands.
Software fix: RXOffset, TXOffset and calibration by BER
The initial frequency offset (the one from factory tolerance) is fixed without a soldering iron — in software. The MMDVM configuration has two parameters:
- RXOffset — the receiver frequency correction, in hertz.
- TXOffset — the transmitter frequency correction, in hertz.
These offsets shift the actual frequency relative to the one set in the firmware, compensating for the reference oscillator's drift. The goal of calibration is to find the values at which BER is minimal. The easiest approach is to work from the observed BER: set the radio to a fixed frequency, transmit from the hotspot, and tweak TXOffset until the BER in the logs drops toward zero; then, working in the reverse direction, dial in RXOffset. This procedure and the tool for it are described step by step in the guides on frequency calibration and MMDVMCal step by step.
For what counts as a good result, see the article BER: the norm: the target is a steady few tenths of a percent and below. In parallel it's worth checking that the reception level is set correctly, otherwise a good BER can be confused with a gain problem — there's more on that in the note on RSSI calibration.
An important limitation. Software calibration fixes a single offset — for the temperature at which you calibrated. On a TCXO board this works beautifully: dial it in once and forget it. On a board without a TCXO calibration handles the tolerance but not the drift — the board warms up, and the chosen offset is wrong again. This is a fundamental distinction: software fixes a constant offset, hardware compensation fixes the wandering.
Hardware fix: a board with a TCXO
If the hotspot consistently drifts precisely when it warms up and no TXOffset holds for longer than half an hour — this can't be cured in software. The options:
- Replace the board with a TCXO version. The most reliable and, all the frustration considered, the cheapest solution. The price difference between a clone without a TCXO and a proper board is trivial compared with the time wasted.
- Re-solder the reference oscillator. For those comfortable with a soldering iron: swap the crystal for a TCXO of the same frequency with an output compatible with the ADF7021's REF input. This requires care and an understanding of exactly which signal the chip expects.
- Stabilize the thermal regime. A half-measure: move the board out of a cramped case, provide airflow, eliminate heating from the Raspberry Pi. It reduces the amplitude of the drift but doesn't remove it.
When choosing a band and an offset margin, it helps to understand the modem's tuning limits — that's covered in the note on modulation and tuning range.
How to measure the drift
Before fixing anything, you need to see the drift in numbers. A few practical methods:
- By BER during a sweep. The most accessible method without instruments: change TXOffset in steps of, say, 200–300 Гц and record the BER at each step. You get a "bathtub" — the frequency with the minimum BER is your actual offset. The distance from zero to that minimum is the magnitude of the drift.
- Warm versus cold. Calibrate the board right after power-on and record the optimal TXOffset. Let it run for an hour in its case and repeat the sweep. The difference in the optimal offset is the temperature drift of your particular unit. A large spread = no TCXO.
- Against a reference. If you have an SDR receiver or a spectrum analyzer, put the hotspot into carrier mode (CW calibration in MMDVMCal) and look at the actual frequency against the set one directly.
Practical tips
- Calibrate on a warmed-up board — in the regime the hotspot actually operates in, not right after power-on.
- If the drift is more than ±2 кГц and depends on temperature — don't torment the software, the board has no TCXO, get a different one.
- Write down the chosen RXOffset/TXOffset — after a re-flash or a config update they're easy to lose.
- Calibrate RX and TX separately: the ADF7021 may have a different offset on receive and transmit, and a single common offset isn't always correct.
- Don't chase zero at any cost — a steady 0,1–0,3 % BER on a warmed-up board already gives a confident link.
A stable hotspot is the foundation of a reliable network
Stable data reception is critical for SMS and Last Heard in DMRhub: frequency drift hits these features first. We cover calibration in detail in our guides.
Sources
- Jonathan Naylor (G4KLX). MMDVMCal — the MMDVM calibration utility. github.com/g4klx/MMDVMCal
- Analog Devices. ADF7021 — High Performance Narrow-Band Transceiver IC, datasheet.
- Jonathan Naylor (G4KLX). MMDVMHost — the RXOffset/TXOffset parameters in MMDVM.ini. github.com/g4klx/MMDVMHost
- Application note on using a TCXO as a reference oscillator in narrowband transceivers (general theory of ppm and the temperature drift of crystal resonators).