我们都知道GNSS终端具备授时功能,能够提供精确的时间信息。今天我们就来讨论一下GNSS终端输出时间信息的几种不同接口形式。目前常用的时间信息输出接口形式包括:
-
PPS+TOD
-
B码
-
网络授时NTP
-
网络授时PTP
本篇文章,我们先介绍最简单的PPS+TOD的接口形式。文章分为两个部分:
-
什么是PPS+TOD
-
怎么使用PPS+TOD
什么是PPS+TOD
PPS (Pulse Per Second)是一种硬件定时脉冲信号,由GNSS接收机输出。正常情况下每秒产生一个脉冲,在脉冲的上升沿(也可设置为下降沿)代表系统整秒时刻。当PPS信号到达时,标志着一秒的开始。目前常规GNSS接收机输出的PPS时间精度可达30ns~50ns级别。
但是PPS信号仅代表一个时刻,未包含具体的时间信息。其他设备接收到PPS脉冲后,仍需知道该脉冲对应的"年月日时分秒毫秒"信息,因此需要补充TOD(Time of Day)信息。TOD的作用是明确告知该PPS脉冲对应的具体时刻。
PPS和TOD信息的时序关系如下图所示:
PPS和TOD
一般GNSS接收机都配备串口,因此TOD信息通过异步串行总线接口传输。GNSS接收机在整秒时刻输出PPS脉冲信号,随后发送包含TOD的数据帧,提供PPS时刻对应的时间信息。
在卫星导航领域,传输TOD数据的协议帧较多,最常用的是NMEA0183的ZDA语句。ZDA(Time & Date)提供了UTC时间和日期信息,包含年、月、日、小时、分、秒和毫秒等要素。
(关于UTC时间、北斗时间、GPS时间、北京时间、格林威治时间等时间系统,后续将专门撰写文章进行详细介绍。
一个典型的NMEA ZDA语句格式如下:
**\$BDZDA,hhmmss.sss,day,month,year,xx,yy\*CC。**
各参数说明如下:
$BDZDA:ZDA语句标识符。通常表示数据来自北斗系统,GPZDA表示GPS系统,$GNZDA表示组合系统。
hhmmss.ss:当前UTC时间,格式为小时(hh)、分钟(mm)、秒(ss),后跟小数部分(.sss)。在NMEA-4.1协议中,秒精确到小数点后3位。
day:日期(日)。
month:月份。
year:年份。
xx:本地时区偏移量的小时部分(如适用)。无时区信息时该字段为空或省略。
yy:本地时区偏移量的分钟部分(如适用)。无时区信息时该字段为空或省略。
*CC:校验和,用于验证语句完整性。计算方法是从$开始到*之前所有字符ASCII码的异或结果。
假设接收到的$BDZDA语句如下:
\$BDZDA,160012.750,19,08,2023,,\*4C
其含义为:
-
基于北斗卫星导航系统计算的时间信息。
-
日期为2023年8月19日。
-
时间为16:00:12.750,UTC时间。
怎么使用PPS+TOD
有朋友可能会问:TOD数据是在PPS信号之后发出的,当用户设备接收到TOD时,对应的PPS脉冲已经过去。这该如何应用呢?
实际上,用户设备接收到TOD数据后,可提取其中的时间T0,加 1秒得到T1。当检测到下一个PPS脉冲到来时,该时刻即为T1。
还有朋友会提出疑问:PPS每秒仅输出一次,代表整秒时刻。若需要更高分辨率的时间信息,应如何处理?
例如以下场景:
外部触发事件打时间戳
用户设备接收GNSS接收机的PPS和TOD信号,同时接收到外部触发事件(EventMark)。需要为该外部EventMark事件打时间戳,获取其对应的"年月日时分秒毫秒"信息,应如何操作?
假设用户设备为单片机或ARM处理器(若为CPLD/FPGA,处理方式相同)。操作步骤如下:
外部事件打时间戳
1. 在单片机内启动内部定时器,选择时钟频率(如1MHz主时钟)以获得1μs分辨率的时间戳。
2. 定时器持续运行。
3. PPS脉冲到达时,将内部定时器清零。
4. 将外部EventMark脉冲作为中断信号,在中断处理程序中读取定时器计数值,该值即为EventMark时刻1s以下的时间部分。
5. 将TOD中的PPS时间与定时器计数值相加,即可获得EventMark事件的完整时间戳。
码字不易,大家觉得文章不错,就安排一下一键三连吧:点赞、分享、推荐。