一、HC-SR04模块介绍

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

模块的基本工作原理为:

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

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

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

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

具体的电气参数如下:

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

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

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

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

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

二、与单片机的连接

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

TRIG---------PA1

ECHO--------PA0

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

三、程序设计

主程序:

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;

}

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的超声波测距相关推荐

  1. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  2. 经验分享帖 基于STM32的超声波测距HC-SR04(附程序)

    CSDN上其实有很多超声波测距的博客,但我还是想写一篇,主要是附上可用的程序,伸手党最爱.其实我也是个伸手党,不过还是希望大家能自己动手自己多练自己能实现. 同时写下我的心得与看法: 1,程序是用ST ...

  3. 基于STM32的超声波雷达项目【可拟合构建平面地图】(代码开源)

            前言:本文为手把手教学基于STM32的超声波雷达项目--HC-SR04雷达.本次项目采用的是STM32作为MCU,搭配常用的HC-SR04超声波模块与舵机SG90实现模拟雷达检测的效果 ...

  4. 基于stm32的超声波HC-SR04测距仪含距离报警(温度补偿)

         前言:本文主要是紧跟前一篇文章中有关超声波HC-SR04模块进行的扩展实验,主要涉及超声波测距的温度补偿(DHT11),并搭配蜂鸣器的距离报警.整体实验较为简单,为常用的几个传感器模块相互配 ...

  5. 基于STM32的超声波倒车检测装置

    基于STM32的超声波倒车检测装置 一.前言 这里是为了完成学校嵌入式系统及应用实验而做的一个作业,硬件资源使用的是STM32F103VBT6开发板.HC-SR04超声波模块,蜂鸣器和数码管开发板上以 ...

  6. STM32用超声波测距模块实现测距

    STM32用超声波测距模块实现测距 通过超声波测距模块可以实现超声波反射型距离测试.市面上的超声波测距模块主要有两种.一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块 ...

  7. 创意发明: 基于STC51单片机超声波测距(精简设计只需三个元件)

    基于STC51单片机超声波测距精简设计只需三个元件(测距模块暂且算做是一个元件吧) 1.所需元件:STC单片机+超声波模块+4位共阳数码管 2.原理:单片机向测距模块trig脚发送20us的高电平触发 ...

  8. 2022-4-15 基于单片机的超声波测距报警

    基于单片机的超声波测距报警 系统设计软件:Proteus8.10和keil4 .proteus8.10版本安装包可在微信公众号下载 系统源代码和仿真等资料可在文末的链接中下载 系统组成:单片机最小系统 ...

  9. 基于51单片机超声波测距液位检测-温度检测

    [毕设课设]基于51单片机超声波测距液位检测-温度检测 ​效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: ​效果图 更多内容请关注@WENJIE电子科技 ​ 基于51单片 ...

最新文章

  1. Embarcadero Dev C++ 中文输出乱码
  2. 点击头像单独把图片拉取出来.然后再次点击回到初始效果
  3. 初学 Delphi 嵌入汇编[10] - 函数返回值与寄存器
  4. 阿里云环境中TLS/SSL握手失败的场景分析
  5. 效果好,速度快!大连海事大学提出基于增强多任务学习的单图像去雨算法MENET...
  6. 合沟微服务怎么添加_微服务架构:动态配置中心搭建
  7. Auto-ML之自动化特征工程
  8. 用slub track调试use after free问题
  9. Unity3D插件之DoTween
  10. 区块链技术在“三资”监管领域的应用
  11. Paxos算法原理与推导
  12. 【知识地图】开发测试全栈 (未完待续)
  13. 网站优化中SEO关键词密度到底多少属于合理?
  14. Vivado IP核之RAM Block Memery Generator
  15. html后代选择器和子代选择器,CSS后代选择器与子元素选择器的区别
  16. 删除带头结点的单链表的奇数结点
  17. ibdata1是什么?
  18. phpstorm常见问题
  19. Android进程保活主流方案
  20. 日语网站的服务器迁移,云端服务器日语是什么

热门文章

  1. PCB简单绘制一般步骤
  2. BDS全球卫星导航定位系统
  3. 认证培训 | GBase 8s 11月培训训练营圆满结束
  4. QT学习笔记14(Qt模型视图结构)
  5. Address 172.16.40.216 maps to localhost, but this does not map back to the address
  6. apache 基金会 project 概述
  7. 用JQuery实现简单的开心农场小游戏
  8. go语言如何调用java接口_Go语言实现的Java Stream API
  9. java中的transient关键字详解
  10. 那些传奇的天才们(一)