文章目录

  • 超声波测距原理
  • HC-SR04工作原理
  • STM32实现驱动
    • 1.引脚的配置
    • 2.时序控制
    • 3.时间差测量
    • 4.如何将距离测出来

超声波测距原理

利用HC-SR04超声波测距模块可以实现比较精确的直线测距,其测距原理图如下:

HC-SR04的一端发出超声波,接触到反射物后反射,被另一个端口接收到,所以只要知道发射和接收的时间差,就可以根据声波传播的速率算出HC-SR04和反射物直接的距离。
所以实现超声波测距就需要俩个条件:

  • 发射和接收的时间差
  • 超声波传输的速率

HC-SR04工作原理

HC-SR04模块的电气参数如示:

HC-SR04模块的实物图如示:

有四个引脚:

  • Vcc:+5V电源供电
  • Trig:输入触发信号(可以触发测距)
  • Echo:传出信号回响(可以传回时间差)
  • Gnd:接地

用Trig和Echo引脚实现测距的流程:
1.通过Trig输出一段至少10us的高电平(脉冲),触发一次测距,超声波在传输的过程中Echo一直输出高电平。
2.在Trig脉冲输出后,立即检测Echo引脚的电平,测出Echo高电平持续的时间t,t就是超声波在所测距离一个来回所需时间。
测距时序图如示:

STM32实现驱动

利用STM32驱动HC-SR04需要做好几个关键点:

  • 引脚的配置
  • 时序的控制
  • 时间差的测量

下面来分开实现几个关键点

1.引脚的配置

HC-SR04四个引脚,Vcc和Gnd直接接在开发板的电源上即可,主要是Trig和Echo引脚的配置,我选择了PB1连接Trig引脚、PB2连接Echo引脚。
因为要控制Trig输出电平,所以PB1引脚模式是推挽输出GPIO_Mode_Out_PP
Echo要检测高电平持续的时间,所以PB2引脚模式是浮空输入GPIO_Mode_IN_FLOATING
相关的配置代码如下:

void SR04_GPIO_Init( void )
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd( Trig_Clock  |Echo_Clock , ENABLE );GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = Trig_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(Trig_PORT, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStruct.GPIO_Pin = Echo_PIN;GPIO_Init(Echo_PORT, &GPIO_InitStruct);
}

2.时序控制

HC-SR04的时序是:先来一段10us的Trig高电平,接着接收一段Echo的高电平,伪代码如下:

#define Trig_H  GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define Trig_L  GPIO_ResetBits(GPIOB, GPIO_Pin_1)/* Trig给一个至少10us的高电平,超声波进行一次测距 */Trig_H;Delay_us( 10 );Trig_L;
/* 等待Echo高电平 */

3.时间差测量

这个是最重要的一步,要测量Echo高电平持续的时间,因为光传播的速率是340m/s,而测距的范围大多是cm级别,所以相应Echo高电平持续的时间也就是us级别的。
所以,测量时间差的条件就比较苛刻,我是利用SysTick(系统计数器)的原理实现计时的。SysTick计数器原理是对通过SysTick_Config()函数配置每俩次中断之间的节拍数,也就是俩次中断之间的机器周期,我大概算出了,测出0.1cm距离的Echo高电平时间约为6um,而系统时钟的频率是72MHz,所以配置每俩次中断之间的节拍为432的时候,进入一次中断就代表0.1cm的距离,所以只需要记录进入中断的次数就可以算出距离。通过一个全局变量在中断函数中自增来记录中断次数。SysTick_Config函数源代码如下:

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ /* 判断ticks 是否超出装填值和重装值的最大值 */if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* 配置 装载寄存器 */   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;     /* 配置 内核中断的优先级,也是在NVIC中 */NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 加载计数器的值 *//* SysTick->VAL是当前数值寄存器的值 */SysTick->VAL   = 0;      /* CTRL是SysTick控制及状态寄存器:CLKSOURCE:位段2 时钟源选择,0=APB/8;1=APB  APB即72MHzTICKINT:   位段1 当置为1时,计数器递减到0时会产生中断请求;当置为0时无动作ENABLE:   位段0 使能位,可以启动SysTick定时器*/SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk   | SysTick_CTRL_ENABLE_Msk;                  return (0);
}

SysTick的具体原理可以参考一下我之前的博客:SysTick原理

注意:SysTick_Config()函数执行完就开启了中断,所以必须在Echo为低电平后及时关闭中断,并且将记录中断的变量清零。
中断函数如示:

/* 用extern和volatile关键字修饰的 全局变量n */
extern volatile uint32_t n;void SysTick_Handler(void)
{n++;
}

关闭中断及清零n的代码如下:

/* 本来的使能位取反 */
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

SysTick->CTRL寄存器的0位控制着中断的使能,具体情况在之前SysTick的博客中已做详细说明。

4.如何将距离测出来

我在main函数中实现了距离的测量,并且通过串口打印函数将距离传到上位机,具体代码如示:

int main(void)
{int i=1,q;float p;/* HC-SR04模块引脚初始化 */SR04_GPIO_Init();/* 串口相关配置 */GQ_UART_Config();/* 打印调试信息 */printf("慢漫的测距实验\n ");while( 1 ){/* 每0.5s测一次距离 */Delay_ms( 500 );/* Trig给一个至少10us的高电平,超声波进行一次测距 */Trig_H;Delay_us( 10 );Trig_L;/* 等待Echo高电平 */while( Echo_Value != 1 );/* 打开中断,对Echo高电平时间计时 *//* 配置计数器的装载值是72*6=432,即一次中断6um,正好是超声波的0.1cm,所以中断次数n对应着n*0.1cm *//* SysTick_Config()中已经使能计数器了,所以无需再开启  */SysTick_Config( 432 );/* 等待直到Echo为低电平 */while(Echo_Value == 1);/* 关闭中断,通过参数n来取得距离参数 *//* 本来的使能位取反 */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* p、q分别是距离的整数部分和小数部分 */p=n/10;q=n%10;/* 打印距离信息 *//* p-50时经过调试的,因为测量的距离和诸多因素有关,这个操作减小了误差 */printf("第%d次测量为:%.0f.%dcm\n",i,p-50,q);i++;/* 清零中断记录变量n */n=0;}}

STM32—驱动HC-SR04超声波测距模块相关推荐

  1. 【STM32】详解超声波测距模块工作原理

    一.产品介绍 超声波测距模块可提供2cm-400cm的非接触距离感测功能,测距精度3mm,模块包括超声波发射器,接收器与控制电路. 二.基本工作原理 (1)采用IO口trig出发测距,给Echo最少1 ...

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

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

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

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

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

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

  5. STM32用超声波测距模块实现测距

    STM32用超声波测距模块实现测距 通过超声波测距模块可以实现超声波反射型距离测试.市面上的超声波测距模块主要有两种.一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块 ...

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

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

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

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

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

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

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

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

最新文章

  1. KVM为虚拟机添加设备总结
  2. FFmpeg-20160422-snapshot-bin
  3. 数据结构——第一章线性表:01线性表的逻辑结构
  4. mysql库操作、表操作
  5. 5、位运算符(7个):实例
  6. 中小企业上ERP项目不可回避的9个基本问题
  7. Java接口自动化之TestNG单元测试框架(一)
  8. 深入解析oracle电子版,深入解析Oracle数据库
  9. 下一时代的HTML5和JavaScript
  10. 集成电路那些事儿:CMOS模拟集成电路版图基础
  11. Socket教程(完全版)
  12. Three.js实现太阳系八大行星的自转公转
  13. 2.某公司要开发新游戏,请用面向对象的思想,设计游戏中的蛇怪和蜈蚣精设定⦁蛇怪类:属性包括:怪物名字,生命值,攻击力方法包括:攻击,移动(曲线移动),补血(当生命值<10时,可以补加20生命值
  14. 几种kafka多线程消费方式
  15. 地球引擎初级教程——JavaScript 简介(一文读懂如何使用GEE)
  16. 旷野徒奔-Java底层篇(1.4)
  17. TypeScript语法错误:Argument of type ‘string‘ is not assignable to parameter of type ‘Element‘. 解决方法
  18. java 字符串 数字个数_Java简单统计字符串中汉字,英文字母及数字数量的方法...
  19. SCI论文类型及写作结构分析
  20. 认证3A信用等级对企业有什么作用

热门文章

  1. QT显示中文 连接上文
  2. Java图片分割与合并
  3. 调制与解调(一)——模拟调制系统调制解调方法
  4. matlab 1.封装LPF 巴特沃斯低通滤波器
  5. Linux查看显卡设备信息
  6. 【热门主题: 高清雪景桌面壁纸】
  7. PTA 习题5-2 使用函数求奇数和 (15分)
  8. 快速排序和归并排序中一趟的理解(递归和非递归)
  9. CV实战项目--人脸考勤
  10. 卡兹莫机器人报价_第三次超级机器人大战Z:时狱篇 部分隐藏机体获得条件