历史上的今天

今天是:2024年09月13日(星期五)

正在发生

2021年09月13日 | 基于stm32的HC-SR04超声波测距模块使用

发布者:信息巫师 来源: eefocus关键字:stm32  HC-SR04  超声波测距模块 手机看文章 扫描二维码
随时随地手机看文章

1 工作原理

使用超声波模块之前,先了解其IO口和工作原理:


1.1 IO说明

VCC: 供5V电源

GND: 为地线

TRIG: 触发控制信号输入

ECHO: 回响信号输出

在这里在这里插入图片描述插入图片描述

1.2 基本工作原理:

认真看好以下工作原理,后面的代码就是基于工作原理来实现的。

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

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

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

时序图:

在这里插入图片描述

2 程序编写

2.1 外设配置

根据两个信号引脚来配置两个单片机的IO口

trig: 需要产生一个10us高电平, 配置为推挽输出;

echo: 等待高电平脉冲并测量其脉冲宽度, 配置为下拉输入

测量echo的高电平持续的时间,需要用到定时器, 因此配置一个定时器,用来计时


void UltrasonicWave_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 对应trig引脚

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

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_ResetBits(GPIOB,GPIO_Pin_1);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // 对应echo引脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入

  GPIO_Init(GPIOB, &GPIO_InitStructure);   

 

   //定时器初始化,分频系数为71,则频率为1MHZ,每个计数为1us,(频率越高越精确)

   //重装载值为65535,溢出时间为1us*65536= 65.536ms=0.065536s

   //一个计数周期可以测距 0.065536s * 340m/s / 2  = 11.14112m

TIM_TimeBaseStructure.TIM_Period = 65535; 

TIM_TimeBaseStructure.TIM_Prescaler = 71; 

TIM_TimeBaseStructure.TIM_ClockDivision = 0; 

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //

}


2.2 测距函数

根据工作原理 :

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


/***** 启动超声波 *****/

void UltrasonicWave_StartMeasure(void)

{

GPIO_SetBits(GPIOB, GPIO_Pin_1);   //拉高PB1电平

delay_us(20);            //持续20us

GPIO_ResetBits(GPIOB, GPIO_Pin_1); //拉低PB1电平

}


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


/***** 测距 *****/

float UltrasonicWave_Measure(void)   //

{

    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1);//echo为高电平时,则等待至低电平,才启动超声波

UltrasonicWave_StartMeasure(); //启动超声波

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 0);//等待echo的高电平到来

TIM_SetCounter(TIM2,0); //清零计数器

TIM_Cmd(TIM2, ENABLE);  //使能定时器2,开始计数

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 1);//等待echo的高电平结束

    TIM_Cmd(TIM52, DISABLE); //失能定时器2,截止计数

return (TIM_GetCounter(TIM2))/1000000*340/2 *100; //此处单位转换为cm

}


2.3 测距

int main()

{

float distance;

UltrasonicWave_Init(void);//初始化

delay_init();

while(1)

{

    distance = UltrasonicWave_Measure(void); //完成测距

    delay_ms(60);//建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响。

    printf("distance:%5.2f ",distance);//打印到串口

        }

}


还可以使用中断方式进行测距, 大致框架如下, 有兴趣自行研究


  //先开启对应引脚双边沿触发中断, 中断服务函数大致如下

  float Distance;

  void EXTI15_10_IRQHandler(void)

  {

if(//发生中断)

{   

if(//上升沿)   

{

TIM_SetCounter(TIM2,0); //清零计数器

TIM_Cmd(TIM2, ENABLE);  //使能定时器2,开始计数

  }

    if(//下降沿)

    {

    TIM_Cmd(TIM52, DISABLE); //失能定时器2,截止计数

Distance=(TIM_GetCounter(TIM2))/1000000*340/2 *100;//此处单位转换为cm

}

}

EXTI_ClearITPendingBit(EXTI_Line10);  //清除中断标志   

 } 

  //主函数

  

```c

extern float Distance;

int main()

{

UltrasonicWave_Init(void);//初始化

while(1)

{

UltrasonicWave_StartMeasure();//启动超声波

    delay_ms(60);//建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响。

    //Distance 在中断服务函数中被重新赋值

    printf("Distance:%5.2f ",Distance);//打印到串口

        }

}


以上超声波模块的使用一次记录

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

上一篇:基于STM32单片机采集数据&数据上云
下一篇:基于STM32的超声波HC-SR04详解

推荐阅读

“做事踏实认真,待人宽容诚恳,追求博大精深,发展永无止境。”这是慈星人做人做事的准则,也是多年来始终践行的座右铭。宁波慈星机器人技术有限公司董事长李立军本人的经历也如他所说的这句话一样,严谨却不死板,进取却不鲁莽。从国企到机器人行业,李立军可称之为“跨界高手”。今天,让我们走进李立军,听听他与慈星的故事,了解这家国内一流纺织自动...
2019年9月11日,“物联世界 传感先行”第七届国际物联网传感技术峰会如约举行。三年之后,大会二临温州乐清,展望全球传感器、中国物联网应用领域未来发展趋势,探讨物联网、传感、智慧城市、大数据、AI等产业现状,共谋我国规划传感器、物联网应用未来的发展路线图,加速产业成熟。本届峰会由国家工业信息安全发展研究中心、德国传感与测量技术专业协会...
在今年疫情影响下,多家机构预测全球MCU芯片销售萎缩,然而,在国际贸易形势发生重大变化以及国内新基建如火如荼建设的背景下,国内MCU市场表现出了足够的韧性,在市场需求仍很强劲的背景下,国内MCU厂商迎来发展良机。对于数百家国产MCU厂商而言,如何在机遇面前完善产业布局,缩小与国外龙头企业差距?9月9日,中科芯集成电路有限公司携多款MCU新品亮相2...
9月10日消息 SEMI(国际半导体产业协会)日前公布最新一版《全球半导体设备市场报告》。报告显示,2021年第二季度半导体设备出货金额达249亿美元,环比增长5%,同比则大幅增长48%,创下历史新高。其中,中国大陆二季度半导体设备出货82.2亿美元,环比增长38%,同比增长79%;凭借这一增速,力压韩国成为全球最大市场。韩国和中国台湾则同步各退一位,位居...

史海拾趣

问答坊 | AI 解惑

关于深圳DSP培训

本人具备一定的单片机开发经验现想学习使用C2000系列DSP,应用于UPS设计,请问深圳现在有相应的DSP培训班吗?…

查看全部问答∨

关于非时钟引脚总是在pin planner里出现的问题

现象:       计数分频的方式产生了一个时钟ld1_clk,然后对原时钟clk_24和分频时钟ld1_clk都进行了时钟约束,但是并没有将ld1_clk作为output,奇怪的是,编译完后pin planner里就出现了ld1_clk,手动删掉了之后,再编译还是会 ...…

查看全部问答∨

基于单片机的电动自行车调速系统

如题,这是我毕设的题目哪位大侠给点资料 或者建议啊…

查看全部问答∨

请教GPIO设置问题

我现在用的是IXP420芯片,想对GPIO2进行读写操作,来控制LED灯。我向相应的寄存器设置了输出为1,并输出使能,但无法对LED灯进行操作。不知道遗漏了什么,GPIO模式要选择么,我在数据手册上没有找到,如何设置?…

查看全部问答∨

怎么通过编程的方式获得Windows CE的QFE的安装情况。

相关的MSDN上已经说了,CEQFECheck.exe操作的是windows目录下的WinCEPB500.ini文件,也看了,但是觉得不足以提供足够的信息。 如何才能判断某个QFE是否安装?或者是列出已经安装的QFE?…

查看全部问答∨

USB驱动问题

我要做一个东西,主要功能是PC应用程序和一个USB设备通讯,该USB设备的cpu自带了USB接口,通讯时候需要写驱动么?是不是通用的系统自带的USB驱动就能搞定了? 新手,请高手们不吝赐教…

查看全部问答∨

ARM高手请进(求推荐ARM9开发板)

小弟想把LINUX2.6移植到ARM9上去,通过这个学习 驱动编程以及系统移植 现在基础:能看懂驱动,系统的大概 还请路过的大侠能推荐个性价比比较高的三星的2410的板子给ME, 硬件懂的不多,所以以及焊也没那精力 现在考虑的 U龙的 质量有个保证,但是据 ...…

查看全部问答∨

頂一下我的編程網吧

頂一下我的編程網吧 www.kingofcoders.com…

查看全部问答∨

【晒经典】LM386音频放大模块

LM386电源电压4--12V,音频功率0.5w。LM386音响功放是由NSC制造的,它的电源电压范围非常宽,最高可使用到15V,消耗静态电流为4mA,当电源电压为12V时,在8欧姆的负载情况下,可提供几百mW的功率。它的典型输入阻抗为50K。特性(Features): 静态 ...…

查看全部问答∨

做小车的设计报告<测试方案及测试条件>是什么意思啊

本帖最后由 paulhyde 于 2014-9-15 04:00 编辑 求助。。。。。。。。。。。。。。。。。。。。。。。  …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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