HC-SR04超声波测距

模块说明


  超声波模块Trig引脚输入了的10us的信号后,发射器会发送8个40KHz的的方波信号,当方波信号遇到障碍物时便会返回,接收器接收到了返回的方波信号便会输出一个高电平,高电平的持续时间便是方波信号的传输时间,以下是超声波模块的时序图:

实验程序

  以下是超声波模块的初始化函数和实验函数,相关宏定义和延迟函数可以参考我其他的随笔;
sr04.c

#include "stm32f4xx.h"
#include "bluetooth.h"
#include "common.h"
#include "sys_tick.h"
#include "sr04.h"

void sr04_init(void)
{
	GPIO_InitTypeDef		GPIO_InitStructure;
	
	//使能端口B、端口E的硬件时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE );
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE );
	
	//PB6为输出模式,因为该引脚连接到Trig
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;//指定第6根引脚 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;//配置为输出模式
	GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz ;//配置引脚的响应时间=1/100MHz .
	//从高电平切换到低电平1/100MHz,速度越快,功耗会越高
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP ;//推挽的输出模式,增加输出电流和灌电流的能力
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL ;//不使能内部上下拉电阻
	GPIO_Init(GPIOB ,&GPIO_InitStructure);	
	
	//PE6为输入模式,因为要检测ECHO输出高电平的持续时间
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;//指定第6根引脚 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN ;//配置为输出模式
	GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz ;//配置引脚的响应时间=1/100MHz .
	//从高电平切换到低电平1/100MHz,速度越快,功耗会越高
	//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP ;//推挽的输出模式,增加输出电流和灌电流的能力
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL ;//不使能内部上下拉电阻
	GPIO_Init(GPIOE ,&GPIO_InitStructure);	
	
	//PB6引脚初始状态为低电平,根据时序图可以了解到
	PBout(6)=0;
}

uint32_t sr04_get_distance(void)
{
	uint32_t t=0;

	//PB6输出高电平
	PBout(6)=1;
	
	//延时10us
	delay_us(10);

	//PB6输出低电平
	PBout(6)=0;	
	
	//PE6要等待高电平出现
	while(PEin(6)==0);
	
	//测量高电平的持续时间
	while(PEin(6))
	{
		t++;
		delay_us(9);//超声波每传输9us时间,距离为3mm,也就是传输3mm的时间为9us
	}
	
	//因为该时间是包含发射和返回的时间,需要除以2
	t/=2;
	
	return 3*t; //单位为mm
}

总结

  1.两次测量时间应大于60ms;
  2.被测物体的面积不少于0.5平方米且平面尽量要求平整;
  3.超声波的测量误差为3mm,可根据3mm的测距求出测量时间:(34010010mm)/1000000us=3mm/t --> t = 9us。

模块资料下载

链接:https://pan.baidu.com/s/1OOlTqa4WwsbH5iy7rrsyqg 
提取码:ne5l 
复制这段内容后打开百度网盘手机App,操作更方便哦
posted @ 2021-03-02 14:51  ding-ding-light  阅读(790)  评论(0)    收藏  举报