STM32驱动多个超声波模块(只用一个定时器)

2023-05-16

用STM32单片机成功驱动一个超声波模块后,接下来便有了疑问如何用stm32单片机驱动多个超声波模块呢?(驱动一个超声波模块可以参考:stm32驱动超声波模块测距)
超声波模块型号为HC-SR04,模块驱动方式选择利用外部中断的方式驱动(具体细节可参见上面链接)。
经过一个下午的思考实验发现了两种驱动多个超声波模块的方法:

  1. 分时测量
  2. 同时测量

1.分时测量:

通过类似于实现流水灯的方法,多个超声波模块依次测量并将测量结果依次输出。
优点:各个超声波模块测量过程中不会出现相互干扰的情况。
缺点:整体测量周期长,数据采样频率比较低。
这里有几个问题点需要注意:

  1. 一个超声波模块需要在测量完成后再开始下一个模块的测量
  2. 超声波模块在测量的过程中有时会跳动明显超出量程的值
  3. 在带电拔掉超声波模块可能出现程序异常
    为解决上面几个问题,需要根据超声波模块的量程(2cm-400cm)进行限辐,这里我根据需要将超声波模块的最远距离设定为255cm。这样最远距离的测量时间为15ms(255cm x 2 / 100 / 340m/s * 1000 = 15ms),这样便可以将定时器计时超过15ms时直接按15ms计算。这样便基本可以解决上面的问题1和问题2,一个模块测量完成的时间不会超过15ms(实际预留时间时建议在此基础上多几毫秒),这样每过一个15ms便可以完成一个模块的测距。问题3可以通过每次测量开始前将超声波数据的初始值初始化为量程的最小值2cm,并将超声波模块的ECHO引脚设为低电平来解决(在上电状态下拔掉超声波模块,ECHO引脚会呈现高电平状态导致一直进外部中断)。这样如果串口上位机距离值一直打印为2cm便很明显知道该超声波模块没有接。

2.同时测量:

创建一个系统时钟,每一个超声波模块在测量过程中只记录时间戳,不直接占用定时器,这样便可以实现多个超声波模块同时测量。
优点:整体测量周期短,数据采样频率高。
缺点:各个超声波模块在测量过程中可能出现相互干扰情况。
使用建议:将各个模块尽量大角度朝不同的方向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32驱动多个超声波模块(只用一个定时器) 的相关文章

随机推荐

  • C++类与对象笔记十四:多态六:虚析构和纯虚析构

    多态使用时 xff0c 如果子类中有属性开辟到堆区 xff0c 那么父类指针在释放时无法调用子类的析构代码 即 xff1a 父类指针无法调用子类实例对象内的析构函数 造成堆区内存泄漏 解决方案 将父类中的析构函数改为虚析构或者纯虚析构 虚析
  • PCL笔记九:采样一致性

    模型拟合 xff1f 采样一致性的目的 xff1a 用于排除错误的样本 基于采样一致性算法的应用主要是对点云进行分割 xff0c 根据不同设定的几何模型 xff0c 估计对应的几何模型的参数 xff0c 在一定允许误差范围内分割出在模型上的
  • ubuntu下安装gfortran

    找官网 xff1a GFortranBinaries GCC Wiki 找到GNU Linux 找到Download xff0c 点击蓝色链接下载 此外有installtion instructions安装步骤 Gfortran Binar
  • 面试可能会问六:智能指针

    先看一下百度百科的解释 xff1a 指针指针 当类中有指针成员时 xff0c 一般有两种方式来管理指针成员 xff1a 一是采用值型的方式管理 xff0c 每个类对象都保留一份指针指向的对象的拷贝 xff1b 另一种更优雅的方式是使用智能指
  • C++笔记:指针转向(重新赋值)时的问题;重复释放;原地址遗漏释放;赋值运算符重载operator=;

    一个类默认会创建4个函数 xff1a 默认构造 拷贝构造 析构 和operator 61 函数 最后一个就是赋值运算符重载 xff0c 可以进行简单的值传递 注意 xff1a 这个是值传递 问题就在这 xff1b 还有一种传递叫 xff1a
  • C++笔记:虚继承

    虚继承解决的是菱形继承 Animal下派生出Sheep和Tuo类 动物基类下 xff0c 有两个派生类 xff0c 一个是羊类 xff0c 一个是驼类 这两个类都继承了Animal的一个属性 xff0c 比如m age 这样就导致资源的浪费
  • Ubuntu 搭建文件服务器(Nginx)

    1 xff0c 下载Nginx 2 xff0c 安装Nginx 3 xff0c Nginx指令及脚本使用 4 xff0c 配置Nginx 1 xff0c 下载Nginx 去官网下载对应的Nginx版本 nginx download 直接在u
  • WS2812灯珠(四)---实现全彩呼吸灯效果

    WS2812灯珠实现呼吸灯效果主要涉及到呼吸函数及颜色模型两部分的内容 清楚了这两点结合之前的灯珠驱动程序 xff0c 便可以实现任意颜色的呼吸变换效果了 呼吸函数 具体的呼吸函数细节这里就不介绍了 xff0c 感兴趣的可以自行搜索 这里下
  • 浅谈Marlin2.0

    简介 marlin固件发展至今已经形成了三个比较重大的版本 xff1a 1 0版 xff0c 1 1版 xff0c 2 0版 我接触marlin固件已经有一段时间了 xff0c 原来一直对于marlin固件的结构和应用平台一直不是很理解 x
  • uni-app多平台融合【入门】(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 uni app多平台融合 入门 标贝科技 xff09 一 uni app介绍 uni
  • vscode开发STM32(三)---调试篇

    vscode开发STM32 xff08 三 xff09 调试篇 文章目录 vscode开发STM32 xff08 三 xff09 调试篇前提条件配置调试配置JLink使用 96 JLinkGDB 96 进行调试配置stlink使用openO
  • CANopen资料收集

    CANopen资料收集 文章目录 CANopen资料收集开源CANopen协议栈1 CanFestival2 CANopenNode 3 canopen stack CIA官网canopen说明 https www can cia org
  • Modbus资料收集

    Modbus资料收集 文章目录 Modbus资料收集开源Modbus协议栈1 FreeModbus2 uc Modbus 开源Modbus协议栈 1 FreeModbus 网站 xff1a https www embedded expert
  • CANopenNode学习笔记(一)--- README翻译

    CANopenNode学习笔记 文章目录 CANopenNode学习笔记特性CANopen其他 CANopenNode 流程图文件结构对象字典编辑器 CANopenNode 是免费开源的CANopen协议栈 CANopen是建立在CAN基础
  • STM32驱动MAX6675读取K型热电偶温度

    MAX6675 进行热电偶冷端补偿和数字化 K 型热电偶信号 输出 12 位分辨率 SPI 兼容 只读的数据 转换器的精度为 0 25 xff0c 最高可读 43 1024 xff0c 如果使用数据的 8LSB 则温度范围为 0 到 43
  • WS2812灯珠(二)-- STM32 SPI+DMA方式驱动

    通过硬件SPI的可以很巧妙的模拟出WS2812的通信时序 xff0c 用spi的8位数据模拟ws281x的一位数据 要将系统时钟设置为56M xff0c SPI分频数设置为8 xff0c 则SPI的通信频率为7M xff0c 1s 7M 1
  • ESP8266(一)---引脚定义&接线说明

    一 引脚定义 xff1a FunctionDescriptionURXDUART RXD xff0c 接收UTXDUART TXD xff0c 发送RST外部Reset信号 xff0c 低电平复位 xff0c 高电平工作 xff08 默认高
  • STM32编码器模式详解(一)---理论

    一 编码器接口模式 选择编码器接口模式的方法是 xff1a 如果计数器只在TI2的边沿计数 xff0c 则置TIMx SMCR寄存器中的SMS 61 001 xff1b 如果只在TI1边沿计数 xff0c 则置SMS 61 010 xff1
  • STM32使用虚拟示波器

    STM32使用虚拟示波器 在调试过程中 xff0c 经常会有需要看到数据实时变化的情况 xff0c 这时候便需要用到虚拟示波器 如 xff1a 制作平衡车时 xff0c 需要了解拟合角度跟随加速度计和陀螺仪的动态变化情况 xff1b 做电机
  • STM32驱动多个超声波模块(只用一个定时器)

    用STM32单片机成功驱动一个超声波模块后 xff0c 接下来便有了疑问如何用stm32单片机驱动多个超声波模块呢 xff1f xff08 驱动一个超声波模块可以参考 xff1a stm32驱动超声波模块测距 xff09 超声波模块型号为H