欢迎淘宝搜索飞灵科技,我司相关新产品陆续上线
在很多工业使用场景中,网络内一些设备终端与设备终端,或设备终端与主控之间需要进行时间同步。 比如给传感器数据打时间戳,比如总线的时分复用等场景,相关的设备都需要一个统一的时间。
在同步精度不是很高的场景中,我们可以使用ntp等服务进行同步,精度在ms级别。 但如果想达到同步精度在us,甚至ns 级别, IEEE-1588 , PPS+ToD和 GPS 是常用的标准协议。在很多设备终端采用的是MCU作为主控的,大多数的中低端MCU并没有硬件1588的能力,所以 PPS+ToD 是成为首要选择。
?下图列举了一个 实用场景,场景中使用分别为飞灵科技的FlySync系列的主时钟和从时钟。
在上图中:
- 主时钟与GPS进行同步,并作为IEEE 1588的主时钟。
- 从时钟与主时钟进行同步,同步后输出四路ToD + PPS信号。
- 四个传感器终端分别与四路ToD + PPS 相连接,用来获取时间。
- 四个传感器采集数据后,打上时间戳后通过总线发送给PLC。
飞灵科技提供了一个方案,用来解决如何在MCU上通过ToD+PPS 获取同步时间。
ToD + PPS 的时序如下图所示:
ToD 信号在PPS上升沿1ms后发出,并且在500ms 之内发送完成。PPS+ToD配合可以获取到整秒时间,为了捕获到ns秒的时间, 我们使用一个硬件计数器,即Timer 来计时ns秒的时间。基本原理如下:
?
我们使用一个freerun的timer, 即硬件timer以一定的频率计数,比如1MHZ。同时这个timer有外部触发的捕获功能,即PPS上升沿可以锁存当前的计数值。
- ?PPS上升沿触发timer 锁存当前计数值,上图中10.
- 在APP 调用函数get_time()获取当前时间时,首先获取当前计数值15,然后减去上一个PPS锁存的计数值10, 转化成ns后即为我们所需的ns时间:(15-10)* 1000 = 5000ns。 需要注意Timer计数值回绕的。
在上面的原理中,需要Timer 计数值周期不能小于1秒,否则在两个PPS之间发生两次回绕的话,我们不能正确获得计数的差值。 大多数MCU仅支持16Bits的Timer, 这样如果要满足周期为1s的话,每个计数值必须大于15us。这个对我们获取的时间精度会有影响。一种改进的方法是在Timer发生回绕时产生中断,在中断里记录这个周期内回绕的次数。并且在每次PPS触发锁存的中断里清零这个回绕次数。
以上的原理的时间精度依赖于给Timer提供时钟的晶振的精度。晶振精度越高,我们获取的时间精度越高。但是不幸的是,一般MCU所使用的晶振精度都很低,并且晶振还有温漂,老化等现象。我们MCU使用的晶振一般偏差在20PPM左右。也就是说,Timer每个1秒的计数周期会有达到20us的偏差。所以基于以上方法获取的时间值精度不高,并不能满足us级别的应用。
但晶振具有短期稳定性的特点,也就是说,晶振在短期内偏差不会变化很大。所以我们只要计算出这个偏差,就可以来校准我们获取的时间了。计算的基本原理就是通过测量PPS之间的实际计数值来计算计算出晶振的偏差值。
<待续, 下一篇介绍具体校准的方法>
|