基于STM32的超声波测距

这篇具有很好参考价值的文章主要介绍了基于STM32的超声波测距。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、HC-SR04模块介绍

HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm;模块包括超声波发射器、接收器、与控制电路。

模块的基本工作原理为:

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

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

(3)有信号返回,通过 IO口 ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

测试距离=(高电平时间*声速(340M/S))/2;

具体的电气参数如下:

基于stm32的超声波测距设计,单片机,单片机,嵌入式硬件

作为一个传感器模块,它本身与单片机的数据传输也就尤为重要,超声波的时序图如下:

基于stm32的超声波测距设计,单片机,单片机,嵌入式硬件

HC-SR04的时序图只有这一个,而且看着比较简单,也是比较容易理解的,但是当时自己去写程序去调试的时候确是花费了不少时间,这里我们主要是要理解一点模块内部发出的8个40kHz脉冲并不通多端口输出,只存在与模块内部,我们在设计程序的时候是不需要去管这个内部信号的。从时序图来看程序的设计思路还是比较简单的,我们只需要提供一个10us以上的脉冲触发信号,模块内部将发出8个40kHz周期电平并检测回波。一旦检测到又回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。建议测量周期为60ms以上,以防止发射信号对回响信号的影响。

这里还有两点需要注意的:

1、模块不宜带电连接,若要带电连接,则需要先让模块的GND端先连接,否则会影响模块的正常工作。

2、测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果。(如果对测量结果的精度要求不高的情况之下,这个点还是可以忽略的,话说如果对精度要求高估计也不会用到这个传感器)

二、与单片机的连接

基于stm32的超声波测距设计,单片机,单片机,嵌入式硬件

上图时HC-SR04的接线端口的说明,TRIG输入端口我们只需要随便接一个普通io口就可以了,我们只需要通过这个io口向模块发送出发信号,然后等待接收就行。ECHO输出口,因为我们我要检测输出高点平的持续时间,所以我们就需要将他接到具有输入捕获的io口上。我们整个程序设计的为:

TRIG---------PA1

ECHO--------PA0

这是STM32F103ZET6数据手册的一部分,可以看到PA0为TIM5_CH1的接口,

基于stm32的超声波测距设计,单片机,单片机,嵌入式硬件

三、程序设计

主程序:

int main()

{

u8 i=0;

float distance;

SysTick_Init(72);

LED_Init();

USART1_Init(115200);

HC_SR04_Init();

while(1)

{

distance=HC_SR04_Measure();

printf("障碍物距离为:%.2f cm\r\n",distance);

i++;

if(i%20==0)

{

led1=!led1;

}文章来源地址https://www.toymoban.com/news/detail-548174.html

delay_ms(10);

}

}

定时器初始化程序

//**定时器初始化,分频系数为71则频率为1Mhz,每个计数为1us**//

//**自动重装载值为65535,一个计数周期1*65536=0.65536 s **//

TIM_TimeBaseInitStructure.TIM_Period=65535; //自动装载值 定时器定时时间计算公式

TIM_TimeBaseInitStructure.TIM_Prescaler=71; //分频系数 ((per)*(psc+1))/Tclk

TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//时钟分频

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //计数模式(向上计数模式)

TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);

/****输入捕获设置***/

TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //通道设置 通道1

TIM_ICInitStructure.TIM_ICFilter=0x00; //滤波器长度 无滤波

TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //捕获极性 上升沿捕获

TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //分频系数 1

TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; //直接映射到TI1

TIM_ICInit(TIM5,&TIM_ICInitStructure);

TIM_ITConfig(TIM5,TIM_IT_CC1,ENABLE); //使能中断

NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; //中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //子优先级

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure);

TIM_Cmd(TIM5,ENABLE);

读取距离程序:

float HC_SR04_Measure()

{ \\这个函数只是将高电平持续的时间转化为输出的距离

float distance;

GPIO_SetBits(GPIOA,GPIO_Pin_1);

delay_us(20);

GPIO_ResetBits(GPIOA,GPIO_Pin_1);

if(TIM5_CH1_CAPTURE_STA&0X80)

{

distance=TIM5_CH1_CAPTURE_VAL*0.000001*340*100*0.5;

TIM5_CH1_CAPTURE_STA=0;

delay_ms(50);

return distance;

}

return 0;

}

中断服务函数

void TIM5_IRQHandler(void) //中断服务函数 \\ 高电平时间的读取是在中断服务函数中完成的,

{ \\这样只要模块输出端口输出高电平,单片机就会第一时间去处理

\\从而完成对持续时间的读取

if(TIM_GetITStatus(TIM5,TIM_IT_CC1))

{

if(TIM5_CH1_CAPTURE_STA&0x40) //0100 0000 //发生捕获中断

{

TIM5_CH1_CAPTURE_STA|=0X80; //成功捕获一次高电平

TIM5_CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);

TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置上升沿捕获

}

else

{

TIM5_CH1_CAPTURE_STA=0;

TIM5_CH1_CAPTURE_VAL=0;

TIM5_CH1_CAPTURE_STA|=0X40; //捕获到高电平 标志

TIM_Cmd(TIM5,DISABLE);

TIM_SetCounter(TIM5,0); //定时器初值为0

TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置下降沿捕获

TIM_Cmd(TIM5,ENABLE);

}

}

TIM_ClearITPendingBit(TIM5,TIM_IT_CC1);

}

到了这里,关于基于STM32的超声波测距的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32的HC_SR04模块实现超声波测距(附源码)

    本次实验需要通过STM32与HC_SR04模块实现实时测距,并将测距信息通过串口显示在电脑上 原理 超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时

    2024年02月11日
    浏览(49)
  • 基于STM32F103C8T6的超声波测距应用

    #一、超声波HC_SR04简介 #二、超声波工作原理 #三、超声波测距步骤 #四、硬件接线 #五、项目代码 一、超声波HC_SR04简介 超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应) 工作电压与电流

    2024年02月03日
    浏览(47)
  • stm32之14.超声波测距代码

           -------------------- 源码  

    2024年02月11日
    浏览(50)
  • STM32:两种方式实现超声波测距

    超声波模块HC-SR04的工作原理很简单,有很多办法可以完成超声波测距,这里简单介绍两种。 配置定时器的中断并声明一个Time的变量,在中断中先判断标志位,然后检查echo端口是否为高电平,如果是,Time++,然后变量time乘以定时时间就能得到echo端口高电平持续的时间,经过

    2024年04月16日
    浏览(51)
  • STM32超声波测距(OLED显示距离)

    超声波原理: 利用声音测距,声音在空气中的速度是340m/s(15℃) 当声音传播时,若遇到障碍物时,就会被反弹回来,通过计时反弹回来的时间就可以计算出从发射端到障碍物的距离 引脚定义: 工作电压:3V-5.5V宽电压供电 测距盲区:2cm最小盲区 接口定义如图 序号 接口定义

    2024年02月04日
    浏览(44)
  • 最详细STM32,cubeMX 超声波测距

    这篇文章将详细介绍 STM32使用 cubeMX驱动超声波测距 。 实验材料:STM32F103C8T6开发板, HC-SR04 超声波模块。 所需软件:keil5 , cubeMX ,AiThinker Serial Tool 串口助手。 实验目的:了解 STM32使用 cubeMX驱动超声波 。 实验:超声波测距。 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触

    2024年02月08日
    浏览(52)
  • 基于Arduino单片机超声波测距仪设计

    文章目录 摘  要 1.课程设计任务 1.1课程设计题目 1.2设计的要求 2.设计总体方案 2.1初步设计方案 2.2各个单元电路的设计要求 2.3主要性能指标 2.4总体方案 3.单元模块设计 3.1显示模块 3.2超声波测距模块 3.3蜂鸣器模块 3.4电机模块 3.5 LED二极管模块 4.软件流程图 5.设计代码 5.1核

    2024年02月11日
    浏览(49)
  • 基于STM32的超声波HC-SR04和红外测距模块测量距离的实验对比(HAL库)

            前言: 本文主要是为了 日常普通场合 下测距做的 对比实验 ,本实验主要包含 2种模块 : 超声波测距模块 (HC-SR04)和 红外测距模块 (SHARP GP2Y0A21YK0F)。两种模块不管是测距原理和编程实验方式都是不相同的,其测距效果也存在很大差异。感兴趣的读者朋友,

    2023年04月27日
    浏览(69)
  • STM32F103驱动HCSR04超声波测距显示

    超声波模块在电子DIY作品中实现小车避障测距等方面均应用广泛,在大学生智能车DIY爱好者中尤为显眼。 点击图片购买 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm,包括发射器、接收器与控制电路,它是一种压电式传感器,利用电致伸缩现

    2024年02月02日
    浏览(47)
  • 【STM32篇】驱动HC_SR04超声波测距模块

    CH_SR04 HC_SR04超声波测距模块可提供 2cm-400cm 的非接触式测距感测功能,测距精度高达3mm;模块包括超声波发射器,接收器与控制电路。 基本工作原理: (1)采用IO口TRIG触发测距,需要给最少10us的高电平。 (2)模块自动发送8个40kHz的方波,自动检测是否有信号返回。 (3)有

    2024年02月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包