时钟同步的两个方案的个人理解
NTP
原理图:

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

- PPS是一个周期为1s的外部时钟引脚,每隔1s输出一个方波电平,表示整秒到了。
- GPMC是一个包含年月日时分秒的时间戳,一般是串口接收这个数据,一般是在两个PPS信号之间月500ms的位置发送。
- PPS引脚的上升沿触发MCU的中断,表示到整秒了,这个时候,MCU系统的时间复制一下上一个GPMC的时间戳并+1s复制完后,这个GPMC时间戳立即失效,待下一次更新。
- PPS引发的中断里面还要将定时器的累加值清零,和定时器自己的cnt值清零。(假设开了一个1ms累加一次的定时器)
- 在两个PPS之间的时间在系统时间的基础上加上定时器跑的时间。
- 如果定时器已经跑的超过了1s但是PPS信号还没来,那就系统时间自加一秒继续往下走。直到PPS信号来了全部更新一下系统时间和定时器时累加值,如上。
- 如果定时器还没到1s但是PPS信号来了,也全部更新一下系统时间和定时间累加值。
- 这样就可以得到一个较为精确的时钟同步信号,理论上的误差就是触发中断的时间。
进阶:连续几秒比较“理论 1 s 计数”与“实际计数器差”,得到 ppm 级的频偏估计 ε,动态微调计数器的重装值/刻度或用数字 PLL(小步调频),让秒内插值也更准,这样即便 PPS 短暂丢失,漂移也更小。
需要硬件:PPS → 定时器输入捕获通道;另开一个高频自由运行定时器(例如 1 MHz)。
PPS 到来:读取捕获值,与上一捕获值差得到“本地 1 s 计数”,更新频偏 ε;把“当前 UTC 整秒”(来自最近一次已验证的 NMEA 语句)绑定到这个边沿;清零或对齐“秒内计数”。
