基于stm32f10x的超声波模块HC-SR04的测距示例

发布者:翅膀小鹰最新更新时间:2019-08-20 来源: eefocus关键字:stm32f10x  超声波模块  HC-SR04  测距 手机看文章 扫描二维码
随时随地手机看文章

一.所需材料:


1任何一种型号的stm32f10x的微控制器


2.HC-SR04模块


3.安装串口驱动与串口助手(这里用的火哥的串口调试助手)


4.ST-link或者串口等下载方式都可以


二。超声波原理


网上一大堆,这里我就大体说一下:单片机先给TRIG一个大于10us的高电平,然后模块ECHO引脚会发出一个高电平,检测高电平的时间乘声速便可算出距离。这里ECHO发出也接收,所以检测的时间,假设按秒算,然后乘170便是以m为单位的距离。


三.源代码分析


1.接口定义:


//由于只是用的定时器的基本计时功能,所以IO口随便找两个便可以

#define HCSR04_PORT              GPIOB

#define HCSR04_PORTC_CLK_FUN     RCC_APB2PeriphClockCmd

#define HCSR04_CLK               RCC_APB2Periph_GPIOB

#define HCSR04_TRIG              GPIO_Pin_11

#define HCSR04_ECHO              GPIO_Pin_10


2.驱动函数分析


//超声波计数,记录有几个更新中断,由于在.c文件中定义,中断函数中测试其值,故加个extern

extern u16 msHcCount = 0; 


//IO口初始化 TRIG为普通推挽输出,ECHO为浮空输入,

//配置时基结构体

void Hcsr04Init(void)

{  

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   

    GPIO_InitTypeDef GPIO_InitStructure;

    HCSR04_PORTC_CLK_FUN(HCSR04_CLK, ENABLE);

   

    GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);

    GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

     

    GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  

    GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);    

     

          

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   

     

    TIM_DeInit(TIM2);

    TIM_TimeBaseStructure.TIM_Period = (1000-1);         //定时器时钟1MHZ,自动重装载寄存器的值为1000, 也就是说满一次为1MS

    TIM_TimeBaseStructure.TIM_Prescaler =(72-1); 

    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);          

        

    TIM_ClearFlag(TIM4, TIM_FLAG_Update);  

    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);    

    hcsr04_NVIC();

    TIM_Cmd(TIM4,DISABLE);     

}


//中断配置,这里只用了一个中断,不用考虑中断嵌套等等,所以中断优先级以及次优先级可以随便配置,只用到了定时器update中断


void hcsr04_NVIC(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;             

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       

NVIC_Init(&NVIC_InitStructure);

}


//关闭定时器4

static void CloseTimerForHc(void)    

{

   TIM_Cmd(TIM4, DISABLE); 


//打开定时器4

static void OpenTimerForHc(void)  

{

   TIM_SetCounter(TIM4,0);

   msHcCount = 0;

   TIM_Cmd(TIM4, ENABLE); 

}

//获取定时器4计数器值,此值为更新中断的次数*1000+计数器的值

u32 GetEchoTimer(void)

{

   u32 t = 0;

   t = msHcCount*1000;

   t += TIM_GetCounter(TIM4);

   TIM4->CNT = 0;  

   Systick_DelayMs(50);

   return t;

}


//通过定时器4计数器值推算距离,单位厘米,假设测试值为x,距离y=x/1M*17000


//这里每测出5此求个平均值输出

float Hcsr04GetLength(void )

{

   u32 t = 0;

   int i = 0;

   float lengthTemp = 0;

   float sum = 0;

   while(i!=5)

   {

      GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);

      Systick_DelayUs(20);

      GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

      while(GPIO_ReadInputDataBit(HCSR04_PORT,HCSR04_ECHO)==RESET);

      OpenTimerForHc();

      i = i + 1;

      while(GPIO_ReadInputDataBit(HCSR04_PORT,HCSR04_ECHO)==SET);

      CloseTimerForHc();

      t = GetEchoTimer();

      lengthTemp = ((float)t*0.017);//cm

     

      sum = lengthTemp + sum ;

        

    }

    lengthTemp = sum/5.0;

    return lengthTemp;

}


 


3.主函数测试程序:


float length;

  //延时函数初始化

  Systick_DelayMs(10); //这里用的系统滴答定时器延时  

  hcsr04_NVIC(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

  

  USART_Config();//串口服务程序,这里我用的火哥的串口一

   Hcsr04Init();  


  while(1) 

  {  

     length = Hcsr04GetLength();

     printf("距离为:%.3fcmn",length);

     Systick_DelayMs(1000);

  }


 


四.效果图


关键字:stm32f10x  超声波模块  HC-SR04  测距 引用地址:基于stm32f10x的超声波模块HC-SR04的测距示例

上一篇:基于STM32F103C8T6的超声波测距示例
下一篇:记STM32之PWM学习笔记 ---PWM原理

推荐阅读最新更新时间:2024-11-03 19:13

基于keil5新建STM32F10x寄存器版本工程
一、前言 前面文章分享了很多关于STM32F103系列知识点、物联网相关的小项目,工程都采用的是寄存器方式编写;很多小伙伴接触STM32开始都采用库函数编程,不清楚如何使用寄存器方式开发STM32;这篇文章就讲一下如何新建寄存器风格的STM32工程,并介绍需要用到哪些官方系统文件等。 比较具有代表性的几篇物联网教程: 1. 智慧农业项目(基于腾讯物联网服务器) 2. 遥控小车项目 3. 智能门锁项目(基于腾讯物联网服务器) 4. 物联网项目(基于阿里云物联网服务器) 5. 智能家居项目(基于中国移动OneNet物联网服务器) 二、环境介绍 开发环境: keil5.25 编程语言: C语言 操作系
[单片机]
基于keil5新建<font color='red'>STM32F10x</font>寄存器版本工程
倒车多媒体可视测距终端的设计与实现
摘 要: 本文描述了一种新型汽车倒车雷达产品(倒车多媒体可视测距终端)硬/软件的开发和设计。首先介绍了它与现行产品相比的优势及工作原理,它以通用车载电视为显示平台,结合红外倒车测距模块,字符叠加模块,主控制模块进行硬件设计和软件开发。 关键词:超声波测距;后视摄像系统;字符叠加信号处理 引言 目前,倒车已出现两种新技术: 超声波测距和后视摄像。 倒车雷达和后视摄像各有利弊,前者具有确切判断距离的优点,但对车后方的水沟、山崖、凸出的钢筋、竹杆等,超声波无法感应,这也是倒车安全上的死角;后者图像直观真实,但无法获得精确的距离。如何把两者的优点结合起来,消除两者的缺点是倒车多媒体可视测距终端解决的重点难题。 倒车多媒
[应用]
STM32F10x利用定时器测量脉冲宽度
  硬件:STM32F103C8T6   平台: ARM-MDk V5.11   前面一篇文章讲过如何利用定时器测量信号的频率(见 利用定时器测量频率),使用的是定时器的捕获/比较单元(Capture/compare),它也可以测量输入信号的脉冲宽度。   利用定时器测量脉冲宽度有两种方法。   方法1:   在捕获中断函数里改变捕获信号的触发沿(上升沿触发改为下降沿触发,或者下降沿触发改为上升沿触发),通过两次触发得到的计数器的差值,来计算出脉冲宽度。这种   方法需要定时器的配置和 利用定时器测量频率方法是一样的,不同的地方在中断函数里修改触发沿,以TIM2, 捕获通道2为例: if(
[单片机]
蔚来将和恩智浦合作部署4D成像雷达 最远探测距离可达300米
荷兰计算机芯片制造商恩智浦半导体近日宣布,中国电动汽车制造商蔚来将采用其 4D 成像雷达解决方案,这是一种远超传统雷达的技术,能够在高速公路和复杂的城市场景中,探测距离达 300 米的各种物体,为用户带来更高的道路安全和驾驶舒适度。 4D 成像雷达是一种延伸的毫米波技术,提供了精确测量高度的能力,可以有效补充视觉传感器的优势,提高关键场景下对静止和隐藏目标的识别能力。其不仅能够测量物体的距离和速度,还能够测量物体的方向、到达角度和高度。这些细分点云能够增强环境映射和场景理解,实现超越人眼视野的物体检测和分类,同时能够在几乎所有的天气和光照条件下测量物体的速度。 恩智浦表示,4D 成像雷达解决方案将使当今车辆的前置雷达性能得到
[汽车电子]
低成本微型测距雷达设计
0 引言 随着电子技术的飞速发展,雷达技术也得到了长足的进步。雷达是以军事目的发展起来的,在当今主基调为和平与发展的年代,雷达技术越来越多地向民用方面转移。像我国普遍用于交通方面的测速雷达,正在飞速发展的汽车防撞雷达等。随着成本的不断降低,雷达在民用方面的用途会越来越广泛。 雷达进行测距,与激光测距相比,不受气候条件限制,距离远,精度高。本文将主要叙述微型测距雷达的原理及组成。 微型测距雷达主要用于以下几个方面: (1)导弹和炮弹的微波引信; (2)汽车前视防撞雷达; (3)堆积物和小山头的高度测量; (4)高速公路及城市道路的机动车流量测量; (5)建筑行业的楼层测量; (6)罐装液面高度测量
[测试测量]
低成本微型<font color='red'>测距</font>雷达设计
基于P89LPC932超声波测距
0 引言 一些传统的距离测量方式在某些特殊场合存在不可克服的缺陷。例如,液面测量就是一种距离测量,传统的电极法是采用差位分布电极,通过给电或脉冲来检测液面,电极长时间浸泡于水中或其他液体中,极易被腐蚀、电解,失去灵敏性。利用超声波测量距离可以解决这些问题,因此超声波测量距离技术在工业控制、勘探测量、机器人定位和安全防范等领域得到了广泛应用。所谓超声波是指频率高于20 kHz的机械波,具有强度大、方向性好等特点。其一般由压电效应或磁致伸缩效应产生。 本文设计的超声波测距仪用三种测距模式选择跳线J1(短距、中距、可调距)。其整体方案为当按下测量键,探头就发送超声波,当超声波遇到障碍物时将产生回波信号;系统将探头接收到的回波信号放
[测试测量]
基于P89LPC932<font color='red'>超声波</font><font color='red'>测距</font>仪
基于单片机的超声波测距系统的研究与设计
电子科技 南京工程学院通信工程学院 沙爱军   在日常生产生活中,很多场合如汽车倒车、机器人避障、工业测井、水库液位测量等需要自动进行非接触测距。超声波是指频率大于20 kHz的在弹性介质中产生的机械震荡波,其具有指向性强、能量消耗缓慢、传播距离相对较远等特点,因此常被用于非接触测距。由于超声波对光线、色彩和电磁场不敏感,因此超声波测距对环境有较好的适应能力,此外超声波测量在实时、精度、价格也能得到很好的折衷。   为此,文中尝试以单片机AT89S52为核心,利用一对40 kHz压电超声传感器设计一款体积较小、价格低廉、精度较高、具有温度补偿、实时LCD显示和报警的超声波测距仪。   1 超声波测距原理   超声波传感器
[单片机]
基于单片机的<font color='red'>超声波</font><font color='red'>测距</font>系统的研究与设计
STM32F10X SPI操作flash MX25L64读写数据
  简单的一种应用,ARM芯片作为master,flash为slaver,实现单对单通信。ARM主控芯片STM32F103,flash芯片为MACRONIX INTERNATIONAL的MX25L6465E,64Mbit。   SPI应该是嵌入式外围中最简单的一种应用了吧!一般SPI应用有两种方法:软件仿真,手动模拟产生时序和应用主控芯片的SPI控制器。   一般采用第二种方法比较好,比较稳定。应用主控芯片的SPI控制器,要点:正确的初始化SPI、操作SPI各寄存器和正确理解flash的时序。下面是过程,采用的是STM32F10X自带的库函数 1、初始化:void SpiFlashInitialzation(void);   
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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