具有 1pps 输出的 GPS 模块很容易获得且价格低廉。
实际上没有必要将 CPU 的振荡器用于 GPS(例如,使用 PLL)。只要您可以“时间戳”相对于 CPU 时钟的外部事件,在任何两个 PPS 事件之间插入波发送和接收事件的时间就相对简单。
您通常可以结合使用微控制器上的硬件定时器以及用于溢出事件的软件计数器来创建任意宽度的 CPU 周期计数器。正确处理硬件计数器和软件计数器的翻转事件可能很棘手,但最后,您可以拥有一个以 CPU 时钟速率计数的 32 位计数器(提供高分辨率) 并以比您尝试测量的时间间隔更长的时间滚动(例如,429 秒 @ 10 MHz)。
您可以使用此计数器为不同的外部事件添加时间戳。如果其中一个事件是来自 GPS 接收器的 1 pps 脉冲,那么 CPU 时钟的基本长期精度就变得无关紧要了。唯一重要的是它的短期稳定性。您可以将 GPS 时间戳保存在 FIFO 缓冲区中,并将其他事件的时间戳与该缓冲区中的值进行比较。由于您知道 GPS 脉冲恰好相隔一秒,因此您可以通过插值找到任何其他事件的准确时间。
认为GPSn和GPSn+1是两个连续 GPS 脉冲的 CPU 时钟时间戳。您还知道与每个脉冲相关的实际(原子钟)时间(来自 GPS 消息),Timen和Timen+1. 如果Ext是您要测量的某个外部事件的 CPU 时钟时间戳,介于GPSn和GPSn+1,其确切时间为:
Timen+Ext−GPSnGPSn+1−GPSn
最后,如果您在两个独立的系统上运行此设置,每个系统都有自己的 GPS 接收器,您可以高精度比较两个系统上各种事件的计算时间(通常为 ±100 ns 数量级),即使两个系统的 CPU 时钟不同步。