stm32驱动HCSR04(HAL)

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;
}

这样我们就成功的驱动了一个超声波传感器

效果如图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值