简介
PPS+TOD是授时信号的一种,用来传递准确的时间信息。
- PPS,Pulse Per Second,是每秒一次的脉冲信号,其上升沿表示整秒的时刻。
- TOD,Time of Day,是时间信息。是跟随在每个PPS信号后的由串口发出的一句报文,报文内容包含UTC时间。通常在PPS信号后的几百个毫秒内发送完成。
GNSS授时的PPS+TOD
GNSS,Global Navigation Satellite System,是全球导航卫星系统。目前最准确的授时来自卫星授时,也就是通过GPS,北斗等GNSS接收机输出的PPS+TOD进行授时。我们知道GNSS接收机经常用于定位导航,但其实它输出PPS+TOD时间信息也是很重要的一种授时方式。
GNSS的数据信息通常采用NMEA-0183协议,该协议的官方网址在
https://www.archives.nmea.org/content/STANDARDS/NMEA_0183_Standard。我们具体在使用的时候直接参考接收机厂商的协议手册就可以了。
TOD的报文格式常见的有RMC语句,和ZDA语句。以RMC语句为例,它的报文格式是这样的。
STM32模拟实现PPS+TOD
在很多应用系统中,各个子系统往往需要时间同步。通过PPS+TOD传递时间信息,就是一种可以支持高精度时间同步的方式。本示例只简单演示如何通过一个STM32的MCU输出PPS+TOD的时间信息。
MCU因为运行频率较低,而且通常也没有专用高精度的时间模块,所以其传递和同步高精度的时间信息还是比较受限制的。本示例使用的STM32F103C8T6最高工作主频72MHz,代码里我们配置成65MHz,示例的设计思路是
- 基于65MHz的系统时钟,软件模拟一个时钟,可以提供TOD信息。对其进行gettime,settime操作。
- 基于系统时钟的tick(1ms)中断,当模拟时钟达到整秒时,在中断处理函数里set GPIO。当模拟时钟达到设置的脉冲宽度时,在中断处理函数里clean GPIO。以此作为PPS的输出。
- 主线程就在PPS输出后的几百毫秒里,把TOD时间组包成RMC语句报文,通过串口发送。
示例运行
核心板出一个调试串口,和一个TOD串口接到PC上查看。也接一个ST-LINK到PC,进行程序烧写。
- 调试串口:TX(A9管脚),RX(A10管脚)
- TOD串口:TX(A2管脚)
- PPS:C13管脚
两个串口波特率默认都是9600,左边是调试串口输出信息,右边是TOD信息。核心板LED灯随PPS信号每秒闪烁一次,TOD串口接收LED灯每秒接收TOD信息也闪烁一次。
我们从示波器查看PPS和TOD的波形,PPS脉宽100ms,TOD从第10ms时开始发出。每秒发出一对。
代码结构
代码开发基于ST官方的STM32CubeF1 v1.8.4,使用Keil IDE。增加了虚拟timer和tod的相关功能。
PPS+TOD的配置可以通过定义修改。如果有时间能改成通过调试端口,动态配置就更好了。
如果对源码感兴趣,可以通过https://flyelf.taobao.com/获取。适当少量收费有利于慎重选择和学习。