STM32超声波测距

发布者:xi24最新更新时间:2017-10-27 来源: eefocus关键字:STM32  超声波测距 手机看文章 扫描二维码
随时随地手机看文章

超声波测距模块是HC-SR04,C-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测

距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。

HC-SR04基本工作原理:

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

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

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

程序编写思路是:1、配置好使用到的GPIO以及定时器;

2、给模块TRIG端口发送大于10us的高电平信号,当收、收到ECHO回响信号是,打开定时器开始定时;

3、当回响信号消失,关闭定时器;

4、通过定时器定时时间来确定距离。

STM32超声波测距

上时序图表明你只需要提供一个 10uS以上脉冲触发信号,该模块内部将发出8个 40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式: uS/58=厘米或者uS/148=英寸; 或是: 距离=高电平时间*声速( 340M/S) /2; 建议测量周期为 60ms以上, 以防止发射信号对。

回响信号的影响

具体程序如下:

///////头文件//////////

#ifndef _CS_H

#define _CS_H

#include "sys.h"

#define uint unsigned int

#define TRIG_Send  PBout(8)

#define ECHO_Reci  PBin(9)

void CH_SR04_Init(void);

float Senor_Using(void);

void NVIC_Config(void);

#endif

/////////主程序/////////////////

#include "cs.h"

#include "stm32f10x.h"

#include "delay.h"

#include "usart.h"

uint overcount=0;

void NVIC_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructer;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;

NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;

NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;

NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructer);

}

void CH_SR04_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructer;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;

GPIO_Init(GPIOB, &GPIO_InitStructer);

GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;

GPIO_Init(GPIOB, & GPIO_InitStructer);

TIM_DeInit(TIM2);

TIM_TimeBaseInitStructer.TIM_Period=999;//定时周期为1000

TIM_TimeBaseInitStructer.TIM_Prescaler=71; //分频系数72

TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分频

TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断

NVIC_Config();

TIM_Cmd(TIM2,DISABLE);//关闭定时器使能

}

float Senor_Using(void)

{

float length=0,sum=0;

u16 tim;

uint i=0;

while(i!=5)

{

PBout(8)=1;  //拉高信号,作为触发信号

delay_us(20);  //高电平信号超过10us

PBout(8)=0;

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);

TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数

i+=1; //每收到一次回响信号+1,收到5次就计算均值

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//回响信号消失

TIM_Cmd(TIM2,DISABLE);//关闭定时器

tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间

length=(tim+overcount*1000)/58.0;//通过回响信号计算距离

sum=length+sum;

TIM2->CNT=0;  //将TIM2计数寄存器的计数值清零

overcount=0;  //中断溢出次数清零

delay_ms(100);

}

length=sum/5;

return length;//距离作为函数返回值

}

void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数

{

if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)

  {

TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志

overcount++;

  }

}

温度补偿:

STM32超声波测距


关键字:STM32  超声波测距 引用地址:STM32超声波测距

上一篇:利用stm32f103的TIM2实现精确延时
下一篇:STM32定时器编码器模式计算减速电机AB相脉冲个数

推荐阅读最新更新时间:2024-03-16 15:41

STM32开发设计中FSMC可能遇到问题应对方案
本文将就使用FSMC可能遇到的问题进行说明。希望能对大家的学习有所帮助。 一、端口配置 1、 由于FSMC写NOR时序与8080接口的时序十分相识,因此我们采用模拟8080时序, 2、 STM32的引脚图如图所示。 3、根据上图我们可以得出,FSMC的数据端口D 如下 4、我们使用的是 FSMC 的信号线 NE1 作为控制 8080 的 CSX 片选信号,所以我们把本成配置为 FSMC_Bank1_NORSRAM1 (NE1 片选BANK1)。由上图得FSMC-NE1 ==PD7 ---------LCD-CS 5、数据地址的选择 本成员用于设置 FSMC 接口的数据宽度,可被设置为 8Bit 或 16b
[单片机]
<font color='red'>STM32</font>开发设计中FSMC可能遇到问题应对方案
基于Keil、STM32,用C++编写流水灯程序
通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发单片机呢? 答案是肯定可以的,下面讲讲基于Keil、STM32,用C++编写流水灯程序的一些内容。 1、为什么很少用C++开发单片机 不知道大家对面向过程和面向对象的理解有多少? C语言面向过程的语言,C++是面向对象的编程语言。结合本文来说,面向过程相比面向对象的编程,代码量更小,运行效率更高。 所以,C语言相比C++具有更小代码量、更快的运行速度。 当然,这里是C相对C++而言。其实,汇编相对C而言,具有更小代码量和更快的运行速度。可以参看文章:用 汇编 和 C语言 写流水灯程序有什么不一样? 因为单片机的RAM和Flash资源
[单片机]
STM32 产品唯一身份标识寄存器(96位) 闪存容量寄存器
产品唯一的身份标识非常适合: ● 用来作为序列号(例如USB字符序列号或者其他的终端应用) ● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。 ● 用来激活带安全机制的自举过程 96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。 这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。 un=(*( u16 *)0x1FFFF7E0); //闪存容量寄存器 printf( The Flash size: %d KB\r\n
[单片机]
<font color='red'>STM32</font> 产品唯一身份标识寄存器(96位) 闪存容量寄存器
STM32输入输出模式理解
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个
[单片机]
<font color='red'>STM32</font>输入输出模式理解
基于STM32和CAN总线的电动车电池管理系统设计
  随着电池能源的广泛应用,石油资源的枯竭和环境污染,电动汽车以其节能环保的优势引起越来越多的重视,在电动汽车的研究和发展上,车载电池及其管理系统的研究与制造占据着重要位置。电动汽车动力电池在应用中的主要问题表现在:生产过程中,电池的工艺,技术以及成组技术还不能保证其初始性能具有良好的一致性;使用过程中,对过充电、过放电、过温度、过电流等非常敏感,这类情况的发生会明显缩短电池寿命,甚至会导致电池报废。电池组是几十个甚至上百个单体电池串联,单体电池之间存在不一致性,随着连续的充放电循环,电池间的不一致性加剧,电池组的可用容量受容量最小的单体电池制约。对于这些情况,电池的初始性能必须要依靠企业生产工艺的优化,生产过程关键参数的控制来改
[电源管理]
基于<font color='red'>STM32</font>和CAN总线的电动车电池管理系统设计
stm32 USART_IT_IDLE
请注意IDLE中断是只检测到空闲帧时产生的中断。 而空闲帧的定义是:被视为完全由 1"组成的一个完整的数据帧,后面跟着包含?数据的下一帧的开始位。 关键是后面半句话,要求有下一帧的开始位,而你的情况恰巧没有下一帧的开始位(传输已经结束),当然不会有中断了。 举例: 如果连续发送一串字符串 123 会发生空闲中断吗? 不会,因为没有下一帧的开始位。 如果进了空闲中断不手动清零,会一直进入空闲中断。 所以用这个IDLEIE来结束DMA方式的接收,是合适的。唯一一个不合适的地方是:如果你发送一个字符串后,将DMA设置好接收传输方式,然后:对方没响应,你一个字符也收不到,这时候,IDLEIE是不会来的,必须有个总超时检测来结束DM
[单片机]
STM32的几种输入模式以及外部中断的配置
  要求:将连接按键的IO口配置为上拉输入,按键一端接IO口,一端接地,即当按键按下后,该IO口会产生一个下降沿,触发下降沿中断。   问题:将相应的IO口配置好后,测了引脚的的电压,并不是3.3V左右,而是0.1V左右。于是猜想:   1. 外围电路对IO口产生了影响。   2. STM32内部上拉能力较弱,一次只能上拉一个IO口。   于是开始从这两个想法着手解决。首先第一个,很容易就排除了。将外围电路撤掉,我用的是杜邦线,直接拔掉测量引脚上的电压,依然是0.1V左右,于是第1个猜想排除。   第二个,查看万能的参考手册,发现每一个IO口都是有独立的驱动电路,这样第2个也排除了。   最后各种纠结,然后发现:在主函数的开头部分
[单片机]
关于LM3S与STM32的粗浅对比
我用过STM32,现在又用LM3S。用后者的原因就是因其集成有网口。通过对比,我发现LM3S有一点不如STM32,就是外设的更新事件。STM32中可以通过更新事件机制实现外设之间直接打交道,而不必打扰CPU,从而大大提高了处理效率。但LM3S中就没这种机制,这是其一大不足。不知TI能否予以改进。 另外,LM3S的网口既然集成了MAC+PHY,为设么不集成协议?还要通过软件实现,耽误事。据我所知,对上述三者全部硬件实现的只有南韩的一款芯片W7100,是51核的。不知TI下一步能否硬件集成协议。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved