Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于STM32的HC-SR04超声波测距模块实验

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

作者头像
用户8913398
发布于 2021-08-16 08:07:17
发布于 2021-08-16 08:07:17
3.9K00
代码可运行
举报
运行总次数:0
代码可运行

硬件环境

STM32F407探索板(其他开发板皆可以)

HC-SR04超声波模块

软件环境

KEIL5

CUBEMX

串口调试助手(sscom或其他)

实验目标

  • 了解HC-SR04超声波模块工作原理
  • 实现超声波模块测距

1、超声波模块介绍

1.1 超声波测距原理及系统组成

超声波测距是借助于超声脉冲回波渡越时间法来实现的。设超声波脉冲由传感器发出到接收所经历的时间为t,超声波在空气中的传播速度为c,则从传感器到目标物体的距离D可用下式求出:D = ct/2,图 2是相应的系统框图。

基本原理:经发射器发射出长约 6mm,频率为 40KHZ 的超声波信号。此信号被物 体反射回来由接收头接收,接收头实质上是一种压电效应的换能器。它接收到信号后产 生 mV 级的微弱电压信号。

1.2 HC-SR04模块原理

HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测 距精度可达高到3mm,模块包括超声波发射器、接收器与控制电路。

基本工作原理:(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声 波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2,下面是实物图。

如上图接线,VCC供5V电源,GND为地线,TRIG触发控制信号输入,ECHO 回响信号输出等四个接口端。

1.3 超声波时序图

以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。

注:1、此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响 模块的正常工作。

2、测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的 结果。

1.4 电气参数

电气参数

HC-SR04模块

工作电压

DC5V

工作电流

15mA

工作频率

40KHZ

最远射程

4M

最近射程

2CM

测量角度

15度

输入触发信号

10uS 的 TTL 脉冲

输出回响信号

输出 TTL 电平信号,与射程成比例

规格尺寸

45*20*15mm

2、软件实现

对程设计最重要的就是模块的时序图了,一切皆时序,看明白了时序,那么驱动自然也就不难写了,分析上面时序,首先模块需要触发信号,触发信号是不低于10us的TTL电平,也是就需要控制IO输出不低于10us的高电平脉冲,模块接收到此脉冲信号后,内部会输出8个40KHZ脉冲,然后模块会输出与检测距离相应时间的高电平作为回响信号,作为我们检测的依据。

2.1 硬件连接

单片机

HC-SR04模块

5V

VCC

Trig

PB14

Echo

PB15

GND

GND

2.2 cubemx配置

结合上面我们的分析,需要用到us延时,定时器计算超声波返回高电平时间,us延时在上一篇文章做了很详细的介绍,小伙伴们可以动动可爱的小手哈,上篇文章链接在这:Embeded

时钟配置上篇文章也有介绍到,这里也贴出来,也可以使用内部RC高速时钟,本次主要介绍使用外部高速时钟,上图:

我板子上焊接的是8M的晶体,如果小伙伴们的板子上不是8M,根据自己的晶振频率配置即可,左侧圈1中,可以根据自己的晶体频率,输入相应的频率,经过分频、倍频后,系统时钟频率设置为最大,168MHZ,APB1的时钟频率为 84MHZ,也是后面用到的 TIM2 挂载的时钟源的频率。

TIM2 基础配置,这个就比较简单了,分频系数 83,计数单位为 84MHZ/84 = 1uS,向上计数方式,周期 65535,由于没有使用到中断,不需要开启中断。

配置串口1作为我们调试输出串口,配置如下图

接下来,配置超声波模块用到的IO,PB14作为Trig引脚,配置为输出模式,PB15作为Echo引脚,配置为输入模式

此时IO的状态有个默认值,可能不是我们上电初始化希望保持的状态,比如Trig引脚是需要输出不低于10us的高电平脉冲,那么Trig初始引脚配置为低电平使我们希望的,为实现这个目的,需要再配置一下

至此,我们的cubemx配置就完成了,下面进行软件逻辑的实现。

2.3 软件代码实现

首先将我们用到的两个IO进行宏定义,方便调用,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define HCSR_TRIG_HIGH() HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_SET)
#define HCSR_TRIG_LOW()  HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_RESET)

#define HCSR_ECHO()  HAL_GPIO_ReadPin(HC_SR04_ECHO_GPIO_Port,HC_SR04_ECHO_Pin)

根据上面的协议,先实现触发脉冲信号,不低于10us的TTL高电平脉冲信号,我延时了20us,也是上一张测试过的20us延时函数,如果小伙伴不知道怎么实现us延时,麻烦翻看上一张哈,代码如下,顺便用逻辑分析仪截了一下TRIG引脚信号,还是熟悉的20us:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void HCSR04StartTrigStart(void)
{
 HCSR_TRIG_HIGH();
 for_delay_us(20);
 HCSR_TRIG_LOW();
}

接下来是TIM2的配置函数,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* TIM2 init function */
void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 84-1;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 65535;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

定时器开启与关闭函数体如下面,由于没用中断,屏蔽了定时器中断部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//mode=1-->open timer 
//mode=0-->close timer
void HCSR04_TimerFunc(uint8_t mode)
{
 if(mode)
 {
  __HAL_TIM_SetCounter(&htim2,0);
  HAL_TIM_Base_Start(&htim2);
  //HAL_TIM_Base_Start_IT(&htim2);
  msHcCount = 0;
 }
 else
 {
  HAL_TIM_Base_Stop(&htim2);
  //HAL_TIM_Base_Stop_IT(&htim2);
 }
}

接下来就是我们的核心时间采集及距离换算部分了,代码如下,设计两个函数,一个是单次获取距离,另一个是对采集结果做了均值滤波处理,减少误差:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//单次获取测量距离
float HCSR04_Get_Distant(void)
{
    HCSR04StartTrigStart();
    while(!HCSR_ECHO());
    HCSR04_TimerFunc(1);//start timer
    while(HCSR_ECHO());
    HCSR04_TimerFunc(0);//stop timer

    return (__HAL_TIM_GetCounter(&htim2))/58.0;
}

//均值滤波减小测量误差
float Distance(uint8_t cnt)
{
    float sum = 0;
    for(int i =0;i<cnt;i++)
    {
        sum+=HCSR04_Get_Distant();
    }
 return sum/cnt;
}

主函数部分没什么,每隔100ms读取一次,并通过串口打印出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  distant =  Distance(5);
  t++;
  if(t%5==0)
  {
        t=0;
        printf("\r\n\r\n---------------start--------------------\r\n\r\n");
        printf("The Mesure Distant is:%.2f cm\r\n",distant);
        printf("\r\n\r\n----------------stop--------------------\r\n\r\n");
        HAL_GPIO_TogglePin(led_run_GPIO_Port,led_run_Pin);
  }
  HAL_Delay(100);

最终测试效果,手机支架高度,大概16CM,测量效果还是可以的:

本次要分享的内容就要结束啦,希望对能帮助到正在想使用HC-SR04超声波模块却不知道如何下手的小伙伴。

如果你觉得对自己有帮助的话,给个赞,点个关注,点个在看,感谢前进的道路上有你的陪伴!图片欢迎大家关注Embeded小飞哥,让我快点遇到优秀的你,然后一起变得更加优秀,加油!!!小飞哥微信号:w974762670,加好友进群一起交流呀!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小飞哥玩嵌入式 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
STM32CubeMX-39 | 使用硬件定时器测算超声波模块数据(HC-SR04)
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的通用定时器外设,捕获超声波模块的距离信号。
Mculover666
2021/05/18
1.2K0
STM32CubeMX-39 | 使用硬件定时器测算超声波模块数据(HC-SR04)
树莓派基础实验24:超声波测距传感器实验
   超声波传感器使用超声波来准确检测物体并测量距离。他发出超声波并将它们转换成电信号,主要应用于汽车的倒车雷达、机器人自动避障行走、建筑施工工地以及一些工业现场。
张国平
2020/09/27
2.3K0
stm32f103+HC-SR04+ssd1306实现超声波测距
如果你经常做一些嵌入式设备,HC-SR04应该不陌生,一款便宜简单的超声波测距装置,可以应用在智能小车测距壁障,航模飞行器定高等。这篇文章简单讲解,通过一个示例来揉和。
秋名山码神
2023/11/07
3760
stm32f103+HC-SR04+ssd1306实现超声波测距
基于STM32和HC-SR04模块实现超声波测距功能
本文用的单片机是STM32F103C8T6,超声波测距模块是HC-SR04,显示测距结果用的是0.96寸OLED屏模块。
zeruns
2022/11/11
2.3K0
基于STM32和HC-SR04模块实现超声波测距功能
4.9 51单片机-(HC-SR04)超声波测距模块
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、 接收器与控制电路。
DS小龙哥
2022/01/12
1.8K0
4.9 51单片机-(HC-SR04)超声波测距模块
超声波测距模块
硬件介绍 1.使用场景 超声波测距模块在平时做电子产品、机器人、智能设备中的应用里还是非常常用的,使用非常简单,但是代码的编写和理解其实并不容易,在这里想和大家交流一下。有不同的意见和建议可以给我留言或者私信我。 2. 工作原理
跋扈洋
2021/01/28
1K0
C51 单片机开发认识超声波测距传感器
闲话:数学功底好的人,对于编程来说是真的好。高精尖的东西都涉及深厚的数学知识,算法的优化也涉及各种数学知识、……编译器对于除法的优化,数学不好都搞不明白,只能记个结论算啦!如果有大把的时间用来学习的程序员,比如还在学校当学生的准程序员,那么花时间研究数学是太值得了。
码农UP2U
2024/07/04
2270
C51 单片机开发认识超声波测距传感器
在全志H616核桃派开发板上实现超声波传感器测距
超声波传感器是一款测量距离的传感器。其原理是利用声波在遇到障碍物反射接收结合声波在空气中传播的速度计算的得出。在测量、避障小车,无人驾驶等领域都有相关应用。
阿志小管家
2024/05/13
1320
在全志H616核桃派开发板上实现超声波传感器测距
Linux驱动开发-编写超声波测距模块的驱动
当前采用的这种超声波测距模块在各大高校实验室、毕设、课设里用的很多,原理很简单,通过声波测距,发出的声音碰到障碍物会反弹,声音在空气里传播的速度是已知的,根据时间就能计算出测量的距离。这款超声波模块内部自带了时间计算电路,型号是HC-SR04 ,它可提供 2cm-400cm 的非接触式距离感测功能,距精度可达高到 3mm; 整个模块包括了超声波发射器、 接收器与控制电路。
DS小龙哥
2022/04/08
1.8K0
Linux驱动开发-编写超声波测距模块的驱动
使用.NET IoT驱动超声波测距传感器
最近买的一堆传感器到货了,先来把玩一下超声波测距传感器。超声波传感器一般用于机器人,小车的避障,物体的测距,液位检测,停车检测等领域。
桑榆肖物
2022/11/18
6640
使用.NET IoT驱动超声波测距传感器
雷达测距和超声波测距_超声波测距的原理是什么
本实验是基于MSP430利用HC-SR04超声波传感器进行测距,测距范围是3-65cm,讲得到的数据显示在LCD 1602液晶屏上。
全栈程序员站长
2022/10/03
7930
雷达测距和超声波测距_超声波测距的原理是什么
基于单片机设计的超声波测距仪(采用HC-SR04模块)
本项目是基于单片机设计的超声波测距仪,主要采用了STC89C52单片机和HC-SR04超声波测距模块。通过LCD1602液晶显示屏来展示测量的距离信息。
DS小龙哥
2023/11/28
7780
基于单片机设计的超声波测距仪(采用HC-SR04模块)
LabVIEW控制Arduino实现超声波测距(进阶篇—5)
超声波测距是一种传统而实用的非接触测量方法,与激光、涡流和无线电测距方法相比,具有不受外界光及电磁场等因素影响的优点,在比较恶劣的环境中也具有一定的适应能力,且结构简单、成本低,因此在工业控制、建筑测量、机器人定位方面有广泛的应用。
不脱发的程序猿
2022/06/12
1.6K0
LabVIEW控制Arduino实现超声波测距(进阶篇—5)
树莓派综合项目2:智能小车(四)超声波避障
树莓派综合项目2:智能小车(二)tkinter图形界面控制,实现了本地图形界面控制小车的前进后退、转向和原地转圈。
张国平
2020/12/23
1.5K0
树莓派综合项目2:智能小车(四)超声波避障
C51 单片机开发超声波测距传感器控制 LED 灯
上篇文章整理了关于超声波测距传感器 HC-SR04 这个模块,本篇文章来完成一个它的基本编程。
码农UP2U
2024/07/04
1920
C51 单片机开发超声波测距传感器控制 LED 灯
树莓派Raspberry+超声波模块测距
Talk is cheak,show me the code! import RPi.GPIO as GPIO import time makerobo_TRIG = 11 # 超声波模块Tring控制管脚 makerobo_ECHO = 12 # 超声波模块Echo控制管脚 # 超声波模块初始化工作 def makerobo_setup(): GPIO.setmode(GPIO.BOARD) # 采用实际的物理管脚给GPIO口 GPIO.setwarnings(False)
周星星9527
2020/11/11
5900
FPGA系统性学习笔记连载_Day21【模块实验】 之 《超声波测距》篇
本系列为FPGA系统性学习学员学习笔记整理分享,如有学习或者购买开发板意向,可加交流群联系群主。
FPGA技术江湖
2021/04/12
4400
FPGA系统性学习笔记连载_Day21【模块实验】 之 《超声波测距》篇
张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块
  HC-SR04 采用 IO 触发测距。下面介绍一下其在 Windows 10 IoT Core 环境下的用法。   项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码。 1.
张高兴
2018/05/18
7450
项目复刻 - STM32智能小车 笔记1
原理是4红外对管可以通过红外反射识别出小车和路径(黑色胶带的)的相对位置,来调节转向,实现循迹功能。
笃信好学
2023/03/06
1.1K0
【参赛经验分享】智能导盲杖设计
摘 要:中国的盲人数量占全球盲人数量比重很大,盲人在日常交通和生活活动中都受到很大限制,盲人对于出行有很大的困扰。本篇论文利用超声波测距原理解决盲人出行问题。本文首先介绍了国内外定位的发展现状和发展趋势,其次对硬件进行选型和硬件外围电路设计,对硬件电路部分的各个模块做了详细设计说明,包括单片机最小系统、电源电路、超声波测距电路、GPS模块电路、GSM模块电路、报警电路、显示电路以及语音播放电路。根据所画流程框图编写程序,再通过仿真电路图进行调试。通过实验表明,本系统能实现距离的实时测量、语音播报、紧急报警的功能。经测试本系统具有硬件结构简单、成本低、工作可靠、流程清晰、精度高、易于推广的优点。
DRL DP-旺仔
2021/10/12
4.9K0
推荐阅读
相关推荐
STM32CubeMX-39 | 使用硬件定时器测算超声波模块数据(HC-SR04)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验