时间同步PPS+GPRMC
介绍一下pps结合rmc报文的时间同步方案
- 定义:PPS全称为每秒脉冲,即1脉冲/1秒。它是一个低功率的脉冲电平信号,通常用于提供精确的时钟同步信号。
- 特征:PPS信号的脉冲宽度通常在20ms至200ms之间,也有说法为200ms至300ms,采用上升沿为准时点,上升时间非常短,一般在纳秒级别。PPS信号提供精确的时钟同步信号,确保时间同步的精确性。
二、RMC报文
- 定义:RMC报文(以GPRMC为例)是一种包含UTC时间(精确到秒)以及经纬度定位数据的标准格式报文。它通常通过标准串口(如RS232)输出。
- 内容:GPRMC报文包含年、月、日、时、分、秒等UTC时间信息,以及经度、纬度等定位数据。例如:“$GPRMC, 084048.00, A, 3030.69749, N, 11411.83508, E, 0.065, , 210722, , , D, V * 0F”。
- 作用:GPRMC报文为接收设备提供了准确的时间信息和定位数据,是时间同步过程中的关键数据。
三、时间同步方案
-
原理:
- 设备首先通过PPS信号接收到一个精确的秒脉冲。在接收到PPS信号后,设备将内部系统时间的毫秒及以下部分清零,并开始重新计算毫秒时间。
- 紧接着,设备通过串口接收到GPRMC报文。报文中包含了准确的UTC时间信息。
- 设备将接收到PPS信号到解析出GPRMC中UTC时间所用的时间(通常在毫秒级别)与UTC整秒时间相加,得到准确的系统时间。至此,一次时间同步过程完成。每秒都会进行这样的过程,以确保系统时间的准确性。
-
优点:
- 高精度:PPS信号和GPRMC报文都提供了高精度的时间信息,确保时间同步的准确性。
- 稳定性好:PPS信号是一个稳定的秒脉冲信号,不易受到外界干扰;GPRMC报文也通过标准串口稳定输出。
- 可靠性高:该方案结合了PPS信号和GPRMC报文两种时间信息来源,提高了时间同步的可靠性。即使其中一个信息来源出现问题,另一个仍然可以作为备用。
-
应用场景:该时间同步方案广泛应用于需要精确时间控制的领域。例如,在自动驾驶系统中,各个传感器和域控制器需要实现时间同步,以确保数据的准确性和一致性。PPS结合GPRMC报文的时间同步方案能够提供高精度、稳定可靠的时间同步服务,满足自动驾驶系统的需求。
综上所述,PPS结合RMC报文的时间同步方案是一种高精度、稳定可靠的时间同步方法。它通过结合PPS信号的精确秒脉冲和GPRMC报文的准确时间信息,实现了系统时间的高精度同步。
“在接收到PPS信号后,设备将内部系统时间的毫秒及以下部分清零,并开始重新计算毫秒时间 ”这句话怎么理解?pps触发之后用gettimeofday获取当前pps触发的时间不行吗?
信号,通常在每秒钟的开始时刻(UTC时间的整秒)产生。
-
清零毫秒及以下部分:当设备接收到PPS信号时,它会将其内部系统时间的毫秒、微秒(或更小的单位,取决于系统时间的分辨率)部分清零。这意味着,无论PPS信号到达时系统时间的毫秒部分是多少,它都会被重置为0。
-
重新计算毫秒时间:清零后,设备会开始从0毫秒重新计算时间。这通常是通过一个高精度的计数器来实现的,该计数器在PPS信号到达后的每个时钟周期内递增,以提供毫秒级(或更高精度)的时间信息。
使用gettimeofday
获取PPS触发时间的可行性
gettimeofday
是一个在Unix和类Unix系统中常用的函数,用于获取当前的时间(包括秒和微秒部分)。然而,直接使用gettimeofday
来获取PPS触发时间可能并不是最准确的方法,原因如下:
-
系统调用延迟:
gettimeofday
是一个系统调用,它本身有一定的执行时间。当PPS信号到达时,如果立即调用gettimeofday
,那么获取到的时间可能会稍微滞后于PPS信号的实际到达时间,因为系统调用需要一定的时间来执行。 -
中断处理延迟:PPS信号通常是通过中断来处理的。当中断发生时,系统需要一定的时间来保存当前上下文、执行中断处理程序并恢复上下文。这个过程中也可能引入一些延迟。
-
时间戳记录方式:为了更精确地记录PPS信号的到达时间,通常需要使用硬件时间戳技术。这意味着PPS信号到达时,硬件会直接记录一个精确的时间戳,而不是通过软件调用(如
gettimeofday
)来获取。
因此,虽然理论上可以使用gettimeofday
来获取PPS触发的时间,但在实际应用中,为了获得更高的时间同步精度,通常会采用硬件时间戳技术或其他专门设计的时间同步算法。这些技术可以确保在PPS信号到达时能够更准确地记录时间戳,从而提供更可靠的时间同步服务。
那在linux中是不是意味着pps_info_t中的assert_timestamp.tv_nsec要清零?
-
时间同步设备或模块在接收到PPS信号时会自动记录一个精确的时间戳,并可能通过某种机制(如中断、DMA传输等)将该时间戳传递给用户空间。在这种情况下,您可能不需要手动清零
tv_nsec
,因为硬件已经为您处理了这些细节。 -
软件实现:如果您的系统或应用程序没有硬件时间戳的支持,而是依赖于软件计时器或系统调用来处理PPS信号,那么您可能需要自己实现时间戳的记录和更新逻辑。在这种情况下,您可能会选择在接收到PPS信号时清零
tv_nsec
,并更新tv_sec
以反映新的时间基准。 -
精度和延迟:清零
tv_nsec
并更新tv_sec
可能会引入一些精度上的损失,特别是如果PPS信号的到达时间不是恰好在整秒时刻。此外,由于系统调用和中断处理的延迟,您记录的时间戳可能会稍微滞后于PPS信号的实际到达时间。因此,在设计时间同步系统时,需要仔细考虑这些因素,并可能需要采用一些补偿措施来提高精度。 -
API和文档:最重要的是,您应该查阅您正在使用的特定硬件或软件库的API文档,以了解如何正确处理PPS信号和时间戳。不同的硬件和软件库可能有不同的要求和实现方式。
总之,是否清零assert_timestamp.tv_nsec
取决于您的具体需求和实现方式。如果您正在使用特定的硬件或软件库来处理PPS信号和时间同步,请务必查阅相关文档以获取准确的指导。