距离= 速度(343m/s)*时间/2
代码过程
①首先进行初始化的工作 初始化包括定时器的初始化(在这里用的是定时器2) GPIO口的初始化 (包括两个GPIO口 一个是TRIG 一个是 ECHO )
②msp函数
③定时器开启 定时器关闭
④设置计数器的值 主要用于定时器开始时 计数器从0开始计时
⑤计算距离 流程如下
怎么让他发送波 即触发超声波传感器工作
给TRIG端口至少10us的高电平
怎么知道他开始发送了超声波
ECHO引脚 由低电平跳转到高电平,表示开始发送波
怎么知道接收了返回波
ECHO引脚 由高电平跳转到低电平,表示接收到了波
怎么计算时间
ECHO引脚维持高电平的时间 波发出去的那一刹那 开始启动定时器
波回来的那一刹那 开始停止定时器 计算中间的时间
计算
其中包含简单的数学关系 距离=速度*时间 但在这里时间要进行➗2
#include "hcsr04.h"
#include "delay.h"
TIM_HandleTypeDef tim2_handle ={0};
一下为hcsr.c文件
//定时器的初始化函数
void tim2_init(void) //传入载入到的值 和想要的分频数 在主函数中被调用
{
tim2_handle.Instance = TIM2; //选择哪一个定时器
tim2_handle.Init.Period =65536 - 1; //载入到的值
tim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP; //计数模式选择
tim2_handle.Init.Prescaler = 72-1; //分频系数是多少
tim2_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //不自动重装载
HAL_TIM_Base_Init(&tim2_handle); /* 时基工作参数配置 函数 */
}
//msp函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) //无需调用自动执行 HAL_TIM_Base_Init()被调用后自动调用
{
if(htim->Instance == TIM2)
{
__HAL_RCC_TIM2_CLK_ENABLE();
}
}
void tim2_start(void) //定时器开启函数
{
HAL_TIM_Base_Start(&tim2_handle);
}
void tim2_stop(void) //定时器关闭函数
{
HAL_TIM_Base_Stop(&tim2_handle);
}
void tim2_set_cnt(uint16_t val)
{
__HAL_TIM_SetCounter(&tim2_handle,val);
}
uint16_t tim2_get_cnt(void)
{
return __HAL_TIM_GetCounter(&tim2_handle);
}
void hcsr04_gpio_init()
{
//①定义初始化结构体
GPIO_InitTypeDef gpio_initstruct;
//②初始化GPIO函数
//打开时钟
TRIG_GPIO_CLK_ENABLE();
ECHO_GPIO_CLK_ENABLE();
//初始化TRIG引脚
gpio_initstruct.Pin =TRIG_PIN; //TRIG 的引脚连接位置
gpio_initstruct.Pull = GPIO_NOPULL; //下拉
gpio_initstruct.Mode =GPIO_MODE_OUTPUT_PP; //推挽复用输出
gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(TRIG_PORT,&gpio_initstruct);
//初始化ECHO引脚
gpio_initstruct.Pin = ECHO_PIN; //ECHO的引脚连接位置
gpio_initstruct.Pull = GPIO_NOPULL; //下拉
gpio_initstruct.Mode =GPIO_MODE_INPUT; //推挽复用输出
gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(ECHO_PORT,&gpio_initstruct);
}
void hcsr04_init(void)
{
tim2_init();
hcsr04_gpio_init();
}
float hcsr04_get_lengh(void) //计算距离
{
uint16_t total_time=0;
float distance=0;
//①触发超声波传感器工作 给TRIG端口至少10us的高电平
TRIG_HIGH();
delay_us(15);
TRIG_LOW();
//②开始发送了超声波 ECHO引脚 由低电平跳转到高电平,表示开始发送波
while(ECHO_STATUS()==GPIO_PIN_RESET);
tim2_start();
tim2_set_cnt(0);
//③接收了返回波 ECHO引脚 由高电平跳转到低电平,表示接收到了波
while(ECHO_STATUS() ==GPIO_PIN_SET);
tim2_stop();
//④计算时间 ECHO引脚维持高电平的时间 波发出去的那一刹那 开始启动定时器 波回来的那一刹那 开始停止定时器计算中间的时间
total_time=tim2_get_cnt(); //计数一个值的时间为1us
//⑤计算距离 距离= 速度(343m/s)*时间/2
distance=total_time * 0.01715;
return distance;
}