STM32F103VET6超声波模块HC-SR04 的测试例程

发布者:shtlsw最新更新时间:2017-10-02 来源: eefocus关键字:STM32F103VET6  超声波模块  HC-SR04 手机看文章 扫描二维码
随时随地手机看文章

近来有时间,整理一下资料,自己近十年来,业余画了不少的开发测试板,在淘宝上也买了不少的板子与器件,一直以来,都喜欢DIY,今天整理了一下超声波模块HC-SR04的程序,网上资料应该不少,自己工作中也接触过。记录一下。


超声波如何设计的我不太关心,我只关心如何使用。这个模块可以+3.3V供电,四个引脚,使用STM32两个GPIO引脚控制即可,测试起来,简单。


超声波模块工作的原理:首先需要触发trig,就像是打开或是使能的作用,让超声波工作起来。然后,超声波通过echo返回一段高电平,高电平的时间,就是声音到达障碍物返回的时间,声速是固定的340m/S,因此,可以求得距离。这里是2倍距离的时间,因此计算公式为:2L = Vt = 340m/S * t,这里t单位为S(秒)。


STM32如何操作超声波模块呢?

(1)一个GPIO引脚Trig,用于触发。

(2)一个GPIO引脚接Echo,设置为外部中断,用来接收触发后返回来的高电平。

(3)一个定时器(计数器),用来测时间。

(4)可以使用另一个定时器,如Systick,隔一段时间用来触发一次超声波模块,从而不断获取当前的距离值。

(5)一个串口,用来打印输出测量的距离。


驱动代码如下:


  1. /********************     (C) COPYRIGHT 2017      ************************** 

  2.  * 文件名  :Sonic.c 

  3.  * 描述    :超声波模块 测试例程        

  4.  * 实验平台:STM32F103VET6 

  5.  * 库版本  :ST3.5.0 

  6.  * 

  7.  * 编写日期:2017-04-10 

  8.  * 修改日期:2017-04-14 

  9.  * 作者    : 

  10. ****************************************************************************/  

  11. #include "Sonic.h"  

  12.   

  13.   

  14. /******************************************************************************* 

  15. *   Sonic  Init 

  16. *******************************************************************************/  

  17.   

  18. u32  Distance = 0;  

  19. u8   Done;  

  20. u32 __IO time_1ms = 0;  

  21.   

  22. void TIM6_Init(void)  

  23. {  

  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  

  25.   //NVIC_InitTypeDef           NVIC_InitStructure;  

  26.   /* TIM6 clock enable */  

  27.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);  

  28.   /* Time base configuration */  

  29.   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;   

  30.     TIM_TimeBaseStructure.TIM_Prescaler = 142;          //144分频,500K的计数器  

  31.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  

  32.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

  33.   

  34.   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);  

  35.   TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);     

  36.     TIM_Cmd(TIM6, DISABLE);  

  37. }  

  38.   

  39. void Sonic_Init(void)  

  40. {  

  41.     NVIC_InitTypeDef NVIC_InitStructure;  

  42.     EXTI_InitTypeDef EXTI_InitStructure;  

  43.     GPIO_InitTypeDef GPIO_InitStructure;  

  44.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC| RCC_APB2Periph_AFIO,ENABLE);  

  45.       

  46.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         

  47.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  48.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                       //PC4 Trig  

  49.     GPIO_Init(GPIOC,&GPIO_InitStructure);  

  50.       

  51.     GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;  

  52.     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;                 //PC5 Echo  

  53.     GPIO_Init(GPIOC,&GPIO_InitStructure);     

  54.       

  55.     GPIO_WriteBit(GPIOC,GPIO_Pin_4,(BitAction)0);           //trig  

  56.       

  57.     //EXTI_DeInit();  

  58.     EXTI_ClearITPendingBit(EXTI_Line5);  

  59.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);  

  60.     EXTI_InitStructure.EXTI_Line= EXTI_Line5;   

  61.     EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;   

  62.     EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Rising_Falling;  

  63.     EXTI_InitStructure.EXTI_LineCmd=ENABLE;  

  64.   EXTI_Init(&EXTI_InitStructure);  

  65.       

  66.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  

  67.     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;  

  68.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;  

  69.     NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0;          

  70.     NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;     

  71.     NVIC_Init(&NVIC_InitStructure);  

  72.       

  73.     Distance = 0;  

  74.     Done = 1;  

  75. }  

  76.   

  77. void Sonic_Trig(void)  

  78. {  

  79.     u16 i = 0;  

  80.     if((Done == 1)&&(time_1ms > 100))  

  81.     {  

  82.         time_1ms = 0;  

  83.         GPIO_WriteBit(GPIOC,GPIO_Pin_4,(BitAction)1);  

  84.         for(i=0;i<0xf0;i++);  

  85.         GPIO_WriteBit(GPIOC,GPIO_Pin_4,(BitAction)0);   

  86.         Done = 0;  

  87.     }  

  88. }  

  89.   

  90. void EXTI9_5_IRQHandler(void)  

  91. {  

  92.     static u8 flag_Sta = 0;  

  93.     if(EXTI_GetITStatus(EXTI_Line5) != RESET)         

  94.     {  

  95.         EXTI_ClearITPendingBit(EXTI_Line5);    

  96.         if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==1)  

  97.         {  

  98.              TIM_SetCounter(TIM6,0);      

  99.              flag_Sta=1;  

  100.              TIM_Cmd(TIM6, ENABLE);       

  101.         }  

  102.         else  

  103.         {  

  104.             TIM_Cmd(TIM6, DISABLE);                       

  105.             if(flag_Sta)  

  106.             {         

  107.                 Distance = TIM_GetCounter(TIM6);  

  108.                 Distance = Distance /29;  

  109.                 if(Distance > 300)  

  110.                     Distance = 300;  

  111.                 Done = 1;  

  112.             }  

  113.             flag_Sta=0;  

  114.         }  

  115.     }  

  116. }  

  117.   

  118. /*******************      (C) COPYRIGHT 2017       *END OF FILE************/  



SysTick中断作的处理:


  1. /** 

  2.   * @brief  This function handles SysTick Handler. 

  3.   * @param  None 

  4.   * @retval None 

  5.   */  

  6. void SysTick_Handler(void)  

  7. {  

  8.     time_1ms++;  

  9.     time_120ms++;  

  10.     if(time_120ms>=80)  

  11.     {  

  12.         Sonic_Trig();               //50ms Trig Sonic  

  13.         time_120ms=0;  

  14.     }  

  15.     TimingDelay_Decrement();  

  16. }  



  1. /*  

  2.  * 函数名:main 

  3.  * 描述  : "主机"的主函数 

  4.  * 输入  :无 

  5.  * 输出  : 无 

  6.  */  

  7.    

  8. int main(void)  

  9. {      

  10.     SysTick_Init();  

  11.     USART1_Config(115200);                      /* 初始化USART1 */  

  12.     LED_GPIO_Config();                          /* 运行LED初始化 */  

  13.     TIM2_Config();                                      /* 定时器TIM2初始化 */      

  14.     TIM6_Init();            //TIM6 Init  

  15.     Sonic_Init();           //Sonic_Init   

  16.     LED1(OFF);  

  17.     LED2(OFF);  

  18.     LED3(OFF);  

  19.     LED4(OFF);  

  20.     LEDR(OFF);  

  21.     printf("STM32F103VET6_Sonic Test!\r\n");  

  22.     printf("2017-04-14 9:00\r\n\r\n");  

  23.     while(1)  

  24.     {   

  25.         Delay_ms(1000);  

  26.         printf("The Distance is:%d\r\n",Distance);  

  27.     }  

  28. }  



测试下来,基本符合要求,关于距离的测量,总结如下:

(1)超声波模块,如果前方没有障碍物,就可能不返回,这样程序里,需要有超时的处理,不能死等,否则会影响其他程序的正常进展,采集用的计数器会超时,重新计数,距离也不正确。

如超声波最大测距为:4米,则 2*4 = vt = 340m/s *Tm   Tm为最大的时间,约为:30ms。加上一些余量,60ms差不多可以完成一次采集任务。我这里使用:100ms一次。计数器:每个数为:2us,可以计到最大2*65535=130ms中断并重新计数。


(2)计算公式:

2* L = VT = 340m/s * n * 2us = 340*2*n/1000000(m)=34*2*n/1000(cm)

L= 34*n/1000 (cm),这里单位为厘米。

L= n/29.4 约为:L=n/30

这样,根据定时计数器的值,就可计算得到距离(单位为:cm)


(3)最大值限制:如超声波最大测距为:4米,程序里根据要求,可以限制到3.5米。如果超过,则等于3.5米,





工程如下:感兴趣的可以一起讨论。


https://git.oschina.net/fsmd/stm32f103ve


Keil5 工程下载


关键字:STM32F103VET6  超声波模块  HC-SR04 引用地址:STM32F103VET6超声波模块HC-SR04 的测试例程

上一篇:STM32F103VET6 2.4G通信模块NRF24L01 GPIO模拟SPI的测试例程
下一篇:STM32F103 GPIO的外部中断的使用例子

推荐阅读最新更新时间:2024-03-16 15:39

一款串口输出超声波测距模块使用范例
一、模块简介: 该串口输出超声波测距模块采用STC11F04E单片机作处理器,工作电源:DC5V,工作电流10mA。测量数据输出方式为TTL串口输出,数据格式为标准的ASCII码,数据由:空格位(起始位)+百+十位+个位。工作方式有两种:一是连续测量方式;二是查询测量方式。 测量范围:方式一:5cm~200cm(盲区5cm);方式二:25cm~350cm(盲区25cm)。 测量过程中,当接收不到障碍物反射的回波时,输出 C C C ,当测量低于下限值(在盲区内)时显示 - - - 。测量结果由模块上的输出端口输出,输出方式为串口(TTL电平)输出。测量结果可通过电脑进行显示。模块使用串口通讯可靠性更高,同时可以通过电脑
[单片机]
一款串口输出<font color='red'>超声波</font>测距<font color='red'>模块</font>使用范例
TDK推出可检测障碍物的超声波传感器模块演示套件
TDK株式会社 隆重推出用于机械解耦式超声波传感器模块USSM1.0 PLUS-FS(订购代码:B59110W2111W032)的演示套件 。 该元件非常适合严苛工况下的障碍物检测和距离测量应用,比如在强光照射条件下和探测透明目标物等,广泛适用于自主移动机器人 (AMR) 或自动导航车辆 (AGV)。 演示套件包括TDK演示板、USB-A转Micro-B电缆、两个超声波传感器模块、两个传感器电缆和两个密封件。软件包能让用户在多种工作模式下监测传感器的性能表现,并能提供回波轨迹的数字IO和模拟读数。演示板能可视化显示传感器可以检测到什么以及在特定情况下的反应,从而帮助用户简化早期和后期阶段的开发工作。 USSM1.0
[传感器]
TDK推出可检测障碍物的<font color='red'>超声波</font>传感器<font color='red'>模块</font>演示套件
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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