
Originally Posted by
ddrown
Yes, I'm using the firmware defaults for the adafruit GPS, which is 9600 and no ZDA message. I'm also using an external antenna on a windowsill. Without an external antenna, I get bad reception.
I purchased active antenna and placed it on windowsill attached to my adafruit ultimate GPS, and i no longer lose lock. Settings were 9600 with GPS_USES_RMC. offset/drift look good with GPS PPS and disciplined T4.1 clock and 1088 NTP server. I also tested a u-blox NEO-M8U GPS with the external antenna and the 1088 NTP server. I added T4 temperature to table output. Offset and drift plots below


On u-blox GPS I enabled ZDA, disabled some other NMEA sentences, and set baud to 115200. Fix with 12 satellites and HDOP 0.8
Below is drift during early morning hours probably showing 17 minute HVAC cycles. Used u-blox PPS interrupts with T4.0 GPT @ 150MHz.

Code:
38553 secs 149998303 ticks -11.313 -11.319 ppm 58.8 C
38554 secs 149998303 ticks -11.313 -11.319 ppm 58.8 C
38555 secs 149998303 ticks -11.313 -11.319 ppm 58.8 C
38556 secs 149998306 ticks -11.293 -11.319 ppm 58.8 C
38557 secs 149998303 ticks -11.313 -11.319 ppm 58.8 C
38558 secs 149998304 ticks -11.307 -11.319 ppm 58.8 C
I can't really see the temperature cycles in the MCU temperature data, but a separate I2C temperature sensor (Si7021) does reveal the HVAC cycles. Roughly if temperature changes 1.0 C then MCU frequency changes 0.067 ppm
Here are two plots showing change in drift versus temperature. PPS samples every second. HVAC cycle about 500 seconds.


(The active antenna also fixed the GPS signal problems that I was seeing on mbed board)

Crystal stability looks good (Allan deviation) over 24 hours using u-blox PPS interrupts with T4.0 GPT @ 150MHz. tau is in seconds.
Code:
#!/usr/bin/python
# allan deviation
# zcat gps3gpt150.tmp.gz | awk '{ print ($3 - 150000000)/150000000}' | allan.py
import matplotlib.pyplot as plt
import numpy as np
import sys
taus = np.array([1,3,10,100,300,1000,3000,10000, 30000])
x = []
#for line in sys.stdin.readlines():
for line in sys.stdin:
val = float(line)
x.append(val)
x = np.array(x)
n = x.size
dev = np.array([]) #Create empty array to store the output.
for tau in taus:
currentSum = 0
for j in range(0,n-2*tau):
currentSum = (x[j+2*tau]-2*x[j+tau]+x[j])**2+currentSum #Cumulate the sum squared
devAtThisTau = currentSum/(2*tau**2*(n-2*tau)) #Divide by the coefficient
dev = np.append(dev,1.e6*np.sqrt(devAtThisTau))
print dev
plt.title("allan deviation")
plt.xlabel("tau (s)")
plt.ylabel("allandev (PPM)")
plt.yscale('log')
plt.xscale('log')
plt.grid()
plt.plot(taus, dev, 'o', label='Original data', markersize=5)
plt.plot(taus,dev, 'r', label='Fitted line')
plt.show()
also see attached alavar5.2 pdf (zip)