模块说明
超声波模块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,操作更方便哦