使用STM32 MCU模拟实现PPS+TOD授时信号

简介

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/获取。适当少量收费有利于慎重选择和学习。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值