STM32单片机连接HC_SR04超声波模块测距

发布者:小牛队最新更新时间:2019-08-19 来源: eefocus关键字:STM32  单片机  HC_SR04  超声波模块 手机看文章 扫描二维码
随时随地手机看文章

首先,先来看一下这个模块的基本功能和原理。


HC-SR04超声波测距模块可提供约2cm400厘米的非接触式距离感测功能,测距精度可达高到3毫米;模块包括超声波发射器,接收器与控制电路像智能小车的测距以及转向,或是一些项目中,常常会用到。智能小车测距可以及时发现前方的障碍物,使智能小车可以及时转向,避开障碍物。


注意是5v输入,但是我用stm32的3.3v输入也是没有问题的。

二,工作原理

      1.给超声波模块接入电源和地
      。2.给脉冲触发引脚(trig)输入一个长为20us的高电平方波

      3.输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1;(
      当此时应该启动定时器计时)4.当超声波返回被模块接收到时,回波引脚端的电平会由1变为0;(此时应该停止定时器计数),定时器记下的这个时间即为超声波由发射到返回的总时长
      5 。根据声音在空气中的速度为344米/秒,即可计算出所测的距离。

      要学习和应用传感器,学会看懂传感器的时序图是很关键的,所以我们来看一下HC-SR04的时序触发图。

    

 

    我们来分析一下这个时序图,先由触发信号启动HC-RS04测距模块,也就是说,主机要先发送至少为10us的高电平,触发HC-RS04,模块内部发出信号是传感器自动回应的,我们不用去管它。输出回响信号是我们需要关注的。信号输出的高电平就是超声波发出到重新返回接收所用的时间。用定时器,可以把这段时间记录下来,算出距离,别忘了结果要除于2,因为总时间是发送和接收的时间总和。

下面是亲测可用的驱动程序。

芯片型号为STM32F103ZET6,超声波测距后通过串口打印到电脑上面。

驱动和测距;

  1. //超声波测距  

  2.   

  3. #include“hcsr04.h”  

  4.    

  5. #define HCSR04_PORT GPIOB  

  6. #define HCSR04_CLK RCC_APB2Periph_GPIOB  

  7. #define HCSR04_TRIG GPIO_Pin_5  

  8. #define HCSR04_ECHO GPIO_Pin_6  

  9.   

  10. #define TRIG_Send PBout(5)   

  11. #define ECHO_Reci PBin(6)  

  12.   

  13. u16 msHcCount = 0; //毫秒计数  

  14.   

  15. void  Hcsr04Init()  

  16. {    

  17.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;     //生成用于定时器设置的结构体  

  18.     GPIO_InitTypeDef GPIO_InitStructure;  

  19.     RCC_APB2PeriphClockCmd(HCSR04_CLK,ENABLE);  

  20.        

  21.         // IO初始化  

  22.     GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG;       //发送电平引脚  

  23.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  24.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出  

  25.     GPIO_Init(HCSR04_PORT,&GPIO_InitStructure);  

  26.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);  

  27.        

  28.     GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;     //返回电平引脚  

  29.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入  

  30.     GPIO_Init(HCSR04_PORT,&GPIO_InitStructure);    

  31.         GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);      

  32.        

  33.             //定时器初始化使用基本定时器TIM6  

  34.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);   //使能对应RCC时钟  

  35.         //配置定时器基础结构体  

  36.         TIM_DeInit(TIM2);  

  37.         TIM_TimeBaseStructure.TIM_Period =(1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的计数到1000为1ms  

  38.         TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值1M的计数频率1US计数  

  39.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频  

  40.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // TIM向上计数模式  

  41.         TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMX的时间基数单位         

  42.           

  43.         TIM_ClearFlag(TIM6,TIM_FLAG_Update);   //清除更新中断,免得一打开中断立即产生中断  

  44.         TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);    //打开定时器更新中断  

  45.         hcsr04_NVIC();  

  46.     TIM_Cmd(TIM6,DISABLE);       

  47. }  

  48.   

  49.   

  50. //提示:静态函数的作用域仅限于定义它的源文件内,所以不需要在头文件里声明  

  51. static void  OpenTimerForHc()         //打开定时器   

  52. {  

  53.         TIM_SetCounter(TIM6,0); //清除计数  

  54.         msHcCount = 0;  

  55.         TIM_Cmd(TIM6,ENABLE);  //使能TIMX外设  

  56. }  

  57.    

  58. static void  CloseTimerForHc()         //关闭定时器   

  59. {  

  60.         TIM_Cmd(TIM6,DISABLE);  //使能TIMX外设  

  61. }  

  62.    

  63.    

  64.  // NVIC配置  

  65. void  hcsr04_NVIC()  

  66. {  

  67.             NVIC_InitTypeDef NVIC_InitStructure;  

  68.             NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  

  69.       

  70.             NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;             //选择串口1个中断  

  71.             NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占式中断优先级设置为1  

  72.             NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //响应式中断优先级设置为1  

  73.             NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能中断  

  74.             NVIC_Init(&NVIC_InitStructure);  

  75. }  

  76.   

  77.   

  78. //定时器6中断服务程序  

  79. void  TIM6_IRQHandler(void )    // TIM3中断  

  80. {  

  81.         如果 (TIM_GetITStatus(TIM6,TIM_IT_Update)!= RESET)   //检查TIM3更新中断发生与否  

  82.         {  

  83.                 TIM_ClearITPendingBit(TIM6,TIM_IT_Update);  //清除TIMX更新中断标志   

  84.                 msHcCount ++;  

  85.         }  

  86. }  

  87.    

  88.   

  89. //获取定时器时间  

  90. u32 GetEchoTimer(void )  

  91. {  

  92.         u32 t = 0;  

  93.         t = msHcCount * 1000; //得到MS  

  94.         t + = TIM_GetCounter(TIM6); //得到美国  

  95.           TIM6-> CNT = 0;  //将TIM2计数寄存器的计数值清零  

  96.                 Delay_Ms(50);  

  97.         返回 t;  

  98. }  

  99.    

  100.   

  101. //一次获取超声波测距数据两次测距之间需要相隔一段时间,隔断回响信号  

  102. //为了消除余震的影响,取五次数据的平均值进行加权滤波。  

  103. float  Hcsr04GetLength(void  )  

  104. {  

  105.         u32 t = 0;  

  106.         int  i = 0;  

  107.         float  lengthTemp = 0;  

  108.         float  sum = 0;  

  109.         而(i!= 5)  

  110.         {  

  111.         TRIG_Send = 1;      //发送口高电平输出  

  112.         Delay_Us(20);  

  113.         TRIG_Send = 0;  

  114.         while (ECHO_Reci == 0);      //等待接收口高电平输出  

  115.             OpenTimerForHc();        //打开定时器  

  116.             i = i + 1;  

  117.             while (ECHO_Reci == 1);  

  118.             CloseTimerForHc();        //关闭定时器  

  119.             t = GetEchoTimer();        //获取时间,分辨率为1US  

  120.             lengthTemp =((float )t / 58.0); //厘米  

  121.             sum = lengthTemp + sum;  

  122.           

  123.     }  

  124.         lengthTemp = sum / 5.0;  

[1] [2]
关键字:STM32  单片机  HC_SR04  超声波模块 引用地址:STM32单片机连接HC_SR04超声波模块测距

上一篇:基于STM32的超声波传感器测距(含代码)
下一篇:stm32驱动超声波模块

推荐阅读最新更新时间:2024-11-10 07:30

51单片机IO口模拟串口通讯2-计数法
硬件环境:STC89C52 软件环境:IDE Keil uVision V4.10 编译器 C51 V9.0 代码如下: /********************************************** 方法2:计数法 硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1 波特率:9600 描述:所谓计数法是指根据模拟出的波特率,每1位持续的时间的长短是通过定时器计数 溢出来置标志位,查询该标志位来实现的。 测试1:上电发送1个0x02的字符 测试2:上电先发送1个0x02的字符,然后等待接收,将收到的字符再发送出去(分别一个一个发送0x01,0x02,0x03,0x0
[单片机]
STM32系列之LCD驱动接口与驱动程序介绍
STM32F103系列是没有内置LCD控制器接口的,如果要驱动LCD,需要一颗LCD图形驱动IC。STM32和LCD驱动IC的接口在STM32端是FSMC,FSMC接口提供各种存储器驱动信号也提供了驱动LCD驱动IC的各种信号。 一、FSMC简介 FSMC概览 如下图可以看到FSMC支持的存储器类型及提供的各种读写控制信号。 图1 2.FSMC 框图 图2 3.FSMC 内存地址空间分配 图3 二、LCD 接口 1.8080和6800接口 这两种接口类型是典型的LCD并行接口。接口信号分为:数据信号和控制信号。 数据信号支持8,9,16,18,24位等。 控制信号用来区分读、写及区分是向LCD寻址命令寄存器还是写L
[单片机]
<font color='red'>STM32</font>系列之LCD驱动接口与驱动程序介绍
关于STM32函数定义
1.*(__IO uint8_t *) CIR_BYTE3_ADDRESS #define __IO volatile /*! Defines 'read / write' permissions 声明 volatile ,目的:使编译器不优化该变量。从相应变量内存中取数。 /* Check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); //assert _param函数作参数检查用 2. static: static局部变量中文名叫静态局部变量。它与普通的局部变量比起来有如下几个区别: 1)位
[单片机]
基于ARM内核单片机的四旋翼直升机飞行控制系统设计
四旋翼飞行器(Ouadrotor,Four-rotor,4 rotors helicopter,X4-flver等)是一种特殊构型的电动可遥控微型飞行器,它是由4个螺旋桨驱动,通过4个螺旋桨的差速来完成姿态控制。四旋翼飞行器与其他类型的无人机相比具有许多优点,其中主要是其可垂直起降及机动性强等性能,能够适应各种复杂环境。因此四旋翼飞行器在民用产品、军事武器等各方面有着广泛的应用前景。文中将介绍四旋翼飞行器控制系统的软硬件设计方案与实现。 1 飞行控制系统总体设计 四旋翼飞行器控制系统的设计主要包括主飞行控制板和相关外围电路,结合惯性传感器、超声波传感器、GPS接收机、无线数传模块,并配套自行开发的地面站软件设计实现一套完整
[单片机]
基于ARM内核<font color='red'>单片机</font>的四旋翼直升机飞行控制系统设计
在学习STM32时为什么要学习汇编?
不同的平台的汇编代码是不一样的,最早的汇编在50年代就发明了,比很多人的父母的年龄都大,老掉牙,不用学习怎么写汇编。一个公司有一个人知道怎么写汇编就够了。但要学习读汇编,为什么学习汇编? 1、性能 直接翻译为机器语言,性能最高。优秀的C语言效率只能达到汇编的80%左右。其他高级语言跟汇编一比差得更远。语言越高级性能越差。很多bootloader和BIOS用汇编写,汇编操作的是电脑,手机刚刚上电时,硬件和初始化的那些命令,它们的性能的要求比较高,效率高开机速度更快。 分析问题 个人认为,编程人与机器对话,我们写C,写JAVA,但是电脑并不认识这些语言,电脑只认识0和1;所以需要一个人来翻译这些语言,这个翻译官就是编译器,但是编译器不
[单片机]
在学习<font color='red'>STM32</font>时为什么要学习汇编?
STM32中学到的工程建立方法
这阵子通过STM32的学习,学到的不仅仅是硬件的知识,关于工程的结构也学到了一些实用的东西。以前学习51的时候就是一个文件写到底,把所有的函数写到一个c文件中,所有的变量也定义在一个c文件中。 但是这阵子接触到了模块化的思想,每一个外设,对应着一个单独的驱动程序,包括一个c文件还有一个h文件。在建立工程之后,先建立组,包括USER,可以把主文件放在这个组里面;SYSTEM组,可以吧系统的一些通用型文件放在这个组里面;HARDWEAR组,可以把外设放在这个组里面。还可以建立一个组放说明性的文件。这样使得整个工程的结构十分的清晰,在调试程序的时候十分方便,在以后自己重新看这个工程的时候也可以很快的理清整个工程个脉络。 在
[单片机]
51单片机系列连载8—独立键盘与矩阵键盘
在前面我们讲的都是向单片机中向外输出数据,今天我们开始介绍一下如何向单片机里面输入数据,也就是键盘。 键盘有两种,独立式键盘与行列式矩阵键盘。 独立式键盘是指直接用一根I/O口线构成的单个按键电路,每个I/O口的按键不会影响另外一个,具体电路图如下: 接下来看一个程序,这个程序主要是按键二极管亮,同时按一下数码管显示一下,往下加,加到9,具体程序如下: #include #define uint unsigned int; #define uchar unsigned char; sbit d1=P1^2; sbit duan=P
[单片机]
STM32HAL库ADC实验(一)——阻塞查询法
实验现象 生成代码: int main(void) { /* USER CODE BEGIN 1 */ uint16_t adcData; float voltage; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BE
[单片机]
STM32HAL库ADC实验(一)——阻塞查询法
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved