Los módulos GPS con salidas de 1pps son fáciles de conseguir y baratos.
No es realmente necesario disciplinar el oscilador de la CPU al GPS (por ejemplo, con un PLL). Mientras puedas "marcar el tiempo" de los eventos externos en relación con el reloj de la CPU, es relativamente sencillo interpolar el tiempo de tus eventos de transmisión y recepción de ondas entre dos eventos PPS cualquiera.
A menudo se puede utilizar la combinación de un temporizador de hardware en el microcontrolador, junto con un contador de software para sus eventos de desbordamiento, para crear un contador de ciclos de la CPU de ancho arbitrario. Puede ser complicado manejar correctamente los eventos de desbordamiento, tanto del contador de hardware como del contador de software, pero al final, puedes tener, digamos, un contador de 32 bits que cuente a la velocidad del reloj de la CPU (dando una alta resolución) y se desborde con un período más largo que los intervalos que estás tratando de medir (por ejemplo, 429 segundos a 10 MHz).
Puedes usar este contador para marcar el tiempo de diferentes eventos externos. Si uno de esos eventos son pulsos de 1pps de un receptor GPS, entonces la precisión básica a largo plazo del reloj de la CPU se convierte en un no importa. Lo único que importa es su estabilidad a corto plazo. Puedes guardar las marcas de tiempo del GPS en un buffer FIFO, y comparar las marcas de tiempo de otros eventos con los valores de ese buffer. Como sabes que los pulsos del GPS están exactamente a un segundo de distancia, puedes encontrar la hora exacta de cualquier otro evento interpolando.
Supongamos que \$GPS_n\$ y \$GPS_{n+1}\$ son las marcas de tiempo del reloj de la CPU para dos pulsos sucesivos del GPS. También se conocen las horas reales (del reloj atómico) asociadas a cada uno de esos pulsos (a partir de los mensajes del GPS), \$Time_n\$ y \$Time_{n+1}\$ . Si \$Ext\$ es la marca de tiempo del reloj de la CPU para algún evento externo que desee medir y que caiga entre \$GPS_n\$ y \$GPS_{n+1}\$ su hora exacta es:
$$Time_n + \frac{Ext - GPS_n}{GPS_{n+1} - GPS_n}$$
Por último, si tienes esta configuración funcionando en dos sistemas separados, cada uno con su propio receptor GPS, puedes comparar los tiempos calculados para varios eventos en los dos sistemas con alta precisión (normalmente del orden de ±100 ns), incluso si los relojes de la CPU de los dos sistemas no están sincronizados.