基于stm32f103vc的智能小车——超声波避障部分

2023-11-01

智能小车的超声波避障实现过程

在硬件综合训练这门课程中,我们以小组的形式完成了基于stm32f103vc的智能小车的制作,实现的主要功能有:遥控、避障、语音控制、人脸识别以及舵机控制摄像头旋转。其中我主要负责的是stm32板的开发,以下是超声波避障的实现过程。

  1. 超声波模块的介绍
    我们所用的是HC-SR04超声波测距模块,它可以测量 3cm – 4m 的距离,精确度可以达到 3mm。
    HC-SR04 实物图
  2. 超声波模块的工作原理
    (1)采用IO口TRIG触发测距,给至少10us的高电平信号;
    (2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
    (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速/2;
    (4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值。
  3. 超声波模块电路图
    在这里插入图片描述
  4. 超声波模块时序图
    在这里插入图片描述
  5. 超声波模块实现代码
    时钟与GPIO初始化:
void iniTim()
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
 	TIM_TimeBaseInitStructer.TIM_Period=9999;// 定时周期 .1s 100ms overflow
 	TIM_TimeBaseInitStructer.TIM_Prescaler=71;  // 72 000 000 1mhz 1us
 	TIM_TimeBaseInitStructer.TIM_ClockDivision=0; 
 	TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
 	TIM_TimeBaseInitStructer.TIM_RepetitionCounter = 0;
 	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);

	TIM_Cmd(TIM2,ENABLE);
 	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
 
 	NVIC_InitTypeDef NVIC_InitStructure;
 	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
 	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
 	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	 NVIC_Init(&NVIC_InitStructure);
 
 	TIM_Cmd(TIM2,DISABLE);// 关闭定时器使能

	GPIO_InitTypeDef GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
	 /*TRIG 信号 */
 	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
 	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	 /*ECOH 信号 */
	 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
 	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
 	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
 	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 	GPIO_ResetBits(GPIOB,GPIO_Pin_9);//关闭距离过远led
}

测距函数:

double get_length(void)
{
 	GPIO_SetBits(GPIOB,GPIO_Pin_8);
 	 Delay_us(11);
  	GPIO_ResetBits(GPIOB,GPIO_Pin_8);
 	 while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6) == RESET);
   	TIM2->CNT = 0;//清零计时器
  	TIM_Cmd(TIM2,ENABLE);// 回响信号到来,开启定时器计数
  	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==SET);
  	TIM_Cmd(TIM2,DISABLE);// 关闭定时器
  
 	if(!toofar) //没有完成一次计数周期,即距离不是很远 
  	{
   		t=TIM_GetCounter(TIM2);// 获取 TIM2 寄存器中的计数值
   		time = (double)t/(double)1000000; //往返时间,单位s 
   		length =  340*time/2; //单程长度,单位m 
   		TIM2->CNT=0; // 将 TIM2 计数寄存器的计数值清零
  	}
  	else
 	{
   		toofar = 0; 
   		length =99; //足够远,不用考虑 
   		TIM2->CNT=0; // 将 TIM2 计数寄存器的计数值清零
  	}
 	return length;
}

设置中断:

void TIM2_IRQHandler(void) // 中断,当距离足够远时,设置toofar = 1,不必再计算 
{
 	if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
   	{
   		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);// 清除中断标志
   		toofar = 1;
   		GPIO_ResetBits(GPIOB,GPIO_Pin_9);
   	}
}

主函数:

int main(void) 
{
 	SysTick_Init();
 	iniTim();
 	while(1) 
 	{
 		double len = 0;
  		len = get_length();
  		if ( len < 0.5 ) //如果距离够近
  		{
  			GPIO_SetBits(GPIOB,GPIO_Pin_7);//点亮距离过近led
   			GPIO_ResetBits(GPIOB,GPIO_Pin_9);//复位距离过远led
  		}
  		else 
   		{
   			if(toofar)//距离长到tim溢出,> 17m
   			{
    				GPIO_SetBits(GPIOB,GPIO_Pin_9);//点亮距离过远led
    				GPIO_ResetBits(GPIOB,GPIO_Pin_7);//复位距离过近led
   			}
   			else
   			{
     				GPIO_ResetBits(GPIOB,GPIO_Pin_7);//复位距离过近led
    				GPIO_ResetBits(GPIOB,GPIO_Pin_7);//复位距离过近led
    			}
  		}  
 	}
}

注:我添加了两个led灯来判断超声波测距功能的实现,其中
PB7引脚上连接的是距离过近led,如果近距离内出现障碍,它会亮起;
PB9引脚上连接的是距离过远led,如果在很远的距离范围里都没有障碍,它会亮起。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于stm32f103vc的智能小车——超声波避障部分 的相关文章

  • STM32在Debug时程序运行时间不对,Debug时定时器中断每次进入断点时间不对,定时器一开启就进入中断的解决办法

    一 Debug时程序时间不对解决办法 1 点击魔术棒 2 点击Debug 点击Settings 3 点击Trace 在Core Clock里修改为你的系统时钟 二 Debug时定时器中断每次进入断点时间不对 在Debug时 程序停下来 定时
  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • vue使用wangEditor

    vue版本2 0 editor5 1 23版本 editor for vue 1 0 2版本 api文档入口 效果图 点击查看如何封装 安装步骤入口 npm install wangeditor editor save npm instal
  • 多路选择器MUX总结-IC学习笔记(八)

    多路复用器是一种组合电路 它从许多输入信号中选择一个作为输出 本文先介绍两个MUX的简单应用 主要关于如何将verilog与物理实现对应 第二当MUX作为时钟切换电路时如何避免毛刺 glitch 文章目录 1 1 MUX code与物理实现
  • grafana配置MySQL持久化存储并配置HTTPS

    Grafana 配置 MySQL 数据持久化存储 一 mysql8 0 30 安装 1 1 解压并初始化 MySQL8 0 30 查询是否存在 MariaDB 和 MySQL 存在需要删除后进行安装 rpm qa grep MariaDB
  • 目标检测VOC标注格式中,将斜框标注转化为水平框

    目标检测VOC格式数据集obb标注向hbb标注的转换 polygon 2 bndbox polygon obb 和bndbox hbb 介绍 polygon obb bndbox hbb polygon2bndbox转换原理 polygon
  • unturned服务器修改空投频率,unturned 服务器设置

    unturned 服务器设置 内容精选 换一换 区块链服务状态为 弹性IP异常 排查项 弹性公网IP已 解绑 或被释放 在BCS控制台 服务管理页面中的目标服务卡片中 单击 更多 gt 更新访问地址 查看弹性公网IP 登录网络控制台 查找目
  • ajax success function(data)后的data数据无法使用Uncaught TypeError: Cannot read property ‘xxx‘ of undefined

    问题描述 前端小白 在不了解ajax机制的情况下误使用函数返回ajax中需要时间完成的ajax函数 导致return后的data无法在后面的script代码块中正常使用 function getData ajax type get url
  • procfs使用及字符设备

    以下内容由chatgpt给出 以下是一个使用procfs接口创建设备节点的示例代码 include
  • Android Kotlin SharedFlow

    SharedFlow 会从其中收集值得所有使用方法中发出数据 简而言之就是 像普通的流只可以一方发送 一方接受 而这个流可以一方发送 多方接受 下面上代码演示 SharedFlowFragment package com example a
  • 【C#】-属性(Property)和字段(Field)的区别

    导读 近期学习过程中发现了一些问题 我的学习只是学习 敲代码就是敲代码 没有加入思考 也不问为什么就直接去敲人家写好的例子去敲 把知识都学死了 逐渐散失了思考能力 所以学习的兴趣大打折扣 正如那句话 学而不思则罔 思而不学则殆 在设计模式中
  • c语言 学生信息管理系统设计,大一C语言结课设计之《学生信息管理系统》

    第一次写这么长的程序 代码仅供参考 有问题请留言 学生信息管理系统 IDE Dev Cpp 4 9 9 2 2014 6 15 include include include include include using std sort u
  • 【Redis】回顾Redis知识点之事务机制

    回顾Redis知识点之事务机制 Redis事务机制 为什么 Redis 不支持回滚 roll back 假如事务执行一半的时候Redis宕机怎么办 为什么需要内存回收 上一篇回顾下Redis基础知识点中有简单介绍Redis与Memcache
  • python 一行代码 将小数变成百分数

    数据表 将人数占比和金额占比设置成百分数 先将数据变成保留4位小数点的数 方法一 最简单 result 人数占比 round 4 result 金额占比 round 4 方法二 lambda函数 把数据变成4位小数点的数 写lambda函数
  • 云服务器和传统IDC物理机有什么区别?

    为什么选腾讯云服务器不选传统IDC物理机 云服务器弹性计算使用灵活 上云是趋势 并且性价比高 支持一键升级配置或降级配置 一键部署搭建应用程序环境 一键调整公网带宽 一键镜像复制到另一台服务器 并且支持退款 可以实现分分钟创建多台云服务器实
  • Springboot中使用mabatis_plus拓展包多数据源配置

    1 需求 使用Springboot进行项目开发时 需要访问多个数据库 每个数据库都有各自的作用 需要将数据分开建表存储 1 多数据源配置 两个库业务互不相干 a方法使用a库的数据 b方法使用b库的数据 2 动态数据源配置 两个库业务有关联
  • Flink intervalJoin 使用 -转载

    1 前言 Flink中基于DataStream的join 只能实现在同一个窗口的两个数据流进行join 但是在实际中常常会存在数据乱序或者延时的情况 导致两个流的数据进度不一致 就会出现数据跨窗口的情况 那么数据就无法在同一个窗口内join
  • 中国低代码行业竞争格局:BAT、用友、金蝶纷纷入局

    前文我们分析了低代码行业的市场规模和应用价值 文中提到过 中国目前的低代码行业已经起步且不乏行业巨头的加入 那么中国目前的低代码行业形成了怎样的竞争格局呢 本文将对此展开分析 2016年起 低代码概念开始在国内兴起 当年该行业总共有10起融
  • 用 EasySysprep 4 封装XP图文教程

    根据文件内的教程一步一步的操作就可以了 基本上是傻瓜式的哦 下载地址 http pan baidu com s 1gdjhP0B
  • C语言基础入门详解三

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 一 C语言之函数指针 include
  • SQL进阶_2

    自连接 针对相同的表进行的连接被称为 自连接 self join 面向对象语言以对象的方式来描述世界 而面向集合语言 SQL 以集合的方式来描述世界 自连接技术充分体现了 SQL 面向集合的特性 特性 1 可重排列 排列 组合 组合 有顺序
  • 基于stm32f103vc的智能小车——超声波避障部分

    智能小车的超声波避障实现过程 在硬件综合训练这门课程中 我们以小组的形式完成了基于stm32f103vc的智能小车的制作 实现的主要功能有 遥控 避障 语音控制 人脸识别以及舵机控制摄像头旋转 其中我主要负责的是stm32板的开发 以下是超