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

硬件环境

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进行宏定义,方便调用,代码如下:
#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:
void HCSR04StartTrigStart(void){ HCSR_TRIG_HIGH(); for_delay_us(20); HCSR_TRIG_LOW();}
接下来是TIM2的配置函数,代码如下:
/* 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();
  }

}

定时器开启与关闭函数体如下面,由于没用中断,屏蔽了定时器中断部分:
//mode=1-->open timer //mode=0-->close timervoid 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); }}

接下来就是我们的核心时间采集及距离换算部分了,代码如下,设计两个函数,一个是单次获取距离,另一个是对采集结果做了均值滤波处理,减少误差:
//单次获取测量距离
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读取一次,并通过串口打印出来:
  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超声波模块却不知道如何下手的小伙伴。
(0)

相关推荐

  • PD-1/TIM3 双免疫检查点人源化小鼠模型

    遗传背景: C57BL/6N 品系构建策略: 将小鼠PD-1胞外区替换为人源PD-1胞外结构域.保留小鼠跨膜结构域和胞内结构域构建嵌合型人源化PD-1小鼠模型.将小鼠TIM3胞外区替换为人源TIM3胞 ...

  • 《电子DIY》之基于51单片机的超声波测距(HC

    一,超声波 超声波是声波的一部分,是人耳听不见.频率高于20KHZ的声波,它和声波有共同之处,即都是由物质振动而产生的,并且只能在介质中传播;同时,它也广泛地存在于自然界,许多动物都能发射和接收超声波 ...

  • HC-SR04超声波测距原理及实现

    HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm: 模块包括超声波发射器.接收器与控制电路. 在智能小车的测距.避障,盲人拐杖,视力保护器(坐姿矫正),倒 ...

  • 原来PWM这么简单!!

    基本原理 PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式: 所以根据面积等效法则,可以通过对改 ...

  • 超声波测距模块(51单片机)

    硬件介绍 1.使用场景 2. 工作原理 讲解代码 重点 1.定义引脚 2.定义时间 3.获取时间和距离 4.主函数 5.延时函数 结尾 硬件介绍 1.使用场景 超声波测距模块在平时做电子产品.机器人. ...

  • 51单片机控制超声波模块

    The HC­SR04 has four pins, VCC, GND, TRIG and ECHO; these pins all have different functions. The VCC ...

  • STM32:用HC-SR04和STM32F103ZET6做超声波测距

    出品 21ic论坛  王小琪 网站:bbs.21ic.com 背景:最近整理东西,发现了一个蓝色的小模块,上面还有两个像喇叭的小东西,关键上面还有丝印,用蓝底白字写着"HC-SR04&quo ...

  • 基于STM32、FreeRTOS低功耗设计思路和原理

    如今电池供电的产品很多,电池供电通常设计到一个问题,那就是低功耗. 本文为大家讲讲基于STM32.FreeRTOS实现低功耗思想和原理. 嵌入式专栏 1 低功耗设计常规思路 应用中使用的 RTOS 一 ...

  • 【方案推荐】基于STM32的三维旋转显示平台设计(立体成像)

    电路设计技能 本公众号主要用户为从事电路设计的硬件工程师,发布与设计技能.最新技术.最新产品等相关的技术文章,涉及PCB.FPGA.模拟电源.嵌入式.测试测量.开源平台.人工智能等相关领域. 552篇 ...

  • 基于STM32图像智能处理平台的设计开发

    随着人工智能和5G互联网的普及,物联网.智慧生活已经逐渐走入人们的生活.但是目前的智慧城市.智慧家居的普及需要一套可以快速构建整套硬件.软件相互结合的平台.而随着机器学习技术的发展,传统方式以其实现周 ...

  • 船模制作——遥控模块 基于stm32和nrf24l01(固件库开发)

    目录 nrf24l01介绍 引脚图 引脚功能介绍 模式配置方法 官方宏 stm32配置 引脚映射 初始化函数 SPI模拟通信函数 nrf24l01配置函数 nrf24l01发射和接收 nrf24l01 ...

  • 基于STM32实现的普通灯泡调光控制器

    最近没有什么产出,吓得ZhengN翻箱倒柜倒出一些小东西来发.下面分享一个ZhengN大二时候的一个小玩具,软硬件都分享给大家,有需要的小伙伴,文末获取. 这个小作品设计到了强电,不建议没经验的小伙伴 ...