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

用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.同时测量:

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

发布了48 篇原创文章 · 获赞 78 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/xiaoyuanwuhui/article/details/88411896