基于STM32的超声波测距模块实验

实验内容

  • 理解超声波测距原理;
  • 编写程序,使用超声波模块测距并显示到数码管上。

实验目的

  • 熟悉超声波模块的使用;
  • 了解数码管的工作原理;
  • 能够编程实现用超声波测距。

实验环境

实验所需硬件

序号 名称 数量 备注
1 电脑 1台 系统Windows7及以上
2 STM32底座模块 1个 ·
3 超声波模块 1个 ·
4 ST-Link下载器 1个 ·
5 ST-Link下载器连接线 1根 ·
6 超声波实验代码 1份 ·

实验所需软件

  • MDK5 安装步骤

  • ST-LINK 驱动安装步骤

  • Git 软件下载(可选)

ST-Link下载器 & ST-Link下载器连接线

STLink下载器

STM32底座:HIVE PRO STM32是一种基于STM32F103C8T6芯片的蜂巢底座。

STM32底座

超声波模块

超声波模块

实验要求

  • 理解超声波测距原理;
  • 能够用超声波测出3M以内距离(精度5cm以内);
  • 能够画出程序流程图。

实验原理

超声波测距

由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此超声波测距被广泛的应用。

超声波发生器

为了研究和利用超声波,人们已经设计和制成了许多超声波发生器。总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生器。

超声波测距原理

超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。这就是所谓的时间差测距法。

超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样的。

测距的公式表示为:L=C×T

式中L为测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收时间数值的一半)。

超声波测距主要应用于倒车提醒、建筑工地、工业现场等的距离测量,虽然目前的测距量程上能达到百米,但测量的精度往往只能达到厘米数量级。

由于超声波易于定向发射、方向性好、强度易控制、与被测量物体不需要直接接触的优点,是作为液体高度测量的理想手段。在精密的液位测量中需要达到毫米级的测量精度,但是目前国内的超声波测距专用集成电路都是只有厘米级的测量精度。

误差分析

根据超声波测距公式L=C×T,可知测距的误差是由超声波的传播速度误差和测量距离传播的时间误差引起的。

时间误差

当要求测距误差小于1mm时,假设已知超声波速度C=344m/s (20℃室温),忽略声速的传播误差。测距误差s△t<(0.001/344) ≈0.000002907s 即2.907μs。

在超声波的传播速度是准确的前提下,测量距离的传播时间差值精度只要在达到微秒级,就能保证测距误差小于1mm的误差。使用的12MHz晶体作时钟基准的89C51单片机定时器能方便的计数到1μs的精度,因此系统采用89C51定时器能保证时间误差在1mm的测量范围内。

超声波传播速度误差

超声波的传播速度受空气的密度所影响,空气的密度越高则超声波的传播速度就越快,而空气的密度又与温度有着密切的关系,如表1所示。 已知超声波速度与温度的关系如下:

式中: r —气体定压热容与定容热容的比值,对空气为1.40,

R —气体普适常量,8.314kg·mol-1·K-1,

M—气体分子量,空气为28.8×10-3kg·mol-1,

T —绝对温度,273K+T℃。

近似公式为:C=C0+0.607×T℃

式中:C0为零度时的声波速度332m/s;

T为实际温度(℃)。

对于超声波测距精度要求达到1mm时,就必须把超声波传播的环境温度考虑进去。例如当温度0℃时超声波速度是332m/s, 30℃时是350m/s,温度变化引起的超声波速度变化为18m/s。若超声波在30℃的环境下以0℃的声速测量100m距离所引起的测量误差将达到5m,测量1m误差将达到5cm。

超声波时序图

超声波时序图

采用IO触发测距,给至少10us的高电平信号;模块自动发送8个40khz 的方波,自动检测是否有信号返回;有信号返回,通过 IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

超声模块原理图

超声模块原理图

实验步骤

① 将超声波模块安装在STM32底座上,ST_LINK连接电脑与STM32底座,如下图所示:

安装模块

② 访问github,进入github界面后点击Code,Clone HTTPS安全链接,如下图所示:

操作步骤

③ 打开电脑终端,进入工作目录workspace (workspace 为工程文件夹所在目录):

$ cd workspace

④ 运行clone命令:

$ git clone https://github.com/aiotcom/eps.git

下载目录至指定文件夹下。
如果提示“command not found”表示电脑没有安装Git,请至Git官网下载。
如果电脑没有安装 Git 软件,也可以进入Github,点击 Code -> DownLoad ZIP 下载所有工程代码。如下图所示:
下载代码
如果电脑没有公网,可以进:D盘\实验教程与代码选择相应的代码。

⑤ 打开MDK5工程软件,点击工具栏: ` Project -> Open Project,选择工程文件:基于STM32的模块实验\5.超声波模块\超声波模块程序\USER\HC-SR04.uvprojx` 并打开。

打开工程 选择文件

⑥ 工程启动后,点击 Rebuild 重新编译。如下图:

重新编译工程

⑦ 编译成功,如下图:

编译成功

⑧ 点击 Download 按钮下载程序,如下图所示:

下载程序 下载成功

⑨ 下载完成后,将USB线进行重连操作(即:将STLink的USB线从底座上取下,再重新接上)。

⑩ 在声波探头正前方移动一物体,观察数据管的显示,数码管显示的单位为cm。由于探头有盲区,当前探头距离遮挡物小于2cm时测量的结果并不准确。

测距

代码讲解

① 程序目录结构,如下图。CORE文件夹为STM32内核代码,HALLIB文件文件夹为底层HAL库文件。我们主要关心,main.c及HARDWARE中的代码。

程序目录结构

② main.c中对TM1640、HC_SR04超声波探头模块、定时器进行初始化。其中定时器为超声波测距提供了时间基准。TM1640驱动数码管显示。

    int main(void)
    {
        uint16_t Avg;//测量返回的距离值

        HAL_Init();//初始化HAL库  		
        TM1640_Init();//初始化TM1640,数码管驱动
        HCSR04_Init();//初始化超声波模块
        TIM2_Init(10-1,64-1);//初始化定时器2(中断周期10us),超声波测量使用

        while(1)
        {
            Avg =  HCSR04_StartMeasure(10);//探测距离共探测10次
            send_LED_Display(0xC0,Avg,1);//数码管显示距离
            HAL_Delay(500);//每500ms测量一次
        }
    }

通过调用HCSR04_StartMeasure()获取探测距离。send_LED_Display显示获取到的距离。

    while(1)
        {
            Avg =  HCSR04_StartMeasure(10);//探测距离共探测10次
            send_LED_Display(0xC0,Avg,1);//数码管显示距离
            HAL_Delay(500);//每500ms测量一次
        }

常见问题

  1. 弹出警告窗口,不能下载程序。

    • 请确认STLink驱动、STM32F103C8的DFP包是否安装。
    • STLink仿真器是否正常接入。
  2. 下载代码后程序没观察到实验现象。

    • 请重新上电,或者按下底座上的复位按键。
    • 模块没有安装稳妥。
  3. 测量数据不对。

    • 超声波探头是否接入到正常的座子上。或者进入了测量盲区(<3cm)。

实验思考

  1. 对超声波采到的数据进行滤波处理。