这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【原创】STM32——HC-SR04超声波模块的应用--from杰

共2条 1/1 1 跳转至

【原创】STM32——HC-SR04超声波模块的应用--from杰

工程师
2024-04-23 21:51:22     打赏

模块介绍

本篇主要介绍的是超声波模块中的HC-SR04模块,我们一般用来测距使用。

HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主要是由两个通用的压电陶瓷超声传感器,并加外围信号处理电路构成的。

两个压电陶瓷超声传感器,一个用于发出超声波信号,一个用于接收反射回来的超声波信号。由于发出信号和接收信号都比较微弱,所以需要通过外围信号放大器提高发出信号的功率,和将反射回来信号进行放大,以能更稳定地将信号传输给单片机

HC-SR04模块可提供 2cm-400cm 的非接触式距离感测功能,具有非接触式距离感测功能,测距精度可达高到 3mm ;模块包括超声波****、接收器与控制电路。从下图,我们可以看到HC-SR04超声波模块有四个引脚,分别为VCC、Trig(控制端)、Echo(发送回响信号)、GND。

WPS图片(1).jpeg

如图上所示为HC-SR04模块实物图

工作原理

(1)采用IO口TRIG触发测距,给最少10us的高电平信号。

(2)模块自动发送8个40khz周期电平并检测回波,一旦检测到有回波信号则输出回响信号。

(3)回响信号: 通过IO口ECHO输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2 或者 us/58 =厘米 或者 us/148=英寸。

时序图和流程图如下

根据上述了解,我们可以知道,超声波的变成主要配置两个引脚,分别为控制端Trig以及可以发出回响信号的Echo。控制端Trig是需要一个10us的高电平触发,所以这里的GPIO模式时推挽输出。而Echo引脚需要作为输入捕获通道,则模式为浮空输入。

硬件连接

串口1:RX PA10  TX PA9

超声波:Trig PB11    ECHG PB9

 

代码如下

#include "delay.h"

#include "sys.h"

//超声波硬件接口定义

#define HCSR04_PORT     GPIOB

#define HCSR04_CLK      RCC_APB2Periph_GPIOB

#define HCSR04_TRIG     GPIO_Pin_11

#define HCSR04_ECHO     GPIO_Pin_9

#define TRIG_Send PBout(11)

#define ECHO_Reci PBin(9)

//超声波计数

u16 msHcCount = 0;

//定时器4设置

void hcsr04_NVIC()

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

 

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;             

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       

NVIC_Init(&NVIC_InitStructure);

}

//IO口初始化 及其他初始化

void Hcsr04Init()

{  

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);

   

    GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);

    GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

     

    GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  

    GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);    

     

          

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   

     

    TIM_DeInit(TIM4);

    TIM_TimeBaseStructure.TIM_Period = (1000-1);

    TIM_TimeBaseStructure.TIM_Prescaler =(72-1);

    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);          

        

    TIM_ClearFlag(TIM4, TIM_FLAG_Update);  

    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);    

    hcsr04_NVIC();

    TIM_Cmd(TIM4,DISABLE);     

}

 

//打开定时器4

static void OpenTimerForHc()  

{

   TIM_SetCounter(TIM4,0);

   msHcCount = 0;

   TIM_Cmd(TIM4, ENABLE);

}

 

//关闭定时器4

static void CloseTimerForHc()    

{

   TIM_Cmd(TIM4, DISABLE);

}

//定时器4终中断

void TIM4_IRQHandler(void)  

{

   if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  

   {

       TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );

       msHcCount++; //计数器开始加

   }

}

 //获取定时器4计数器值

u32 GetEchoTimer(void)

{

   u32 t = 0;

   t = msHcCount*1000;

   t += TIM_GetCounter(TIM4);

   TIM3->CNT = 0;  //计数器归零

   delay_ms(50);

   return t;

}

 

//通过定时器4计数器值推算距离

float Hcsr04GetLength(void )

{

   u32 t = 0;

   int i = 0;

   float lengthTemp = 0;

   float sum = 0;

   while(i!=5)  //测量五次取平均

   {

      TRIG_Send = 1;   //给控制端高电平

      delay_us(20);

      TRIG_Send = 0;  //超声波模块已开始发送8个40khz脉冲

      while(ECHO_Reci == 0);   //若ECHO_Reci为低电平,则一直循环,直到为高电平。  

      OpenTimerForHc();  //此时说明检测到高电平,开启定时器,开始计时。       

      i = i + 1;

      while(ECHO_Reci == 1); //若ECHO_Reci为高电平,则一直循环,直到为低电平。

      CloseTimerForHc();   //此时说明检测到低电平,关闭定时器,停止计时     

      t = GetEchoTimer();        //获取定时器时间

      lengthTemp = ((float)t/58.0); //数据处理,转换成cm

      sum = lengthTemp + sum ;  //五次测得数据累加

        

    }

    lengthTemp = sum/5.0; //取平均

    return lengthTemp;

}

 下图为HC-SR04模块的实际应用,图为基于stm32的避障小车,其上的HC-SR04模块可以帮助小车实现避障和测距功能。

WPS图片(4).png


专家
2024-04-24 06:20:32     打赏
2楼

来学习一下


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]