超声波传感器

距离= 速度(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;       
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值