HC-SR04 超声波测距模块

一、基本工作原理

1.主控板先向Trig控制端输入至少10us的高电平触发信号,
2.该模块内部将发送出8个40KHz的方波并检测回波信号,
3.一旦检测到有回波信号则Echo接收端输出高电平回响信号,高电平的持续时间就是超声波从发射到返回的时间。(回响信号的脉冲宽度与所测的距离成正比)
4.公式:距离=高电平时间*声速(340M/S)/2

二、HC-SR04图片

三、驱动原理及程序

方法一:

在向Trig控制端发送触发信号后,等待Echo引脚响应后(上升沿或者下降沿)触发外部中断,开启定时器计时直到Echo引脚变为低电平,关闭定时器记录下计时时间,在通过公式进行计算出具体距离。

程序

超声波引脚配置
hc-sr04.c

#include "hc-sr04.h"
#include "tim.h"
#include "delay.h"
#include "Printf.h"/*2020.11.16
* HC-SR04超声波测距模块
* 基本工作原理:* 给TRIG引脚至少10us的高电平信号触发测距* 模块自动发送8个40KHz的方波,自动检测是否有信号返回* 有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间* 测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2
*/#define HC_SR04_TRIG_CLK   RCC_APB2Periph_GPIOA   //脉冲触发TRIG端口
#define HC_SR04_TRIG_PORT  GPIOA
#define HC_SR04_TRIG_PIN   GPIO_Pin_4#define HC_SR04_ECHO_CLK   RCC_APB2Periph_GPIOA   //回波接收ECHO端口
#define HC_SR04_ECHO_PORT  GPIOA
#define HC_SR04_ECHO_PIN   GPIO_Pin_5float Distance;   //测的距离值//HC_SR04超声波初始化
void HC_SR04_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(HC_SR04_TRIG_CLK, ENABLE);  //使能PA端口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟GPIO_InitStructure.GPIO_Pin = HC_SR04_TRIG_PIN;               // 脉冲触发端口(Trig)配置PA4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(HC_SR04_TRIG_PORT, &GPIO_InitStructure);                     //根据设定参数初始化端口GPIO_InitStructure.GPIO_Pin = HC_SR04_ECHO_PIN;               // 回波接收端口(Echo)配置PA5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(HC_SR04_ECHO_PORT, &GPIO_InitStructure);                     //根据设定参数初始化端口//接收端口 中断线以及中断初始化配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource5);EXTI_InitStructure.EXTI_Line=EXTI_Line5;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);     //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;            //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                 //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道NVIC_Init(&NVIC_InitStructure);TIM3_Int_Init(49999,7199);   //初始化TIM3定时器,计数一次为1/10000S(0.1ms)}//发送20us的脉冲触发信号
void HC_SR04_start(void)
{GPIO_SetBits(HC_SR04_TRIG_PORT,HC_SR04_TRIG_PIN);    //TRIG置高delay_us(20);GPIO_ResetBits(HC_SR04_TRIG_PORT,HC_SR04_TRIG_PIN);  //TRIG置低delay_ms(10);
}void EXTI9_5_IRQHandler(void)
{           delay_us(10);if(EXTI_GetITStatus(EXTI_Line5) != RESET)    //检测外部中断触发5请求是否发生{//while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) == RESET);TIM_SetCounter(TIM3,0);  //计数清零TIM_Cmd(TIM3,ENABLE);  //使能TIM3定时器while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5));  //等待电平变为低电平TIM_Cmd(TIM3,DISABLE); //关闭定时器//获取TIM3计数器的值Distance = TIM_GetCounter(TIM3)* 340/200.0;  //计算距离:cnt * 1/10000 * 340 / 2(单位:m)//printf("Counter:%d\n",TIM_GetCounter(TIM3));printf("测的距离: %f cm \r\n",Distance);EXTI_ClearITPendingBit(EXTI_Line5);     //清除 EXTI 线路挂起位}
}

hc-sr04.h

#include "sys.h"//HC_SR04超声波初始化
void HC_SR04_Init(void);
//发送20us的脉冲触发信号
void HC_SR04_start(void);float Senor_Using(void);

main.c

#include "sys.h"
#include "delay.h"
#include "hc-sr04.h"
#include "usart.h"
#include "Printf.h"
#include "tim.h"int main(void)
{ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //系统时钟设置PLL作为系统时钟delay_init();          //初始化延时函数uart_init(115200);printf("开始测量距离\r\n");/*Echo引脚需要接收并记录高电平的持续时间。在发送触发信号后,Echo响应后(上升沿)触发外部中断,开启定时器计时直到Echo变为低电平,关闭定时器记录下计时时间*/HC_SR04_Init();      //HC_SR04超声波初始化配置HC_SR04_start();    //发送20us的脉冲触发信号//while(1);}

串口通信程序自己添加一下吧,我这就不添加了

STM32——库函数版——超声波测距模块相关推荐

  1. STM32—驱动HC-SR04超声波测距模块

    文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...

  2. STM32智能小车------超声波测距模块

    文章目录 一.原理讲解 1.实物图 2.工作原理: 3.接线: 二.软件驱动代码 1.接口定义 2.驱动函数 总结 最终效果 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的普通大学生. 进 ...

  3. 我的stm32学习——HC-SR04超声波测距模块

    一.前言 从大一开始一直有着写点东西的想法,如今即将迈入大三,却迟迟没有动笔.没有太多的借口,就是懒,"间歇性的踌躇满志,持续性的混吃等死"说的就是我本人啦.前不久刷微信看到同学在 ...

  4. 【STM32】 STM32驱动URM04超声波测距模块

    URM04简介: URM04采用了RS485串行通信总线的架构,支持多传感器的并行工作,有着两个RS-485接口,最多支持32个超声波的并联, 内置温度传感器辅助校正距离值,同时支持温度的测量 应用场 ...

  5. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  6. stm32控制超声波测距模块HC-SR04

    引脚:PB15 TRIG,PB0 ECHO: 不同距离,LED对应不良.闪烁.亮状态,并通过串口发送到PC; TIM3定时中断,测出脉宽长度,没有像野火一样使用捕捉功能: 1.HS-SR04模块实物图 ...

  7. HC-SR04超声波测距模块使用方法和例程(STM32)

    基于STM32和HC-SR04模块实现超声波测距功能 最近在学STM32做个简单的应用实践一下,顺便水一篇文章. 本文用的单片机是STM32F103C8T6,超声波测距模块是HC-SR04,显示测距结 ...

  8. 学习并使用HC-SR04超声波测距模块+STM32

    ** 超声波测距原理 ** 参考博客: https://blog.csdn.net/qq_40734815/article/details/105992801 https://blog.csdn.ne ...

  9. STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块

    STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...

  10. STM32——超声波测距模块(HAL库CubeMx)

    超声波测距 1. 超声波测距模块原理 2. CubeMx配置 3. 代码的编写 3.1 定时器计时的计算 3.2 接口函数 1. 超声波测距模块原理 (2021/11/28 16:25编辑) 超声波测 ...

最新文章

  1. 3D MinkowskiEngine稀疏模式重建
  2. 国民认证科技有限公司助力构建我国可信网络空间
  3. chart.Correlation绘制相关性热图
  4. cytoscape绘图互作网络图(二)
  5. 编程面试的10大算法概念汇总
  6. 汇编语言整数加减法示例
  7. 预告:大牛现身说法 TensorFlow在工程项目中的应用 | AI 研习社
  8. linux云服务终端提示符显示-bash-4.2#解决方法
  9. 奥鹏教育计算机试题,最新奥鹏教育《计算机基础》模拟试卷附答案(11页)-原创力文档...
  10. java c++ python哪个好_程序员学java好还是python语言好 c++又如何
  11. com.sun.jersey.api.client.UniformInterfaceException:returned a response status of 403
  12. Linux 基本命令(十)--grep 常用命令
  13. 使用apktool.jar工具反编译和回编译Android APK 终端命令模式
  14. 学习FFmpeg API – 解码视频
  15. Windows 实用小工具
  16. 浏览器是如何工作的:Chrome V8让你更懂JavaScript
  17. 三阶矩阵的lu分解详细步骤_lu分解(笔算矩阵lu分解步骤)
  18. python实现遗传算法
  19. 数独游戏(回溯算法)
  20. 在vscode编辑器中,vetur和volar冲突

热门文章

  1. 华为主题锁屏壁纸换不掉_华为手机中的这些默认设置一定要改,不然会导致手机卡顿加快耗电...
  2. python热成像_matplotlib实现热成像图colorbar和极坐标图的方法
  3. python中换行的转义字符_Python语言中表示换行的转义字符是____________。(2.5分)_学小易找答案...
  4. linux 创建软连接_linux删除原理
  5. 【转】Element-UI中上传的action地址相对问题
  6. C# MysqlHelper 执行reader时,遇到致命错误或者超时
  7. 【leetcode】1041. Robot Bounded In Circle
  8. ceph luminous 版本 osd掉线处置
  9. intra调用order
  10. spring mvc静态资源放行