超声波传感器

devtools/2024/12/21 21:54:01/

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


http://www.ppmy.cn/devtools/144185.html

相关文章

数据结构之二叉搜索树(Binary Search Tree)

数据结构之二叉搜索树(Binary Search Tree) 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3.⼆叉搜索树的 查,删,插(没有改,因为没有意义会破坏本质)(源码) 1. ⼆叉搜索树…

C语言双向链表

1.思维导图 2.单向循环链表的所有操作 创建 loopLinkPtr create() {loopLinkPtr H(loopLinkPtr)malloc(sizeof(loopLink));if (NULLH){printf("创建失败\n");return NULL;}H->len 0;H->next H;printf("创建成功\n");return H; }输出结果&#xf…

OpenCV及基本用法

一.OpenCV介绍 1.OpenCV 的全称是 Open Source Computer Vision Library,是一个开放源代码的 计算机视觉库。OpenCV 是最初由英特尔公司发起并开发,以 BSD 许可证授权发 行,可以在商业和研究领域中免费使用,现在美国 Willow Gar…

挑战一个月基本掌握C++(第七天)了解指针,引用,时间,输入输出,结构体,vector容器,数据结构 - 通用完结

一 指针 每一个变量都有一个内存位置&#xff0c;每一个内存位置都定义了可使用连字号&#xff08;&&#xff09;运算符访问的地址&#xff0c;它表示了在内存中的一个地址。 下面的实例&#xff0c;它将输出定义的变量地址&#xff1a; #include <iostream>using…

uniapp中的uni-file-picker组件上传多张图片到服务器

由于在uniapp官方文档中的uni-file-picker组件可实现图片上传功能&#xff0c;默认的是上传到自带的服务&#xff0c;所以我们要修改成自己的服务器 1. 添加 :auto-upload"false" 加上这个取消自动上传 <uni-file-picker v-model"jobAddUpdateForm.imag…

我应该如何安装Python3

安装Python3的步骤会因操作系统的不同而有所差异。以下是在不同操作系统上安装Python3的详细步骤&#xff1a; 一、在Windows系统上安装Python3 下载Python安装包&#xff1a; 打开任意浏览器&#xff0c;访问Python官方网站&#xff08;https://www.python.org&#xff09;。…

深度学习模型中增加随机性可以通过多种方式实现,以下是一些可以应用到你的 `TCNAttentionLSTM`

在深度学习模型中增加随机性可以通过多种方式实现&#xff0c;以下是一些可以应用到你的TCNAttentionLSTM模型中的方法&#xff1a; ### 1. Dropout 你已经在模型中使用了dropout&#xff0c;这是增加随机性的一种常见方法。你可以通过调整dropout率来控制随机性的程度。 ###…

Python球球大作战

系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…