问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32实现HC-SR04超声波传感器测距详解

创作时间:
作者:
@小白创作中心

STM32实现HC-SR04超声波传感器测距详解

引用
CSDN
1.
https://m.blog.csdn.net/qq_44016222/article/details/142132802

HC-SR04超声波传感器是一种常用的测距传感器,通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。本文将详细介绍HC-SR04超声波传感器的工作原理及其在STM32微控制器上的应用,并提供完整的代码示例。

一、介绍

HC-SR04超声波传感器是通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离的一种传感器模块。与蝙蝠寻找猎物的回声定位基本原理相同,可以广泛应用于无损测量、水文液位测量、工业场地等领域。

以下是超声波传感器的主要参数:

参数
规格
型号
HC-SR04
工作电压
DC 5V
工作电流
3.3mA
工作温度
-40~85℃
输出方式
GPIO
探测距离
2cm~600cm
探测精度
3mm

二、传感器原理

1. 原理图

模块包括超声波发射器、接收器与控制电路。

2. 引脚描述

引脚名称
描述
VCC
供给电压DC 5V
GND
地线
TRIG
触发控制信号输入
ECHO
回响信号输出

3. 工作原理介绍

传感器发射器向某一个确定的方向发射超声波的同时进行计时,超声波在碰触到障碍物之后会返回给超声波接收器一个反射波,此时停止计时,将时间纪录为t。根据速度距离公式,结合超声波的传播速度与时间t,可以推算出超声波发射点与所测量障碍物之间的距离为S=340t/2

  1. 采用IO口TRIG触发测距,给最少10us的高电平
  2. 模块自动发送8个40khz的方波,自动检测是否有信号返回
  3. 有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

测试距离=(高电平时间*声速(343M/S))/2;
distance_cm=(us)/58

注意:测量周期应为60ms以上,以防止发射信号对回响信号的影响,被测物体的面积应不小于0.5平方米且尽量要求平整,否则影响结果

三、程序设计

使用STM32F103C8T6读取HC-SR04超声波传感器采集的距离数据,通过串口发送至电脑。同时,将读取得到的距离信息在OLED上显示。

硬件连接如下:

  • TRIG -> PA0
  • ECHO -> PA1
  • OLED_SCL -> PB11
  • OLED_SDA -> PB10
  • 串口 -> 串口1

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "ultrasonic.h"
#include "timer.h"

/*****************辰哥单片机设计******************
                                            STM32
 * 项目			:	HC-SR04超声波传感器实验                     
 * 版本			:   V1.0
 * 日期			:   2024.8.27
 * MCU			:	STM32F103C8T6
 * 接口			:	参看ultrasonic.h							
 * BILIBILI	    :	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 
**********************BEGIN***********************/
float distance;
int main(void)
{ 
    
  SystemInit();//配置系统时钟为72M	
    delay_init(72);
    LED_Init();
    LED_On();
    Ultrasonic_Init();
    USART1_Config();//串口初始化
    
    OLED_Init();
    printf("Start \n");
    delay_ms(1000);
    
    OLED_Clear();
    //显示“距离:”
    OLED_ShowChinese(0,0,0,16,1);
    OLED_ShowChinese(16,0,1,16,1);
    OLED_ShowChar(32,0,':',16,1);
    OLED_ShowString(60,20,"cm",16,1);
  while (1)
  {
        LED_Toggle();
        distance = UltrasonicGetLength();
        OLED_ShowNum(40,20,distance,2,16,1);
        delay_ms(50);	//延时50ms
  }
}  

ultrasonic.h文件

#ifndef __ULTRASONIC_H
#define	__ULTRASONIC_H
#include "stm32f10x.h"
#include "adcx.h"
#include "delay.h"
#include "math.h"
/*****************辰哥单片机设计******************
                                            STM32
 * 文件			:	HC-SR04超声波传感器h文件                   
 * 版本			:   V1.0
 * 日期			:   2024.8.27
 * MCU			:	STM32F103C8T6
 * 接口			:	见代码							
 * BILIBILI	    :	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥
**********************BEGIN***********************/
/***************根据自己需求更改****************/
// ULTRASONIC GPIO宏定义
#define		ULTRASONIC_GPIO_CLK								RCC_APB2Periph_GPIOA
#define 	ULTRASONIC_GPIO_PORT							GPIOA
#define 	ULTRASONIC_TRIG_GPIO_PIN					GPIO_Pin_0	
#define 	ULTRASONIC_ECHO_GPIO_PIN					GPIO_Pin_1	
#define 	TRIG_Send  PAout(0)
#define 	ECHO_Reci  PAin(1)
/*********************END**********************/
void Ultrasonic_Init(void);
float UltrasonicGetLength(void);
void OpenTimerForHc(void);
void CloseTimerForHc(void); 
u32 GetEchoTimer(void);
#endif /* __ADC_H */

ultrasonic.c文件

#include "ultrasonic.h"
#include "timer.h"
/*****************辰哥单片机设计******************
                                            STM32
 * 文件			:	HC-SR04超声波传感器c文件                   
 * 版本			:   V1.0
 * 日期			:   2024.8.27
 * MCU			:	STM32F103C8T6
 * 接口			:	见代码							
 * BILIBILI	    :	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥
**********************BEGIN***********************/
//超声波计数
u16 msHcCount;
void Ultrasonic_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_APB2PeriphClockCmd (ULTRASONIC_GPIO_CLK, ENABLE );			// 打开连接 超声波传感器 的单片机引脚端口时钟
        GPIO_InitStructure.GPIO_Pin = ULTRASONIC_TRIG_GPIO_PIN;			// 配置连接 传感器TRIG 的单片机引脚模式
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;						// 设置为推挽输出
        GPIO_Init(ULTRASONIC_GPIO_PORT, &GPIO_InitStructure);				// 初始化 
        GPIO_InitStructure.GPIO_Pin = ULTRASONIC_ECHO_GPIO_PIN;			// 配置连接 传感器ECHO 的单片机引脚模式
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;				// 设置为浮空输入输入
        GPIO_Init(ULTRASONIC_GPIO_PORT, &GPIO_InitStructure);				// 初始化 
    
        TIM4_Int_Init(1000-1,72-1);
}
//打开定时器4
static void OpenTimerForHc()  
{
   TIM_SetCounter(TIM4,0);
   msHcCount = 0;
   TIM_Cmd(TIM4, ENABLE); 
}
//关闭定时器4
static void CloseTimerForHc()    
{
   TIM_Cmd(TIM4, DISABLE); 
}
//获取定时器4计数器值
u32 GetEchoTimer(void)
{
   u32 t = 0;
   t = msHcCount*1000;
   t += TIM_GetCounter(TIM4);
   TIM4->CNT = 0;  
   delay_ms(50);
   return t;
}
 
//通过定时器4计数器值推算距离
float UltrasonicGetLength(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;
      while(ECHO_Reci == 0);      
      OpenTimerForHc();        
      i = i + 1;
      while(ECHO_Reci == 1);
      CloseTimerForHc();        
      t = GetEchoTimer();        
      lengthTemp = ((float)t/58.0);//cm
      sum = lengthTemp + sum ;
        
    }
    lengthTemp = sum/5.0;
    return lengthTemp;
}  

四、实验效果

(实验效果部分未提供具体信息,可以根据实际实验结果补充)

五、资料获取

(资料获取部分未提供具体信息,可以根据实际需求补充)

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号