HC-SR04超声波传感器详解(STM32)

news/2024/9/18 23:43:39/ 标签: stm32, 嵌入式硬件, 单片机, 传感器

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

3.工作原理介绍

三、程序设计

main.c文件

ultrasonic.h文件

ultrasonic.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        HC-SR04超声波传感器是通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离的一种传感器模块。与蝙蝠寻找猎物的回声定位基本原理相同,可以广泛应用于无损测量、水文液位测量、工业场地等领域。

以下是超声波传感器的参数:

型号

HC-SR04

工作电压

DC 5V

工作电流

3.3mA

工作温度

-40~85

输出方式

GPIO

探测距离

2cm~600cm

探测精度

3mm

哔哩哔哩视频链接:

HC-SR04超声波传感器详解(STM32)

(资料分享见文末) 

二、传感器原理

1.原理图

模块包括超声波发射器、接收器与控制电路。

2.引脚描述

引脚名称

描述

VCC

供给电压DC 5V

GND

地线

TRIG

触发控制信号输入

ECHO

回响信号输出

3.工作原理介绍

    传感器发射器向某一个确定的方向发射超声波的同时进行计时,超声波在碰触到障碍物之后会返回给超声波接收器一个反射波,此时停止计时,将时间纪录为 t。根据速度距离公式,结合超声波的传播速度与时间 t,可以推算出超声波发射点与所测量障碍物之间的距离为S=340t/2

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

注意:测量周期应为60ms以上,以防止发射信号对回响信号的影响,被测物体的面积应不小于0.5平方米且尽量要求平整,否则影响结果

三、程序设计

1.使用STM32F103C8T6读取HC-SR04超声波传感器采集的距离数据,通过串口发送至电脑

2.将读取得到距离信息数据同时在OLED上显示

TRIG

PA0

ECHO

PA1

OLED_SCL

PB11

OLED_SDA

PB10

串口

串口1

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "ultrasonic.h"
#include "timer.h"/*****************辰哥单片机设计******************STM32* 项目			:	HC-SR04超声波传感器实验                     * 版本			:   V1.0* 日期			:   2024.8.27* MCU			:	STM32F103C8T6* 接口			:	参看ultrasonic.h							* BILIBILI	    :	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/float distance;int main(void)
{ SystemInit();//配置系统时钟为72M	delay_init(72);LED_Init();LED_On();Ultrasonic_Init();USART1_Config();//串口初始化OLED_Init();printf("Start \n");delay_ms(1000);OLED_Clear();//显示“距离:”OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChar(32,0,':',16,1);OLED_ShowString(60,20,"cm",16,1);while (1){LED_Toggle();distance = UltrasonicGetLength();OLED_ShowNum(40,20,distance,2,16,1);delay_ms(50);	//延时50ms}
}

ultrasonic.h文件

#ifndef __ULTRASONIC_H
#define	__ULTRASONIC_H
#include "stm32f10x.h"
#include "adcx.h"
#include "delay.h"
#include "math.h"/*****************辰哥单片机设计******************STM32* 文件			:	HC-SR04超声波传感器h文件                   * 版本			:   V1.0* 日期			:   2024.8.27* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	    :	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************//***************根据自己需求更改****************/
// ULTRASONIC GPIO宏定义#define		ULTRASONIC_GPIO_CLK								RCC_APB2Periph_GPIOA
#define 	ULTRASONIC_GPIO_PORT							GPIOA
#define 	ULTRASONIC_TRIG_GPIO_PIN					GPIO_Pin_0	
#define 	ULTRASONIC_ECHO_GPIO_PIN					GPIO_Pin_1	#define 	TRIG_Send  PAout(0)
#define 	ECHO_Reci  PAin(1)/*********************END**********************/void Ultrasonic_Init(void);
float UltrasonicGetLength(void);void OpenTimerForHc(void);
void CloseTimerForHc(void); 
u32 GetEchoTimer(void);#endif /* __ADC_H */

ultrasonic.c文件

#include "ultrasonic.h"
#include "timer.h"/*****************辰哥单片机设计******************STM32* 文件			:	HC-SR04超声波传感器c文件                   * 版本			:   V1.0* 日期			:   2024.8.27* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	    :	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************///超声波计数
u16 msHcCount;void Ultrasonic_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd (ULTRASONIC_GPIO_CLK, ENABLE );			// 打开连接 超声波传感器单片机引脚端口时钟GPIO_InitStructure.GPIO_Pin = ULTRASONIC_TRIG_GPIO_PIN;			// 配置连接 传感器TRIG 的单片机引脚模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;						// 设置为推挽输出GPIO_Init(ULTRASONIC_GPIO_PORT, &GPIO_InitStructure);				// 初始化 GPIO_InitStructure.GPIO_Pin = ULTRASONIC_ECHO_GPIO_PIN;			// 配置连接 传感器ECHO 的单片机引脚模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;				// 设置为浮空输入输入GPIO_Init(ULTRASONIC_GPIO_PORT, &GPIO_InitStructure);				// 初始化 TIM4_Int_Init(1000-1,72-1);
}//打开定时器4
static void OpenTimerForHc()  
{TIM_SetCounter(TIM4,0);msHcCount = 0;TIM_Cmd(TIM4, ENABLE); 
}//关闭定时器4
static void CloseTimerForHc()    
{TIM_Cmd(TIM4, DISABLE); 
}//获取定时器4计数器值
u32 GetEchoTimer(void)
{u32 t = 0;t = msHcCount*1000;t += TIM_GetCounter(TIM4);TIM4->CNT = 0;  delay_ms(50);return t;
}//通过定时器4计数器值推算距离
float UltrasonicGetLength(void)
{u32 t = 0;int i = 0;float lengthTemp = 0;float sum = 0;while(i!=5){TRIG_Send = 1;      delay_us(20);TRIG_Send = 0;while(ECHO_Reci == 0);      OpenTimerForHc();        i = i + 1;while(ECHO_Reci == 1);CloseTimerForHc();        t = GetEchoTimer();        lengthTemp = ((float)t/58.0);//cmsum = lengthTemp + sum ;}lengthTemp = sum/5.0;return lengthTemp;
}

四、实验效果 

五、资料获取

项目分享


http://www.ppmy.cn/news/1527444.html

相关文章

linux 双网卡服务器突然断电后网卡单通故障解决

某台linux 双网卡服务器突然断电后网卡单通故障解决 故障现象:断电后重启服务器,主用网卡IP只能同网段访问,其他网段无法访问,备用网卡则正常; 解决方案:route -n查询路由信息,发现主网卡路由…

JavaWeb开发02 - js+vue

什么是JavaScript? JavaScript(简称:JS) 是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;它能使网页可交互。 JS引入方式 内部脚本:将JS代码定义在HTML页面中 JavaScript代码必须位于<script></script>标签之间在HTML文档中&#xff0c;可…

财富之眼用经济思维看清世界PDF高清下载

财富之眼用经济思维看清世界.pdf: 下载地址&#xff1a; http://share.vpssw.com/f/28426853-1358046308-e8b70f

大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

C++:内部类,匿名对象,操作符new与delete

一.内部类 1.如果一个类定义在另一个类的内部&#xff0c;这个内部类就叫做内部类。内部类是一个独立的类&#xff0c;跟定义在全局相比&#xff0c;他只是受外部类类域限制和访问限定符限制&#xff0c;所以外部类定义的对象中不包含内部类。 2.内部类默认是外部类的友元类。…

合宙Air201资产定位模组LuatOS入门课程:FOTA远程升级,点点鼠标就搞定

你是否也经常吐槽&#xff1a;开发是个苦差事&#xff01;做项目一时爽&#xff0c;遇到升级火葬场。 如果你也有这种困惑&#xff0c;可以多了解了解合宙的开发工具&#xff0c;简单实用又高效&#xff0c;甚至只需点点鼠标&#xff01; 本期&#xff0c;我们来学习合宙Air2…

Android 系统下:普通应用无缝安装,Launcher 应用安装遭遇罕见障碍解析

目录 一、场景 1.1 错误分析 1.2 解决方法尝试 1.2.1 检查应用的安装位置 1.2.2 使用ADB安装 1.2.3 检查APK的签名 1.2.4 检查可用的内部存储空间 1.2.5 将应用程序安装到设备的内部存储空间 1.2.6 重置设备&#xff08;谨慎使用&#xff09; 1.2.7 获取Root权限&…

求树上任意两个点的距离lca

前言&#xff1a;一开始看到这个题目的时候&#xff0c;感觉就和lca有关&#xff0c;但是没有想到具体的公式 d d e p [ x ] d e p [ y ] − 2 ∗ d e p [ l c a ( x , y ) ] d dep[x] dep[y] - 2*dep[lca(x,y)] ddep[x]dep[y]−2∗dep[lca(x,y)] 并且我们这个题目还是一个…

Android AlertDialog圆角背景不生效的问题

一行解决: window?.setBackgroundDrawableResource(android.R.color.transparent) 原文件: /*** Created by Xinghai.Zhao* 自定义选择弹框*/ SuppressLint("InflateParams", "MissingInflatedId") class CustomDialog(context: Context?) : AlertDia…

【MQTT协议使用总结】基于-FreeRTOS平台-移植MQTT协议栈

文章目录 仓库地址关键接口适配FreeRTOS_readFreeRTOS_writeNetworkInit && NetworkConnect && NetworkDisconnect 总结 仓库地址 https://github.com/eclipse/paho.mqtt.embedded-c 这里官方给了一些平台适配案例&#xff0c;这里参考FreeRTOS的 关键接口适配…

C++学习笔记----7、使用类与对象获得高性能(二)---- 理解对象生命周期(1)

对象的生命周期包含三个活动&#xff1a;生成&#xff0c;解体&#xff0c;与赋值。理解如何以及什么时候生成、解体以及赋值对象&#xff0c;以及如何客户化其行为非常重要。 1、对象生成 对象在声明的时候生成&#xff08;如果是在栈上的话&#xff09;&#xff0c;或者显式…

打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵

附源码&#xff01;&#xff01;&#xff01; 感谢支持 小弟不断创作网站demo感兴趣的可以关注支持一下 对了 俺在结尾带上了自己用的 背景 大家可以尝试换一下效果更好哦~~~ 如何创建一个民国风格的炫酷网页 在这篇博客中&#xff0c;我们将展示如何制作一个结合民国风格和…

python植物大战僵尸项目源码【免费】

植物大战僵尸是一款经典的塔防游戏&#xff0c;玩家通过种植各种植物来抵御僵尸的进攻。 源码下载地址&#xff1a; 植物大战僵尸项目源码 提取码: 8muq

避免 PyCharm 将该 Python 脚本作为测试运行

为了避免 PyCharm 将该 Python 脚本作为测试运行&#xff08;即 pytest 自动捕获&#xff09;&#xff0c;你可以做以下几步来确保该脚本作为普通的 Python 程序执行&#xff0c;而不是作为 pytest 运行。 解决方案&#xff1a; 1. 确保文件名不以 test_ 开头&#xff1a; P…

electron有关mac构建

针对 Mac M1/2/3 芯片的设备&#xff0c;proces.archarm64. 执行下面命令&#xff0c;检查下按照的 node.js 版本是不是 intel x64 指令集&#xff0c;如果是的话安装下 arm64 指令集的 node.js终端中执行以下命令&#xff1a;node -p process.arch 对应的node版本也是arm版 …

区块链领航者孙宇晨:驾驭潮流,共绘未来新篇章

​区块链技术的迅速发展正在重塑全球经济格局&#xff0c;而孙宇晨&#xff0c;作为这一变革的先锋人物之一&#xff0c;以其卓越的远见和创新能力在行业内引领潮流&#xff0c;开创了区块链未来的新局面。 孙宇晨的名字与区块链技术密不可分。作为波场TRON的创始人&#xff0c…

9.11 QT ( Day 4)

一、作业 1.Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器类 #include <QTime> #include <QtTextToSpeech> //文本转语音类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcl…

游戏、网关等服务借助Docker容器化并使用Kubernetes部署、更新等

本文首发在这里 请先看完 实现负责消息转发、推送的网关服务负责网络、定时、坐下、站起、重连等&#xff0c;支持多类游戏的无锁房间 Docker容器化 Build and Push docker build -t panshiqu/game_server:latest -t panshiqu/game_server:1 -t panshiqu/game_server:1.0 -…

kubernetes架构

kubernetes cluster由master和node组成&#xff0c;节点上运行着若干kubernetes服务Master节点&#xff1a; master是kubernetes cluster的大脑&#xff0c;运行着的Daemon服务包括kube-apiserver&#xff0c;kube-scheduler,kube-controller-manager&#xff0c;etcd和Pod网络…

Docker基本概念详解及优势分析

Docker作为现代开发环境中不可或缺的工具&#xff0c;极大地简化了应用程序的开发、测试和部署流程。本篇文章将介绍Docker的基本概念&#xff0c;包括其架构、优势及常用命令&#xff0c;帮助您快速入门。 Docker是一个基于Go语言开发的开源应用容器引擎&#xff0c;遵循Apach…