STM32之定时器--超声波测距

news2024/11/27 7:40:36

1、模块介绍

型号:HC-SR04

 超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离。

 2、超声波模块的使用方法

  • 怎么让它发送波

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

  • 怎么知道它开始发了

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

  • 怎么知道接收了返回波

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

  • 怎么算时间

        Echo引脚维持高电平的时间!

        波发出去的那一下,开始启动定时器

        波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间

  • 怎么算距离

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

3、 超声波时序图

4、编程实现

需求:使用超声波测距,当手离传感器距离小于5cm时,LED1点亮,否则保持不亮状态。

codeMX配置

 定时器配置:使用 TIM2 ,只用作计数功能,不用作定时。 将 PSC 配置为71,则计数 1 次代表 1us

这里因为涉及到us级的延时,而我们的HAL_Delay()延迟函数时ms级别的所以在这里用不了。需要我们使用定时器编写一个us级的延时函数

使用到的HAL库函数

1.启用TIM外设(启动定时器计数)

__HAL_TIM_ENABLE(__HANDLE__)  

参数:定时器的句柄

2.在运行时设置TIM计数器寄存器值(设置计数器的值)

#define __HAL_TIM_SetCounter            __HAL_TIM_SET_COUNTER

#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) 

参数1:定时器的句柄

参数2:指定计数器寄存器的新值

3.在运行时获取TIM计数器寄存器值

#define __HAL_TIM_GetCounter            __HAL_TIM_GET_COUNTER

#define __HAL_TIM_GET_COUNTER(__HANDLE__)

参数:定时器的句柄

返回值:计时器计数器寄存器的值 (TIMx_CNT)

4.禁用TIM外设(关闭定时器计数)

#define __HAL_TIM_DISABLE(__HANDLE__)

参数:定时器的句柄

5.启动TIM Base生成(启动定时器)

HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)

参数:定时器的句柄

6.停止生成TIM Base。(停止定时器)

HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)

参数:定时器的句柄

__HAL_TIM_ENABLE(&htim2)与 HAL_TIM_Base_Start(&htim2)两个库函数有什么区别

代码实现

延时函数代码:

//使用TIM2来做us级延时函数
void TIM2_Delay_us(uint16_t n_us)
{
    /* 使能定时器2计数 */
    __HAL_TIM_ENABLE(&htim2);
    __HAL_TIM_SetCounter(&htim2, 0);
    while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
    /* 关闭定时器2计数 */
    __HAL_TIM_DISABLE(&htim2);
}

main函数里面的代码

  while (1)
  {
		//1. Trig ,给Trig端口至少10us的高电平
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
		TIM2_Delay_us(20);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
		//2. echo由低电平跳转到高电平,表示开始发送波
		while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_RESET);
		//波发出去的那一下,开始启动定时器
		HAL_TIM_Base_Start(&htim2);
		__HAL_TIM_SetCounter(&htim2,0);//测量之前先把次数置零
		//3. 由高电平跳转回低电平,表示波回来了
		while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_SET);
		//波回来的那一下,我们开始停止定时器
		HAL_TIM_Base_Stop(&htim2);
		//4. 计算出中间经过多少时间
		count = __HAL_TIM_GetCounter(&htim2);//获取次数
		dis = (0.017 * count) / 2;
		//5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
		if(dis < 10)
		{
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
			HAL_Delay(1000);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
		}
		//每500毫秒测试一次距离
		HAL_Delay(500);
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1267121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BeanUtils.populate将map对象转换成vo对象

文章目录 BeanUtils.populate将map对象转换成vo对象&#x1f4d6;1.添加依赖&#x1f4d2;代码✒️运行结果&#x1f5b2;最后总结 BeanUtils.populate将map对象转换成vo对象 &#x1f4d6;1.添加依赖 <dependency><groupId>commons-beanutils</groupId>&l…

云服务器同时连接数突然变高是什么原因

​  云服务器同时连接数突然变高&#xff0c;导致服务器负载增加&#xff0c;响应时间变长&#xff0c;严重影响了网站的正常运营。为了解决这个问题&#xff0c;我们首先需要了解 云服务器同时连接数变高的原因。 一、网络攻击 网络攻击是导致云服务器同时连接数突然变高的一…

2022年土地出让数据,超多字段,附数据可视化

分享一个土地出让数据&#xff0c;详细信息如下&#xff1a; 数据名称: 2022年土地出让数据 数据格式: Shp、excel 数据时间: 2022年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 部分字段如下&#xff1a; 如需获取可搜“吧唧数…

【EI会议征稿】第四届应用数学、建模与智能计算国际学术会议(CAMMIC 2024)

第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09; 2024 4th International Conference on Applied Mathematics, Modelling and Intelligent Computing 第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09;将于…

docker (简介、dcoker详细安装步骤、容器常用命令)一站打包- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应…

基于社区电商的Redis缓存架构-缓存数据库双写、高并发场景下优化

基于社区电商的Redis缓存架构 首先来讲一下 Feed 流的含义&#xff1a; Feed 流指的是当我们进入 APP 之后&#xff0c;APP 要做一个 Feed 行为&#xff0c;即主动的在 APP 内提供各种各样的内容给我们 在电商 APP 首页&#xff0c;不停在首页向下拉&#xff0c;那么每次拉的…

炸裂:completablefuture自定义线程池慢2倍......比默认线程池......

尼恩说在前面 尼恩社群中&#xff0c;很多小伙伴找尼恩来卷3高技术&#xff0c;学习3高架构&#xff0c;遇到问题&#xff0c;常常找尼恩反馈和帮扶。 周一&#xff0c;一个5年经验的大厂小伙伴&#xff0c;反馈了一个令人震惊的问题 completablefuture自定义线程池慢2倍…比…

C# Socket通信从入门到精通(12)——多个同步UDP客户端C#代码实现

前言: 我们在开发Udp客户端程序的时候,有时候在同一个软件上我们要连接多个服务器,这时候我们开发的一个客户端就不够使用了,这时候就需要我们开发出来的软件要支持连接多个服务器,最好是数量没有限制,这样我们就能应对任意数量的服务器连接,由于我们开发的Udp客户端程…

如何使用阿里云国际站虚拟主机搭建网站

阿里云虚拟主机是一款灵活易用的产品&#xff0c;允许您使用 FTP 构建或传输网站。它支持各种各样的 Web 构建器&#xff0c;非常适合各种应用程序&#xff0c;从个人博客到电子商务网站。 本教程介绍如何通过几个简单的步骤使用阿里云虚拟主机构建网站。 先决条件 您需要安…

VUE本地idea启动

安装yarn&#xff08;也可以用npm&#xff09; 问题&#xff1a;yarn : 无法加载文件 C:\Users\xx/yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 解决办法&#xff1a;管理员身份运行【 PowerShell】&#xff0c;然后执行【Set-ExecutionPolicy RemoteSigned】&#xff0c…

C++基础 -11- 类的析构函数

析构用于释放构造函数中初始化的数据成员 析构不能重载 析构函数格式 #include "iostream"using namespace std;extern "C" { #include "string.h" }class rlxy {public:int a;rlxy(int a, int b, const char *c){this->c new char[1024];…

uniapp开发App从开发到上架全过程

​ 当我们的APP开发完毕&#xff0c;最终交付的时候&#xff0c;必然要经历的一个环节&#xff0c;就是APP上架&#xff0c;国内APP上架一般为IOS端appstore上架&#xff0c;安卓端应用商店比较多&#xff0c;最常见的应用商店有华为应用商店、小米应用商店、OPPO应用商店、VIV…

CRM系统的数据分析和报表功能对企业重要吗?

竞争日益激烈&#xff0c;企业需要更加高效地管理客户关系&#xff0c;以获取更多的商机。为此&#xff0c;许多企业选择使用CRM系统。在CRM中&#xff0c;数据分析功能扮演着重要的角色。下面就来详细说说&#xff0c;CRM系统数据分析与报表功能对企业来说重要吗&#xff1f; …

超声波雪量传感器冬季气象监测助手

在冬季&#xff0c;雪量的监测对于人们的生活和农业生产都具有重要的意义。而WX-XL2超声波雪量传感器&#xff0c;作为近年来一种气象监测设备&#xff0c;以其优势和广泛的应用场景&#xff0c;引起了人们的广泛关注。 一、超声波雪量传感器的工作原理 超声波雪量传感器是一…

数据结构之二叉树与堆以及力扣刷题函数扩展

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力 目录 1.前言 2.树 2.1概念 2.2树的相关概念 3.…

MyBatis使用教程详解<上>

一. 什么是MyBatis? Mybatis是一个持久层框架,用于简化JDBC的操作MyBatis原本是Apache的一个开源项目ibatis,后来更名为MyBatis 上面我们提到了一个概念----持久层 不知道小伙伴们有没有想到五大注解的关系,类似于下图 其中MyBatis就是Mapper层的框架,是基于JDBC的封装,可以帮…

华为服务器驱动及固件下载步骤

1. 打开官网技术支持页面 https://support.xfusion.com/support/#/zh/home 2.页面往下来&#xff0c; 选择【FusionServer iDriver】 3. 选择最新版本 4. 选择对应的型号及版本

『 MySQL数据库 』插入查询结果

文章目录 &#x1f39f;️ 前言&#x1f39f;️ 创建一张结构相同的表&#x1f39f;️ 表内插入查询结果&#x1f3ab; 对表内数据进行去重&#x1f3ab; 配合ORDER BY排序后以及LIMIT分页对数据进行插入 &#x1f39f;️ 前言 在MySQL数据库中不仅可以直接根据字段类型等对数据…

企业宣传画册用什么工具制作,不用下载软件,在线就能搞定!

企业宣传册是一种常见的营销工具&#xff0c;可以有效地展示企业或产品的特点和优势&#xff0c;吸引客户的注意力。企业宣传画册有这么多优势&#xff0c;如何制作呢&#xff1f;用什么工具制作呢&#xff1f;这可难倒了不少人。 有人可能会说&#xff0c;找专业的设计公司交…

微信小程序如何获取用户手机号码?

需求 在开发一款微信小程序时&#xff0c;通常需要用户进行微信登录&#xff0c;并获取用户的手机号码作为用户的唯一标识&#xff08;userId&#xff09;。虽然可以通过wx.login来获取用户的openid&#xff0c;但有时候需要获取用户的手机号码以提供更完善的个性化服务&#…