HC-SR04 超声波测距模块

超声波测距原理及方法一

方法二:

在向Trig控制端发送触发信号后,通过定时器的输入捕获引脚抓取到Echo引脚上升沿,开启定时器计时直到Echo变为低电平,关闭定时器记录下计时时间,通过公式计算具体的距离。

程序:

定时器初始化:
tim.c

#include "tim.h"
#include "delay.h"
#include "Printf.h"/*2020.11.16*///通用定时器 5 初始化
void TIM5_Int_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM5_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 时钟//初始化 GPIOA.0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //PA0 设置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  //回波接收ECHO端口GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉//初始化 TIM5 参数TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位  TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx//初始化 TIM5 输入捕获通道 1TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1;           //选择输入端 IC1 映射到 TI1 上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;    //上升沿捕获TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;    //映射到 TI1 上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;    //配置输入分频,不分频TIM5_ICInitStructure.TIM_ICFilter = 0x00;    //IC1F=0000 配置输入滤波器 不滤波TIM_ICInit(TIM5, &TIM5_ICInitStructure);    //初始化 TIM5 输入捕获通道 1//初始化 NVIC 中断优先级分组NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM5 中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能NVIC_Init(&NVIC_InitStructure); //初始化 NVICTIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断捕获中断//TIM_SetCounter(TIM5,0);   //设置计数器初值TIM_Cmd(TIM5,ENABLE ); //使能定时器 5}u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM5CH1_CAPTURE_VAL; //输入捕获值//定时器 5 中断服务程序
void TIM5_IRQHandler(void)
{if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获{if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){if(TIM5CH1_CAPTURE_STA&0X40) //已经捕获到高电平了{if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了{TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获了一次TIM5CH1_CAPTURE_VAL=0XFFFF;}else TIM5CH1_CAPTURE_STA++;}}if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获 1 发生捕获事件{if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿{TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获}else //还未开始,第一次捕获上升沿{TIM5CH1_CAPTURE_STA=0; //清空TIM5CH1_CAPTURE_VAL=0;TIM_SetCounter(TIM5,0);TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获}}}TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位}

tim.h

#include "sys.h"//通用定时器 5 初始化
void TIM5_Int_Init(u16 arr,u16 psc);

超声波引脚配置
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//HC_SR04超声波初始化
void HC_SR04_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(HC_SR04_TRIG_CLK, ENABLE);  //使能PA端口时钟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);                     //根据设定参数初始化端口}//发送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);
}

hc-sr04.h

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

主函数;
main.c

#include "sys.h"
#include "delay.h"
#include "hc-sr04.h"
#include "usart.h"
#include "Printf.h"
#include "tim.h"extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态
extern u16 TIM5CH1_CAPTURE_VAL; //输入捕获值int main(void)
{ float Distance=0;RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //系统时钟设置PLL作为系统时钟delay_init();          //初始化延时函数uart_init(9600);HC_SR04_Init();TIM5_Int_Init(65535,71);printf("开始测量距离\r\n");/*在发送触发信号后,通过定时器的输入捕获引脚抓取Echo引脚上升沿,开启定时器计时直到Echo变为低电平,关闭定时器记录下计时时间*/while(1){HC_SR04_start();  //发送20us的脉冲触发信号if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平{Distance=TIM5CH1_CAPTURE_STA&0X3F;Distance*=65536;         //溢出时间总和Distance += TIM5CH1_CAPTURE_VAL;  //得到总的高电平时间   ECHO输出的高电平的时间就是超声波从发射到返回的时间Distance = Distance *170*0.0001;   printf("测的距离 = %0.4f cm \r\n",Distance);TIM5CH1_CAPTURE_STA=0;  //开启下一次捕获}  delay_ms(500);}}

STM32通过定时器捕获的方法驱动(HC-SR04)超声波测距模块相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. stm32蓝牙模块和超声波测距模块

    蓝牙 蓝牙概念 蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接. [1] 蓝牙使当前的一些便携移动设备和计算 ...

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

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

  10. hc sr04流程图_超声波测距模块工作原理_HC-SR04模块详解

    超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是目前来说测试距离比较远的一款了,另外还有比较 ...

最新文章

  1. JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)
  2. Android MVP模式的初识
  3. 北京大学计算机系 丁主任,丁骋、李时新参加第七届新闻史论青年论坛暨北京大学新闻学研究会年会...
  4. diskfileitemfactory 需要的包_《开心枕和生气包》中班下学期社会教案
  5. python 调用C语言DLL的方法
  6. gdb 命令_16. 如何使用 GDB 调试 Go 程序?
  7. oracle 并行之二: parallel dml
  8. 切!原来进入500强就那么简单啊——前IBM,HP,Dell员工揭开外企的招聘内幕
  9. 声纹技术(七):声纹技术的未来
  10. XSS插入绕过一些方式总结
  11. python语音识别分析_Python语音识别(计算器)
  12. 量子计算与量子信息之量子力学引论(一)
  13. Android 面试必备 - 系统、App、Activity 启动过程
  14. C - 有符号数和无符号数扩展
  15. Office课程习题
  16. hadoop ha搭建 namenode格式化失败等错误
  17. arduino声音传感器与二极管_如何将声音传感器与Arduino连接 并实现继电器控制项目...
  18. 基于osp平台和Echarts的折线图案例
  19. fiddler 抓ios app包
  20. 无线控制器与无线AP

热门文章

  1. html的form表单详解
  2. 测试一个链表是否为空表 C语言,【链表测试面试题】面试问题:C语言单链表的… - 看准网...
  3. 未解bug001:SSM整合的过程中单元测试用Junit5复合注解整合失败
  4. 50个提高会话技巧的方法 (转IT经理人)
  5. 《Storm实时数据处理》一导读
  6. Golang、python中的一个异或加密算法,用来加密字符串。
  7. (十六)企业部分之lvs
  8. Linq to sql 语法方法示例
  9. oracle rac 学习(转载)
  10. 调研时报表的相关信息