基于stm32的超声波测距

news2024/12/25 15:55:40

文章目录

  • 一、HC-SR04超声波测距模块说明
    • 1、产品特点
    • 2、电气参数
    • 3、HC-SR04超声波测距模块
    • 4、超声波时序图
  • 二、 CUBEMX配置
  • 三、keil配置代码

模块选择:
stm32f103c8芯片
HC-SR04超声波测距模块

一、HC-SR04超声波测距模块说明

1、产品特点

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

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

2、电气参数

在这里插入图片描述

3、HC-SR04超声波测距模块

在这里插入图片描述
VCC 供 5V电源,GND 为地线,TRIG 触 发 控 制 信 号 输入,ECHO 回响信号输出等四个接口端。

4、超声波时序图

在这里插入图片描述
以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将
发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。
回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号
时间间隔可以计算得到距离。公式:uS/58=厘米或者 uS/148=英寸;或是:距离= 高电平时间*声速(340M/S)/2;建议测量周期为 60ms 以上,以防止发射信号对
回响信号的影响。

注:
1、此模块不宜带电连接,若要带电连接,则先让模块的 GND 端先连接,否则会影响模块的正常工作。
2、测距时,被测物体的面积不少于 0.5 平方米且平面尽量要求平整,否则影响测量的结果

二、 CUBEMX配置

配置rcc
在这里插入图片描述

设置时钟为72
在这里插入图片描述

配置串口
在这里插入图片描述
在这里插入图片描述

定时器配置
为了不在重复配置,这里就直接配置成输入捕获模式,开启溢出中断与捕获中断,方法一只需要开启定时器即可。利用TIM1_CH4是因为Echo与TIM1_CH4共用引脚。
在这里插入图片描述
在这里插入图片描述

命名引脚
在这里插入图片描述
在这里插入图片描述

生成项目
在这里插入图片描述
在这里插入图片描述

三、keil配置代码

重定向printf函数,打开 usart.c,在 /* USER CODE BEGIN 0 / 和 / USER CODE END 0 */加入以下代码:

 
#include <stdio.h>
 
#ifdef __GNUC__
	/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
	set to 'Yes') calls __io_putchar() */
	#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
	#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
 
#endif /* __GNUC__ */

在这里插入图片描述

在 /* USER CODE BEGIN 1 / 和 / USER CODE END 1 */ 之间加入以下代码:

 
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
	/* Place your implementation of fputc here */
	/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}

在这里插入图片描述

在tim.c中编写毫秒延时函数

/* USER CODE BEGIN 1 */
 
//使用TIM1来做us级延时函数,此函数为1us
void TIM1_Delay_us(uint16_t n_us)
{
	/* 使能定时器1计数 */
	__HAL_TIM_ENABLE(&htim1);
	
	__HAL_TIM_SetCounter(&htim1, 0);//htim1
	
	while(__HAL_TIM_GetCounter(&htim1) < ((1 * n_us)-1) );
	
    /* 失能定时器1计数 */
	__HAL_TIM_DISABLE(&htim1);
}
 
 
/* USER CODE END 1 */

在这里插入图片描述

在main.c中编写超声波开始函数

void Start()
{
	HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_SET);//拉高
		
	TIM1_Delay_us(20);
		
	HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_RESET);//拉低
}

在这里插入图片描述

在主函数外定义变量

int Cnt;//计数值
float Distance;//距离

在这里插入图片描述
重写主函数

int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
	
	HAL_TIM_Base_Start(&htim1);//开启定时器
	
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
 
  while (1{
		/* 定时器1,通道1,模式随便,主要用于计数,没有使用边沿捕获 */	
		Start();//开启超声波模块
		
		HAL_TIM_Base_Start(&htim1);//开启定时器
 
		//对超声波输入端口操作
		while( HAL_GPIO_ReadPin (Echo_GPIO_Port ,Echo_Pin) == GPIO_PIN_RESET);//等待输入电平拉高
		
		__HAL_TIM_SetCounter(&htim1,0);
		
		//对超声波输入端口操作
		while( HAL_GPIO_ReadPin (Echo_GPIO_Port ,Echo_Pin) == GPIO_PIN_SET);//等待输入电平变低
		
		Cnt = __HAL_TIM_GetCounter(&htim1);
		
		HAL_TIM_Base_Stop(&htim1);
		
		Distance = Cnt*340/2*0.000001*100 ;
		
		printf("Distance=%.1fcm\n",Distance);
		
		HAL_Delay(500);
		
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

硬件连接
trig——PA2;
echo——PA11;
vcc——3.3v;
GND——GND;

烧录运行结果如下:
在这里插入图片描述

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

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

相关文章

chatgpt赋能python:Python如何将两张图片叠加

Python如何将两张图片叠加 介绍 图像处理是计算机视觉领域的重要应用&#xff0c;而Python已经成为了图像处理中最流行的编程语言之一。在图像处理的过程中&#xff0c;有时需要将两张图片叠加在一起&#xff0c;这就需要用到Python中的图像叠加技术。 本文将介绍Python中如…

chatgpt赋能python:Python如何空一行:介绍

Python如何空一行&#xff1a;介绍 在Python编程中&#xff0c;经常需要在输出文字或代码时进行空行分隔。一个常用的场景就是在代码中加入注释&#xff0c;将注释与代码分开&#xff0c;使代码逻辑更加清晰易懂。在某些情况下&#xff0c;也需要在输出文字时进行空行分割&…

一次方维o2o商城PHP审计学习

PHP审计源码学习 一、渗透测试 起因是朋友问fanwei o2o源码搭建的站后台能不能拿shell&#xff0c;于是我进后台进行了一番尝试&#xff0c;各功能点没什么进展&#xff0c;好多地方过滤了&#xff0c;上传也是白名单&#xff0c;编辑器的1day修了&#xff0c;万幸的是有个拿…

priority_queue(优先级队列)模拟实现(堆方式)

目录 priority_queue初步介绍 堆 堆的模拟实现 接口实现 插入(push) AdJustUp(向上排序)接口 删除(pop) AdJustDown(向下排序算法) 适配器堆总结 仿函数 用仿函数对堆进一步封装 用堆进行封装优先级队列 代码总结 priority_queue初步介绍 priority_queue的性质是…

BOOST 恒压控制驱动芯片,外围电路简单

应用说明 Hi8000 是一款外围电路简单的 BOOST 升压恒压控制驱动芯片&#xff0c;适用于 2.7-40V 输入电压范围的升压恒压电源应用领域&#xff0c;启动电压可以低至 2.5V&#xff0c;可以广泛应用 于太阳能、便携式数码产品&#xff0c;锂电升压应用等供电领域。 应用领域 移…

Day_44希尔排序

目录 一. 关于希尔排序 二. 希尔排序的实现过程 三. 希尔排序的代码实现 1. 核心代码 2. 修改后的代码 四. 代码展示 五. 数据测试 六. 总结与反思 一. 关于希尔排序 希尔排序按其设计者希尔&#xff08;Donald Shell&#xff09;的名字命名&#xff0c;该算法由希尔在 19…

报名抽奖功能(互动功能接收端JS-SDK)

功能概述 本模块主要处理报名抽奖相关逻辑&#xff0c;如抽奖开始、结束和更新等事件消息。 图&#xff1a;抽奖--效果截图 图&#xff1a;抽奖--效果截图 初始化及销毁 在实例化该模块并进行使用之前&#xff0c;需要对SDK进行初始化配置&#xff0c;详细见参考文档。 在线…

直播教学答题卡(互动功能发起端JS-SDK)

本 SDK 主要包括发起答题卡、管理答题卡题库等功能。以下操作仅支持角色为讲师/嘉宾/助教/管理员的用户执行。 答题卡可以分为快速问答和普通答题卡。 快速问答只有单选和多选两种类型&#xff0c;没有具体的选项内容&#xff0c;最多可有 5 个选项。普通答题卡题目类型包括&a…

MySQL:索引

索引&#xff0c;在MySQL中非常重要。它能提高数据库的性能&#xff0c;不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行 正确的 create index &#xff0c;查询速度就可能提高成百上千倍。 但是&#xff0c;查询速度的提高是以插入、更新、删除的…

Lora模型训练-koya SS GUi

前提 现在大部分 AI 产品采用的的大模型(dreamboth),但是在产品的训练中也发现了不仅仅需要较大的内存还需要好的 GPU 成本较高,而且模型较大修改只能重新训练不能修改,为了解决这个问题开始推荐 lora 小模型时代.接下来讲解 lora 模型以及使用小模型(lora)的Koya.SS.GUI的流程…

LeetCode-031. 最近最少使用缓存

HashMap扩容&#xff1a;(30条消息) 代码优化 | 如何设置HashMap的初始值大小_hashmap指定初始值大小_死牛胖子的博客-CSDN博客 1、哈希表LinkedList 超出时间&#xff08;&#xff09; Collection(集合):容器,用于存放对象(引用类型。基本类型需要自动装箱) List(列表):元素…

正则表达式(一):基础命令及字符

正则表达式一-基础命令及字符 一、常用命令补充&#xff1a;1.grep&#xff1a;2.sort&#xff1a;3.uniq&#xff1a;快速去重4.tr&#xff1a;5.cut&#xff1a;6.split&#xff1a;文件拆分7.paste&#xff1a;合并文件8.例题应用&#xff1a; 二、正则表达式&#xff1a;1.…

UID和cookie的查找

1、首先在浏览器中输入www.weibo.cn(如图1)&#xff0c; 然后按回车键&#xff0c;打开微博&#xff08;如图2&#xff09;。 图1 图2 2、在上图空白处单击鼠标右键&#xff0c;在显示出的对话框中点击【检查】&#xff0c;如下图。 3、如下图&#xff0c;点击【网络】或者【N…

chatgpt赋能python:Python自定义函数:让编程更高效

Python自定义函数&#xff1a;让编程更高效 Python是一种非常流行的编程语言&#xff0c;它有很多强大的功能&#xff0c;包括自定义函数。Python的自定义函数可以让你编写自己的代码&#xff0c;并将其作为一个函数来使用。这在编程中非常有用&#xff0c;因为它可以让你将代…

java设计模式(十九)备忘录模式

目录 定义模式结构角色职责代码实现适用场景优缺点定义 备忘录模式(Memento Pattern) 保存一个对象的某个状态,以便在适当的时候恢复对象。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘录模式属于行为型模式。 模式结构 角色职责 …

数据结构04:串的存储结构与KMP算法

前言 参考用书&#xff1a;王道考研《2024年 数据结构考研复习指导》 参考用书配套视频&#xff1a;4.1_1_串的定义和基本操作_哔哩哔哩_bilibili 特别感谢&#xff1a; Google Bard老师[解释KMP&#xff0c;修改BUG]、Chat GPT老师[修改BUG]、BING老师[封面图]~ 当我请求BI…

chatgpt赋能python:Python如何使用空行优化SEO

Python 如何使用空行优化 SEO 在网页排名算法中&#xff0c;空行的使用可以对网页的排名产生影响。在 Python 中&#xff0c;空行的使用也被用来优化代码和提高代码的可读性。本文将介绍如何在 Python 中使用空行来优化代码和优化 SEO。 空行的作用 在 Python 中&#xff0c…

【论文阅读】AlexNet: ImageNet Classification with Deep Convolutional Neural Networks

1. 简介 AlexNet是一个用于图像识别的卷积神经网络&#xff0c;其应用在ILSVRC比赛中&#xff0c;AlexNet所用的数据集是ImageNet&#xff0c;总共识别1000个类别 2. 网络结构 整体网络结果如下图所示&#xff0c;一共有8层&#xff0c;前五层是卷积层&#xff0c;后三层是全…

Kubernetes之pod

Kubernetes之pod 在通过docker运行程序时&#xff0c;我们通常会制作Dockerfile文件构建镜像。也可以基于某个镜像运行容器在容器中安装组件之后&#xff0c;再基于容器生成镜像 使用如下命令可生成镜像&#xff0c;想了解更多参数请添加–help docker build -f Dockerfile路…

(超超详!!)Linux进程间通信-----管道 + 共享内存详解

索引 通信背景管道匿名管道命名管道 共享内存基本概念共享内存如何管理共享内存的相关函数共享内存的删除共享内存的使用 通信背景 进程是具有独立性的,每个进程都有独立的PCB,独立的数据和数据结构,因此进程间想要交互数据,成本会非常高,但有时候需要多进程协同处理同一件事情…