【GPS授时系列】通过USB接口获取PPS信号

GPS时间同步与USB延迟
本文探讨了通过USB接口同步GPS模块的PPS信号以获取精确时间的方法,分析了USB接口引入的延迟及其对时间同步精度的影响。文章比较了USB与GPIO接口在时间同步上的性能差异,展示了USB接口的延迟范围及修正方法。

前言

本文翻译自Don Drawn的博客
https://blog.dan.drown.org/
斜体是译者加的注释,方便读者理解

目标

为了获取精确时间,最划算的做法是从GPS模块同步PPS信号(秒脉冲信号),这种模块一般只需要几十元钱,而精度却能达到100ns,从GPIO引脚获取PPS信号是比较常用的同步PPS信号的方法,但并不是所有系统都支持这种方法,USB接口是一种比GPIO使用更广泛的接口,但是用USB接口同步PPS信号会引入额外的误差,因为USB接口的特性,会给信号同步带来不小的延迟,本项目的目的,既是测量这个延迟,并且试图减小这个延迟。

评价时钟质量的几个指标:
分辨率(resolution):时钟每次自增量,如果时钟每次增加一秒,则分辨率为1秒
精度(precision ):时钟精度,来说是外部程序能获取时钟时间的最小间隔,如时钟的分辨率可能是1ns,但是时钟的精度可能是1ms
抖动(jitter):重复读取时钟值,每两次读取之间的间隔是不同的,两次读取之间的间隔的差值既是jitter
精准度(Accuracy ):时钟值与理想精确时间的差值
频率误差(frequency  error):时钟一般由某种频率发生器件驱动,这些器件频率会发生漂移,频率误差一般用PPM作为单位,PPM既是Part Per Million,如果时钟PPM为12,差不多一天下来积累的误差就有1秒

USB同步PPS信号原理图

从图中可以看出USB的轮询机制必然导致较大的延迟

USB同步PPS信号原理图

测试

测试中同一个PPS信号同时连接了USB和GPIO
GPIO同步PPS信号时,没有做额外的延迟补偿(这个延迟大概在10us左右)

PPS 信号产生IRQ

PPS信号产生IRQ请求的延迟
在这里插入图片描述
大概是 1.7us-1.8us

USB 延迟

图标中的纵坐标标识的是USB设备在收到PPS信号到USB host(既主机)获取到PPS信号之间的时间差。
在这次测试中,USB设备的轮询时间被设成1000us,USB host会在每个USB包之间轮询USB设备的状态,USB延迟就此产生。
在这里插入图片描述
USB延迟介于26us到1033us之间,稍后作者会详细讲解这个三角形的图像背后的原理。

误差修正值

测量值用UART串口传送

数据整合

主机收到测量值与PPS信号后,就可以计算本机时间与GPS时间的差值,这个差值叫偏移(offset),下面的图形是GPIO PPS信号与USB PPS信号的时间差记录,在理想情况下,这两条线都应该是一条平的直线,不过现实是USB PPS有一个125us的固有偏移,可能是由于USB hub 的缓冲机制带来的,固有偏移很容易处理,只要减掉就可以了,所以一下图形中作者已经将125us的固有偏移消除了,这种固有偏移在不同机器间也是相同的,作者测试过树莓派 Pi 2和一台intel的机器。

在上节中作者测量到USB延迟介于26us到1033us之间,但是这里USB PPS的偏移只有100多us,这里作者应该是使用了某种修正方法,利用UART传输测量值来修正延迟,但是即使如此,USB传输延迟中的抖动(jitter)依然存在。

在这里插入图片描述

GPIO PPS 与 USB PPS对比

USB PPS时间源能保持±5us的偏差,因此它是一个长期的,优质的时间源,但是对比GPIO PPS时间,依旧多了絮都尖峰,而且偏移持续时间也更长。
研究偏移时间的分布,作者认为它们都符合高斯分布(Gaussian distribution)。
在这里插入图片描述

GPIO PPS 信号更接近高斯分布,作者认为这是一种很好的测量短期偏移的方法。

扩展

此处未翻译

USB latency pattern

Looking closer at the USB latency, you can see the PPS drifting relative to the host schedule of polling the USB device for its status. The system clock error was 2.215ppm during this time period, and this drift matches that error exactly. This probably means USB on this system shares the same clock as the system clock. This hardware is a Raspberry Pi 2, and I suspect it won’t be true for other platforms. I also suspect the stability of the polling schedule can’t be relied upon, as the host controls it and can reschedule it whenever it wants.
在这里插入图片描述
Subtracting the 2.215ppm drift gives the remaining jitter (root mean squared error=2.278)
在这里插入图片描述

### GPS授时与PPS信号的使用方法 GPS授时是一种利用全球定位系统(GPS)来提供高精度时间信息的技术。PPS(Pulse Per Second)信号GPS授时中常用的同步信号之一,用于传递精确的时间基准。以下是关于GPS授时、时间同步以及PPS信号的相关信息和使用方法。 #### 1. PPS信号的基本概念 PPS信号是一种每秒产生一次脉冲的信号,其上升沿表示整秒时刻。这种信号通常由GPS接收器生成,并用于同步本地时钟与UTC时间[^1]。PPS信号的特点包括: - **高精度**:PPS信号的时间误差通常在纳秒级别。 - **简单性**:仅需一个脉冲即可表示整秒时刻,易于硬件实现。 - **可靠性**:由于PPS信号不依赖于数据传输协议,因此不受网络延迟或抖动的影响。 #### 2. TOD信号的补充作用 TOD(Time of Day)信号通常跟随PPS信号发送,包含更详细的时间信息,例如年、月、日、小时、分钟和秒等。TOD通过串口或其他通信接口传输,通常以ASCII格式表示UTC时间。PPS信号负责标记秒级时间点,而TOD信号则提供完整的日期和时间信息[^1]。 #### 3. GPS授时的时间同步机制 GPS授时通过PPS信号和TOD信号共同实现时间同步。具体过程如下: - GPS接收器捕获卫星信号并计算UTC时间。 - 接收器生成PPS信号,其上升沿对应UTC时间的整秒时刻。 - 同时,接收器通过串口发送TOD报文,包含当前的UTC时间信息。 - 目标设备通过检测PPS信号的上升沿和解析TOD报文,调整本地时钟以与UTC时间保持一致[^2]。 #### 4. PPS信号的使用方法 在实际应用中,PPS信号可以通过以下方式使用: - **硬件连接**:将GPS接收器的PPS输出端口连接到目标设备的输入端口。目标设备可以是工控机、嵌入式系统或其他需要时间同步的设备。 - **软件处理**:编写程序读取PPS信号并调整系统时钟。例如,在Linux系统中,可以使用`pps-tools`库来捕获PPS信号[^2]。 以下是一个简单的Python示例代码,展示如何读取PPS信号并打印时间戳: ```python import time import pps.pps as pps # 初始化PPS设备 pps_device = "/dev/pps0" pps_client = pps.PPSClient(pps_device) while True: timestamp = pps_client.get_time() print(f"PPS Timestamp: {timestamp}") time.sleep(1) ``` #### 5. 时间同步成功的标志 当PPS信号成功同步本地时钟后,系统会显示相应的状态标志。例如,在某些工控机上: - `#` 表示本地时钟正在运行。 - `*` 表示已成功同步到外部时间源。 - `reference ID` 显示为“pps”,表明时间源来自PPS信号[^2]。 #### 6. 注意事项 - 确保GPS接收器具有良好的天线信号,以获得稳定的PPS信号。 - 在复杂电磁环境中,可能需要屏蔽干扰以保证PPS信号的准确性。 - 如果目标设备需要毫秒级或更高的时间精度,建议结合PPS信号和TOD信息进行校准。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值