STM32 | HC-SR04 超声波传感器测距

模块:HC-SR04

感应角度:不大于15度 

探测距离:2cm-450cm      

高精度:可达0.3cm

Trig:触发信号,接收MCU发送的控制脉冲,MCU对应GPIO 设置为输出

Echo:反馈信号,向MCU发送数据脉冲, MCU对应GPIO 设置为输入

VCC:3.3V~5V

超声波测距原理:

  1. 超声波发射装置向某一方向发出超声波,并开始计时
  2. 超声波在空气中传播,途中碰到障碍物就立即返回来
  3. 接收器接收到超声波的时间差,就停止计时
  4. 根据超声波在空气中传播速度(340m/s),再根据计时器记录的时间t,可以算出距离(s)

似乎有多种模式,本文只使用GPIO模式:

单片机操作步骤:

(1)采用IO口TRIG触发测距,给最少10us的高电平信号。

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回, 超声波模块通过ECHO引脚输出一个高电平(ECHO输出的高电平持续时间,就是处理的结果), 高电平持续的时间就是超声波从发射到返回的时间。

代码

UltraSonic_Init()

  1. 配置 GPIOG 的 14 脚为 Trig 输出,15 脚为 Echo 输入
  2. 配置 TIM4 定时器为 1MHz 计数频率 (1us / 计数)
  3. 设置最大测量时间为 50ms (50000 计数)
void UltraSonic_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;TIM_TimeBaseInitTypeDef  	TIM_TimeBaseInitStruct;// UlatrSonic-->PG14,PG15RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);	 //使能PG端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;               // TrigGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHzGPIO_Init(GPIOG, &GPIO_InitStructure);					 //根据设定参数初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;	    		 // EchoGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;            //设置成上拉输入GPIO_Init(GPIOG, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz// 设置一个定时器,1us计数1个数,不用中断,且开始时不使能定时器//1、能定时器时钟。RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);TIM_TimeBaseInitStruct.TIM_Prescaler	= 84-1;	            //84MHZ/8400 = 10000HZ  Prescaler范围1~65536 TIM_TimeBaseInitStruct.TIM_Period		= 50000-1;		    //在10000HZ时钟频率下,用时1ms 自动重装载寄存器值TIM_TimeBaseInitStruct.TIM_CounterMode	= TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;  	 //分频因子//2、初始化定时器TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);//【不使能定时器】TIM_Cmd(TIM4, DISABLE);
}

UltraSonic_GetDistance()

  1. 发送 15us 的高电平触发信号,然后拉低引脚
  2. 等待模块返回的 Echo 信号(高电平)
  3. 高电平来了,开始定时器计时,目的是测量 Echo 高电平持续时间
  4. 低电平来了,停止定时器计时,得到 Echo 高电平持续时间
  5. 根据超声波在空气中的传播速度 (340m/s) 计算距离
float UltraSonic_GetDistance()
{float distance_cm = 0;u32 time_us = 0;//**************************************//启动超声波模块 也就是要发送启动信号GPIO_ResetBits(GPIOG, GPIO_Pin_14);delay_us(5);//高电平需要10us以上---【启动信号】GPIO_SetBits(GPIOG, GPIO_Pin_14);delay_us(15);GPIO_ResetBits(GPIOG, GPIO_Pin_14);//*********************************//设置定时器的CNT值为0,设置初值TIM_SetCounter(TIM4,0);//等待ECHO的高电平到来while(GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_15)==Bit_RESET);//**************************//【高电平来了】-------启动定时器TIM_Cmd(TIM4,ENABLE);//等待ECHO的低电平到来while(GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_15)==Bit_SET);//****************************//【低电平来了】------读时间数据,关定时器//取出CNT的值-----定时器的当前值time_us = TIM_GetCounter(TIM4);    // 微秒 (μs)。//关闭定时器TIM_Cmd(TIM4, DISABLE);//**************************************//【通过公式】: // distance (m) * 2 = time * 10(-6) * 340m/s// distance (m)     = time * 10(-6) * 340m/s / 2// distance (cm)    = time * 10(-6) * 340m/s / 2 * 100 = time * 10(-3) * 17distance_cm = time_us * 0.017;   // distance = time / 58;return distance_cm;
}

调用程序:

void ULTRA_SONIC_task(void *pvParameters)
{float distance_cm = 0;while(1){printf("ULTRA_SONIC_task \r\n");distance_cm = UltraSonic_GetDistance();printf("distance = %f  (cm) \r\n",distance_cm);delay_ms(3000);}
}

输出结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89269.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89269.shtml

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

相关文章

【RTSP从零实践】12、TCP传输H264格式RTP包(RTP_over_TCP)的RTSP服务器(附带源码)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

【unitrix】 6.1 类型化整数特征(t_int.rs)

一、源码 这段代码定义了一个 Rust 特征(trait)TInt 和一些实现,用于表示类型化的整数。 use crate::number::{Null, B, Bit, TNumber};/// 类型化整数标记特征 /// /// 要求: /// - 实现 TNumber /// - 可复制 (Copy) /// - 默认…

速通LVS

一、LVS的使用lvs部署命令介绍lvs软件相关信息:程序包:ipvsadm Unit File: ipvsadm.service 主程序:/usr/sbin/ipvsadm 规则保存工具:/usr/sbin/ipvsadm-save 规则重载工具:/usr/sbin/ipvsadm-restore 配置文件&#x…

Nginx,MD5和Knife4j

一、 Nginx: 项目网关与流量调度核心原理反向代理 (Reverse Proxy):在Web架构中,Nginx作为系统的统一入口(API网关),接收所有外部客户端请求。它通过解析请求的URL路径(location指令),判断请求的…

多态,内部类(匿名内部类),常用API(1)

多态 什么是多态? 同一个对象在不同时刻表现出来的不同形态(多种形态) 例:Cat extends Animal 第一种形态:Cat c1 new Cat(); //c1是只猫 第二种形态:Animal c2 new Cat(); //c2是个动物 &#xff08…

Qt小组件 - 7 SQL Thread Qt访问数据库ORM

简介网上关于Qt访问数据库的资料大多使用QSqlDatabase模块。虽然这在C中尚可接受,但在Python中使用就显得过于繁琐了——不仅要手动编写SQL语句,还与Python追求简洁的理念背道而驰。在这里写一个基于sqlalchemy的示例,也可以使用其他的ORM库 …

使用Gin框架构建高并发教练预约微服务:架构设计与实战解析

项目概述 技术栈 Web框架:Gin(高性能HTTP框架)数据存储:Redis(内存数据库,用于高并发读写) 项目结构 coach-booking-service ├── main.go # 程序入口,路由初始化&am…

深入拆解Spring第二大核心思想:AOP

什么是AOP Aspect Oriented Programming(面向切面编程) 什么是面向切面编程呢? 切⾯就是指某⼀类特定问题, 所以AOP也可以理解为面向特定方法编程. 什么是面向特定方法编程呢? 比如对于"登录校验", 就是⼀类特定问题. 登录校验拦截器, 就是…

linux服务器stress-ng的使用

安装方法 • Ubuntu/Debian:sudo apt update && sudo apt install stress-ng -y• CentOS/RHEL(需EPEL源):sudo yum install epel-release -ysudo yum install stress-ng -y• 源码编译(适合定制化需求&#x…

探索阿里云DMS:解锁高效数据管理新姿势

一、阿里云 DMS 是什么 阿里云 DMS,全称为 Data Management Service,即数据管理服务 ,是一种集数据管理、结构管理、安全管理于一体的全面数据库服务平台。它能够有效地支持各类数据库产品,包括但不限于 MySQL、SQL Server、Post…

python爬取新浪财经网站上行业板块股票信息的代码

在这个多行业持续高速发展的时代,科技正在改变着我们的生活。 在世界科技领域中,中国正占据越来越重要的位置。当下,每个行业都提到了区块链、人工智能、大数据、5G等科技力量,强调了科技在行业咨询与数据分析领域的重要意义。 随…

【JAVA】监听windows中鼠标侧面键的按钮按下事件

监听windows中鼠标侧面键的按钮按下事件用到的包核心类使用这个类用到的包 jna-5.11.0.jar jna-platform-5.11.0.jar核心类 package sample.tt.mouse;import com.sun.jna.Pointer; import com.sun.jna.platform.win32.*; import com.sun.jna.platform.win32.WinDef.HMODULE; …

Redis突发写入阻断?解析“MISCONF Redis is configured to save RDB…“故障处理

当你的Redis服务器突然拒绝写入并抛出 MISCONF Redis is configured to save RDB snapshots... 错误时,别慌!这是Redis的数据安全保护机制在发挥作用。本文带你深度解析故障根因,并提供完整的解决方案。🔥 故障现象还原 客户端&am…

产品更新丨谷云科技 iPaaS 集成平台 V7.6 版本发布

六月,谷云科技iPaaS集成平台更新了V7.6版本。这次更新中我们着重对API网关、API编排、组织管理权限、API监控等功能进行了增强以及优化,一起来看看有什么新变化吧! 网关、监控、编排、组织权限全方位升级 1.API网关 错误码预警,可…

图像处理中的模板匹配:原理与实现

目录 一、什么是模板匹配? 二、模板匹配的匹配方法 1. 平方差匹配(cv2.TM_SQDIFF) 2. 归一化平方差匹配(cv2.TM_SQDIFF_NORMED) 3. 相关匹配(cv2.TM_CCORR) 4. 归一化相关匹配&#xff08…

高性能架构模式——高性能NoSQL

目录 一、关系数据库的缺点二、常见的 NoSQL 方案分 类2.1、K-V 存储2.2、文档数据库2.3、列式数据库2.4、全文搜索引擎三、高性能 NoSQL 方案的典型特征和应用场景3.1、K-V 存储典型特征和应用场景3.2、文档数据库典型特征和应用场景3.1.1、文档数据库的 no-schema 特性的优势…

正确选择光伏方案设计软件:人力成本优化的关键一步

在竞争激烈的市场环境中,企业无不追求效率提升与成本控制。设计环节作为产品开发的核心流程,其效率高低直接影响整体项目进度与资源消耗。错误的设计软件选择如同在信息高速公路上设置路障——它不会阻止前行,却会让每一次沟通、每一次修改都…

Git问题排查与故障解决详解

前言 在使用Git进行版本控制的过程中,开发者常常会遇到各种各样的问题和错误。本文将详细介绍常见的Git问题及其解决方法,帮助开发者快速定位和解决问题,避免在开发过程中浪费时间。 1. 基础错误与解决 1.1 身份配置问题 问题&#xff1a…

使用Xinference部署语音模型实现文本转语音:完整指南

文章目录引言环境准备1. 安装Xinference2. 启动Xinference服务3. 部署语音模型Python实现文本转语音关键参数说明应用场景性能优化建议常见问题解决结语引言 文本转语音(Text-to-Speech, TTS)技术在智能助手、有声读物、语音导航等应用中扮演着重要角色…

【C#】实体类定义的是long和值识别到的是Int64,实体类反射容易出现Object does not match target type

🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…