To pick up from part 2: I wanted to test one of u-blox's TCXO based modules to see if that improves getting a signal.
I'm also comparing these modules to each other to see how closely they agree on the current time. Expectations for GPS modules are to agree around +/- 20 nanoseconds, but that isn't a guarantee.
TCXO based modules!
I bought two u-blox TCXO based modules: a NEO-7N and a NEO-M8N. The main difference between the two is the 8 series adds support for Galileo and BeiDou satellites. They both support the GPS and GLONASS satellites.
I bought them off of two random vendors shipped from China. I suspect the NEO-7N I got was counterfit because I couldn't update its firmware. I peeled back the labels to see if the RF shields matched what other people said of their counterfit modules, and my NEO-7N did match their description. The NEO-M8N looks legit to me, and I was able to update its firmware.
Comparing the 7N with the M8N
Despite all this, these two modules agreed with each other pretty well:
This is slightly higher than I would have expected, so I compared the time offset data to a few different things. Altitude difference had an amazingly large correlation with the time offset:
This is probably from two factors: I'm using an indoor antenna - an outdoor one would have a better signal, and I'm using standard GPS modules instead of a timing one.
If I take the altitude difference (in light-nanoseconds) and remove it from the time difference, I get this graph:
Which is much better, and pretty close to my measurement limit.
This is the reported frequency of the GPS module's TCXO:
I shifted the NEO-7N's line down by 457ppb to make it easier to compare the two. The M8N's frequency was much more stable, but the 7N was pretty decent even if it was counterfit.
Summary of M8N vs 7N
The M8N also had better satellite reception, on average it saw 1 more signal than the 7N. Both of them reported a full 3D navigation lock over this entire time period, so it wasn't a large difference. Because the M8N supports more satellite systems, has a better TCXO, and had slightly better reception, I'd recommend it over the 7N.
Other GPS modules
I also compared a few other GPS modules:
Navspark-GL vs Adafruit GPS (MTK MT3339)
NEO-M8N vs Adafruit GPS
All of these modules also had an altitude based additional error. Comparing the altitude difference with the time difference with the M8N/Adafruit pair:
And comparing the time difference with the altitude difference removed:
To show that it isn't just one of the modules having large changes in altitude, here's a comparison of both of the GPS modules against what I believe is the "true altitude".
I've learned I need to change my expectation of these modules being within +/- 20ns of each other! However, GPS modules being within +/-100ns of each other seems like a reasonable expectation that would be true most of the time.