超声波传感器(HC-SR04)按时序图手撕驱动

目录

1、简介

2、传感器介绍

2.1 引脚介绍

2.2 时序图介绍

3、 需求与接线

3.1 任务需求

3.2 接线

4、Cubemax配置

4.1 SYS配置

4.2 RCC配置

4.3 时钟树配置

4.4 GPIO初始化

 4.5 定时器配置

 4.6 生成代码

5、 keil端代码编写

5.1 微妙函数封装

5.2 超声波驱动封装

5.2.1 引脚宏定义

5.2.2 按时序图进行封装

5.2.3 封装函数

5.3 任务实现


1、简介

在单片机开发中,最开始是直接使用厂家提供的驱动,有时候厂家不提供或者好用时候还会网上复制被人的驱动,但是有的并没有资源可用,此时就需要自己按照说明书/使用手册进行驱动的封装,本文就是从最简单的超声波超声波传感器开始进行练习驱动的封装。

2、传感器介绍

2.1 引脚介绍

HC-SRF04超声波测距传感器+Proteus仿真(附源码与仿真电路)_君子不怨的博客-CSDN博客_srf04

 VCC、GND 电源引脚(DC5V)。

Trig  接高电平会发出信号。

Echo 由低电平转到高电平,开始发送波。由高电平转到低电平,表示波返回。

2.2 时序图介绍

 流程:

首先给Trig10us的高电平信号,进行信号触发,当信号触发后,Echo会从低电平跳转到高电平开始发出超声波,当遇到障碍物,超声波会返回,此时Echo由高电平转到低电平,表示波返回。

距离计算:

 高电平持续的时间就是超声波发出的时间,因此在波发出的时候就需要启动定时器计算时间t。因为超声波遇到障碍物返回,所以计算距离应该将t/2处理,得到单程的时间。

Distance = v * t /2。

v = 340m/s

3、 需求与接线

3.1 任务需求

当距离小于10cm,LED灯被点亮,大于10cm时LED灯处于熄灭状态。

3.2 接线

LED ---- PB0

Trig ---- PB6

Echo --- PB7

4、Cubemax配置

4.1 SYS配置

4.2 RCC配置

4.3 时钟树配置

直接在红框内输入下方数值,回车确定即可自动对时钟树进行配置。

4.4 GPIO初始化

 4.5 定时器配置

定时器只用作计数,不用做定时,如下图所示:

 计算:

T = (arr+1)/TCK
 =  (71+1)/(72000000)//1M等于1000000hz
 =  1us

因此按照如上配置,计数一次代表1us。

 4.6 生成代码

5、 keil端代码编写

5.1 微妙函数封装

 需要一个10us延时进行信号触发,但是HAL库并不具备微妙级函数,因此需要在主函数上方进行微秒级函数封装,封装函数如下所示:

void TIM2_Delay_us(uint16_t n)
{
	__HAL_TIM_ENABLE(&htim2);//使能定时器
	__HAL_TIM_SetCounter(&htim2,0);
	while(__HAL_TIM_GET_COUNTER(&htim2) <(n-1));
	__HAL_TIM_DISABLE(&htim2);//关闭定时器
}

5.2 超声波驱动封装

5.2.1 引脚宏定义

为了便于函数的整理,首先在main.h中进行宏定义,如下所示:

#define Trig_up HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET)
#define Trig_Down HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET)
#define Trig HAL_GPIO_ReadPin(Trig_GPIO_Port,Trig_Pin)
#define Echo_up HAL_GPIO_WritePin(Echo_GPIO_Port,Echo_Pin,GPIO_PIN_SET)
#define Echo_Down HAL_GPIO_WritePin(Echo_GPIO_Port,Echo_Pin,GPIO_PIN_RESET)
#define Echo HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin)
#define LED_up HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET)
#define LED_Down HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET)
#define LED HAL_GPIO_ReadPin(LED_GPIO_Port,LED_Pin)

5.2.2 按时序图进行封装

 观察时序图,首先需要Trig一个大于10us高电平进行信号触发,如下代码所示:

Trig_up;
TIM2_Delay_us(20);
Trig_Down;

Echo由低电平转到高电平,表示波已发出,当波发出去时候进行定时器的启动,如下所示:

while(Echo==0);
HAL_TIM_Base_Start(&htim2);//开启定时器

Echo由高电平转到低电平,超声波遇到障碍物返回,关闭定时器,如下所示:

while(Echo==1);
HAL_TIM_Base_Stop(&htim2);//关闭定时器

接着进行时间与距离的计算,如下所示:

*cnt = __HAL_TIM_GET_COUNTER(&htim2);//计数一次是1us 
	
*dis = 340*(*cnt)/2*0.000001*100;//1us = 0.000001s 1m = 100cm

5.2.3 封装函数

void HCSR(int *cnt,float *dis)
{
	//Trig大于10us高电平
	Trig_up;
	TIM2_Delay_us(20);
	Trig_Down;
	
	//Echo由低电平转到高电平,开始发送超声波
	while(Echo==0);
	HAL_TIM_Base_Start(&htim2);//开启定时器
	
	//Echo由高电平转到低电平,超声波遇到障碍物返回
	while(Echo==1);
	HAL_TIM_Base_Stop(&htim2);//关闭定时器
	
	//计算时间
	*cnt = __HAL_TIM_GET_COUNTER(&htim2);//计数一次是1us 
	
	//距离计算
	*dis = 340*(*cnt)/2*0.000001*100;//1us = 0.000001s 1m = 100cm
	
}

5.3 任务实现

最后在主函数的while中进行逻辑代码的实现,如下所示:

while (1)
  {
		int cnt = 0;
		float dis = 0;
		HCSR(&cnt,&dis);
		if(dis<5){
			LED_up;
		}
		else
		{
			LED_Down;
		}
		HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

html | 基于iframe的简易富文本编辑器

效果图 支持: 选中后 ctrlI 斜体 代码 思路就是在iframe种嵌套html和css。 <pre> - 支持: 选中后 ctrlI 斜体 - todo: 鼠标实现单击斜体 </pre> <iframe name"richedit" style"height:30%; width:100%;"></iframe><script…

【论文解读】Hybrid-SORT: Weak Cues Matter for Online Multi-Object Tracking

因为Hybrid-SORT的baseline是基于OCSORT进行改进的&#xff0c;在这之前建议先了解byteTrack和【】的相关知识 1.介绍 1.1 基本框架 多目标跟踪(MOT)将问题分为两个子任务。第一个任务是检测每个帧中的对象。第二个任务是将它们在不同的框架中联系起来。关联任务主要通过显式…

回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一…

matlab 点云精配准(1)——point to point ICP(点到点的ICP)

目录 一、算法原理参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 参考文献 [1] BESL P J,MCKAY N D.A method for registration of 3-Dshapes[J].IEEE Tran…

2.创建小程序

创建 在开发工具中,选择小程序,点击加号 填写小程序信息,模板使用的是TS+Sass 编辑器的工作区 目录结构 项目使用的是ts的模板,目录结构和js的有一点差异,目录结构如下: miniprogram:小程序根目录 —pages:小程序页面目录 ——xxx:页面目录,一个页面对应一个目…

JVM的前世今生之类加载过程

1. 什么是JVM VM是JavaVirtualMachine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它可以实现跨操作系统运行&#xff0c;即一…

Java进阶篇--迭代器模式

目录 同步迭代器&#xff08;Synchronous Iterator&#xff09;&#xff1a; Iterator 接口 常用方法&#xff1a; 注意&#xff1a; 扩展小知识: 异步迭代器&#xff08;Asynchronous Iterator&#xff09;&#xff1a; 常用的方法 注意&#xff1a; 总结&#xff1a…

Android Alarm闹钟API使用心得

前言 有什么办法可以在不打开App的时候&#xff0c;也能够触发一些操作呢&#xff1f;比如说发送通知&#xff0c;解决这个需求的办法有很多种选择&#xff0c;比如说官方推荐的WorkManager API&#xff0c;可以在后台执行一次性、耗时、定时的任务&#xff0c;但WorkManager是…

如何创建和查看软链接和硬链接?这二者的区别是什么?

索引节点&#xff08;inode&#xff09;硬链接创建硬链接查看硬链接 软链接创建软链接查看软链接 inode编号妙用总结软链接和硬链接的区别感谢 &#x1f496; hello大家好&#x1f60a; 在linux中&#xff0c;文件链接可以使多个文件名引用同一个文件。有两种方式可以创建指向同…

我能“C”——数据的存储

目录 1. 数据类型介绍 1.1 类型的基本归类&#xff1a; 2. 整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 2.3 练习 3. 浮点型在内存中的存储 3.1 一个例子 3.2 浮点数存储规则 1. 数据类型介绍 char // 字符数据类型 short // 短整…

Jmeter 分布式性能测试避坑指南

在做后端服务器性能测试中&#xff0c;我们会经常听到分布式。那你&#xff0c;是否了解分布式呢&#xff1f;今天&#xff0c;我们就来给大家讲讲&#xff0c;在企业实战中&#xff0c;如何使用分布式进行性能测试&#xff0c;实战过程中&#xff0c;又有哪些地方要特别注意&a…

Log4net在.Net Winform项目中的使用

引言&#xff1a; Log4net是一个流行的日志记录工具&#xff0c;可以帮助开发人员在应用程序中实现高效的日志记录。本文将提供一个详细的分步骤示例&#xff0c;来帮助您在.Net Winform项目中使用Log4net。 目录 一、安装Log4net二、配置Log4net三、在项目中使用Log4net四、初…

【Kubernetes】Kubernetes的Pod控制器

Pod控制器 一、Pod 控制器的概念1. Pod 控制器及其功用2. Pod 控制器有多种类型2.1 ReplicaSet2.2 Deployment2.3 DaemonSet2.4 StatefulSet2.5 Job2.6 Cronjob 3. Pod 与控制器之间的关系 二、Pod 控制器的使用1. Deployment2. SatefulSet2.1 为什么要有headless&#xff1f;2…

最新AI系统ChatGPT程序源码/支持GPT4/自定义训练知识库/GPT联网/支持ai绘画(Midjourney)+Dall-E2绘画/支持MJ以图生图

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

Python编程——列表解析与常用操作

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、列表是什么&#xff1f; 二、列表的特点 1、元素…

Java --- 二维数组

一、二维数组的定义 public class TwoArrayTest {public static void main(String[] args) {//二维数组声明与初始化//方式1&#xff1a;静态初始化int[][] arr new int[][]{{1,2,3},{1,2,3},{1,2,3}};//方式2&#xff1a;动态初始化int[][] arr2 new int[3][3];arr2[0][1] …

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)

开个新坑详细分析一下虚幻官方发布的《CropOut》&#xff0c;文章会同步发布到我在知乎|CSDN的专栏里 文章目录 概要Create Island几何体生成部分随机种子Step 1Step 2Step 3Step 4Step 5Step 6 岛屿材质部分动态为草地设置颜色 程序设计的小技巧其它Platform Switch函数 概要 …

NLP的tokenization

GPT3.5的tokenization流程如上图所示&#xff0c;以下是chatGPT对BPE算法的解释&#xff1a; BPE&#xff08;Byte Pair Encoding&#xff09;编码算法是一种基于统计的无监督分词方法&#xff0c;用于将文本分解为子词单元。它的原理如下&#xff1a; 1. 初始化&#xff1a;将…

【Rust日报】2023-08-18 RustShip:一个新的 Rust 播客

探索 Rust 编译器基准测试套件 在最近关于 Rust 编译器 CI&#xff08;持续集成&#xff09;和基准测试基础设施的文章中&#xff0c;作者承诺写一篇关于运行时基准测试的博客文章&#xff0c;这是 Rust 编译器基准测试套件的新补充。然而&#xff0c;在这样做之前&#xff0c;…

5G技术与其对智能城市、物联网和虚拟现实领域的影响

随着第五代移动通信技术&#xff08;5G&#xff09;的到来&#xff0c;我们即将迈向一个全新的数字化世界。5G技术的引入将带来更高的速度、更低的延迟和更大的连接性&#xff0c;推动了智能城市、物联网和虚拟现实等领域的发展。 首先&#xff0c;5G技术将带来超越以往的网络速…