STM32单片机超声波测距(避障)

2023-11-05

1 实物准备

  • STM32单片机,STM32F103C8T6
    在这里插入图片描述
  • 超声波传感器,HC-SR04
    在这里插入图片描述

2 原理介绍

2.1 超声波传感器引脚和参数介绍(PA0–>Trig PA1–>Echo)
在这里插入图片描述
在这里插入图片描述
2.2 超声波测距实现原理
首先看原理图:
在这里插入图片描述
如图所示,超声波工作的过程实际就是不断循环主控(STM32)发送Trig信号、超声波模块发送驱动信号以及主控接收Echo信号并测距则三个过程。
具体过程为:
首先单片机给超声波模块发送大于10微秒的高电平Trig信号,当超声波模块收到Trig信号后会向前发送超声波驱动脉冲,最后超声波模块等待超声波脉冲返回,在收到返回信号之前Echo端口一直为高电平,直到收到回传信号Echo端口电平翻转。故而可以在Trig端口打出高电平启动信号后,计算出Echo端口高电平的持续时间。
通过上述过程可以得到超声波的传播时间,这部分实际上具体的实现就是单片机端口的简单操作,发送信号和检测端口状态以及通过定时器来获得最终的时间。
而得到了超声波的传播时间后,将时间带入公式(距离和时间(定时器)相关的公式)即可计算出距离。
因为超声波在声音中传输的速度是340m/s左右,所以可以得到障碍物的距离与Echo端口的高电平持续时间有如下所示关系。
在这里插入图片描述
对于模块的启动信号,可以随便使用一个GPIO口发送10微妙以上的高电平来实现,本次设计使用的是PA0端口作为与超声波模块连接的Trig端口。
关于Echo端口的高电平持续时间的获取,实际上也是通过定时器实现。通过开启定时器TIM2,并配置外部中断定时器TIM2通道2,当Echo端(PA1)翻转成高电平时,执行外部中断句柄。进入外部中断句柄后,首先开启定时器并记录定时器当前的计数值CH1,再进入一个循环判断直到Echo端电平翻转成低电平,记录此时的定时器计数值为CH2,然后关闭定时器。通过将计数值CH2和CH1做差即可得到Echo端口高电平时间内定时器计数个数再和定时器单位计数个数对应得实际时间相乘即可得到Echo端口高电平持续得时间。
定时器一个单位计数对应得实际时间和配置定时器时得预分频值PSC有关,本次设计配置预分频值PSC为71。单位计数对应得时间和预分频值得关系如下式所示。

在这里插入图片描述
若使用的定时器预分频器得输入时钟为72M,代入上式可得单位计数对应得实际时间为1微秒。所以可以得到超声波测得得距离计算公式如下式所示。
在这里插入图片描述
故而可以实现测距功能。

3 代码

下文给出了绝大部分代码除了OLED显示的代码,因为OLED版本不同所以未给出。之前使用的是4针的IIC通信的OLED。下述代码中的模块函数均为c文件,h文件可自行建立。

3.0 延时函数代码(对应Delay.h):

/*************************Delay延时模块*******************************
模块功能:产生X (us ms s)延时效果
*********************************************************************/
#include "stm32f10x.h"
//0到233015微妙延时
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;			//设置定时器重装值ARR=72x
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;	//设置时钟源为HCLK 启动定时器
	while(!(SysTick->CTRL & 0x00010000));//等待计数到0
	SysTick->CTRL = 0x00000004;		//关闭定时器
}

//函数功能:0~4294967295毫秒延时
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}

 //0~4294967295秒级延时
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

3.1 定时器代码(对应Timer.h):

#include "stm32f10x.h"//头文件
//超声波测距定时器TIM2 初始化
void Timer_Init(void)
{	//开启定时器时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	//使用内部时钟
	TIM_InternalClockConfig(TIM2);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65535;//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//预分频值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//CNT到达ARR中断一次
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	TIM_SetCounter(TIM2,0);//CNT值清0
}

//开启TIM2定时器
void Timer_ON(void)
{
	TIM_Cmd(TIM2,ENABLE);
}

//关闭TIM2定时器
void Timer_OFF(void)
{
	TIM_Cmd(TIM2,DISABLE);
}
  1. 2 超声波代码:
#include "stm32f10x.h"               
#include "Delay.h"
#include "Timer.h"
#include "OLED.h"
//参数初始化
float Num;
int i=0,Counter,Sum,Dec,CNT_Mean,CN1,CN2;
//超声波模块触发函数
void SR04_Start(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_0);//A0置1大于10us
	Delay_us(15);
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}

void SR04_Init(void)
{
	Timer_Init();//开启定时器3
	GPIO_InitTypeDef GPIO_InitStructure;//定义初始化结构体
	EXTI_InitTypeDef EXTI_InitStructure;//定义外部中断结构体
	NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开AFIO时钟
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
	EXTI_InitStructure.EXTI_Line=EXTI_Line1;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	
	NVIC_Init(&NVIC_InitStructure);
	//脉冲触发端口 Trig=PA0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//回波接收端口 Echo=PA1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	SR04_Start();
}
void EXTI1_IRQHandler(void)
{
	Delay_us(50);
	if(EXTI_GetITStatus(EXTI_Line1) != RESET)
	{	
		Timer_ON();//开始计时
		CN1 = TIM_GetCounter(TIM2);
		while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1));//A1为高电平时一直循环下去
		CN2 = TIM_GetCounter(TIM2);
		Timer_OFF();
		Counter = CN2 - CN1;//获得计数差
		EXTI_ClearITPendingBit(EXTI_Line1);//清除标志位
	}
}
                         
void Show_SRDis(void)
{
	for(i=0;i<5;i++)//均值滤波
	{
		SR04_Init();
		Sum+=Counter;
	}
	CNT_Mean=Sum/5;
	Num=CNT_Mean*0.017;//b/5 * 17/1000
	Dec=(17*Sum/5)%100;//100取余得到小数点后值
	OLED_ShowNum(1,7,Num,3);
	OLED_ShowNum(1,11,Dec,2);
	Delay_ms(100);
	Sum=0;//更新Sum
}

//返回超声波测距值
float Get_DisVal(void)
{
	return Num;
}
  1. 4 主函数代码:
#include "stm32f10x.h"// Device header
#include "Delay.h"	//延时函数模块
#include "OLED.h"//OLED显示模块
#include "HCSR04.h"//超声波模块

int main(void)
{
	OLED_Init();//OLED初始化
    while(1)
    {
        Show_SRDis();//超声波获取当前距离
    }
}

4 实物结果演示

在这里插入图片描述

工程文件下载:
链接:https://pan.baidu.com/s/1udbi87Xm-hDzVLdZTH6KuA?pwd=4n7q
提取码:4n7q
解压密码为xkyp

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

STM32单片机超声波测距(避障) 的相关文章

  • 嵌入式(网络编程)(网络基础)

    网络采用分层的思想 1 每一层实现不同的功能 2 每一层向上层提供服务 同时使用下层提供的服务 各层典型的协议 1 网络接口与物理层 MAC地址 48位全球唯一 网络设备的身份标识 ARP RARP ARP IP地址 gt MAC地址 RA

随机推荐

  • Windows10 安装wsl2、Ubuntu相关操作

    Windows10 安装wsl2 Ubuntu相关操作 安装wsl2 查看本机windows版本 键盘上按下win r 输入winver 查看系统版本 必须运行 windows 10 版本 2004 及更高版本 内部版本 19041 及更高
  • css3 vw rem 布局 最完整的 css重置 浏览器样式修复

    http caibaojian com vw vh html css重置 Reset css css浏览器样式修复 Normalize css 最新方案 Neat css neat css融合了Reset css和Normalize css
  • Python练习题一(2021.04.08)

    Python练习题一 首先不得不说 人生苦短 我用Python 作为Python的初学者 为了坚持刷题 故以每天写博客的形式砥砺自己 每天 忙的话就两天搞一次 都会总结 2 3道题目 话不多说 呈上第一天题目 题目一 在同一行依次输入三个值
  • 【H5】 meta标签适配器(兼容所有屏幕)

    H5 meta标签实现屏幕大小适配器 效果图如下 meta标签内属性解释如下 name viewport 视图窗口 content 里面写以下属性 width device width 设备宽度 initial scale 1 0 100p
  • Ubuntu下安装RocksDB

    原文地址 https program park github io 2021 06 08 rocksdb 2 安装依赖 sudo apt get install gcc g libsnappy dev zlib1g dev libbz2 d
  • HBase条件查询(多条件查询)

    Author Pirate Leo myBlog http blog csdn net pirateleo myEmail codeevoship gmail com 转载请注明出处 谢谢 文中可能涉及到的API Hadoop HDFS h
  • css中背景颜色的代码,css背景代码是什么,css怎么控制背景颜色

    css背景代码是什么 css怎么控制背景颜色 内容导读 css背景代码主要就是设置background color 然后在后面选择我们喜欢的颜色就可以了 通常css背景代码用来控制div和特殊的文本 本文举了实例 也给出了代码 大家拿去用即
  • 【springboot系】springboot集成日志框架logback

    平常我们工作中常见的日志框架 有log4j logback log4j2 logback是由log4j的创始人设计的另外一个开源日志框架 logback相比之于log4j性能提升了不少 log4j2晚于logback 也是后起之秀 官方介绍
  • 【精·超详细】Java实现图片和Base64之间的相互转化(一看就会)

    目录 一 简介 二 maven依赖 三 工具类 四 测试 一 简介 工作中调用第三方接口的时候 比如 人脸识别 身份证识别 文字识别等等 有时是图片 有时是Base64的字符串 一般前端上传的都是图片 我们有时就需要进行相应的转换了 图片转
  • VsCode下的Remote-SSH插件的使用

    0 前言 众所周知 Vs Code是一个非常NB的编辑器 它可以通过安装不同的插件 满足几乎所有的开发需求 最近了解到微软之前推出过一个Remote SSH的插件 通过该插件可以在Vs Code上通过SSH连接Linux服务器进行终端操作或
  • Non-Rule Package常用表名

    1 GL相关 Journal Template和GL BU手动添加 GL ACCOUNT TBL GP GL GROUP GP GL GROUP DTL GP GL MAP GP GL MAP DTL 2 Pay Entity GP PYE
  • ubuntu 安装mysql,postgresql, mongodb

    安装mysql mysql教程 Ubuntu系统下MySQL开启远程连接 centos安装mysql 安装过程中需要要设置root密码 sudo apt get install python dev libpython dev libpq
  • FISCO BCOS区块链搭建笔记(No.1-节点搭建)

    说明 此文章针对的是centos版本的 其他版本可以参考官网 FISCO BCOS官网链接 点此跳转 1 搭建单群组FISCO BCOS联盟链 第一步 安装依赖 安装centos依赖 sudo yum install y openssl o
  • iOS 第三方登陆 —— 微信

    一 准备工作 1 到微信开放平台注册成开发者 获取appid 2 导入WeChatConnection framework 3 配置URL Schemes 输入appid 例如wx29ce0f21ea982cb8 二 配置AppDelega
  • 机器学习之K-means聚类算法

    目录 K means聚类算法 算法流程 优点 缺点 随机点聚类 人脸聚类 旋转物体聚类 K means聚类算法 K means聚类算法是一种无监督的学习方法 通过对样本数据进行分组来发现数据内在的结构 K means的基本思想是将n个实例分
  • 栈、队列

    一 栈 栈 author Mona public class MyStack int elements public MyStack elements new int 10 压入元素 public void push int element
  • 字节跳动Data部门员工收入证明,92年女月入14 万

    评论
  • 讲清楚 React 的重新渲染

    Web 前端开发者对渲染和重新渲染应该不陌生 在 React 中 它们究竟是什么意思 渲染 React 让组件根据当前的 props 和 state 描述它要展示的内容 重新渲染 React 让组件重新描述它要展示的内容 要将组件显示到屏幕
  • 推荐系统的挑战

    推荐系统的挑战 推荐系统简介 随着互联网2 0的发展 用户不再是数据的消费者 满足于关键词的搜索和在线浏览 而成为了数据的生产者 数据逐渐由专业机构的生产转向由用户的生产 数据量也日益剧增 信息过载油然而生 具体的表现是一是信息过滤即如何从
  • STM32单片机超声波测距(避障)

    文章目录 1 实物准备 2 原理介绍 3 代码 4 实物结果演示 1 实物准备 STM32单片机 STM32F103C8T6 超声波传感器 HC SR04 2 原理介绍 2 1 超声波传感器引脚和参数介绍 PA0 gt Trig PA1 g