当前位置: 首页 > news >正文

STM32-笔记23-超声波传感器HC-SR04

一、简介

HC-SR04 工作参数:

• 探测距离:2~600cm

• 探测精度:0.1cm±1%

• 感应角度:<15°

• 输出方式:GPIO

• 工作电压:DC 3~5.5V

• 工作电流:5.3mA

• 工作温度:-40~85℃

 

  •  怎么让它发送波 Trig?

        给Trig端口至少10us的高电平

  • 怎么知道它开始发了波 Echo引脚?

        由低电平跳转到高电平,表示开始发送波

  • 怎么知道接收了返回波 Echo?

        由高电平跳转回低电平,表示波回来了

  • 怎么算时间 ?

        Echo引脚维持高电平的时间,波发出去的那一下,开始启动定时器 波回来的那一下,我们开始停止定时器,计算出中间经过多少时间

  • 怎么算距离?

        距离 = 速度(343m/s) * 时间 / 2

 二、实验前期准备

        因为想把测出来的距离打印在串口上,所以复制项目文件19-串口打印功能,重命名25-超声波传感器,新建文件夹hc-sr04

打开工程文件

加载文件

引脚接线

三、代码:

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "hcsr04.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯hcsr04_init();uart1_init(115200);while(1){ printf("距离是:%.2f\r\n",hcsr04_get_lenght());delay_ms(1000);}
}

hcsr04.c

#include "hcsr04.h"
#include "delay.h"TIM_HandleTypeDef tim2_handle = {0};//定义结构体//定时器初始化函数
void timer_init()//把ARR和PSC当作参数传进来
{tim2_handle.Instance = TIM2; //选择使用的定时器tim2_handle.Init.Prescaler = 72-1; //PSC:使其读一个数用1ustim2_handle.Init.Period = 65536-1; //ARRtim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//配置成向上的,默认向上的tim2_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;  //自动重装载,默认自动重装载HAL_TIM_Base_Init(&tim2_handle);
//    HAL_TIM_Base_Start_IT(&tim2_handle);//设置使能更新中断,和启动计数器
}//msp函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){__HAL_RCC_TIM2_CLK_ENABLE();
//        HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//设置优先级
//        HAL_NVIC_EnableIRQ(TIM2_IRQn);//设置使能中断}
}
//定时器启动的函数
void tim2_start(void) 
{HAL_TIM_Base_Start(&tim2_handle);
}
//定时器关闭的函数
void tim2_stop(void) 
{HAL_TIM_Base_Stop(&tim2_handle);
}
//读CNT计数器的值
uint16_t tim2_get_cnt(void) 
{return __HAL_TIM_GetCounter(&tim2_handle);
}
//将CNT计数器的值传递进来
void tim2_set_cnt(uint16_t val) 
{__HAL_TIM_SetCounter(&tim2_handle,val);
}
//初始化gpio口引脚
void hcsr04_gpio_init(void)
{   GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct//打开trig和echo时钟TRIG_GPIO_CLK_ENABLE();ECHO_GPIO_CLK_ENABLE();//调用TRIG的GPIO初始化函数gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出gpio_initstruct.Pin = TRIG_PIN;//trig对应的引脚gpio_initstruct.Pull = GPIO_NOPULL;//引脚不拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(TRIG_PORT,&gpio_initstruct);//调用echo的GPIO初始化函数gpio_initstruct.Mode = GPIO_MODE_INPUT;//作为输入引脚gpio_initstruct.Pin = ECHO_PIN;//echo对应的引脚HAL_GPIO_Init(ECHO_PORT,&gpio_initstruct);
}
//初始化超声波
void hcsr04_init(void)
{timer_init();//初始化定时器hcsr04_gpio_init();//初始化GPIO引脚}
//读取超声波测出来的距离
float hcsr04_get_lenght(void)
{uint16_t total_time = 0;  //定义一个变量用于接收CNT的值float distance = 0;//1、Trig,给Trig端口至少10us的高电平TRIG_HIGH();delay_us(15);TRIG_LOW();//2、Echo引脚,由低电平跳转到高电平,表示开始发送波//波发出去的那一下,开始启动定时器while(ECHO_STATUS() == GPIO_PIN_RESET);//用echo引脚是否从低电平变成高电平来决定波是否发出去了tim2_start(); //启动定时器2tim2_set_cnt(0);//将定时器初始值置0//3、Echo,由高电平跳转回低电平,表示波回来了//波回来的那一下,我们开始停止定时器while(ECHO_STATUS() == GPIO_PIN_SET);//用echo引脚是否从高电平变成低电平来决定波是否接到tim2_stop();//关掉定时器//4、Echo引脚维持高电平的时间=计算出中间经过多少时间total_time = tim2_get_cnt();//用total_time接收CNT定时器里面的值//距离 = 速度(343m/s) * 时间 / 2//343m/s = 34300cm/s,因为距离是一个来回,所以要/2(这里速度除2下面路程就不用除2了)// = 34300/2 = 17150cm/s = 0.017150cm/usdistance = total_time * 0.01715;return distance;
}

hcsr04.h

#ifndef __HCSR04_H__
#define __HCSR04_H__#include "sys.h"#define TRIG_PORT                 GPIOB                                             //trig对应gpio的哪一组
#define TRIG_PIN                  GPIO_PIN_6                                        //trig对应gpio的哪个引脚
#define TRIG_GPIO_CLK_ENABLE()    __HAL_RCC_GPIOB_CLK_ENABLE()                      //gpio口时钟打开
#define TRIG_HIGH()               HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_SET)//trig对应的引脚拉高
#define TRIG_LOW()                HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_RESET)//trig对应的引脚拉低#define ECHO_PORT                 GPIOB                                             //echo对应gpio的哪一组
#define ECHO_PIN                  GPIO_PIN_7                                        //echo对应gpio的哪个引脚
#define ECHO_GPIO_CLK_ENABLE()    __HAL_RCC_GPIOB_CLK_ENABLE()                      //gpio口时钟打开
#define ECHO_STATUS()             HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN)              //读取echo对应的引脚电平void hcsr04_init(void);
float hcsr04_get_lenght(void);#endif

打开串口助手,每一秒超声波都在测距

相关文章:

STM32-笔记23-超声波传感器HC-SR04

一、简介 HC-SR04 工作参数&#xff1a; • 探测距离&#xff1a;2~600cm • 探测精度&#xff1a;0.1cm1% • 感应角度&#xff1a;<15 • 输出方式&#xff1a;GPIO • 工作电压&#xff1a;DC 3~5.5V • 工作电流&#xff1a;5.3mA • 工作温度&#xff1a;-40~85℃ 怎么…...

Linux | Ubuntu零基础安装学习cURL文件传输工具

目录 介绍 检查安装包 下载安装 手册 介绍 ‌cURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;首次发行于1997年‌‌12。cURL支持多种协议&#xff0c;包括FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3…...

什么是 GPT?Transformer 工作原理的动画展示

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 1 图解 “Generative Pre-trained Transformer”&#xff08;GPT&#xff09; 1.1 Generative&#xff1a;生成式 1.1.1 可视化 1.1.2 生成式 vs. 判别式&#xff08;译注&#xff09; 1.2 Pr…...

SpringCloudAlibaba实战入门之路由网关Gateway过滤器(十三)

承接上篇,我们知道除了断言,还有一个重要的功能是过滤器,本节课我们就讲一下常见的网关过滤器及其一般使用。 一、Filter介绍 类似SpringMVC里面的的拦截器Interceptor,Servlet的过滤器。“pre”和“post”分别会在请求被执行前调用和被执行后调用,用来修改请求和响应信…...

电路仿真软件PSIM简介

在从事开关电源相关产品开发的工程师或者正在学习开关电源的学习者&#xff0c;常常会用到各种仿真软件进行电路的仿真&#xff0c;不仅可以快速验证电路参数&#xff0c;还能清楚知道各器件的工作状态。 现在的电路仿真软件很多&#xff0c;例如matlab、Multisim、Simplis&…...

C语言:调试的概念和调试器的选择

所谓调试&#xff08;Dubug&#xff09;&#xff0c;就是跟踪程序的运行过程&#xff0c;从而发现程序的逻辑错误&#xff08;思路错误&#xff09;&#xff0c;或者隐藏的缺陷&#xff08;Bug&#xff09;。 在调试的过程中&#xff0c;我们可以监控程序的每一个细节&#xff…...

25. C++继承 1 (继承的概念与基础使用, 继承的复制兼容规则,继承的作用域)

⭐上篇模板文章&#xff1a;24. C模板 2 (非类型模板参数&#xff0c;模板的特化与模板的分离编译)-CSDN博客 ⭐本篇代码&#xff1a;c学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分 目录 一. 继承的基础使用 1.1 继承的格式 1.2 …...

git 退出编辑模式

在使用 Git 时&#xff0c;有时需要进入编辑器来输入提交信息或进行其他编辑操作。不同的系统和配置可能会导致使用不同的编辑器。以下是几种常见 Git 编辑器的退出方法&#xff1a; ‌Vim 编辑器‌&#xff1a; ‌保存并退出‌&#xff1a; 按下 Esc 键退出编辑模式。输入 :w…...

内容营销与传统营销方式有哪些差别?

在互联网高度发达的当下&#xff0c;碎片化的信息接收方式&#xff0c;让用户对于营销信息拥有较高的敏感度。这一现状&#xff0c;也使得众多传统营销方式正在逐渐失效。想要稳定推广效率&#xff0c;内容营销是当下不少品牌的共同选择。接下来&#xff0c;就让我们来了解下内…...

EasyExcel(读取操作和填充操作)

文章目录 1.准备Read.xlsx&#xff08;具有两个sheet&#xff09;2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …...

【华为OD-E卷 - 机房布局 100分(python、java、c++、js、c)】

【华为OD-E卷 - 机房布局 100分&#xff08;python、java、c、js、c&#xff09;】 题目 小明正在规划一个大型数据中心机房&#xff0c;为了使得机柜上的机器都能正常满负荷工作&#xff0c;需要确保在每个机柜边上至少要有一个电箱。 为了简化题目&#xff0c;假设这个机房…...

【竞技宝】LOL:IG新赛季分组被质疑

北京时间2024年12月31日&#xff0c;今天已经2024年的最后一天&#xff0c;在进入一月之后&#xff0c;英雄联盟将迎来全新的2025赛季。而目前新赛季第一阶段的抽签结果已经全部出炉&#xff0c;其中人气最高的IG战队在本次抽签中抽到了“绝世好签”引来了网友们的质疑。 首先介…...

ChatBI来啦!NBAI 正式上线 NL2SQL 功能

NebulaAI 现已正式上线 NL2SQL 功能&#xff0c;免费开放使用&#xff01; 什么是 NL2SQL&#xff1f;NL2SQL 即通过自然语言交互&#xff0c;用户可以轻松查询、分析和管理数据库中的数据&#xff08;ChatBI&#xff09;&#xff0c;从此摆脱传统复杂的数据库操作。 欢迎免费…...

8. Web应用程序(Web)

8. Web应用程序&#xff08;Web&#xff09; Spring Boot 非常适用于Web应用程序开发。你可以使用嵌入式 Tomcat、Jetty、Undertow或Netty创建一个独立的HTTP服务器。大多是Web应用程序都会使用 spring-boot-starter-web 依赖模块来快速启动和运行项目。你也可以选择使用 spri…...

Linux内核修改内存分配策略

今天遇到了如下的内核报错 Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f0e1e06c000, 65536, 1) failed; errorCannot allocate memory (errno12)这个报错是因为&#xff0c;linux会对大部分的内存资源申请都回复允许&#xff0c;以便于运行更…...

六大亮点解析:AI视频监控助力部队训练安全管理

一、用户痛点&#xff1a; 在部队的日常训练和任务执行中&#xff0c;官兵的安全始终是最为重要的保障。然而&#xff0c;传统的监控方式存在显著的局限性&#xff0c;尤其是在高强度、长时间的训练过程中&#xff0c;人工值守监控容易产生疲劳&#xff0c;误判的风险大&#…...

【从零开始入门unity游戏开发之——C#篇33】C#委托(`Delegate`)和事件(`event` )、事件与委托的区别、Invoke()的解释

文章目录 一、委托&#xff08;Delegate&#xff09;1、什么是委托&#xff1f;2、委托的基本语法3、定义自定义委托4、如何使用自定义委托5、多播委托6、C# 中的系统委托7、GetInvocationList 获取多个函数返回值8、总结 二、事件&#xff08;event &#xff09;1、事件是什么…...

大数据与机器学习(它们有何关系?)

想了解大数据和机器学习吗&#xff1f;我们将为你解释它们是什么、彼此之间有何关联&#xff0c;以及它们为何在数据密集型应用中如此重要。 大数据和机器学习是如何相互关联的&#xff1f; 大数据指的是传统存储方法无法处理的海量数据。机器学习则是计算机系统从观察结果和…...

深入浅出 Spring(一) | Spring简介、IOC理论推导、快速上手 Spring

1. spring 1.1 简介 Spring : 春天 —>给软件行业带来了春天 2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形interface21框架。 2004年3月24日&#xff0c;Spring框架以interface21框架为基础&#xff0c;经过重新设计&#xff0c;发布了1.0正式版。 很难想象…...

IDEA 社区版 SpringBoot不能启动

报错原因&#xff0c;Failed to load class [javax.servlet.Filter] <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope> </dependency>…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。

2024 年&#xff0c;高端封装市场规模为 80 亿美元&#xff0c;预计到 2030 年将超过 280 亿美元&#xff0c;2024-2030 年复合年增长率为 23%。 细分到各个终端市场&#xff0c;最大的高端性能封装市场是“电信和基础设施”&#xff0c;2024 年该市场创造了超过 67% 的收入。…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...