8.3.5 超声波测距设计_第1页
8.3.5 超声波测距设计_第2页
8.3.5 超声波测距设计_第3页
8.3.5 超声波测距设计_第4页
8.3.5 超声波测距设计_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.3.5超声波测距设计利用超声波传感器,来测量嵌入式智能车与障碍物之间的距离,完成嵌入式智能车具有避障功能的设计。1.超声波测距原理超声波测距是通过超声波发射装置,发出超声波与接收器接收到超声波的时间差,来获得距离。超声波测距设计超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波则立即停止计时。超声波在空气中的传播速度为V,计时器记录并计算发射和接收回波的时间差△t,这样就可以计算出发射点到障碍物的距离S,计算公式如下:S=V·△t/2超声波测距原理由于超声波也是一种声波,其声速V与温度有关。声速与温度关系如表所示。表中列出了几种不同温度下的声速。常温下超声波的传播速度是334米/秒,如果温度变化不大,则可以认为声速是基本不变的。温度(°C)-30-20-100102030100声速(m/s)313319325332338344349386超声波测距原理超声波的传播速度V易受到空气中温度、湿度、压强等因素的影响,其中受温度的影响较大。温度每升高1°C,声速就增加约0.6米/秒。如果测距精度要求很高,则应通过温度补偿的方法加以校正。已知现场环境温度T时,超声波传播速度V的计算公式为:V=331.45+0.607*T声速确定后,再测得超声波往返的时间,即可求得距离。这就是超声波测距的原理。超声波测距原理在嵌入式智能车的超声波测距电路中,PB4引脚是发送超声波、PA15引脚是超声波中断输入引脚。超声波的ultrasonic.h头文件代码如下:#ifndef__ULTRASONIC_H#define__ULTRASONIC_H#include"stm32f4xx.h"#include"sys.h"#defineINCPAout(15)voidUltrasonic_Init(void);voidUltrasonic_Ranging(void);extern

uint16_tdis;#endif编写ultrasonic.h头文件超声波的ultrasonic.c文件代码如下:编写ultrasonic.c文件#include"stm32f4xx.h"#include"ultrasonic.h"#include"delay.h"#include"cba.h"floatUltrasonic_Value=0;

//读回值uint32_tUltrasonic_Num=0;//计数值uint16_tdis=0;

//距离计算值voidUltrasonic_Port(void){

GPIO_InitTypeDefGPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB,ENABLE);

GPIO_PinAFConfig(GPIOA,GPIO_PinSource14,GPIO_AF_SWJ);

GPIO_PinAFConfig(GPIOA,GPIO_PinSource13,GPIO_AF_SWJ);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//GPIOA15---INC--RX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

//上拉

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//GPIOB4---INT0--TX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉输入

GPIO_Init(GPIOB,&GPIO_InitStructure);}/*定时器6中断初始化。arr:自动重装值,psc:时钟预分频数*/voidUltrasonic_TIM(uint16_tarr,uint16_tpsc){

TIM_TimeBaseInitTypeDefTIM_InitStructure;

NVIC_InitTypeDefNVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);//TIM6时钟使能

TIM_InitStructure.TIM_Period=arr;

TIM_InitStructure.TIM_Prescaler=psc;

TIM_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;

//向上计数模式

TIM_TimeBaseInit(TIM6,&TIM_InitStructure);

//初始化定时器6

NVIC_InitStructure.NVIC_IRQChannel=TIM6_DAC_IRQn;

//TIM6_DAC_IRQn中断

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

NVIC_InitStructure.NVIC_IRQChannelSubPriority=8;

//响应优先级8级

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

//IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);

//初始化NVIC

TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);

//允许更新中断

TIM_Cmd(TIM6,DISABLE);

//TIM6停止}编写ultrasonic.c文件/*外部中断初始化*/voidUltrasonic_EXTI(){

EXTI_InitTypeDefEXTI_InitStructure;

NVIC_InitTypeDefNVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource4);

EXTI_InitStructure.EXTI_Line=EXTI_Line4;

//将中断映射到中断线EXTI4上

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

//设置为中断模式

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//设置为下降沿触发

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

//中断使能

EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;

//EXTI4_IRQn中断

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

NVIC_InitStructure.NVIC_IRQChannelSubPriority=7;

//响应优先级7级

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);//中断优先级初始化}编写ultrasonic.c文件/*超声波初始化*/voidUltrasonic_Init(void){

Ultrasonic_Port();

//超声波硬件端口初始化

Ultrasonic_TIM(9,83);//超声波计数定时器初始化,定时时间约为10μs

Ultrasonic_EXTI();

//超声波接收引脚中断初始化}/*超声波测距*/voidUltrasonic_Ranging(){

INC=1;

delay_us(3);

INC=0;

//INC(PA15)为低电平,发送超声波信号

TIM_Cmd(TIM6,ENABLE);

//开定时器6

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除定时器6中断标志位

Ultrasonic_Num=0;

//定时计数器清零

delay_ms(30);

//等待一段时间,等待发送超声波控制信号完成

INC=1;

delay_ms(5);

TIM_Cmd(TIM6,DISABLE);//关定时器6}编写ultrasonic.c文件voidTIM6_DAC_IRQHandler(){

if(TIM_GetITStatus(TIM6,TIM_IT_Update)==SET)//判断定时器6是否产生中断

{

Ultrasonic_Num++;//定时计数器加1(每次加1之间间隔是10μs)

}

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除定时器6中断标志位}voidEXTI4_IRQHandler(void){

if(EXTI_GetITStatus(EXTI_Line4)==SET)

{

if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==RESET)

{

TIM_Cmd(TIM6,DISABLE);//关定时器6

Ultrasonic_Value=(float)Ultrasonic_Num;

Ultrasonic_Value=(float)Ultrasonic_Value*1.72f-20.0f;

//计算距离。S=Vt/2,减20是误差补偿

dis=(uint16_t)Ultrasonic_Value;

//返回超声波测得距离,单位是mm

}

EXTI_ClearITPendingBit(EXTI_Line4);//清除LIN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论