超声波_HC-SR04

模块说明

**HC-SR04**超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主要是由两个通用的压电陶瓷超声传感器,并加外围信号处理电路构成的。
两个压电陶瓷超声传感器,一个用于发出超声波信号,一个用于接收反射回来的超声波信号。由于发出信号和接收信号都比较微弱,所以需要通过外围信号放大器提高发出信号的功率,和将反射回来信号进行放大,以能更稳定地将信号传输给单片机。模块如图所示:
image.png

模块引脚

  • VCC引脚:5V电源
  • TRIG引脚:触发信号引脚,单片机给超声波模块一个信号,超声波模块就会工作。
  • ECHO引脚:回响信号引脚,当超声波模块已经测量距离成功后,通过该引脚告诉单片机当前超声波传输的时间。
  • GND:信号地。

电气参数

image.png

注意要点

image.png
image.png

  1. 不同的温度,声音的传播速度是不一样的

超声波代码可简单编写如下,测量距离须根据温湿度传感器提供的温度代入上述公式,动态切换声音传播速度值。
image.png

  1. 超声波的测量精度为3mm,需要根据3mm进行计算测量时间(简化计算)

image.png

  1. 时序图

image.png

程序代码

  1. 初始化GPIO和定时器

首先,需要初始化STM32单片机的GPIO和定时器,用于控制HC-SR04模块和测距。配置Trig引脚为输出模式,设置Echo引脚为输入模式。同时,配置一个定时器,用于测量Echo信号的脉冲宽度。

  1. 发送触发信号

在测距之前,需要发送一个触发信号给HC-SR04模块。将Trig引脚置高一段时间,然后再置低。高电平脉冲的持续时间决定了发送的触发信号。

  1. 接收回波信号

测距模块发送触发信号后,开始测量回波信号的宽度。当Echo引脚检测到高电平时,记录当前时间戳。当Echo引脚下降为低电平时,停止计时,并记录下时间戳。通过计算时间差,可以得到回波信号的宽度。

  1. 计算距离

根据声速和回波信号的宽度,可以计算出测距的距离。公式为:距离 = 回波信号宽度 * 声速 / 2。将计算得到的距离进行显示或进一步处理。(公式:uS/58=厘米或者uS/148=英寸)

这个公式用于超声波测距。超声波测距是通过测量超声波从发射到接收到回波的时间来计算距离的。

  1. 声速:在干燥、摄氏20度的空气中,声速大约是343米/秒,或者34,300厘米/秒。
  2. 时间换算:1秒等于1,000,000微秒(uS),所以声速可以表示为0.0343厘米/微秒。
  3. 距离计算:超声波从发射到接收到回波的时间实际上是声波走过的总距离的两倍。因此,1厘米的距离对应的时间是29.15微秒。
  4. 公式推导:为了得到实际距离,我们需要将总时间除以2,然后再除以29.15微秒/厘米。简化后,公式变为:

距离(厘米) = 时间(微秒)/58

代码示例

void  sr04_init(void)
{	

	GPIO_InitTypeDef  GPIO_InitStructure;
	
	/* 使能硬件时钟:端口硬件时钟 */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
		
	/* PB6初始电平状态为低电平,看数据手册 */
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_6;
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_RESET);
	
	/* PE6配置为输入模式 */
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_6;
	GPIO_Init(GPIOE, &GPIO_InitStructure);	
}

int32_t sr04_get_distance(void)
{
	int32_t t=0;
	//发送10us的高电平信号触发测距
	GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_SET);
	delay_us(10);
	GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_RESET);
	
	//等待回响信号出现
	while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6)==Bit_RESET);
	
	//测量回响信号高电平的持续时间,而该高电平的持续时间就是超声波发送到返回的时间
	while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6)==Bit_SET)
	{
		t++;
		delay_us(9);//9us的时间,声音传播了3mm
	}
	
	return 3*t/2;
}
posted @ 2024-07-14 11:39  banon  阅读(12)  评论(0编辑  收藏  举报