第15章-超声波避障功能 HC-SR04超声波测距模块详解STM32超声波测距

news/2025/2/26 23:22:24

原文链接

功能介绍放开头, 使用便捷无需愁

这是全网最详细、性价比最高的STM32实战项目入门教程,通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便学习,通过3万字笔记、12多个小时视频、20多章节代码手把手教会你如何开发和调试。让你更快掌握嵌入式系统开发。

V3.3.0-STM32智能小车

视频: https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click

V3:HAL库开发、功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、视觉控制、电磁循迹、RTOS等功能。

15.1-超声波测距

完成超声波测距功能、测量数据显示在OLED屏幕上

硬件介绍

使用:HC-SR04 超声波测距模块

注意: 绘制PCB注意四个引脚顺序 Vcc Trig Echo Gnd

供电3.3V-5V(最好5V)
在这里插入图片描述

测距原理
在这里插入图片描述
不同模式
在这里插入图片描述
GPIO模式
在这里插入图片描述
查看原理图

通过超声波的硬件介绍我们知道

MCU给Trig脚一个大于10us的高电平脉冲;然后读取Echo脚的高电平信号时间,通过公式:距离 = T* 声速/2 就可以算出来距离。

Trig(PB5)我们配置为GPIO输出

Echo(PA6)我们配置GPIO输入功能

注:这里大家可能会问,为什么不使用定时器捕获功能?

原因:

  1. 留一个定时器 方便以后扩展FreeRTOS使用
  2. 或者扩展其他舵机、电机等

在这里插入图片描述
在这里插入图片描述
软件初始化

设置PB5输出模式然后起别名
在这里插入图片描述
设置PA6输入模式、
在这里插入图片描述
然后生成代码

自己新建HC_SR04.c和HC_SR04.h 然后加入工程,指定路径

防止溢出 把之前使用的数组调整大一些

在这里插入图片描述
因为我们不适用定时器所以我们需要自己写一个us级延时函数
在这里插入图片描述

/*******************
*  @brief  us级延时
*  @param  usdelay:要延时的us时间
*  @return  
*
*******************/
void HC_SR04_Delayus(uint32_t usdelay)
{
  __IO uint32_t Delay = usdelay * (SystemCoreClock / 8U / 1000U/1000);//SystemCoreClock:系统频率
  do
  {
    __NOP();
  }
  while (Delay --);
}

在这里插入图片描述

/*******************
*  @brief  HC_SR04读取超声波距离
*  @param  无
*  @return 障碍物距离单位:cm (静止表面平整精度更高) 
*注意:两个HC_SR04_Read()函数调用的时间间隔要2ms及以上,测量范围更大 精度更高 
*******************/
float HC_SR04_Read(void)
{
	uint32_t i = 0;
	float Distance;
	HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_SET);//输出15us高电平
	HC_SR04_Delayus(15);
	HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_RESET);//高电平输出结束,设置为低电平
	
	while(HAL_GPIO_ReadPin(HC_SR04_Echo_GPIO_Port,HC_SR04_Echo_Pin) == GPIO_PIN_RESET)//等待回响高电平
	{
		i++;
		HC_SR04_Delayus(1);
		if(i>100000) return -1;//超时退出循环、防止程序卡死这里
	}
	i = 0;
	while(HAL_GPIO_ReadPin(HC_SR04_Echo_GPIO_Port,HC_SR04_Echo_Pin) == GPIO_PIN_SET)//下面的循环是2us
	{
		i = i+1;
		HC_SR04_Delayus(1);//1us 延时,但是整个循环大概2us左右
		if(i >100000) return -2;//超时退出循环
	}
	Distance = i*2*0.033/2;//这里乘2的原因是上面是2微妙
	return Distance	;
}

然后就可以读距离了、连上蓝牙可以显示数据

注意:两个HC_SR04_Read()函数调用的时间间隔要2ms及以上,测量范围更大 精度更高
在这里插入图片描述

	sprintf((char *)Usart3String,"HC_SR04:%.2fcm\r\n",HC_SR04_Read());//显示超声波数据
	HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),0xFFFF);//通过串口三输出字符 strlen:计算字符串大小	

然后把我们的手机蓝牙和小车蓝牙连接

手机显示
在这里插入图片描述

15.2-避障逻辑编写

在这里插入图片描述
然后我们编写循迹逻辑,我们的逻辑时
在这里插入图片描述

//**************避障功能********************//
//避障逻辑
	if(HC_SR04_Read() > 25)//前方无障碍物
	{
		motorPidSetSpeed(1,1);//前运动
		HAL_Delay(100);
	}
	else{	//前方有障碍物
		motorPidSetSpeed(-1,1);//右边运动 原地	
		HAL_Delay(500);
		if(HC_SR04_Read() > 25)//右边无障碍物
		{
			motorPidSetSpeed(1,1);//前运动
			HAL_Delay(100);
		}
		else{//右边有障碍物
			motorPidSetSpeed(1,-1);//左边运动 原地
			HAL_Delay(1000);
			if(HC_SR04_Read() >25)//左边无障碍物
			{
				 motorPidSetSpeed(1,1);//前运动
				HAL_Delay(100);
			}
			else{
				motorPidSetSpeed(-1,-1);//后运动
				HAL_Delay(1000);
				motorPidSetSpeed(-1,1);//右边运动
				HAL_Delay(50);
			}
		}
	}

这样我们就可以使用超声波读取距离值了。
下篇16章我们i讲解如何利用超声波做跟随,我们后面会定距离跟随的功能。


http://www.niftyadmin.cn/n/5869265.html

相关文章

网易云音乐分布式KV存储实践与演进

随着网易云音乐业务的快速发展,推荐和搜索场景对分布式KV存储的需求日益增长。本文将深入探讨网易云音乐在分布式KV存储方面的实践和演进,分析其技术选型、架构设计以及未来发展方向。 一、业务背景 网易云音乐的业务场景对分布式KV存储提出了高并发、…

java23种设计模式-命令模式

命令模式(Command Pattern)学习笔记 1. 模式定义 行为型设计模式,将请求封装为对象,使请求的发送者与接收者解耦。支持请求的排队、记录、撤销/重做等操作。 2. 适用场景 ✅ 需要将操作参数化 ✅ 需要支持事务操作&#xff08…

重构清洁想象,石头科技首创五轴仿生机械手打破传统清洁边界

2月25日,主题为“重构清洁想象”的石头科技2025发布会在上海天文馆正式召开。石头科技清洁产品BU总裁钱启杰在会上宣布,石头科技正式成为上海天文馆授权合作伙伴,希望借助航天科技到家庭科技的跨越,进一步简化家庭清洁工作&#x…

升维商哲院高考院:用易经命理为未来导航,开启慧性思维新篇章

(2025年2月19日,中国北京)在人工智能飞速发展、社会变革日新月异的今天,如何帮助青少年更好地规划未来,培养适应未来社会发展的核心素养,成为教育领域的重要课题。近日,名为“升维商哲院高考院”…

如何基于PyTorch做二次开发

基于PyTorch进行二次开发以实现可视化工程,可以从以下几个方面入手:模型结构可视化、训练过程监控、特征可视化等。以下是一些推荐的GitHub项目,这些项目可以帮助你快速搭建一个可视化的工程环境: ### 1. **PyTorch CNN Visualiz…

Visual Studio Code 跨平台安装与配置指南(附官方下载链接)

一、软件定位与核心功能 Visual Studio Code(简称VS Code)是微软开发的开源跨平台代码编辑器,支持超过50种编程语言的智能补全、调试和版本控制功能。2025版本新增AI辅助编程模块,可自动生成单元测试代码和API文档注释。 二、下载…

蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)

[NOIP 2007 普及组] 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始对这个荒岛…

linux 命令+相关配置记录(持续更新...)

linux 命令记录相关配置记录 磁盘切换 cd D:#这里表示切换到D盘查看wsl 安装的linux 子系统 wsl --list -vwsl 卸载 linux 子系统 wsl --unregister -xxx # xxx 表示子系统的名字备份Linux 子系统 导出 wsl --export xxx yyy # xxx 表示子系统的名字 yyy 表示压…