Skip to content

Making a Rubidium GPSDO

For the last couple of months I have worked on a number of small projects, including the repair of a Rubidium frequency standard that I bought cheaply off of Ebay. But while these frequency standards have exceptional stability and aging characteristics, they still need to be calibrated from time to time.

For that purpose, I bought a 10-digit frequency counter, a Racal 1998. I also obtained a number of GPSDOs. GPSDO is short for "GPS Disciplined Oscillator". You can buy them for less then €100 as they are commonplace telecom equipment and found as frequency and time references in cellular network base stations. Network operators replace them routinely and the scrap can be found on the usual online marketplaces.

A GPSDO consists of a local oscillator of good quality and a GPS receiver. Most of the time the LO is an OCXO, an Oven Controlled Crystal Oscillator. As the name suggests, an OCXO is a crystal oscillator where the crystal is heated to a stable temperature well above room temperature (50°C to 60°C is not uncommon). This heating foregoes crystal aging and reduces the frequency drift to a few PPB over time. It also reduces the influence of environmental temperature changes, which would otherwise affect the stability of the oscillator output.

The GPS receiver provides a timing reference, typically in form of a 1PPS (one-pulse-per-second) signal that has exceptional long-term stability. The timing signal is used to compensate the remaining aging of the LO. A GPSDO combines the short-term stability of a crystal oscillator with the long-term stability of an exact timing reference.

The concept of the GPSDO got me interested and I started wondering how it could work. The trivial approach is, as the timing pulses arrive in constant intervals, it should be easy to just count the cycles of the LO between two pulses and adjust its frequency according to the result. However, the frequency of the LO is usually 10MHz, i.e. 100ns cycle time. That would result in a frequency accuracy of only +/- 100ns/s, or 100ppb. For a 10MHz frequency, that computes to +/- 1Hz of deviation. Definitely not very accurate, and the output would wander between the two extremes constantly, so it wouldn't be very stable, either. Another appruach is needed.

Over on the EEVBlog forum I found a number of DIY GPSDO projects and one of them intrigued me through its simplicity and performance. Conceptually, it is similar to a number of other DIY projects: Instead of implementing a frequency counter, a PLL compares the phase offset between the time signal pulse and a selected edge of the LO output. This phase offset is then eliminated by the PLL regulation.

A very simple implementation of this design is the GPSDO by James Miller, G3RUH (link). The output of an XOR phase discriminator is low-pass filtered, buffered and directly applied to the control input of an OCXO.

Another design variant feeds the output of the phase discriminator into the ADC of an Arduino (or similar) micro controller, which then implements a PLL in software to lock the LO to the GPS timing signal. These designs achieve a measurement resolution in the single nanosecond range. Averaging the measurements over a longer time period (hundreds of seconds) achieves the necessary stability. The most simple implementation of this design is Lars Walenius' DIY GPSDO, which was discussed on the EEVBlog forum in great detail.

The design I came up with, with the help of  other forum members, follows the same principle but uses an integrated Time-To-Digital converter instead of an analog interpolator. This avoids some of the problems with temperature drift and selection of suitable components that complicate reproducibility of Lars Walenius' design.

The heart of the design is the TDC7200 by Texas Instruments. Its original use case are ultrasonic flow meters but at its guts it's just a stopwatch. It measures the time between a start and a stop signal presented to its inputs. With a resolution of around 55 picoseconds it's much more sensitive than needed. It's cheap, requires only few external components and can be controlled through a SPI interface.

The following graphic shows a high-level outline of the GPSDO.

GPSDO High-Level Design

The timing signal from the GPS receiver (1PPS) is fed into a Time Interval Counter (TIC) together with a 10MHz reference signal from the LO. In my case, the LO is a Datum LPRO-101 Rubidium frequency standard. A small micro controller, an STM32F042, acts as the central intelligence of the system. It reads the measured time interval between the GPS 1PPS signal and a selected edge of the LO signal and computes a correction factor to be applied to the LO frequency. A DAC converts the correction factor to an analog voltage which is then applied to the adjustment input of the LO.

The controller also connects to the GPS receiver to allow configuration of the time pulse, start a self-survey, provide a known location or simply query status of visible and tracked satellites.

The GPS receiver itself is a Ublox NEO-M8T timing receiver that can work in "overdetermined clock" mode to achieve better precision of the time pulse signal. I bought two modules on Ebay for about 25€ each and designed a small breakout PCB that can be plugged onto the main GPSDO PCB.

3D rendering of the GPSDO

The project is more or less complete now and I'm working on a few minor improvements, but the design itself has been verified and it works very well.

9 thoughts on “Making a Rubidium GPSDO

  1. Robert Darby

    Matthias,
    I've been looking at a breakout board for several m8t's I have on hand. I wonder if you would be willing to share your Kicad file of the GPSDO or just the GPS board?
    Project looks great, wish I had the skills to do something like it.
    Regards,
    Bob Darby

    Reply
      1. matze

        Hi Bob, if you're still interested in a Ublox M8 breakout board, I've published a repository called 'ublox-breakout' on my github account. The main branch is for a LEA-M8, but I'll update the project with a breakout board for the NEO-M8, too.

        Reply
  2. Zdenek

    Hi Matthias,

    I would love to build this myself. Do you have Kicad files available yet? Anything I can kickstart the design?

    Thank you

    Reply
    1. matze

      Hi Zdenek,

      I don't have the KiCAD files online yet. The project got somehow superseded by a OCXO cape I'm making for the Beaglebone Black, and then both projects got preempted by other matters. I'll get to it eventually, though I'm not sure if I'm going to publish the PCB for the Rb-GPSDO. The Beaglebone cape can do the same and can easily work with any Rb frequency standard that has an analog input for frequency adjustment.

      Reply
  3. Renee

    Hi Matthias,

    Have you made any decision yet if you will be completing the PCB for the Rb-GPSDO or the OCXO cape? I i would like to get my hands on either one but preferably the Rb-GPSDO, KICAD files would be fantastic!

    I really appreciate all of the work that you have put in your projects, they are great designs. Im starting to make the ublox-breakout and also the UCCM-connector

    Thank You

    Reply
    1. matze

      The Rb-Only version is pretty much canned, I think. I'm pretty sure I won't continue development there. The OCXO-Cape is on hiatus, I really don't have time a the moment to continue development.

      Reply
  4. Lena

    Hey Matthias,

    do you have adapted Lars GPSDO code to use TDC7200 and I2C DAC?
    Also his code is very well documented it hard for me to understand all off his sometimes tricky code.
    It would be a great help for me, if you can share your adapted version.

    vy 73 & tnx de DL9LC, Lena

    Reply
    1. matze

      Hi Lena,

      I've looked at Lars' code in the beginning to understand how his software worked, but I have since gone and written my own program based on a very, very different architecture. I never used or modified his original Arduino sketch or ran it on my design, I've built something from the ground up.

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *