我需要同步两个微控制器,以便它们可以测量传播波的速度。时间延迟测量需要具有微秒精度(误差小于 1/2 微秒)。
我有两个使用 12MHz 晶体的微控制器(ATmega328 )。
它们都配备了蓝牙收发器。蓝牙收发器以约 15 毫秒的抖动发送和接收数据包。
我希望使用蓝牙收发器或其他一些创造性的方法来同步微控制器。
我曾尝试通过将它们触摸在一起来同步它们,但我需要它们保持同步大约 10 分钟,而且它们的时钟漂移得太快了。也许如果可以准确预测时钟漂移,这种方法会奏效。
我应该如何实现这种同步?
我需要同步两个微控制器,以便它们可以测量传播波的速度。时间延迟测量需要具有微秒精度(误差小于 1/2 微秒)。
我有两个使用 12MHz 晶体的微控制器(ATmega328 )。
它们都配备了蓝牙收发器。蓝牙收发器以约 15 毫秒的抖动发送和接收数据包。
我希望使用蓝牙收发器或其他一些创造性的方法来同步微控制器。
我曾尝试通过将它们触摸在一起来同步它们,但我需要它们保持同步大约 10 分钟,而且它们的时钟漂移得太快了。也许如果可以准确预测时钟漂移,这种方法会奏效。
我应该如何实现这种同步?
我不想在你的无线游行上下雨。您遇到了一个艰难但出乎意料的要求。类似的事情需要重新评估整个系统设计。
想到的第一件事是从一个振荡器上为两个单元提供时钟。您有蓝牙通信,这表明范围约为 10m。您可以使用 RG174 同轴电缆或光纤连接您的设备,以承载时钟。
2、有精密振荡器。为了提高精度和成本。
3、用 GPS 训练的精密振荡器。每颗 GPS 卫星上都有几个原子钟。通常,视野中有大量 GPS 卫星。GPS 用于精确计时很多(与卫星导航相比鲜为人知的用法)。大多数 GPS 接收器具有 1PPS 输出(每秒一个脉冲),可提供精确到 50ns 的计时。
要在 600 秒(10 分钟)内有 0.5μs 的漂移,您的时钟(当前设计中的 12MHz 时钟)的漂移应该小于 0.0008ppm。但是,如果您可以经常从低漂移外部源纠正时序误差,则对时钟漂移的要求可以更加宽松。如果您可以每秒校正一次,那么您的时钟可能会有 0.5ppm 的漂移。
具有 1pps 输出的 GPS 模块很容易获得且价格低廉。
实际上没有必要将 CPU 的振荡器用于 GPS(例如,使用 PLL)。只要您可以“时间戳”相对于 CPU 时钟的外部事件,在任何两个 PPS 事件之间插入波发送和接收事件的时间就相对简单。
您通常可以结合使用微控制器上的硬件定时器以及用于溢出事件的软件计数器来创建任意宽度的 CPU 周期计数器。正确处理硬件计数器和软件计数器的翻转事件可能很棘手,但最后,您可以拥有一个以 CPU 时钟速率计数的 32 位计数器(提供高分辨率) 并以比您尝试测量的时间间隔更长的时间滚动(例如,429 秒 @ 10 MHz)。
您可以使用此计数器为不同的外部事件添加时间戳。如果其中一个事件是来自 GPS 接收器的 1 pps 脉冲,那么 CPU 时钟的基本长期精度就变得无关紧要了。唯一重要的是它的短期稳定性。您可以将 GPS 时间戳保存在 FIFO 缓冲区中,并将其他事件的时间戳与该缓冲区中的值进行比较。由于您知道 GPS 脉冲恰好相隔一秒,因此您可以通过插值找到任何其他事件的准确时间。
认为和是两个连续 GPS 脉冲的 CPU 时钟时间戳。您还知道与每个脉冲相关的实际(原子钟)时间(来自 GPS 消息),和. 如果是您要测量的某个外部事件的 CPU 时钟时间戳,介于和,其确切时间为:
最后,如果您在两个独立的系统上运行此设置,每个系统都有自己的 GPS 接收器,您可以高精度比较两个系统上各种事件的计算时间(通常为 ±100 ns 数量级),即使两个系统的 CPU 时钟不同步。
我之前已经为微控制器实现了无线时钟同步,但只有毫秒精度,这对于应用程序来说已经足够了。根据我的阅读,这篇论文很好地解释了微秒同步:http: //www.math.u-szeged.hu/tagok/mmaroti/okt/2010t/ftsp.pdf
本质上,如果您分别了解发射器和接收器上无线电数据包的传输事件和到达事件,那么您在两个系统之间就有一个共同的可观察事件(假设您忽略无线电波的传播时间),可以用作参考。论文中提到的另一个巧妙的特性是使用线性回归的时钟偏差估计。
查看蓝牙时钟同步协议 (CSP),它是健康设备配置文件(HDP) 的可选部分。该文档中与 CSP 相关的部分是 2.1 和 8。
我还没有机会亲自尝试,但据我所知,BlueZ(官方 Linux 蓝牙协议栈)刚刚添加了对 HDP 的支持,包括对 CSP 的支持。因此,即使听起来您不会在支持 BlueZ 堆栈的平台上运行,但也许代码至少会提供一个很好的参考实现。