GPS disciplined oscillator

I needed a frequency reference for my projects (gpsdo style) at 10 MHz

Fast forward:

There are two designs (and i have build them both) that work out of the box and are stable enough for my measurements

This one is FLL based×16-With-LED/

This one is PLL based

Pros and cons

The FLL has a correction every 1000s /around 16 minutes. Assuming no temperature changes and small drift of the OCXO is more than enough

The PLL based is more sophisticated can also has a quick adjustment to any frequency change

I used the following for both versions (on a prototype board 10cmx16cm)

Project Case 55x106x150mm

GPS antenna

U.FL IPX IPEX UFL to RP-SMA SMA Female Male Pigtail

Don’t spend time at all trying to adjust the NEO to produce 10 MHz as output


Remote the autoreset of the Arduino: 10uF cap between Rst and Gnd is the recommended way to temporarily disable autoreset.

I had an OCXO with sine wave output and DC Offset. Had to remote it with a 100nF capacitor and use one of the gates of the 74AC04/74AC14 to amplify it.

74AC04 => 10 MHz to pin 13, output of pin 12 (filtered) 10 MHz to Pin 1/Pin 3
Output Pin2/Pin4 with 100 ohm in parallel and a small filter ->Sinewave
Another one in out TTL out

Bypass cap 4.7uF/ 10uF close to the OCXO

LM35 filtering: Low pass filter, 68 Ohm in series with the data line and a 10uF capacitor to ground.

Running for the first time:

After 5 minutes with the OCXO warmed up, Press: “h1” and check the field diff_ns. (the same for h63535)

h1 => diff_ns => 1500
h65535 => diff_ns -1400
sum = 2900
gain = 65535/2900 => g22

Frequency accuracy

Just to get an idea of what ppm means vs seconds per month..

10MHz (with 100 ppm)
=> 10MHz +- 1000 Hz
=> 100 ppm => 100/1000000 total error on a day is 86400 * 1e-4 => 8.64 seconds per day => 259.2 seconds per month

10MHz (with 10 ppm)
=> 10MHz +- 100Hz
=> 10 ppm => 10/1000000 total error on a day is 86400 * 1e-5 => 0.864 second per day = > 25.92 seconds per month

10MHz (with 1 ppm)
=> 10MHz +- 10Hz
=> 1 ppm => 1/10000000 total error on a day is 86400 * 1e-6 => 0.0864 second per day = > 2.592 seconds per month

10MHz (with 0.1 ppm)
=> 10MHz +- 1Hz
=> 0.1 ppm => 0.1/1000000 total error on a day is 86400 * 1e-7 => 0.00864 second per day = > 0.2592 seconds per month

10MHz (with 0.01 ppm)
=> 10MHz +- 0.1Hz
=> 0.01 ppm => 0.01/1000000 total error on a day is 86400 * 1e-7 => 0.000864 second per day = > 0.02592 seconds per month

GPS based reference (ignore it, i leave it here for reference ONLY)

In addition having a 10MHz frequency reference (which can be divided also to 1MHz, 100KHz, 10KHz, 1KHz and 100Hz) is a nice to have tool on the bench.

I decided to split it into two phases:
First get a 10 MHz signal from the GPS to try it using the PPS output,
Second switch the PPS to 1Hz and make it a real GPS DO with the my Isotemp OCXO-131

For my GPS locked Frequency Reference Standard 🙂 i bought a u-blox NEO-7M Module (uBlox Neo-7M GPS) for 13 USD.

u-blox makes great GPS receivers and getting a module should speed up the breadboard design.

This modules comes without a PPS pin. This can be easily solved by using a 5-pin header (use a wire cutter to trim the 5 pin directly to the plastic) and a piece of wire connected to the on board led




I run the board on 3.3V and i already had a 3.3V RS232 converter handy.

u-blox provides a tool called ucenter (used version 8.23)

GPS is already configured at 9600 bps

Start your ucenter
Receiver -> Port -> COM3 (replace with your com port)
Change your configuration to the below (for 10 MHz on PPS on locked and 5 Hz when unlocked)


And press send


First issue encounter was the jitter on the 10MHz. NEO-7M uses a 48 MHz crystal internally and it cannot be divided exactly for 10 MHz…

Scope outputs
NEO-7M 8 MHz pps

NEO-7M 12 MHz pps

And our favorite for 10 MHz…
NEO-7M 10 MHz pps

I still don’t know if i should use a 10 MHz crystal as a filter and then a schmitt trigger to give a clean square wave output.

Use a ground plane for the ceramic antenna, it’s a huge difference on, a simple one side PCB will do the trick, place the ceramic antenna ontop

Loosing settings

The backup current needed for NEO-7M is 10μA. The capacitor selected on this board is a a XH414HG which has 30μAH capacity till it reaches the 2V… Seriously… max 2.5 hours disconnected from the power and you loose the settings created above… Solved by using a CR2032 and a diode

Using just the GPS for 10MHz output is a NO GO

2 Comments on “GPS disciplined oscillator

  1. Hi Billy,
    very interesting project (didn’t know that you could convince that GPS module to output a GPS synchronised 10 MHz signal instead of 1 pps)!
    Really can’t wait to read how this project is going on…

    73, Joe

Leave a Reply

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