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

这个是全网最详细的STM32项目教学视频。
第一篇在这里:
视频在这里

STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随

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.mzph.cn/news/843154.shtml

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

相关文章

Creo装配体中只显示一部分零部件

从模型树中选中要显示的零部件,也可以结合Ctrl框选的方式选择对象。然后在模型树右击等会弹出选项,点选----即可

AD23中一些好用的功能

1.关闭在线DRC功能,可以避免布线时候一卡一卡的问题: 取消在线DRC的勾选: 2.AD的在线封装库,非常好用: 如何优雅地服用AD 21的在线元件库 – 吴川斌的博客 (mr-wu.cn) 3.如何恢复Altium Designer23默认窗口布局 打开…

了解MySQL中的存储过程,请看过来

引言 在数据库编程中,存储过程是一种强大的工具,它允许开发者封装复杂的逻辑,提高性能,并且增强安全性。本文将从基础概念讲起,逐步深入到存储过程的高级应用。 第一部分:存储过程基础 1. 存储过程简介 …

小红书推流机制底层逻辑

小红书推流机制底层逻辑 很多做运营的朋友问小红薯怎么玩❓ 小红书的核心逻辑流量是不是玄学❓ 今天就来说说小红书的流量算法机制🔥 ①电脑审核 ②分配初始流量 ③增加流量 ④推荐结束

DINO中为什么教师模型用大图,学生模型用小图

在 DINO(可以理解为由DIstillation和NO labels的缩写)中,使用不同的图像裁剪策略对教师模型和学生模型进行训练有其特定的原因。具体来说,教师模型使用大图(global views),学生模型则同时使用大…

鸿蒙OS开发:【一次开发,多端部署】(音乐专辑主页)

一多音乐专辑主页 介绍 本示例展示了音乐专辑主页。 头部返回栏: 因元素单一、位置固定在顶部,因此适合采用自适应拉伸,充分利用顶部区域。专辑封面: 使用栅格组件控制占比,在小尺寸屏幕下封面图与歌单描述在同一行。歌曲列表: 使用栅格组…

LVM和配额管理

文章目录 一、LVM1.1 LVM概述1.2 LVM的管理命令1.3 创建LVM的过程第一步:先创建物理卷第二步:创建逻辑卷组 / 扩容第三步:创建逻辑卷 / 扩容对ext4文件系统的管理 1.4 删除LVM 二、磁盘配额2.1 磁盘配额概述2.2 磁盘配额命令2.3 磁盘配额设置…

从ZooKeeper切换到ClickHouse-Keeper,藏着怎样的秘密

本文字数:7772;估计阅读时间:20 分钟 作者:博睿数据 李骅宸(太道)& 小叮当 本文在公众号【ClickHouseInc】首发 本系列前两篇内容: 从ES到ClickHouse,Bonree ONE平台更轻更快&a…

vue3学习(三)

前言 继续接上一篇笔记,继续学习的vue的组件化知识,可能需要分2个小节记录。前端大佬请忽略,也可以留下大家的鼓励,感恩! 一、理解组件化 二、组件化知识 1、先上知识点: 2、示例代码 App.vue (主页面) …

认识 DECIMAL 类型

文章目录 1.作用2.实现原理参考文献 1.作用 为保证小数精度不丢失,数据库表使用 DECIMAL 类型,服务代码中使用,比如 Golang 第三方库 https://github.com/shopspring/decimal。接口协议可以使用 string 表示。 从 DB 存储,服务数…

力扣:541. 反转字符串 II

541. 反转字符串 II 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0…

数据恢复:手机数据恢复,盘点7个有效手机恢复方法

你知道吗,超过 70% 的智能手机用户都曾有过数据丢失的经历?如果你曾经丢失过手机中的重要文件,别担心,本文有解决办法。在本文中,我们将告诉你如何使用简单的步骤恢复手机中丢失的数据。无论你是不小心删除了文件还是手…

go使用letteravatar生成圆形透明头像图标

官网地址:GitHub - disintegration/letteravatar: Letter avatar generation for Go 我对其中函数改了一下,支持多个字符,效果如下: func TestCreateAvatar(t *testing.T) {GenerateAvatar("Bird Fish", 0, "Bird…

哈工大机器人竞技队成立22年来4次获国际冠军

另获得中国冠/亚/季军13次、国家级科技奖励60余次、省级科技竞赛奖励50余次、多次获得“最佳技术奖”。早在2009年就力克群雄获得唯一一张亚太大学生机器人大赛的入场卷,代表中国在东京5场全胜获得冠军。 2013届队员王永锟填报高考志愿时,恰巧看到哈工大…

Mac m1安装AWVS

目录 原因 安装 下载镜像 进入终端 启动AWVS 登陆 原因 由于 m1 为 arm 芯片,兼容性问题无法独立安装x86的AWVS,所以使用docker安装较为方便使用。

字符串补位

字符串补位 StringUtilsStrUtilString.format() StringUtils 字符串长度小于设定长度,则会补零,直至达到设定长度字符串长度等于或大于设定长度,则不进行任何操作,保持原字符串不变 import org.apache.commons.lang3.StringUtil…

JavaScript 全屏方案(分享)

文章目录 基本实现特殊情况 基本实现 基本情况是属于只是鼠标点击全屏按钮 document.exitFullscreen()&#xff0c;退出全屏Document.requestFullscreen()&#xff0c;开启全屏document.fullscreenElement&#xff0c;返回当前全屏元素 <template><div><el-b…

stm32 FLYMCU串口刷机:程序文件不是0x8000000和0x20000000区域的”解决办法。

你想使用串口刷机&#xff0c;用FLYMCU &#xff0c; 刷入的bin 文件是不带地址的&#xff0c;得刷入HEX文件 才可以&#xff0c;因为程序并不知道是从0x8000000开始的&#xff0c; 如果必须得刷入bin 那就得用stm32Cube programmer 这个软件 也可以使用ST-LINK&#xff08;S…

Word如何绘制三线表及设置磅值

插入表格&#xff0c; 开始 边框 边框和低温 设置磅值 先全部设置为无边框 上边 1.5 0.5 以上内容未完善&#xff0c;请等待作者更新

【前端面经】JS 中 var、let、const 变量声明方式及其区别?

JS 中三种变量声明方式及其区别 三种变量声明方式及其区别var、let、const 的对比变量的提升 三种变量声明方式及其区别 var、let、const 的对比 特性varletconst函数作用域√&#xff08;变量在函数中声明时&#xff09;not onlynot only全局作用域√&#xff08;变量在函数…