Here's the tracking performance over 93 hours. The graphs demonstrate both the frequency drift over temperature and the much more gradual drift from aging. The enclosure appears to sufficiently blunt the cyclic temperature changes, and the PID loop remains stable despite the offset jumps when the GPS recalculates its coordinate fix. I plan to eventually move the antenna outdoors which should reduce the GPS fix errors.
I noticed over the past several days, that there were occasionally momentary oscillations in the PLL feedback values. The cause turned out to be an overlooked pole in the loop transfer function: the relative PPS offset error itself. The PPS offset error is ultimately an integral with respect to the crystal frequency adjustment. I solved the instability by changing my control from a simple integral into a full PID controller. To improve the initial lock time I used two sets of coefficients:
Cp = 3.333 = (10ns / 1.5ppb) / 2s
Ci = 0.104 = (10ns / 1.5 ppb) / 64s
Cd = 0
Cp = 1.666 = (10ns / 1.5 ppb) / 4s
Ci = 0.026 = (10ns / 1.5 ppb) / 256s
Cd = 0
The derivative coefficients ended up unused because the P and I coefficients provided sufficient performance by themselves.
In addition to changing the loop controller I also overclocked the xmega to 50MHz (2x 25MHz) to increase the error resolution and ultimately reduce the loop tracking error.
I also reduced the magnitude of thermal perturbations by covering the VCXO in hot glue and cooling the bottom of the board with a low speed fan. This reduces the overall operating temperature will preventing sudden jumps in frequency from stray air currents. The final board will have a VCTCXO and be kept in an enclosure which will further reduce thermal sensitivity.
Since the current board layout and software have proven to work, I've replaced the SiT 3807 VCXO with the SiT 5156 VCTCXO on the final board revision. The TCVCXO is considerably more expensive which is why I performed the prototyping stage with the less expensive VCXO.