基于STM32的超声波测距
一、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的超声波测距相关推荐
- 基于STM32和超声波测距传感器的测距功能设计
基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...
- 经验分享帖 基于STM32的超声波测距HC-SR04(附程序)
CSDN上其实有很多超声波测距的博客,但我还是想写一篇,主要是附上可用的程序,伸手党最爱.其实我也是个伸手党,不过还是希望大家能自己动手自己多练自己能实现. 同时写下我的心得与看法: 1,程序是用ST ...
- 基于STM32的超声波雷达项目【可拟合构建平面地图】(代码开源)
前言:本文为手把手教学基于STM32的超声波雷达项目--HC-SR04雷达.本次项目采用的是STM32作为MCU,搭配常用的HC-SR04超声波模块与舵机SG90实现模拟雷达检测的效果 ...
- 基于stm32的超声波HC-SR04测距仪含距离报警(温度补偿)
前言:本文主要是紧跟前一篇文章中有关超声波HC-SR04模块进行的扩展实验,主要涉及超声波测距的温度补偿(DHT11),并搭配蜂鸣器的距离报警.整体实验较为简单,为常用的几个传感器模块相互配 ...
- 基于STM32的超声波倒车检测装置
基于STM32的超声波倒车检测装置 一.前言 这里是为了完成学校嵌入式系统及应用实验而做的一个作业,硬件资源使用的是STM32F103VBT6开发板.HC-SR04超声波模块,蜂鸣器和数码管开发板上以 ...
- STM32用超声波测距模块实现测距
STM32用超声波测距模块实现测距 通过超声波测距模块可以实现超声波反射型距离测试.市面上的超声波测距模块主要有两种.一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块 ...
- 创意发明: 基于STC51单片机超声波测距(精简设计只需三个元件)
基于STC51单片机超声波测距精简设计只需三个元件(测距模块暂且算做是一个元件吧) 1.所需元件:STC单片机+超声波模块+4位共阳数码管 2.原理:单片机向测距模块trig脚发送20us的高电平触发 ...
- 2022-4-15 基于单片机的超声波测距报警
基于单片机的超声波测距报警 系统设计软件:Proteus8.10和keil4 .proteus8.10版本安装包可在微信公众号下载 系统源代码和仿真等资料可在文末的链接中下载 系统组成:单片机最小系统 ...
- 基于51单片机超声波测距液位检测-温度检测
[毕设课设]基于51单片机超声波测距液位检测-温度检测 效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: 效果图 更多内容请关注@WENJIE电子科技 基于51单片 ...
最新文章
- Embarcadero Dev C++ 中文输出乱码
- 点击头像单独把图片拉取出来.然后再次点击回到初始效果
- 初学 Delphi 嵌入汇编[10] - 函数返回值与寄存器
- 阿里云环境中TLS/SSL握手失败的场景分析
- 效果好,速度快!大连海事大学提出基于增强多任务学习的单图像去雨算法MENET...
- 合沟微服务怎么添加_微服务架构:动态配置中心搭建
- Auto-ML之自动化特征工程
- 用slub track调试use after free问题
- Unity3D插件之DoTween
- 区块链技术在“三资”监管领域的应用
- Paxos算法原理与推导
- 【知识地图】开发测试全栈 (未完待续)
- 网站优化中SEO关键词密度到底多少属于合理?
- Vivado IP核之RAM Block Memery Generator
- html后代选择器和子代选择器,CSS后代选择器与子元素选择器的区别
- 删除带头结点的单链表的奇数结点
- ibdata1是什么?
- phpstorm常见问题
- Android进程保活主流方案
- 日语网站的服务器迁移,云端服务器日语是什么
热门文章
- PCB简单绘制一般步骤
- BDS全球卫星导航定位系统
- 认证培训 | GBase 8s 11月培训训练营圆满结束
- QT学习笔记14(Qt模型视图结构)
- Address 172.16.40.216 maps to localhost, but this does not map back to the address
- apache 基金会 project 概述
- 用JQuery实现简单的开心农场小游戏
- go语言如何调用java接口_Go语言实现的Java Stream API
- java中的transient关键字详解
- 那些传奇的天才们(一)