STM32——超声测距HC_SR04记录

news2024/10/7 4:23:22

一、HC_SR04简述

        HC-SR04超声波测距模块可提供 2cm-400cm的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。

基本工作原理:
(1)采用IO 口TRIG 触发测距,给最少10us 的高电平信呈。
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO 口ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

注意:当测距时间大于38ms时,便超时了,这是无论如何,ECHO都会被拉低

二、代码编写

        通过定时器定时测量测距时间再通过上述公式计算对应的距离,这里定时器可以通过定时中断计时。

1.定时器基本配置

#include "Timer.h"

void Timer_Init(uint16_t ARR,uint16_t PSC)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
	TIM_TimeBaseInitTypeDef Tim4_InitStructure;
	Tim4_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
	Tim4_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	Tim4_InitStructure.TIM_Period=ARR;
	Tim4_InitStructure.TIM_Prescaler=PSC;
	Tim4_InitStructure.TIM_RepetitionCounter=0x00;
	TIM_TimeBaseInit(TIM4,&Tim4_InitStructure);
	TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除由于初始化而置的标志位
	TIM_Cmd(TIM4,DISABLE);
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
	/***************初始化定时器,开启更新中断****************/
	NVIC_InitTypeDef TIM4_IT_InitStructure;
	TIM4_IT_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
	TIM4_IT_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	TIM4_IT_InitStructure.NVIC_IRQChannelPreemptionPriority=4;
	TIM4_IT_InitStructure.NVIC_IRQChannelSubPriority=4;
	NVIC_Init(&TIM4_IT_InitStructure);
}

2.传感器函数编写

1.基本配置

#include "HC_SR04.h"

#define Trigo GPIO_Pin_14
#define Echo  GPIO_Pin_15
static uint16_t count;
/*内部调用*/
/**********Trigo为输出引脚************/
void Trigo_Write(uint8_t val)
{
	GPIO_WriteBit(GPIOE,Trigo,(BitAction)val);
}
/**********Echo为输入引脚************/
/*内部调用*/
uint8_t Echo_Read(void)
{
	return GPIO_ReadInputDataBit(GPIOE,Echo);
}

2.初始化

void HCSR04_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=Trigo;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin=Echo;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
	Trigo_Write(0);
}

3.距离测量

        完整的时间=产生更新中断的次数*产生一次中断需要的时间+TIM->CNT里的时间

/*CNT f=1000 000HZ */
/*ARR  1000*/
/*PSC  72 */
/*假设返回单位为cm distance=340*100*time/2/1000 000 */
float HCSR04_GetDistance(void)
{
/****************先将Trigo拉高*******************/
	Trigo_Write(1);
/****************延迟20us确保脉冲足够触发测距*******************/
	delay_us(20);
/****************再拉低脉冲使其开始测距*******************/
	Trigo_Write(0);
/****************当Echo变高时便说明其开始测距*******************/
	while(Echo_Read()==0);
/****************开启定时器,开始计数*******************/
	TIM_Cmd(TIM4,ENABLE);
/****************测距结束的时候便是Echo再次变低*******************/
	while(Echo_Read()==1);
/****************计算时间,即为完整的产生中断的时间加上CNT上的时间*******************/
	float time=count*1000+TIM4->CNT;
	printf("time:%f\r\n",time);
/****************超时判断*******************/
	if(time/1000>38)//如果大于38ms则不能测距
	{
		return 0;
	}
/****************再次清零,回到开始状态等待下一次的测距指令*******************/
	count=0;
	TIM4->CNT=0;
/****************失能定时器*******************/
	TIM_Cmd(TIM4,DISABLE);
/****************返回距离*******************/
	float distance;
	distance=time*340/2/10000;
	return distance;
}
/****************中断函数用于计时*******************/
void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
	{
		count++;
		
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
	}
}

4.主函数

#include "main.h"
float distance;
int main(void)
{
	delay_init();
	uart_init(115200);
	Timer_Init(1000,72);
	NVIC_PriorityGroupConfig (NVIC_PriorityGroup_2 );
	HCSR04_Init();
	while(1)
	{
		distance=HCSR04_GetDistance();
		if(distance) printf("distance :%f\r\n",distance);
		else printf("distance erro\r\n");
		delay_ms(500);
	}
 }

三、最终现象

实际距离约18-20cm,通过串口观察现象可知符合现象

超时检测

 以上便是本次学习的记录

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

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

相关文章

差点引爆全球的核弹,深度分析XZ-Utils供应链后门投毒事件

处心积虑的投毒者蛰伏三年多,精心选择对象,通过复杂的攻击手法、专业的技战术,一步步支起一张大网,企图掌控全球主流linux发行版,一旦成功他将可以随意侵入全球绝大多数的服务器,这将是足以引爆全球的核弹危…

java高级面试题整理 - 2024

Java 创建对象有几种方式 在Java中,有以下几种常见的方式来创建对象: 使用new关键字:这是最常见的创建对象的方式。通过调用类的构造函数,使用new关键字可以在内存中分配一个新的对象。使用反射:Java的反射机制允许在…

【漏洞复现】通天星CMSV6弱口令漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

Anaconda换源和常用命令

设置Anaconda国内镜像加速下载 使用conda install python包非常便捷,但由于官方服务器位于国外,下载速度较慢。为了提升下载速度,国内清华大学提供了Anaconda的仓库镜像。 要将Anaconda设置为使用国内镜像,特别是清华镜像源&…

前后端数据交互

前后端数据交互 网页上所有的数据都是来源于后端,比如淘宝或者京东的秒杀,用户的登陆或者注册,这些都需要借助于后端来存储数据。我们前端需要做的就是把数据发送给后端,后端发送给我们的数据我们要拿到把它显示到页面上&#xff…

高斯消元、组合计数

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 高斯消元 // a[N][N]是增广矩阵 int gauss() {int c, r;for (c 0, r 0; c < n; c ){int t r;for (int i r; i < n; i ) // 找到绝对值最大的行if (fabs(a[i][c]) > fabs(a[t][c]))t i;if (fabs(a…

数据可视化-ECharts Html项目实战(9)

在之前的文章中&#xff0c;我们学习了如何在ECharts中编写气泡图&#xff0c;词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECharts Ht…

git仓库太大只下载单个文件或文件夹

有没有这样的苦恼&#xff1a;仓库太大&#xff0c;只想下载其中某些文件(夹)&#xff1f; 一招解决&#xff1a;bash down_folder_from_git.sh 运行前&#xff0c;先修改开头三个变量 原理: 稀疏检出 让工作树仅包含自定义的文件 #!/usr/bin/bash addrhttps://github.com/fac…

千行百业加速鸿蒙化,5分钟搞懂鸿蒙开发有必要学吗?

鸿蒙系统在全球范围内取得了显著进展&#xff0c;其生态设备数量已经突破8亿大关。更令人振奋的是&#xff0c;已有超过200家领先的互联网应用公司纷纷加速鸿蒙原生开发的步伐。 这其中包括了我们日常生活中耳熟能详的淘宝、支付宝、美团、京东、高德、小红书等热门应用&#…

AI技术创业:挖掘行业解决方案、智能产品服务及教育培训的无限机遇

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

AI大模型和BI如何结合?

人工智能大模型和商业智能&#xff08;Business Intelligence&#xff0c;BI&#xff09;可以结合起来&#xff0c;可以涵盖以下几个方面&#xff1a; 数据分析和预测&#xff1a;人工智能大模型可以通过深度学习和大数据处理技术&#xff0c;对大规模的数据进行分析和预测。通…

org.junit.runners.model.InvalidTestClassError:1. No runnable methods

你们好&#xff0c;我是金金金。 场景 很简单的一个测试方法 我的boot版本&#xff1a;2.7.18 依赖 报错信息 排查 看报错信息提示无效的测试类&#xff0c;没有可运行的方法 看了下依赖信息&#xff0c;引入spring-boot-starter-test依赖也自动的引入了juni5依赖&#xff0…

latex表格前后都有多行合并

最终实现的效果图如下&#xff1a; 这个表格的特点是前面有5行合并&#xff0c;后边也有5行合并&#xff0c;眉头有2行合并。 当然要引入对应的包 \usepackage{multirow} 其实现代码如下&#xff1a; \begin{table*}[!t]\caption{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. \label{X…

论文笔记✍GS3D- An Efficient 3D Object Detection Framework for Autonomous Driving

论文笔记✍GS3D: An Efficient 3D Object Detection Framework for Autonomous Driving &#x1f4dc; Abstract &#x1f528; 主流做法限制 &#xff1a; 我们在自动驾驶场景中提出了一种基于单个 RGB 图像的高效 3D 物体检测框架。我们的工作重点是提取 2D 图像中的底层 3…

八、组合数据类型(列表、元组、集合、字典)

序列&#xff1a;存储多个值的连续空间&#xff0c;每个值对应一个编号————索引 包括&#xff1a;列表、元组、集合和字典 相加操作 s1"桂林山水" s2山水甲天下 print(s1s2)#直接相加得到新的字符串 print(_____________________________) print((s1s2)*5,sep&…

Linux 查看磁盘信息:df与du命令详解

一、df 1.简介 df 是 disk free的缩写&#xff0c;从UNIX和类UNIX操作系统的早期开始&#xff0c;它就是UNIX和类UNIX操作系统的一部分。它被设计为一种工具&#xff0c;用于监视系统上已使用和可用的磁盘空间数量。 df 命令主要用于需要检查文件系统上已使用和可用的磁盘空…

Ubuntu安装Bazel(最简单的方法)

Ubuntu安装Bazel 文章目录 Ubuntu安装Bazel简介安装验证一下 简介 Bazel 是一款由 Google 开发的开源构建和测试工具&#xff0c;它使用了一种人类可读且高度可配置的语言来描述构建规则&#xff0c;使得构建和测试过程更加灵活和可维护。Bazel 支持多种编程语言&#xff0c;包…

ArcGIS Pro怎么进行挖填方计算

在工程实施之前&#xff0c;我们需要充分利用地形&#xff0c;结合实际因素&#xff0c;通过挖填方计算项目的标高&#xff0c;以达到合理控制成本的目的&#xff0c;这里为大家介绍一下ArcGIS Pro中挖填方计算的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的…

【Web自动化】Selenium的使用(一)

目录 关于自动化测试selenium工作机制 selenium的使用selenium中常用API定位元素按id定位按名称定位按类名定位按标签名定位按CSS选择器定位按XPath定位示例 操作测试对象等待sleep休眠隐式等待显示等待 打印信息浏览器操作键盘事件鼠标事件切换窗口截图关闭浏览器 欢迎阅读本文…

Windows部署VisualSVN服务端结合Cpolar实现公网访问内网管理界面

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…