[其他ST产品] STM32驱动HC-SR04超声波模块

[复制链接]
 楼主| lvuu 发表于 2023-9-26 16:28 | 显示全部楼层 |阅读模式
前言

HC-SR04作为简单的外设模块,广泛应用于简单的课设项目中,十分适合入门STM32。

一、HC-SR04介绍

HC-SR04的介绍,这里就不做累述了,大家可以上某宝上找店家要下用户手册,或者到其他博主的博客中看个大概的介绍。

二、使用步骤1.接口定义
  1. VCC      ------->      5V
  2. TRIG      ------->                PA6
  3. ECHO      ------->                PA7
  4. GND      ------->                GND
TRIG和ECHO两个接口也可以使用其他的IO口继续驱动,在这篇文章中,博主用的是PA6和PA7。当然也可以使用其他的IO口,只需要所使用的IO口可以输出输入高低电平即可。
 楼主| lvuu 发表于 2023-9-26 16:38 | 显示全部楼层
阅读时序图
747965129651d5474.png
 楼主| lvuu 发表于 2023-9-26 16:39 | 显示全部楼层
如图,驱动HC-SR04需要先向TRIG口输入一段超过10us的高电平。此时模块会自动输出脉冲信号来检测是否接收到了信号的返回。若接收到了返回信号,则会将ECHO段拉高并持续一段时间,而持续的时间便是超声波信号发出到接收到返回的超声波信号的时间。
 楼主| lvuu 发表于 2023-9-26 16:42 | 显示全部楼层
 楼主| lvuu 发表于 2023-9-26 16:42 | 显示全部楼层
原理:IO口发送触发信号拉高Trig,延迟超过10us之后,再拉低Trig,作为超声波模块的启动信号,此时模块不断自动发出一段40khz的信号,当收到返回的超声波信号时,ECHO口则输出回响信号 。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离.
 楼主| lvuu 发表于 2023-9-26 16:42 | 显示全部楼层
4.代码
hscr.c下的代码:
  1. #include "hcsr.h"

  2. void TIM2_Count_Configuration(void)
  3. {
  4.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  5.        
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  7.        
  8.         TIM_TimeBaseStructure.TIM_Period = 0xFFFF;  //999+1 =1000
  9.         TIM_TimeBaseStructure.TIM_Prescaler = 71;  //71+1= 72分频
  10.         //TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  11.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  12.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  13.         TIM_Cmd(TIM2, ENABLE);
  14.         //暂时先关闭TIM2时钟,等全部初始化结束后正式使用定时器前再开启
  15.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);
  16. }

  17. //PB6(output):TRIG   PB7(input):ECHO
  18. void HCSR04_GPIO_Configuration(void)
  19. {
  20.         GPIO_InitTypeDef GPIO_InitStructure;

  21.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  22.        
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  26.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  27.        
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  29.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  31.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  32. }



 楼主| lvuu 发表于 2023-9-26 16:42 | 显示全部楼层
代码分析:该段代码初始化HC-SR04所使用到的IO口和时钟。并没有什么难度。

 楼主| lvuu 发表于 2023-9-26 16:42 | 显示全部楼层
main. c的代码如下:

  1.           while(1)
  2.         {       

  3.                 TIM_Cmd(TIM2, ENABLE);
  4.                 TRIG_H;
  5.                 delay_us(15);
  6.                 TRIG_L;
  7.                 //printf("HERE");
  8.                 while(ECHO == 0);
  9.                 TIM_SetCounter(TIM2, 0);
  10.                
  11.                 while(ECHO == 1);
  12.                 TIM_Cmd(TIM2, DISABLE);
  13.                 time = TIM_GetCounter(TIM2);
  14.                 //printf("time = ",time);
  15.                 distance = time * 0.017;
  16.                 printf("Distance = %.2fcm\n", distance);
  17.         }
 楼主| lvuu 发表于 2023-9-26 16:42 | 显示全部楼层
代码分析:此段代码的重点在于两个while循环,两个while循环都是为了检查ECHO的输出以及查询其高电平持续的时间,通过持续时间算出测量距离。
MessageRing 发表于 2023-9-30 19:03 | 显示全部楼层
这个while可以用中断代替吗?
claretttt 发表于 2023-10-5 10:01 | 显示全部楼层
超声波模块可能会产生电磁干扰,因此建议将其与其他电路隔离,以避免对其他电路的影响。
uptown 发表于 2023-10-7 22:29 | 显示全部楼层
HC-SR04模块的最大测距范围为4m,如果你的应用需求超过这个范围,你可能需要选择其他类型的超声波模块。
Jacquetry 发表于 2023-10-7 22:36 | 显示全部楼层
这个测量精度怎么样啊
janewood 发表于 2023-10-8 16:20 | 显示全部楼层
在发送触发信号后,HC-SR04会发射超声波,并等待回响信号。回响信号的脉冲宽度与测量目标与传感器之间的距离成正比。你需要使用STM32的GPIO库函数来设置相应的引脚为输入模式,并使用外部中断或轮询方式来检测回响信号的变化。
wengh2016 发表于 2023-10-8 18:17 | 显示全部楼层
HC-SR04超声波模块有两种工作模式,即单脉冲模式和多脉冲模式。单脉冲模式适用于距离测量,多脉冲模式适用于流速测量。在使用时需要根据实际需求选择合适的工作模式。
uptown 发表于 2023-10-8 20:42 | 显示全部楼层
一旦检测到回响信号的变化,你需要使用STM32的定时器或计数器来测量回响脉冲的宽度。通过测量回响脉冲的宽度,你可以计算出目标与传感器之间的距离。
Bowclad 发表于 2023-10-8 21:20 | 显示全部楼层
这个难点在于对时间的把握吧
Henryko 发表于 2023-10-10 13:17 | 显示全部楼层
这个模块的稳定性怎么样
AloneKaven 发表于 2023-10-10 17:36 | 显示全部楼层
手册要去哪获取啊
updownq 发表于 2023-10-10 20:03 | 显示全部楼层
当时Trig引脚发出高电平脉冲的时候同时打开定时器计时,当Echo引脚变为低电平的时候定时器停止计时,读出定时器的值T,当时所测量的距离为T x 声速(340M/S)/2。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

612

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部