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

STM32实现毫秒级时间同步

提起“时间同步”这个概念,大家可能很陌生。一时间搞不清楚是什么意思。

我理解“时间同步”可以解决多个传感器采集数据不同时的问题,让多个传感器同时采集数据。

打个比方。两个人走路,都是100毫秒走一步(频率相同是前提,一般传感器都支持调整频率,容易调到同频,但不容易同相位,因为没法同时启动)。就是两个人起点不同,就走不到一起去。

为了使他们对齐,需要“时间同步”这个概念。

怎么样才能使他们走齐呢?需要一个人发送一个信号,比如说:“停下来”。当另一个人听到这个信号时,他倒退一段距离,和这个人对齐。然后就可以一起走了。

转到STM32上,一个STM32(A)需要给另一个STM32(B)上发送信号,另一个接收到后,开始执行采集命令。而A需要延时一段时间执行采集命令,才能和B同时采集,即时间同步。

那么怎么知道A要延时多久执行采集命令呢?可以用示波器硬件测量,A发B收之间的时间间隔。也可以A发B收,然后B发A收,得到的时间间隔除以2,得到A发B收的时间间隔。(这是软件测量法)。

STM32需要使能RTC时钟,用Hal_Get_Rtc_Time函数,STM32的时间戳。但是弊端是无法精确到毫秒,只能达到秒级。因为RTC时钟亚秒计数器无法设置给另一个STM32(即HAL_Set_Rtc_Time只能设置时、分、秒,无法设置亚秒寄存器,这点可以试一下)。

所以STM32要实现小于一毫秒的时间同步,需要再开一个微秒定时器,里面的数值作为微秒时间值,和RTC时钟配合起来计时。在RTC_Init的时候,维护一个uint16_t的变量Micros,然后在另一个函数里extern声明一下,再调用。STM32启动微秒定时器中断,每隔一微秒加一。(实际测试起来,微秒中断太可怕了,达不到这个性能,可以这么写,但是执行不了,因为速度太快,中断函数里的程序执行不过来,所以我采用的是100微秒的中断,在里面加100,维护微秒值Micros)。

这样就出现了A和B的两个RTC时钟,都是100微秒中断计时一次。同频但不同相。

为了实现同相,需要发信号。比如Stm32外接一个Wifi模块,蓝牙模块,或Rola模块。总之是一个可以发送接收的模块。

流程:A发送RTC时间戳,延时一段时间(发送到接收的时间),触发采集。

B接收到时间戳,立即触发采集。这样两者就是同时触发的啦。

A和B时间同步。


http://www.kler.cn/news/367676.html

相关文章:

  • gin入门教程(4):路由与处理器
  • Linux - 动静态库
  • uniapp 实现本地二维码 二维码中间增加图片不显示(显示白块)
  • 信息咨询试题
  • vivado 配置
  • 让你的 IDEA 使用更流畅 | IDEA内存修改
  • 【解惑】如何用python输出“1024“
  • SQL CHECK 约束:确保数据完整性的关键
  • 【LeetCode】修炼之路-0008- String to Integer (atoi)【python】
  • 世优科技AI数字人180+面部控制参数,雕琢智能体精准表达
  • C++面向对象-继承,多态,重载
  • Pytest+Allure+飞书机器人
  • Video-XL:面向小时级视频理解的超长视觉语言模型
  • STL-常用容器-list
  • Go通过gorm连接sqlserver报错TLS Handshake failed
  • LSP的建立
  • flask服务通过gunicorn启动,supervised管理服务
  • Flutter仿京东商城APP实战 用户中心基础布局
  • Go中的指针指向指针(双指针)
  • git命令笔记(速查速查)
  • Node-Red二次开发:git下载本地打镜像docker部署
  • 5G工业网络E2E运维
  • 反射、动态代理、SPI机制在RPC框架中应用
  • 如何系统学习销售?
  • 力扣33:搜索旋转排序数组
  • 2024-10-23 问AI: [AI面试题] 什么是卷积神经网络 (CNN)?