使用STM32 MCU模拟实现PPS+TOD授时信号
简介
PPS+TOD是授时信号的一种,用来传递准确的时间信息。
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,示例的设计思路是
示例运行
核心板出一个调试串口,和一个TOD串口接到PC上查看。也接一个ST-LINK到PC,进行程序烧写。
两个串口波特率默认都是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/获取。适当少量收费有利于慎重选择和学习。
作者:就是个linux工程师