GPS disciplined oscillator

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

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

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

ISOTEMP OCXO-131 has arrived

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

AVR ATMega328 using External clock

According to the data sheet:
To drive the device from an external clock source, EXTCLK should be driven as shown in the Figure
below. To run the device on an external clock, the CKSEL Fuses must be programmed to ‘0000’:

And Divide clock by 8 disabled

avrdude options -patmega328p -U lfuse:w:0xef:m -U hfuse:w:0xdf:m -U efuse:w:0xf9:m

To be continued

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 *