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

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.mzph.cn/news/181593.shtml

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

相关文章

面试篇之微服务(一)

目录 概览 1.什么是微服务&#xff1f; 2.微服务带来了哪些挑战&#xff1f; 3.现在有哪些流行的微服务解决方案&#xff1f; 这三种方案有什么区别吗&#xff1f; 4.说下微服务有哪些组件&#xff1f; 注册中心 5.注册中心是用来干什么的&#xff1f; 6.SpringCloud可…

总结MySQL 的一些知识点:MySQL 导入数据

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 整体架构流程 技术细节 MySQL 导入数据 本章节我们为大家介绍几种简单的 MySQL 导入数据命令。 1、mysql 命令导入 使用 mysql 命令导入语法格式为&#xff1a; mysql -u用户名 -p密码 < 要导入的数据库数…

netty实现http协议服务

前面了解了netty的启动流程&#xff0c;实现http协议服务在pipeline里添加对应的http协议报文处理器即可。 server端&#xff1a; EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workGroup new NioEventLoopGroup(4);ServerBootstrap bootstrap new…

损失函数总结(十六):NRMSELoss、RRMSELoss

损失函数总结&#xff08;十六&#xff09;&#xff1a;MSLELoss、RMSLELoss 1 引言2 损失函数2.1 NRMSELoss2.2 RRMSELoss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、CrossEntropyLoss、NLLLoss、CTCLoss、PoissonNLLLoss、Ga…

python十大装逼语法

python十大装逼语法 1.列表推导式&#xff1a; 使用一行代码创建一个新的列表&#xff0c;可以在其中进行条件过滤、循环等操作。例如&#xff1a; numbers [1, 2, 3, 4, 5] squared_numbers [x**2 for x in numbers]2.三元表达式&#xff1a; x 10 if a > b else 203…

亚马逊云科技 re:Invent 2023:引领科技前沿,探索未来云计算之窗

文章目录 一、前言二、什么是亚马逊云科技 re:Invent&#xff1f;三、亚马逊云科技 re:Invent 2023 将于何时何地举行四、亚马逊云科技 re:Invent 2023 有什么内容&#xff1f;4.1 亚马逊云科技 re:Invent 2023 主题演讲4.2 亚马逊云科技行业专家探实战 五、更多亚马逊云科技活…

二十章 多线程

线程简介 在 Java 中&#xff0c;并发机制非常重要。在以往的程序设计中&#xff0c;我们都是一个任务完成后再进行下一个任务&#xff0c;这样下一个任务的开始必须等待前一个任务的结束。Java 语言提供了并发机制&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每一…

基于Webserver的工业数据采集控制小项目

主要用到的知识点&#xff0c;http协议&#xff0c;modbus协议&#xff0c;以及进程间通信&#xff0c;消息队列&#xff0c;共享内存等 框架 数据采集 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #…

vue+uniapp校园寻物失物招领平台 微信小程序1f6z5

系统中的核心用户是管理员&#xff0c;管理员登录后&#xff0c;通过管理员菜单来管理后台系统。主要功能有&#xff1a;首页、个人中心、用户管理、物品分类管理、物品信息管理、物品归还管理、留言板管理、系统管理等功能。管理员用例如图3-7所示。 对于本网上失物招领小程序…

Linux—进程状态

目录 一.前言 1.1.通过系统调用获取进程标示符 1.2.通过系统调用创建进程 二.进程状态 三.Z(zombie)-僵尸进程 四.僵尸进程危害 一.前言 学习进程的状态&#xff0c;我们首先了解一下进程的基本数据 1.1.通过系统调用获取进程标示符 由getpid&#xff08;&#xff09…

【Python】plt库详解和示例

plt 是 Python 中 Matplotlib 库的一个常用别名&#xff0c;它表示 pyplot&#xff0c;这是一个用于创建图形和图形的可视化表示的工具。下面是一些 plt 函数的详解和示例&#xff0c;以帮助大家理解和使用。 目录 plt.subplots&#xff08;&#xff09;plt.savefig&#xff0…

回顾过去的五年

回顾过去的五年 不知不觉&#xff0c;一晃就5年了。孩子也慢慢的长大了&#xff0c;都快和我一样高了。 2017-2019年依旧服务于原公司。后来公司停业了&#xff0c;得到了相应的赔偿。在家里呆了几个月&#xff0c;变成了无业游民。陪伴家人&#xff0c;也会收到家人的鞭策。…

前端算法专栏-数组-75.颜色分类

介绍 Hi 大家好。我是程序员库里&#xff0c;今天新开一个前端算法专栏。 接下来会分类给大家分享常考算法题目。 很多朋友也是看着这套系列算法拿到很多offer&#xff01;所以也是想分享给更多朋友&#xff0c;帮助到有需要的朋友。 分类 数组-三路快排 题目 75. 颜色分…

Vue学习笔记-模块化+命名空间

目的 让代码更好维护&#xff0c;让多种数据分类更加明确&#xff08;不同的模块挤在一个index.js中显得臃肿且不方便管理&#xff09; 实现方式 修改store/index.js(也可以将不同模块分别写在不同的js文件中) const countAbout {//开启命名空间namespaced:true,actions:{..…

Html网页threejs显示obj,ply三维图像实例

程序示例精选 Html网页threejs显示obj,ply三维图像实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Html网页threejs显示obj,ply三维图像实例》编写代码&#xff0c;代码整洁&#xff0…

uniapp上架app store详细攻略

​ 目录 uniapp上架app store详细攻略 前言 一、登录苹果开发者网站 二、创建好APP 前言 uniapp开发多端应用&#xff0c;打包ios应用后&#xff0c;会生成一个ipa后缀的文件。这个文件无法直接安装在iphone上&#xff0c;需要将这个ipa文件上架app store后&#xff0c;才…

php框架dcat-admin速查笔记

要想灵活的使用dcat-admin框架开发,必须知道框架有哪些类提供给我们使用. 每一个自定义的按钮,弹框,信息展示,小组件都用到特定的类和接口. 常用核心类 Dcat\Admin\Http\Controllers\AdminController 需要继承的公共控制器 Dcat\Admin\Layout\Content 布局核心 Dcat\Admin\Gr…

c语言-数据在内存中的存储

文章目录 1. 整数在内存中的存储2. 大小端字节序和字节序判断3. 浮点数在内存中的存储 1. 整数在内存中的存储 1.整数的2进制表示方法有三种&#xff0c;即 原码、反码和补码 2. 三种表示方法均有符号位和数值位两部分&#xff0c;符号位都是用0表示“正”&#xff0c;用1表示“…

前端下载文件或者图片方式,window.open或者a标签形式

首先分别讲一下下载文件的方式都有哪些 1.通过a标签的方式下载文件 <a href"http://www.baidu.com" download"baidu.html">下载</a> 我们点击下载&#xff0c;发现是跳转到了百度的首页&#xff0c;并没有真的下载文件。 因为a标签下载只能…

[Java][单列集合+数组遍历方法]通过Lambda表达式简化匿名内部类遍历数组学习体会

在分享本文之前&#xff0c;我们需要先了解两种思想——面向对象式编程与函数式编程思想 面向对象编程和函数式编程是两种不同的编程范式&#xff0c;它们的思想和实现方式有很大的差异。可以将它们比作两种不同的制作蛋糕的方式&#xff1a; 面向对象编程就像是在制作一个三…