【STM32教程】深入解析超声波测距模块的工作原理
一、产品介绍
超声波测距模块可提供2cm-400cm的非接触距离感测功能,测距精度3mm,模块包括超声波发射器,接收器与控制电路。
二、基本工作原理
(1)采用IO口trig出发测距,给Echo最少10us的高电平信号。
(2)模块自动发送40khz的方波,自动检测是否有信号返回
(3)有信号返回,通过IO口ECHO(如上图)输出一个高电平,高电平持续时间就是超声波从发射到返回的时间。
公式:距离=(高电平时间*340m/s)/ 2
三、时序图
如何看时序图?
从上到下,从左到右
四、示例代码
超声波模块初始化
void sr04_init(void)
{
//使能端口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
}
//因为该时间是包含发射和返回的时间,需要除以2
t/=2;
return 3*t;
}