C语言 时钟同步

2uluyalo  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(157)

我的设置包含两个组件:主设备和从设备。它们通过UART进行通信。每个设备都有RTC(实时时钟)模块,我想将从设备的RTC与主设备的RTC同步。
关于我的目标,我有几个问题。首先,我想介绍一下我的实施方案

    • 答:**本人打算采取以下行动:
SLAVE SENT TIMESTAMP X to MASTER
MASTER RECEIVES X, and MEASURES TIME Y
MASTER SENDS (X,Y) to SLAVE
CLIENT MEASURE TIME Z and SET RTC TO Z + (Y-X)

对此的解释是Z=X+T,其中T是经过的时间间隔,因此,我们得出从RTC是X+T+Y-X,即Y+T,也是主机上的时间

    • B.**我的计算中的内置误差是半个往返时间,即从机测量到达主机所需的时间
    • C.**在ntp rfc中,我可以看到他们将偏移量计算为theta = T(B) - T(A) = 1/2 * [(T2-T1) + (T3-T4)](他们测量4次,请参考wiki/rfc),因此我理解他们取了行程时间前一半到后一半之间的某种平均值
    • D.**我的第一个问题:我的实施计划是否/如何缺少关于ntp上所做的工作。就我对C的理解而言,如果我假设系统上发送和接收之间的时间间隔是稳定的(即T2-T1 = T3-T4),我不会错过任何东西
    • E.**第二个问题,您是否知道设置RTC是否也会重置其内部计数器?(即,如果您将RTC设置为处于递增中间的某个时间,则计数器是否会在设置后重置)。我无法找到此问题的答案。
    • F.**最后,我想以几毫秒的精度同步RTC,比如说10毫秒。我想知道如何做到这一点-

在主服务器中,我可以测量包含纳秒的时间戳,在从服务器中,我可以使用tick方法(tick发生在每个固定的时间量,比如每1ms)。
所以我想到也许做以下改变:
在从机端,测量"接近"整秒(即TOTAL_TICKS*TICKS_INTERVAL / 1000 < 2时):十
在主机上,我将以毫秒为单位测量时间:Y,并将X、Y发送到从机
在从机上,我将暂停截断Y的毫秒部分所需的滴答数,然后像以前一样将秒数差(Y.秒-X)添加到我的RTC中。
这听起来像什么?
先谢了。

vtwuwzda

vtwuwzda1#

D.我的第一个问题:我的实施计划是否/如何缺乏关于ntp上所做的工作。
简短的回答是:系统#1读取其时钟(X)和系统#2读取其时钟(Y)之间的延迟不需要补偿。
考虑一下这个时间线:

X is sampled                  Y is sampled             
     |                             |
  ----------------------------------------> timeline
      \---------- delay ----------/
        time it takes to transfer
          X to the other system
               and read Y

我们将theta的系统时钟与D的延迟之差称为:

X = T1
Y = T2 = T1 + theta + D
Y - X = T2 - T1 =  T1 + theta + D -T1 = theta + D

然后,通过将Z + (Y - X)等结果相加来设置/调整时钟,结果为Z + theta + D,即调整包括延迟D。如果D高于所需精度,则该方法存在问题。
ntp公式试图通过假设当从系统#1到系统#2时和当从系统#2到系统#1时延迟将相同来补偿该延迟。
它是这样工作的:
如果我们假设从测量T1到测量T2所用的时间与从测量T3到测量T4所用的时间相同,则公式为

theta = T(B) - T(A) = 1/2 * [(T2-T1) + (T3-T4)]

将补偿所有的"测量延迟"。
假设两个系统完全同步,则T2-T1等于"测量延迟",我们称之为Tmd,则T3-T4等于-Tmd,得到

theta = 1/2 * [(Tmd) + (-Tmd)] = 0

它告诉你系统是同步的。
如果我们假设第一个系统比第二个系统(时间正确)晚100个节拍,则得到:

T1-T2 = (CorrectTime - 100) + Tmd - CorrectTime = -100 + Tmd
T3-T4 = CorrectTime - (Tmd + CorrectTime - 100) = -Tmd - 100
theta = 1/2 * [-100 + Tmd + -Tmd - 100] = 1/2 * [-200] = -100

因此,"测量延迟"再次得到补偿,您可以获得系统间差异的精确值。
进一步通知:
D........如果我假设系统上发送和接收之间的时间间隔是稳定的(即T2-T1 = T3-T4
这个公式是错误的,如果你考虑一个两个系统完全同步的状态,很容易看出,在这样一个系统中,你会得到:

T2 = T1 + delay
T4 = T3 + delay

插入到你得到的公式中:

T2 - T1 = T3 - T4
T1 + delay - T1 = T3 - (T3 + delay)
          delay = -delay

这显然是错误的。
顺便说一句:
当你进行调整时,你不是用一个测量值来调整,而是把你的测量值通过一个低通滤波器,然后用滤波器的输出来调整。

yrefmtwq

yrefmtwq2#

也许类似AUTOSAR TimeSync over CAN (R22-11 SWS)的东西可以在UART上类似地使用。AUTOSARs的时间同步是IEEE 802.1AS的改编,链接的文档是CAN的改编及其基于优先级的仲裁。CAN相对于UART的优势是,可以将一个FullCAN邮箱分配给一个TimeSync消息,而在UART上,您可能必须首先解释,如果接收到的数据内容是时间同步或其它,则作为获取本地时间的开销。
SYNC协议本身是自上而下分层的,在CAN上,它根本不使用Pdelay测量部分:

  1. TimeMaster发送SYNC消息,时间为(t0 r)的秒部分(sec(t0 r))。
    1.这是CAN上最接近同步点的位置,其中TimeMaster看到发送的消息,TimeSlave看到接收
    2a. TimeMaster在发送确认SYNC时获取内部时间(t1 r)
    2b,时间从机在Rx上获取内部时间SYNC指示(t2 r)
  2. TimeMaster传输FUP(随访)消息,时间为SYNC TxConfirmation(t4 r = t1 r-sec(t0 r))的纳秒部分。
  3. TimeSlaves可根据t =(t3 r-t2 r)+(sec(t0 r)+t4 r)计算接收到FUP后t3 r的时间
    也可参见链接文件第1章中的图表。

相关问题