超声波模块

news2024/9/20 1:02:10

HCSR04超声波模块是一种常用的测距模块,它通过检测超声波发射后遇到障碍物所反射的回波,从而测量出与障碍物之间的距离。以下是对HCSR04超声波模块的详细讲解:

一、模块组成与工作原理

  • 组成:HCSR04超声波模块主要由两个压电陶瓷超声传感器和一个外围信号处理电路构成。其中一个传感器用于发出超声波信号,另一个用于接收反射回来的超声波信号。
  • 工作原理:模块通过IO口触发测距,发送一个40kHz的脉冲信号。该信号通过空气传播,遇到障碍物后被反射回来,并由接收传感器捕获。通过计算超声波发出后到达障碍物再反射回传感器的时间差,并结合已知的超声波传播速度(通常为340m/s,但易受温度、湿度、压强等因素影响),就可以得出障碍物与传感器的距离。

二、技术参数

  • 测距范围2cm到400cm
  • 测距精度:通常可达到3mm,但高精度的模块可达到0.3cm左右
  • 工作电压:DC 5V
  • 工作电流:15mA
  • 感应角度:不大于15度
  • 工作频率:发送信号为40kHz

三、引脚与连接

HCSR04模块通常具有四个引脚,分别是VCC(电源正极)、GND(电源负极)、Trig(发射信号)和Echo(接收信号)。这些引脚需要与单片机或开发板正确连接,以实现测距功能。

  • VCC:连接5V电源正极
  • GND:连接电源负极
  • Trig:触发信号引脚,通过向该引脚发送至少10μs的高电平脉冲信号,触发超声波的发射
  • Echo:接收信号引脚,当超声波遇到障碍物并反射回来后,该引脚会输出一个高电平脉冲,其宽度与物体距离成正比

四、应用场景

由于其成本低、精度高、使用简便等特点,HCSR04超声波模块被广泛应用于各种场景,如:

  • 避障机器人:用于检测障碍物与机器人的距离,实现避障控制
  • 智能家居:用于人体检测和距离测量,如检测人的接近并触发开门动作或用于室内的距离测量和触发自动照明等
  • 液位检测:通过测量液面与传感器之间的距离来确定液位
  • 公共安防:如停车场检测、入侵者检测等

五、注意事项

  • 在进行测距时,应注意避免障碍物与传感器之间的夹角过大,以免影响测距精度。
  • 由于声速受温度、湿度、压强等因素影响,因此在测量长距离或需要高精度时,应考虑这些因素对测距结果的影响,并进行相应的修正。
  • 为防止发射信号对回响信号的影响,建议测量周期大于60ms。

超声波HC_SR04的配置

配置思路

1.配置GPIO引脚结构体(Trig,Echo)。
2.配置定时器结构体
3.配置定时器中断结构体
4.开启时钟(定时器,GPIO)
5.Trig引|脚输出高电平(10us以上),然后关闭
6.等待Echo引脚输入高电平开始,”
定时器打开--->开启计数器计数
7.等待Echo引|脚输入高电平结束,定时器关闭--->停止计数器计数
8.通过计数器的值计算得出超声波测量距离


距离公式:

高电平持续时间 *声速(340/秒)/2        

主函数:

#include "stm32f10x.h"
#include "pwm.h"
#include "systick.h"
#include "led.h"
#include "HC_SR04.h"
#include "usart.h"

/*
// 被注释掉的延时函数
void delay(uint16_t time)
{
    uint16_t i = 0;
    while (time--)
    {
        i = 12000;
        while (i--);
    }
}
*/

int main()
{
    // 存储测量得到的距离
    float length = 0;
    // 配置 HCSR04 超声波模块
    HC_SR04Config();
    // 初始化串口
    usart_init();
    while (1)
    {
        // 获取距离值
        length = Getlength();
        // 通过串口打印距离值,保留三位小数
        printf("%.3f\r\n", length);
        // 延时 50 毫秒
        ms_delay(50);
    }
}

包含被调函数的.h文件


#include "stm32f10x.h"
void HC_SR04Config(void);
void Open_tim4(void);
void Close_tim4(void);
int GetEcho_time(void);
float Getlength(void);
void TIM4_IRQHandler(void);

#define ECHO_Reci GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)
#define TRIG_Send(a) if (a) \
                            GPIO_SetBits(GPIOB, GPIO_Pin_11); \
                     else \
                            GPIO_ResetBits(GPIOB, GPIO_Pin_11);

被调函数:

#include "HC_SR04.h"
#include "stm32f10x.h"
#include "systick.h"

// 这里 extern 声明外部变量不能同时初始化
extern uint16_t mscount;

// 函数功能:配置 HCSR04 超声波模块相关的 GPIO 和定时器,并设置中断优先级
void HC_SR04Config(void)
{
    // 定义 GPIO 初始化结构体变量 GPIO_hcsr04init
    GPIO_InitTypeDef GPIO_hcsr04init;
    // 定义定时器初始化结构体变量 TIM_hcsr04init
    TIM_TimeBaseInitTypeDef TIM_hcsr04init;
    // 定义中断初始化结构体变量 NVIC_hcsr04init
    NVIC_InitTypeDef NVIC_hcsr04init;

    // 使能 GPIOB 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    // 使能 TIM4 时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    // 设置中断优先级分组为组 1
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    // 以下是对 Trig(触发引脚,PB11)的配置
    // 设置 GPIO 模式为推挽输出
    GPIO_hcsr04init.GPIO_Mode = GPIO_Mode_Out_PP;
    // 设置 GPIO 引脚为 PB11
    GPIO_hcsr04init.GPIO_Pin = GPIO_Pin_11;
    // 设置 GPIO 速度为 50MHz
    GPIO_hcsr04init.GPIO_Speed = GPIO_Speed_50MHz;
    // 初始化 GPIOB
    GPIO_Init(GPIOB, &GPIO_hcsr04init);

    // 以下是对 Echo(回波引脚,PB10)的配置
    // 设置 GPIO 模式为浮空输入
    GPIO_hcsr04init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    // 设置 GPIO 引脚为 PB10
    GPIO_hcsr04init.GPIO_Pin = GPIO_Pin_10;
    // 初始化 GPIOB
    GPIO_Init(GPIOB, &GPIO_hcsr04init);

    // 以下是对定时器 TIM4 的配置
    // 设置定时器时钟分频为不分频
    TIM_hcsr04init.TIM_ClockDivision = TIM_CKD_DIV1;
    // 设置定时器计数模式为向上计数
    TIM_hcsr04init.TIM_CounterMode = TIM_CounterMode_Up;
    // 设置定时器周期为 999(1000 - 1)
    TIM_hcsr04init.TIM_Period = 1000 - 1;
    // 设置定时器预分频系数为 71(72 - 1)
    TIM_hcsr04init.TIM_Prescaler = 72 - 1;

    // 初始化 TIM4
    TIM_TimeBaseInit(TIM4, &TIM_hcsr04init);
    // 使能 TIM4 更新中断
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
    // 禁用 TIM4
    TIM_Cmd(TIM4, DISABLE);

    // 以下是对 TIM4 中断的配置
    // 设置中断通道为 TIM4 中断
    NVIC_hcsr04init.NVIC_IRQChannel = TIM4_IRQn;
    // 设置抢占优先级为 0
    NVIC_hcsr04init.NVIC_IRQChannelPreemptionPriority = 0;
    // 设置子优先级为 0
    NVIC_hcsr04init.NVIC_IRQChannelSubPriority = 0;
    // 使能该中断通道
    NVIC_hcsr04init.NVIC_IRQChannelCmd = ENABLE;
    // 初始化中断
    NVIC_Init(&NVIC_hcsr04init);
}

// 函数功能:打开定时器 4
void Open_tim4(void)
{
    // 设置 TIM4 计数器为 0
    TIM_SetCounter(TIM4, 0);
    // 重置 mscount
    mscount = 0;
    // 使能 TIM4
    TIM_Cmd(TIM4, ENABLE);
}

// 函数功能:关闭定时器 4
void Close_tim4(void)
{
    // 禁用 TIM4
    TIM_Cmd(TIM4, DISABLE);
}

// TIM4 中断服务函数
void TIM4_IRQHandler(void)
{
    // 判断 TIM4 更新中断标志是否置位
    if (TIM_GetITStatus(TIM4, TIM_IT_Update)!= RESET)
    {
        // 清除 TIM4 更新中断标志
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
        // mscount 自增
        mscount++;
    }
}

// 函数功能:获取定时器计数值
int GetEcho_time(void)
{
    uint32_t t = 0;
    // mscount 乘以 1000
    t = mscount * 1000;
    // 加上 TIM4 当前计数器值
    t += TIM_GetCounter(TIM4);
    // 设置 TIM4 计数器为 0,这里应该使用 TIM_SetCounter(TIM4, 0);
    TIM4->CNT = 0;
    // 延时 50 毫秒
    ms_delay(50);
    return t;
}

// 函数功能:获取超声波测量的距离
float Getlength(void)
{
    int i = 0;
    uint32_t t = 0;
    float length = 0;
    float sum = 0;
    while (i!= 5)
    {
        // 设置 Trig 引脚为高电平
        TRIG_Send(1);
        // 延时 20 微秒
        us_delay(20);
        // 设置 Trig 引脚为低电平
        TRIG_Send(0);
        // 等待 Echo 引脚为低电平
        while (ECHO_Reci == 0);
        // 打开定时器 4
        Open_tim4();
        i++;
        // 等待 Echo 引脚为高电平
        while (ECHO_Reci == 1);
        // 关闭定时器 4
        Close_tim4();
        // 获取定时器计数值
        t = GetEcho_time();
        // 计算距离,58.0 的值可能是根据声速和定时器计数频率计算得出
        length = ((float)t / 58.0);
        // 累加距离值
        sum = sum + length;
    }
    // 计算平均距离
    length = sum / 5.0;
    return length;
}

板子接线示意图:

串口发送超声波数据(测距)

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

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

相关文章

【我的Android进阶之旅】快来给你的Kotlin代码添加Markdown格式的注释吧!

文章目录 一、 传统 HTML 格式注释二、 Markdown 格式注释三.、Markdown格式注释详解3.1. 基础语法3.1.1 单行注释3.1.1 多行注释3.2 标题3.3 列表3.4 加粗和斜体3.5 代码块3.6 链接3.7 引用3.8 表格3.9. 图片3.10. 示例代码3.11. 注释模板的使用场景3.12 实例示例四、总结在 A…

2024年9月深圳200万~300万的三房笔记

​整理了2024年9月深圳200万~300万的三房笔记,数据可能有​出入。有些商品房数据是我看到工抵房的数据,群里说工抵房的房价数据需要乘以1.2就比较接近当前现场的价格​。对于我个人来说关注地铁,即是否方便打工还有价格​。看着一些商品房的工…

【华三】不懂链路聚合?看这篇就够了!华三配置详解

【华三】不懂链路聚合?看这篇就够了!华三配置详解 背景链路聚合基本概念聚合组和聚合接口的类型二层聚合组/二层聚合接口三层聚合组/三层聚合接口聚合接口特性 聚合接口参考端口成员端口 操作Key成员端口的配置分类协议类配置-第一类配置属性配置-第二类…

Day 1 : 数据结构

引入 以张三为例:CEF不能同时举办。 数据的逻辑结构 数据结构是什么 研究计算机数据之间的关系 逻辑结构和存储结构及其操作 基本概念 数据 数据元素 逻辑结构 按前趋和后继数将逻辑结构分为:线性结构和非线性结构。 即:找前…

云首席产品规划专家的必修课

大家好,我是卢旗。 今天和大家探讨一下云计算规划专家的必备研究内容。 一、市场与客户需求分析: 1,市场调研:深入了解当前及未来云计算市场的趋势、竞争格局、客户需求变化等,识别出潜在的市场机会和威胁。 结合20…

C++ string类—容量、元素获取

一、Capacity size:string类对象中字符的个数为size;length:size作用一样,返回string对象中有效数据个数;capacity:一个string对象的容量capacity决定了这个对象能存储多少字符(不包括\0)&…

活动系统开发之采用设计模式与非设计模式的区别-需求整理

用户需求(活动系统): 1、活动类型:答题、图片展示、签到、抽奖、组团等活动 2、活动介绍: a、答题活动: 第一种是签到后,随机抽取10道题,答对8到就可以抽奖; 第二种是随机抽取一道题&#xff0…

Python优化算法24——基于觅食生境选择的粒子群算法(FHSPSO)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考:Python优化算…

c/c++基础及类和对象汇总

目录 c基础 extern关键字及c中(隐式类型转换时)的引用 c中的引用(&)及&做返回值问题 c语言中的宏函数及c的内联函数及auto及NULL 计算类的大小及深入理解this指针(深入浅出) c中的const权限及s…

C语言典型例题58

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.10 求100~200中的全部素数。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题4.10 求100~200中的全部素数。#include <stdio.h> #include <math.h>int m…

python学习11-Pytorch环境安装与模型搭建

先查看下自己的电脑是否是英伟达显卡 如果不是就需要租用平台了,如 AutoDL算力云 https://www.autodl.com/home CUDA 当涉及到深度学习和 Python 时&#xff0c;CUDA 是一个非常重要的概念&#xff0c;它是 NVIDIA 开发的并行计算平台和应用程序编程接口&#xff08;API&am…

【WiFi主要技术学习2】

WiFi协议学习2 WiFi SPEC理解频段信道带宽协商速率安全与加密WiFi主要技术理解BP直接序列扩频(Direct Sequence Spread Spectrum,DSSS)BPSKQPSK正交幅度调制(Quadrature Amplitude Modulation,QAM)互补码键控(Complementary Code Keying,CCK)正交频分复用(Orthogonal…

如何选择合适的JDK:功能、性能与适用场景的全面解析

如何选择合适的JDK&#xff1a;功能、性能与适用场景的全面解析 前言 在 Java 开发领域&#xff0c;开发者有众多的 JDK 选择&#xff0c;如 OpenJDK、GraalVM、Oracle JDK、Dragonwell、Kona、Bisheng、Corretto、Zulu、Liberica、SapMachine、Semeru、Temurin、Mandrel等。 …

YOLOv8改进 | Conv篇 | YOLOv8引入SAConv模块

1. SAConv介绍 1.1 摘要: 许多现代物体检测器通过使用三思而后行的机制表现出出色的性能。 在本文中,我们在目标检测的主干设计中探索了这种机制。 在宏观层面,我们提出了递归特征金字塔,它将特征金字塔网络的额外反馈连接合并到自下而上的骨干层中。 在微观层面,我们提出…

24数学建模国赛助攻中!!!(11——时间序列模型)

需要资料和助攻的建模宝子们可以加企鹅呢&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;具体方式在文章末尾 点击链接加入群聊获取完整版资料和助攻https://qm.qq.com/q/NGl6WD0Bky

基于微信小程序的挂号管理系统-web管理端

流量和预约挂号数可视化功能 系统具备人流量和预约挂号数的可视化功能&#xff0c;能够实时展示各项数据&#xff0c;通过图表等形式直观呈现。这有助于医疗机构快速了解服务状况&#xff0c;优化资源配置&#xff0c;提升运营效率&#xff0c;为患者提供更为便捷的挂号服务。 …

每天五分钟计算机视觉:Siamese深度神经网络模型和FaceNet的关系

本文重点 在前面的课程中,我们学习了Siamese深度神经网络模型和FaceNet,二者都可以完成人脸识别任务,本文进行整理学习,理清二者的区别和联系。 基本概念与原理 Siamese深度神经网络模型 Siamese网络,又称孪生网络,由两个结构相同且权重共享的神经网络组成。这两个网络分…

[引人深思]博彩用户真的赢了吗?——多维度揭示赌博危害

1.项目背景 博彩业&#xff0c;作为全球经济中一个庞大而复杂的行业&#xff0c;吸引了无数用户参与其中&#xff0c;然而&#xff0c;在巨大的利益诱惑背后&#xff0c;博彩业对个人和社会造成的潜在危害却不容忽视&#xff0c;尽管博彩活动常被包装为“娱乐”或“休闲活动”…

10款文档管理系统,助力降本增效

比较好用的 10 款文档管理系统推荐&#xff1a;PingCode、Worktile、语雀、联想Filez企业网盘、360亿方云、DocuPhase 、M-Files 、LogicalDOC、Revver、Box。 在现代企业环境中&#xff0c;管理大量文档和数据往往让人头疼。不仅需要维护信息的更新和可访问性&#xff0c;还要…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(六)- 参考标准

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…