时钟同步

时钟同步的两个方案的个人理解

NTP

原理图:

image

  1. M给S发一组数据并记录自己的时间T1。
  2. S收到数据后立即打一个时间戳T2。
  3. 然后发送一组数据给M并打上时间戳T3。
  4. M收到数据立即打上时间戳T4。
  5. 这样就得到了四个时间戳,然后M把T1,T4时间戳和打包发送给S。
  6. 这样S就得到了M到S的延时,已及M的时间,这样S就知道了和M的时间差值,修正这个差值就可以完成和M时间的同步,理论上的误差来自于两次数据发送的网络波动。

PPS+GPRMC

时序图:

image

  1. PPS是一个周期为1s的外部时钟引脚,每隔1s输出一个方波电平,表示整秒到了。
  2. GPRMC是一个包含年月日时分秒的时间戳,一般是串口接收这个数据,一般是在两个PPS信号之间月500ms的位置发送。
  3. PPS引脚的上升沿触发MCU的中断,表示到整秒了,这个时候,MCU系统的时间复制一下上一个GPRMC的时间戳并+1s复制完后,这个GPRMC时间戳立即失效,待下一次更新。
  4. PPS引发的中断里面还要将定时器的累加值清零,和定时器自己的cnt值清零。(假设开了一个1ms累加一次的定时器)
  5. 在两个PPS之间的时间在系统时间的基础上加上定时器跑的时间。
  6. 如果定时器已经跑的超过了1s但是PPS信号还没来,那就系统时间自加一秒继续往下走。直到PPS信号来了全部更新一下系统时间和定时器时累加值,如上。
  7. 如果定时器还没到1s但是PPS信号来了,也全部更新一下系统时间和定时间累加值。
  8. 这样就可以得到一个较为精确的时钟同步信号,理论上的误差就是触发中断的时间。

进阶:连续几秒比较“理论 1 s 计数”与“实际计数器差”,得到 ppm 级的频偏估计 ε,动态微调计数器的重装值/刻度或用数字 PLL(小步调频),让秒内插值也更准,这样即便 PPS 短暂丢失,漂移也更小。

需要硬件:PPS → 定时器输入捕获通道;另开一个高频自由运行定时器(例如 1 MHz)。

PPS 到来:读取捕获值,与上一捕获值差得到“本地 1 s 计数”,更新频偏 ε;把“当前 UTC 整秒”(来自最近一次已验证的 NMEA 语句)绑定到这个边沿;清零或对齐“秒内计数”。

 

posted @ 2025-10-24 18:48  西北小蚂蚁  阅读(4)  评论(0)    收藏  举报