当前位置: 首页 > news >正文

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

相关文章:

  • Redis 全景图(3)--- Redis 应用于缓存
  • Linux 命令 top 详解
  • 《YOLOv8:从入门到实战》专栏介绍 专栏目录
  • 程序员沟通之道:TCP与UDP之辩,窥见有效沟通的重要性(day19)
  • 工具_git提交时忽略某些文件或者目录,git提交排除某些文件或目录
  • 微服务连接不上rabbitmq解决
  • Android 高德地图
  • Folder Icons for Mac v1.8 激活版文件夹个性化图标修改软件
  • pwn学习笔记(7)--堆相关源码
  • 计算机网络:数据链路层 - 可靠传输协议
  • vscode安装通义灵码
  • 基于AI智能识别技术的智慧展览馆视频监管方案设计
  • 全志A40i android7.1 移植wifi驱动的一般流程
  • 超势垒整流器选型参数,结构原理,工艺与注意问题总结
  • TiDB单机版安装和连接访问
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • angular学习第一篇-----环境搭建
  • Hibernate【inverse和cascade属性】知识要点
  • java多线程
  • October CMS - 快速入门 9 Images And Galleries
  • overflow: hidden IE7无效
  • spring boot 整合mybatis 无法输出sql的问题
  • Spring框架之我见(三)——IOC、AOP
  • Vim 折腾记
  • vue中实现单选
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 技术发展面试
  • 前端技术周刊 2019-02-11 Serverless
  • 嵌入式文件系统
  • const的用法,特别是用在函数前面与后面的区别
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #DBA杂记1
  • (1) caustics\
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)Linux整合apache和tomcat构建Web服务器
  • ./configure,make,make install的作用
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net core使用ef 6
  • .NET企业级应用架构设计系列之结尾篇
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @TableLogic注解说明,以及对增删改查的影响
  • @vue/cli脚手架
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [android学习笔记]学习jni编程
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [HackMyVM]靶场Boxing
  • [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]