超声波传感器(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 */}

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

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

相关文章

生信豆芽菜-差异基因富集分析

网址&#xff1a;http://www.sxdyc.com/enrichmentEnrich 该工具使用R 语言的clusterProfiler包对关键基因集进行GO和KEGG富集分析&#xff0c;注意这个的关键基因集可以是差异基因&#xff0c;WGCNA的module基因&#xff0c;也可以是表型相关的基因集 1、数据准备 准备一个基因…

SpringBoot系列之基于Jersey实现RESTFul风格文件上传API

前言 JAX-RS&#xff1a;JAX-RS是可以用可以用于实现RESTFul应用程序的JAVA API&#xff0c;给开发者提供了一系列的RESTFul注解Jersey&#xff1a;是基于JAX-RX API的实现框架&#xff0c;用于实现RESTful Web 服务的开源框架。 JAX-RX常用的注解&#xff1a; javax.ws.rs.Pa…

【网络编程·网络层】IP协议

目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度&#xff08;解包&#xff09; 3、8位协议&#xff08;分用&#xff09; 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…

IDEA 设置为护眼的豆沙绿

代码区域设置成护眼色 先打开 IDEA 的设置界面&#xff0c;然后按照下图按顺序店了设置就可以了 这个时候&#xff0c;可以看到&#xff0c;只有代码区域别成了护眼色&#xff0c;其他地方还是白的刺眼&#xff0c;我们来一个一个的解决掉 左侧的文件页修改为护眼色 还是先…

基于YOLOv8模型的五类动物目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的五类动物目标检测系统可用于日常生活中检测与定位动物目标&#xff08;狼、鹿、猪、兔和浣熊&#xff09;&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与…

【Vue-Router】路由传参

1. query 传参 list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水","price":400,"id": 2},{"name": "菜","price":500,"…

uniapp+uview封装小程序请求

提要&#xff1a; uniapp项目引入uview库 此步骤不再阐述 1.创建环境文件 env.js&#xff1a; let BASE_URL;if (process.env.NODE_ENV development) {// 开发环境BASE_URL 请求地址; } else {// 生产环境BASE_URL 请求地址; }export default BASE_URL; 2.创建请求文件 该…

数据结构--算法的时间复杂度和空间复杂度

文章目录 算法效率时间复杂度时间复杂度的概念大O的渐进表示法计算实例 时间复杂度实例 常见复杂度对比例题 算法效率 算法效率是指算法在计算机上运行时所消耗的时间和资源。这是衡量算法执行速度和资源利用情况的重要指标。 例子&#xff1a; long long Fib(int N) {if(N …

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

华为云零代码新手教学-体验通过Astro Zero快速搭建微信小程序

您将会学到 您将学会如何基于Astro零代码能力&#xff0c;DIY开发&#xff0c;完成问卷、投票、信息收集、流程处理等工作&#xff0c;还能够在线筛选、分析数据。实现一站式快速开发个性化应用&#xff0c;体验轻松拖拽开发的乐趣。 您需要什么 环境准备 注册华为云账号、实…

基于Helm管理Kubernetes应用

Kubernetes部署方式 官方提供Kubernetes部署3种方式 minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单点的Kubernetes&#xff0c;尝试Kubernetes或日常开发的用户使用。不能用于生产环境。 官方文档&#xff1a;Install Tools | Kubernetes 二进制包 从…

如何从cpu改为gpu,pytorch,cuda

1.cmd输入nvcc -V 2.得到 cuda版本后&#xff0c;去pytorch官网 3.根据自己的cuda进行选择 4.复制上述链接&#xff0c;进入cmd 5.cmd中输入activate XXX,这里的"XXX"指代自己在工程中用到的环境 6.进入后&#xff0c;将刚才链接粘贴&#xff0c;回车等待下载结束 …

Linux 基础

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 linux的目录结构 linux的文件系统采用树状的目录结构&#xff0c;在此结构的最上层是根目录“/”&#xff0c; 然后在此目录下再创建其他…

Mirror网络库 | 实战

此篇为下文&#xff0c;上篇&#xff1a;Mirror网络库 | 说明 一、官方实例说明 场景名说明AdditiveLevels场景为“关卡”&#xff0c;附加形式加载AdditiveScenes加载卸载附加场景Basic基础的连接/断开&#xff0c;消息发送Benchmark服务器1000“怪物”生成性能测试Benchmark…

IL汇编ldc指令学习

ldc指令是把值送到栈上&#xff0c; 说明如下&#xff0c; ldc.i4 将所提供的int32类型的值作为int32推送到计算堆栈上&#xff1b; ldc.i4.0 将数值0作为int32推送到计算堆栈上&#xff1b; ... ldc.i4.8 将数值8作为int32推送到计算堆栈上&#xff1b; ldc.i4.m1 将数值-…

【开源分享】在线客服系统搭建-基于php和swoole客服系统CRMchat(附源码完整搭建教程)...

CRMChat是一款开源的在线客服系统&#xff0c;后台管理使用thinkphp框架&#xff0c;消息通讯使用swoole扩展&#xff0c;现在我来部署搭建一下。 这是一款不可商用的开源客服系统&#xff0c;如果有商用需求可以访问我的网站&#xff1a;gofly.v1kf.com 域名解析 以阿里云为例…

WebRTC | ICE详解

目录 一、Candidate种类与优先级 二、ICE策略 1. iceServers 2. iceTransportPolicy 三、P2P连接 1.Nat类型 &#xff08;1&#xff09;完全锥型NAT &#xff08;2&#xff09;IP限制锥型NAT &#xff08;3&#xff09;端口限制锥型NAT &#xff08;4&#xff09;对称…

springboot、java实现调用企业微信接口向指定用户发送消息

因为项目的业务逻辑需要向指定用户发送企业微信消息&#xff0c;所以在这里记录一下 目录 引入相关依赖创建配置工具类创建发送消息类测试类最终效果 引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

在Centos环境中搭建Nginx环境

一、Nginx概念简介 Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 Nginx与redis相同&#xff0c;都是基于多路复用模型构建出的产物&#xff0c;因此它与R…

利用Opencv实现人像迁移

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用Opencv实现人像迁移&#xff0c;欢迎大家一起参与探讨交流~ 本文目录&#xff1a; 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…