STM32——超声测距HC_SR04记录

一、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,通过串口观察现象可知符合现象

超时检测

 以上便是本次学习的记录

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

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

相关文章

C/C++函数字符串和数字的互相转化(比赛超实用)

字符串和数字相互转化: 1 数字转字符串: 实现方法:to_string函数 存在头文件: string 实现代码: #include<iostream> #include<string> using namespace std; int main() {int a 114514;string s to_string(a);cout << s[0] << endl;cout <<…

Spring Web MVC的入门学习(一)

目录 一、什么是 Spring Web MVC 1、MVC 定义 二、学习Spring MVC 1、项目准备 2、建立连接 2.1 RequestMapping 注解的学习 2.2 RequestMapping 使用 3、请求 3.1 传递单个参数 3.2 传递多个参数 3.3 传递对象 3.4 后端参数重命名&#xff08;后端参数映射&#xf…

【LeetCode: 331. 验证二叉树的前序序列化 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

我的创作纪念日-一周年

&#x1f600;前言 不知不觉过了一年了很感慨也很期待未来 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 我的创作纪念日-一周年机缘收获(荣誉)日常成就憧憬 我的创作纪念日-一周年 机缘 在我开始在 CSDN 上发布文章之前&#xff0c;我对这个平台几乎一无所知。随着时…

[创业之路-102] :结构化思考:产学研人才联合创业公司的特点、优点与困境

目录 前言&#xff1a; 一、什么是产学研 1.1 什么是产学研 1.2 什么是产学研人才联合创业 二、产、学、研的区别、各自的特点 2.1 产业&#xff08;产&#xff09;特点 2.2 其次&#xff0c;学术&#xff08;学&#xff09;特点 2.3 科学研究&#xff08;研&#xff0…

VS Code常用前端开发插件和基础配置

VS Code插件安装 VS Code提供了非常丰富的插件功能&#xff0c;根据你的需要&#xff0c;安装对应的插件可以大大提高开发效率。 完成前端开发&#xff0c;常见插件介绍&#xff1a; 1、Chinese (Simplified) Language Pack 适用于 VS Code 的中文&#xff08;简体&#xff…

PostCSS的安装及使用 (2):使用及问题解决

PostCSS是一个CSS处理器&#xff0c;它通过插件系统可以转换CSS代码&#xff0c;使其具备更多的功能或符合特定规范。 PostCSS的使用&#xff1a; 安装PostCSS CLI和插件 # 全局安装PostCSS CLI&#xff08;可选&#xff0c;一般在项目内安装&#xff09;npm install -g postc…

Kerberos 认证 javax.security.auth.logon.LoginException:拒绝链接 (Connection refused)

kerberos 服务重启之后异常 项目中用到了hive 和hdfs &#xff0c;权限认证使用了Kerberos&#xff0c;因为机房异常&#xff0c;导致了Kerberos 服务重启&#xff0c;结果发现本来运行正常的应用服务hive 和hdfs 认证失败&#xff0c;报错信息是 典型的网络连接异常 排查思路…

鸿蒙开发之ArkUI组件常用组件图片和文本

ArkUI即方舟开发框架是HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 开发文档地址 &…

AI大模型学习在医疗领域的应用与挑战

AI大模型学习在医疗领域的应用与挑战 文章正文&#xff1a;一、AI大模型学习在医疗领域的应用二、AI大模型学习在医疗领域面临的挑战总结&#xff1a; 文章正文&#xff1a; 随着人工智能技术的飞速发展&#xff0c;AI大模型学习在各个领域都取得了显著的成果。本文将探讨AI大…

使用Sui CLI在Sui上创建和执行PTBs

Sui命令行界面&#xff08;CLI&#xff09;中的新命令允许用户直接从终端或Bash脚本创建和执行可编程交易区块&#xff08;PTB&#xff09;。这个新命令为开发人员在实现和执行PTB方面提供了更大的灵活性。 PTB为开发人员提供了一种非常强大的编程工具&#xff0c;这在其他区块…

商务口语每天学习,柯桥英语培训

今天天气好 Its a nice day today. 今天天气真好。(搭讪) Ive heard too much about you. 久仰大名。(恭维) Remember me to... 请代我向……问好。(问候) 半个句型要记牢 Its a ~(nice/good/bad) day today. Tip: 如果你想和某人搭讪而找不着好的借口时&#xff0c;就说天气…

Macs Fan Control Pro--精准掌控Mac风扇,优化散热新选择

Macs Fan Control Pro是一款专为Mac电脑设计的高级风扇控制工具。它具备强大的温度监测能力&#xff0c;可以实时监测Mac电脑各个核心组件的温度&#xff0c;并通过直观的界面展示给用户。同时&#xff0c;用户可以根据个人需求自定义风扇速度&#xff0c;或者选择预设的自动风…

【STL】vector的模拟实现

目录 前言 vector概述 vector的数据结构 vector迭代器的运用 vector的构造和析构 vector的拷贝构造与赋值 拷贝构造 传统写法 现代写法 赋值重载 vector的扩容 reserve() resize() vector的元素操作 push_back() pop_back() insert() erase() 迭代器…

[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的&#xff0c;在将 TLS 证书部署服务端时&#xff0c;证书文件其实就是服务端的公钥&#xff0c;会在 TLS 握手阶段传递给客户端&#xff0c;而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中&#xff0c;客户端会…

算法学习——LeetCode力扣动态规划篇5(198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III )

算法学习——LeetCode力扣动态规划篇5 198. 打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统…

Python|OpenCV-实现检测人脸以及性别检测(12)

前言 本文是该专栏的第13篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 性别检测是计算机视觉领域里面的一个重要学习领域,简单的来说,它可以实现自动识别一张图片中的人物性别。为此在本文中,笔者将结合OpenCV和Tensorflow来实现对一张图进行“图片中的人物人…

探索c++:string常用接口 迷雾

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、string类 这里我们对string类进行一个简单的总结&#xff1a; string是表示字符串的字…

【更新】在湘源7、8中使用2023年11月国空用地用海分类

之前为了做控规&#xff0c;从湘源8中扒了一套国空用地用海的绘图参数给湘源7使用。 【预告】在湘源控规7中使用 国空用地用海分类标准 但是部里在2023年11月又发布了一套新的用地用海分类。 本想去湘源8里面再扒一下&#xff0c;结果发现湘源8自己还没有更新呢&#xff0c;…