目录

  • HC-SR04模块
  • HC-SR04超声波测距模块工作原理
  • HC-SR04超声波模块的时序触发图
  • 思路步骤
  • 代码
  • 实验结果
  • 总结

HC-SR04模块

HC-SR04超声波测距模块工作原理

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

(4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值;

HC-SR04超声波模块的时序触发图

思路步骤

操作思路:
 初始化时将trig和echo端口都置低,首先向给trig 发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,按照 测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。
 
编程步骤

1.配置好相应GPIO,Trig和Echo引脚
2.配置定时器,开启中断,并记录中断产生次数
3.给模块TRIG端口发送大于10us的高电平信号,发出回响信号时,Echo端呈现高电平,此时打开定时器计时;当收到回响信号时,Echo端呈现低电平,此时关闭定时器。
4.获取Echo高电平时间,利用相关公式计算出距离 dis = (高电平时间*声速(340M/S))/2(取平均值获取更精准数据)

代码

ultrasonsic.c

#include "ultrasonsic.h"
#include "delay.h"u8 msHcCount = 0;//ms计数static void NVIC_Config()
{NVIC_InitTypeDef NVIC_InitStruct;//设置中断组为2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断来源NVIC_InitStruct.NVIC_IRQChannel                                       = BASIC_TIM_IRQ;NVIC_InitStruct.NVIC_IRQChannelCmd                             = ENABLE;//设置主优先级NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//设置次优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority             = 1;//初始化NVIC_Init(&NVIC_InitStruct);}void Hcsr04Init()
{  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     //生成用于定时器设置的结构体GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOB时钟*/RCC_APB2PeriphClockCmd(RCC_GPIOx,ENABLE);//IO初始化GPIO_InitStructure.GPIO_Pin =GPIOB_ULTR_Tx_PIN;   //发送电平引脚TXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置推挽输出GPIO_Init(GPIOB_ULTR_PORT, &GPIO_InitStructure);GPIO_ResetBits(GPIOB_ULTR_PORT,GPIOB_ULTR_Tx_PIN);//一开始低电平GPIO_InitStructure.GPIO_Pin =   GPIOB_ULTR_Rx_PIN;     //返回电平引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB_ULTR_PORT, &GPIO_InitStructure);  GPIO_ResetBits(GPIOB_ULTR_PORT,GPIOB_ULTR_Rx_PIN); //默认低电平   //定时器初始化 使用基本定时器TIM2RCC_APB1PeriphClockCmd(BASIC_TIM_CLK, ENABLE);   //使能对应RCC时钟//配置定时器基础结构体TIM_DeInit(BASIC_TIM);//自动重装载值寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period            = BASIC_TIM_Period;//设置周期为1000us//时钟预分频数TIM_TimeBaseStructure.TIM_Prescaler        = BASIC_TIM_Prescaler;//分频数72//时钟分频因子TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//计数器计数模式,设置向上计数,TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//重复计数器的值//    TIM_TimeBaseStructure.TIM_RepetitionCounter=0 ;TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         // TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);   //清除更新中断,免得一打开中断立即产生中断TIM_ClearITPendingBit(BASIC_TIM, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);    //打开定时器更新中断NVIC_Config();TIM_Cmd(BASIC_TIM,DISABLE);
}void initHcsr04()
{Hcsr04Init();//BASIC_TIM_NVIC_Config();
}static void OpenTimer()        //打开定时器
{// /*清除计数器*/TIM_SetCounter(BASIC_TIM,0);msHcCount = 0;TIM_Cmd(BASIC_TIM,ENABLE);//使能定时器
}static void CloseTimer()        //关闭定时器
{// /*关闭计数器使能*/TIM_Cmd(BASIC_TIM,DISABLE);
}//定时器2中断服务程序
void TIM2_IRQHandler(void)   //TIM3中断
{// /*判断中断手否真的产生*/if(TIM_GetITStatus(BASIC_TIM,TIM_IT_Update) != RESET){/*清除更新中断标志位*/TIM_ClearITPendingBit(BASIC_TIM,TIM_IT_Update);msHcCount++;}}//获取定时器时间
u32 GetEchoTimer(void)
{u32 time = 0;/*//当回响信号很长是,计数值溢出后重复计数,overCount用中断来保存溢出次数*/time = msHcCount*1000;//overCount每++一次,代表overCount毫秒,time微妙time += TIM_GetCounter(BASIC_TIM);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间TIM6->CNT = 0;  //将TIM2计数寄存器的计数值清零delay_ms(50);return time;}
float Hcsr04GetLength(void )
{/*测5次数据计算一次平均值*/float length = 0;float t = 0;float sum = 0;u16      i = 0;while(i != 5){GPIO_SetBits(GPIOB_ULTR_PORT,GPIOB_ULTR_Tx_PIN);//trig拉高信号,发出高电平delay_us(20);//持续时间超过10usGPIO_ResetBits(GPIOB_ULTR_PORT,GPIOB_ULTR_Tx_PIN);/*Echo发出信号 等待回响信号*//*输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1;(此时应该启动定时器计时);当超声波返回被模块接收到时,回波引 脚端的电平会由1变为0;(此时应该停止定时器计数),定时器记下的这个时间即为超声波由发射到返回的总时长;*/while(GPIO_ReadInputDataBit(GPIOB_ULTR_PORT,GPIOB_ULTR_Rx_PIN) == 0);//echo等待回响/*开启定时器*/OpenTimer();i = i+1; //每收到一次回响信号+1,收到5次就计算均值while(GPIO_ReadInputDataBit(GPIOB_ULTR_PORT,GPIOB_ULTR_Rx_PIN) == 1);/*关闭定时器*/CloseTimer();/*获取Echo高电平时间时间*/t = GetEchoTimer();length = (float)t/58;//单位时cmsum += length;       }length = sum/5;//五次平均值return length;
}

mian.c

#include "led.h"
#include "delay.h"
#include "ultrasonsic.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "beep.h"int main(void){   float length;         delay_init();            uart_init(115200); //初始化串口,波特率115200     LED_Init(); //初始化LED        BEEP_Init();//初始化蜂鸣器 initHcsr04();                                 LED0 = 1;//上电默认绿灯亮while(1){length=Hcsr04GetLength();   //获取距离printf("dis = %fcm\r\n",length);//串口打印距离delay_ms(50);if(length < 10){//小于10cm亮红灯绿灯灭LED0 = 0;LED1 = 1;BEEP = 1;   delay_ms(300);}else{LED0 = 1;LED1 = 0;BEEP = 0;}}} 

实验结果

正常距离 亮绿灯

有障碍 亮红灯 蜂鸣器报警

串口显示距离

总结

期间还是遇到不少问题,坚持冲冲冲。后面加入舵机争取把感应垃圾桶做出来!!!

STM32 超声波模块测距相关推荐

  1. STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

    参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...

  2. 快速上手Arduino -- 打印超声波模块测距信息到OLED屏幕上

    文章目录 快速上手Arduino -- 打印超声波模块测距信息到OLED屏幕上 实现效果: 模块说明: 引脚接线方法: 程序源码 附录 快速上手Arduino – 打印超声波模块测距信息到OLED屏幕 ...

  3. 树莓派超声波模块测距

    参考:树莓派超声波模块测距及C语言demo 作者:一只青木呀 发布时间: 2020-07-22 16:54:16 网址:https://blog.csdn.net/weixin_45309916/ar ...

  4. 超声波模块测距 Arduino代码

    1.本篇是记录关于使用超声波模块测距的记录,本次使用的超声波测距模块(HC-SR04)探测角度为<5°  宽电压工作在3.3~5V之间,最大测距为7m. 在Arduino中定义引脚,距离变量等. ...

  5. 用8266学习单片机-13-HC-SR04超声波模块测距示例-Ultrasonic-US-015

    HC-SR04原理 重点 5v供电.Tri引脚需要至少10us的高脉冲去触发.Echo返回的是超声波发射到返回的时间 距离怎么算看上面第三张图,US-015原理相似,注意测量范围最小值和最大值 接线 ...

  6. STM32超声波模块实验(定时器实现)

    实验材料准备 1个HC-SR04超声波模块 1台STM32F103ZET6开发板 若干杜邦线 HC-SR04模块简介 STM32定时器设置 实验中接收发送信号都用定时器,方便管理 上表在<STM ...

  7. STM32超声波模块(HC-SR04\US015)测试程序-HAL库函数

    STM32F103系列单片机HAL库的超声波模块测试程序 原理: 声波遇到障碍物会反射,而声波的速度已知,所以只需要知道发射到接收的时间差,就能轻松计算出测量距离,再结合发射器和接收器的距离,就能算出 ...

  8. 关于HC04超声波模块测距的思考(51版)

    之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接. 后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好, 所以这次对它进行了改进.虽然 ...

  9. 关于HC04超声波模块测距的进一步思考(51版)

    之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接. 后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好,所以这次对它进行了改进.虽然上 ...

最新文章

  1. ORB-SLAM2从理论到代码实现(六):Tracking.cc程序详解(上)
  2. wzplayer for android V1.0
  3. java.util.zip.zipexception_android-如何解决java.util.zip.ZipException?
  4. python程序员月薪-月薪30k的资深程序员用Python爬取了知乎百万用户!并数据分析!...
  5. 异步任务利器Celery(一)介绍
  6. 谈谈我对Java并发的理解——读《Java并发编程实战有感》
  7. 【专利】实用新型专利设计模板
  8. Js分割字符串(单个分割符、多个分割符、正则)
  9. 明尼苏达大学Transportation Research Data Lab (TDRL)交通数据读取
  10. 190种超全的解密工具任你选!!
  11. 声纹、语音识别入门书籍推荐
  12. Android M 差分包的制作流程
  13. 使用Oracle数据库的一些小记录 1
  14. 我们不一样!告诉你百度是如何做智能流量异常检测的
  15. 写给工程师的 10 条精进原则
  16. Java删除文件夹和文件(最经典普通的写法)
  17. SQL注入回顾篇(一)
  18. HTML 学习手册(常用的标签)
  19. 在单选按钮上实现双击效果
  20. CMS推送,免费CMS推送,全平台CMS自动URL推送

热门文章

  1. 服务器远程连接端口怎么设置?如何修改服务器远程端口号3389?
  2. MSP430G2553IPW28R 混合信号微处理器 封装:TSSOP28
  3. 打包软件InstallShield更新至v2019,快速解决各种安装问题
  4. 在Ubuntu上安装CERTI
  5. 华为面试经验(应届通信篇)
  6. 先梳理好思维,再动手实战这样会事半功倍
  7. 乐趣国学—品读《弟子规》中的“亲仁”之道
  8. iOS 测试在应用发布前后的痛点探索以及解决方案
  9. 【docker】解决docker启动centos镜像不成功问题
  10. 游戏无法启动解决方案(VC环境问题无法启动)