So, the OCXO saga turns into the GPSDO saga.
I've got a very early prototype of a GPSDO up and running with one of the OCXOs that we were all buying like flies...
Very early days. This is just a trial pass at the core of things, proof of concept before getting anywhere near finalising an actual circuit design and thinking about actually spinning up a board. The current version relies on having a GPS receiver up and running producing valid PPS signals - no initialisation code for the GPS (heck, nothing but a PPS signal at the moment) I'm using a Trimble Resolution-T timing receiver that I already had around, its twin is the PPS source for my NTP server. The DAC I'm using for EFC in the lash-up is a crappy MCP4822 (12 bits 0-4.095V) that produces about 1 LSB of noise on the output and no filtering.
I'm using a truly simple control loop initially, just averaging the count from the OCXO (made with an STM32 timer in capture mode at 100 MHz, said 100MHz derived via PLL from the OCXO) over 100 seconds and making corrections once every 100 seconds on that basis. Haven't even done more than acknowledge that z-transforms, FIR and IIR filters exist and that I'm ignoring them for the time being. No proper analysis has gone into this beyond "Well, the PPS has ~10ns of innate jitter and another ±20ns from quantization jitter - that'll all have to be filtered out".
Results with such a crude setup are promising. Here's the debug output looks like from the latest run (ignore the 'frequency' figures once it gets into the main loop, the crappy printf library I'm using craps out beyond 8 digits of precision and truncates things as a consequence):
========== STM32F411 starting. ==========
Git hash: e2055dfa37582e14a92371c358e003e9395c6991
Creating blinky.
Initialising SPI1 ...done.
Setting DAC for OCXO MIN f calibration.
MIN frequency = 9999987.000000000
Setting DAC for OCXO MAX f calibration.
MAX frequency = 10000016.000000000
OCXO EFI gain = 7.160763740 Hz/Volt, 0.007114774 Hz/DAC step
Setting DAC to initial trial set point.
DAC set to 2000 (2.0163V).
frequency = 10000000.00Hz, error = 0.3100Hz, DAC correction = -43, new DAC value = 1957 (1.9736V)
frequency = 10000000.00Hz, error = -0.0460Hz, DAC correction = 6, new DAC value = 1963 (1.9795V)
frequency = 10000000.00Hz, error = 0.0030Hz, DAC correction = 0, new DAC value = 1963 (1.9795V)
frequency = 10000000.00Hz, error = 0.0109Hz, DAC correction = -1, new DAC value = 1962 (1.9785V)
frequency = 10000000.00Hz, error = 0.0099Hz, DAC correction = -1, new DAC value = 1961 (1.9776V)
frequency = 10000000.00Hz, error = -0.0010Hz, DAC correction = 0, new DAC value = 1961 (1.9776V)
frequency = 10000000.00Hz, error = 0.0049Hz, DAC correction = 0, new DAC value = 1961 (1.9776V)
frequency = 10000000.00Hz, error = 0.0060Hz, DAC correction = 0, new DAC value = 1961 (1.9776V)
frequency = 10000000.00Hz, error = 0.0120Hz, DAC correction = -1, new DAC value = 1960 (1.9766V)
frequency = 10000000.00Hz, error = 0.0099Hz, DAC correction = -1, new DAC value = 1959 (1.9756V)
frequency = 10000000.00Hz, error = 0.0049Hz, DAC correction = 0, new DAC value = 1959 (1.9756V)
frequency = 10000000.00Hz, error = 0.0010Hz, DAC correction = 0, new DAC value = 1959 (1.9756V)
frequency = 10000000.00Hz, error = 0.0040Hz, DAC correction = 0, new DAC value = 1959 (1.9756V)
frequency = 10000000.00Hz, error = 0.0030Hz, DAC correction = 0, new DAC value = 1959 (1.9756V)
frequency = 10000000.00Hz, error = 0.0020Hz, DAC correction = 0, new DAC value = 1959 (1.9756V)
frequency = 10000000.00Hz, error = 0.0010Hz, DAC correction = 0, new DAC value = 1959 (1.9756V)
frequency = 10000000.00Hz, error = 0.0049Hz, DAC correction = 0, new DAC value = 1959 (1.9756V)
frequency = 10000000.00Hz, error = 0.0099Hz, DAC correction = -1, new DAC value = 1958 (1.9746V)
frequency = 10000000.00Hz, error = 0.0030Hz, DAC correction = 0, new DAC value = 1958 (1.9746V)
frequency = 10000000.00Hz, error = 0.0049Hz, DAC correction = 0, new DAC value = 1958 (1.9746V)
frequency = 10000000.00Hz, error = 0.0049Hz, DAC correction = 0, new DAC value = 1958 (1.9746V)
frequency = 10000000.00Hz, error = 0.0049Hz, DAC correction = 0, new DAC value = 1958 (1.9746V)
frequency = 10000000.00Hz, error = -0.0069Hz, DAC correction = 0, new DAC value = 1958 (1.9746V)
frequency = 10000000.00Hz, error = -0.0010Hz, DAC correction = 0, new DAC value = 1958 (1.9746V)
frequency = 10000000.00Hz, error = -0.0030Hz, DAC correction = 0, new DAC value = 1958 (1.9746V)
You're looking at 2500 seconds in the main control loop there, a bit of 40 minutes of operation. Wandering about by a few mHz isn't shabby, especially for such a crude lash-up. Currently has a rather poor constellation of satellites in view for the GPS, so take with a small pinch of salt.
On a slightly different front, my TTi TF930, which I last calibrated and adjusted over a year ago, is only ~8.5 ppb out versus GPS. Creditable, very creditable.