1.原理
超声波模块发出超声波信号,超声波遇到障碍会反弹,得到超声波发送到接收的时间间隔就可以计算出当前位置到障碍物的距离。
模块说明书:
连接Trig的引脚要配置成输出功能,连接Echo的引脚要配置成输入功能。
2.超声波模块和开发板的连接
PE6连接Trig引脚,PA8连接Echo引脚
3.代码逻辑
(1)初始化
PE6设置为输出功能(默认输出低电平) PA8设置为输入功能
(2)测距
PE6拉高 延时>10us PE6拉低 等待PA8变高 ===> 开始计时 等待PA8变低 ===> 停止计时 通过计时时间差求出距离
//代码实现
#include <stm32f4xx.h>
#include <sr04.h>
#include <delay.h>
void sr04_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//1.开启GPIOE GPIOA的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOA,ENABLE);
//2.GPIO初始化 PE6
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//高速
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOE,&GPIO_InitStruct);
TRIG = 0;//默认低电平
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//输入模式
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;//PA8
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
//返回测量的距离,失败返回-1
int get_distance(void)
{
u32 retry = 0;
//1.Trig >10us高电平
TRIG = 1;
delay_us(15);
TRIG = 0;
//2.等待ECHO变高,开始计时
while(ECHO==0){
retry++;
delay_us(1);
if(retry>60000)
return -1;
}
retry = 0;
//3.等待ECHO变低,结束计时
while(ECHO==1){
retry++;
delay_us(10);
if(retry>6000)
return -1;
}
return retry*10/58;
}