GPS PPS drift when it has no signal

Question: What happens to a GPS receiver's pulse per second (PPS) when it loses signal for a long time?

To answer this, I first moved the antenna away from the window and put it in an anti-static bag.

antenna in anti-static bag

I did this on the 16th at 01:02 GMT. Below is a graph of the percent of time satellites were reported as "0dB signal to noise" or "no signal". Normally it'd be around 50%. I took another step on the 18th to reduce the signal further, and I'll go into more detail on that in a minute. With just the anti-static bag, the GPS receiver didn't have any signal between 83%-100% of the time.

GPS satellites at 0dB signal-to-noise

The module needs a signal from 3+ GPS satellites at the same time to get a position lock, so it spent all its time without a lock. Normally the GPS receiver would have a position lock more than 99% of the time.

Percent of time spent in GPS lock

Since this GPS receiver is a "navigation" model, it doesn't have the fancy features of the "timing" GPS receivers. This means it needs a GPS position lock in order to know the local time.

Just in case the GPS receiver was keeping time sync with the small amounts of signal, I added aluminum foil covering on the 18th at 01:58 GMT. You can see the dramatic impact on the satellite signals above.

aluminum foil over antenna

Through all this, the GPS receiver continued to produce a PPS signal, but it slowly drifted off the correct time. The graph below shows the PPS signal drifting roughly 250us-500us/day, which is between 3ppb (parts per billion / 10^-9) and 6ppb. The GPS receiver is a Navspark mini, which has a TCXO inside of it. My measurements of the TCXO of a Navspark-GL are here: timer and pwm

Local Clocks

This drift would probably be larger if there were larger changes in temperature. I am surprised at this result, I would have expected a much larger drift (my expectations were 33x bigger than what happened).

At the 2ms offset, ntpsec rejected my PPS refclock and switched to the NMEA/SHM refclock. You can see below that the local clock was swinging pretty wildly between -2ms and +8ms because of the NMEA refclock. ntpsec switched to the NMEA refclock because I had it set to prefer. The "tos mindist" setting was at its default value, 1ms.

Local Clocks, after PPS reject

For my next tests, I want to experiment with a lower mindist setting and a better failover configuration.