HCSR04有四个引脚,分别是:VCC,TRIG_RX,ECHO_TX,GND
TRIG_RX引脚就是给传感器一个信号,使其能够发出一个波,可以理解为传感器上的其中一个“大眼睛”发出信号。
ECHO_TX引脚就是传感器发出的波遇到物体返回的接收引脚,是传感器上另一个“大眼睛”的功能。
那么接下来我们就需要写代码来驱动一个HCSR04
配置步骤:
1、定时器初始化函数
这里我们用任意一个定时器都可以
void tim2_init(void)
{
tim2_handle.Instance = TIM2;
tim2_handle.Init.Prescaler = 72 - 1;
tim2_handle.Init.Period = 65536 - 1;
tim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
tim2_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Base_Init(&tim2_handle);
}
2、初始化用到的GPIO口
这里我们用到的是PB6和PB7,初始化这两个引脚即可,一个是输出引脚,一个是输入引脚。
void hcsr04_gpio_init(void)
{
GPIO_InitTypeDef gpio_initstruct;
//打开时钟
TRIG_GPIO_CLK_ENABLE();
ECHO_GPIO_CLK_ENABLE();
//初始化Trig引脚
gpio_initstruct.Pin = TRIG_PIN;
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;
gpio_initstruct.Pull = GPIO_NOPULL;
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(TRIG_PORT, &gpio_initstruct);
gpio_initstruct.Pin = ECHO_PIN;
gpio_initstruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(ECHO_PORT, &gpio_initstruct);
}
3、初始化hcsr04
把上述两个步骤的函数封装在一起。
void hcsr04_init(void)
{
tim2_init();
hcsr04_gpio_init();
}
4、定时器开启、关闭、读取、设置
因为我们需要读取超声波传感器发出信号到收到信号的时间,所以需要在收到信号的时候停止定时器方便读取,同时也需要在发出信号的一瞬间就打开定时器,所以需要写出两个函数便于我们能够快速的开启和关闭定时器。
//开始定时器2
void tim2_start(void)
{
HAL_TIM_Base_Start(&tim2_handle);
}
//停止定时器2
void tim2_stop(void)
{
HAL_TIM_Base_Stop(&tim2_handle);
}
//得到定时器2的值
uint16_t tim2_get_cnt(void)
{
return __HAL_TIM_GetCounter(&tim2_handle);
}
//设置定时器2的值
void tim2_set_cnt(uint16_t val)
{
__HAL_TIM_SetCounter(&tim2_handle, val);
}
5、计算距离
超声波传感器的工作顺序:
1. Trig,给Trig端口至少10us的高电平
2. Echo引脚,由低电平跳转到高电平,表示开始发送波
3.Echo,由高电平跳转回低电平,表示波回来了
4.计算出中间经过多少时间
5. 距离 = 速度(343m/s) * 时间 / 2
float hcsr04_get_distance(void)
{
uint16_t total_time = 0;
float distance = 0;
//1. Trig,给Trig端口至少10us的高电平
TRIG_HIGH();
delay_us(15);
TRIG_LOW();
//2. Echo引脚,由低电平跳转到高电平,表示开始发送波
//波发出去的那一下,开始启动定时器
while(ECHO_STATUS() == GPIO_PIN_RESET);
tim2_start();
tim2_set_cnt(0);
//3. Echo,由高电平跳转回低电平,表示波回来了
//波回来的那一下,我们开始停止定时器,计算出中间经过多少时间
while(ECHO_STATUS() == GPIO_PIN_SET);
tim2_stop();
//4. 计算出中间经过多少时间
total_time = tim2_get_cnt();
//5. 距离 = 速度(343m/s) * 时间 / 2
distance = total_time * 0.01715;
return distance;
}
这样我们就成功的驱动了一个超声波传感器
效果如图: