8 进阶任务:超声波测距_第1页
8 进阶任务:超声波测距_第2页
8 进阶任务:超声波测距_第3页
8 进阶任务:超声波测距_第4页
8 进阶任务:超声波测距_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

任务3.5超声波测距模块的应用开发12案例引导蝙蝠在飞行时嘴里能够不断地发出一种声波——超声波(频率高于20000Hz,人类的耳朵能听到的声波频率为20~20000Hz),遇到障碍物时,这种声波就能被反射回来,蝙蝠的耳朵可以接受这种声波,从而避开障碍物。超声波具有方向性好、穿透力强、易于获得较集中的声能、在水中传播距离远等优点,可用于测速、测距、清洗、焊接、碎石、杀菌消毒等,在医学、军事、工业、农业等很多领域均有应用。超声波传感器就是利用这种原理进行测距的。超声波测距任务描述1任务目标超声波雷达价格低廉,检测距离短,是泊车功能的重要传感器。小车倒车时,利用超声波模块测量到后方有障碍,能及时刹车。测量距离:2~400cm。超声波测距任务3.5超声波测距模块的应用开发32本任务要求使用HC-SR04模块,配合STM32F407MCU设计一个可实现智能测距的应用程序,具体要求:1、测距精度0.3cm,盲区为2cm,测距范围为2~400cm。2、测量数据通过串口发送到PC端。任务内容4任务分析任务3.5超声波测距模块的应用开发利用超声波进行测距的时候,超声波发生器T在某一时刻发出一个超声波信号,当这个超声波信号遇到障碍物被反射回来后,就会被超声波接收器R接收到,如图3-50所示。超声波测距

采用STM32F4系列MCU作为控制器,超声波测距模块采用HC-SR04,该模块包括超声波发射器、接收器和控制电路,用串口打印距离测量值。超声波测距器整体结构框图如图3-51所示。图3-50图3-515HC-SR04知识链接

1.认识超声波测距模块3)HC-SR04模块的特点(1)典型工作用电压:5V。(2)超小静态工作电流:小于5mA。(3)感应角度(4)探测距离(5)高精度:可达0.3cm。(6)盲区(2cm)超近。1)HC-SR04超声波测距模块引脚(1)VCC(5V)(2)Trig(控制端)(3)Echo(接收端)(4)地(GND)。2)HC-SR04超声波测距模块工作原理(1)采用Trig触发测距,至少10μs的高电平信号。(2)模块自动发送8个40kHz的方波,自动检测是否有信号返回。(3)如有信号返回,通过Echo输出高电平,高电平持续时间就是超声波从发射到返回时间,测量距离=(高电平时间×声速(340m/s))/2。6任务分析任务3.5超声波测距模块的应用开发超声波测距4)超声波模块时序图图3-53超声波模块时序图图3-53表明只需要提供一个10μs以上的脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。7超声波测距定时器输入捕获功能的用途和工作原理用途与原理用于测量信号的参数,比如周期和频率。在输入捕获模式下,当捕获单元捕捉到外部信号的有效边沿(上升沿/下降沿/双边沿)时,将计数器的当前值锁存到捕获/比较寄存器TIMx_CCR,供用户读取。用途工作原理78捕获通道的内部结构捕获通道结构超声波测距TI1FP1和TI1FP2实际是同一个信号,由于输出方向不同,因此用不同的名称区别捕获信号IC1的选择:①来自捕获通道1的TI1FP1(直接输入方式)②来自捕获通道2的TI2FP1(间接输入方式)③来自从模式管理器的触发信号TRC最终捕获信号9捕获过程示意图超声波测距定时器捕获假设上升沿捕获,递增计数模式第一次捕获第二次捕获将两次捕获到的值相减,再乘以计数时间可计算出信号周期10计算公式Timer信号参数计算公式Period(s)=Diff/TIMx_CLKx(PSC+1)Freq(Hz) =TIMx_CLK/(Diffx(PSC+1))捕获差值定时器时钟预分频系数如果

CCRx_1

<

CCRx_2:捕获差值

=

CCRx_2

-CCRx_1如果

CCRx_1

>

CCRx_2:捕获差值

=

(ARR

+1

-

CCRx_1)

+CCRx_2注意:如果待测信号大于定时器的一个完整计数周期,则需要结合定时器的更新中断次数来计算捕获差值。当待测信号不大于定时器的一个完整计数周期(从0到ARR)时。假设两次连续的捕获值分别为CCRx_1

CCRx_2,则捕获差值可以按照如下方法计算:2 输入捕获功能的数据类型和接口函数11输入捕获单元Timer结构体类型,包括4个成员变量12Capture:捕获捕获边沿宏常量定义含义TIM_ICPOLARITY_RISING上升沿捕获TIM_ICPOLARITY_FALLING下降沿捕获TIM_ICPOLARITY_BOTHEDGE双边沿捕获成员变量ICPolarity的取值范围Timer13捕获通道宏常量定义含义TIM_ICSELECTION_DIRECTTI直接输入模式:捕获通道CH1和CH2分别与IC1和IC2连接捕获通道CH3和CH4分别与IC3和IC4连接TIM_ICSELECTION_INDIRECTTI间接输入模式:捕获通道CH1和CH2分别与IC2和IC1连接捕获通道CH3和CH4分别与IC4和IC3连接TIM_ICSELECTION_TRC选择从模式管理器的触发信号TRC

作为捕获信号成员变量ICSelection的取值范围Timer14预分频系数宏常量定义含义TIM_ICPSC_DIV1检测到输入信号的每1个有效边沿触发1次捕获TIM_ICPSC_DIV2检测到输入信号的每2个有效边沿触发1次捕获TIM_ICPSC_DIV4检测到输入信号的每4个有效边沿触发1次捕获TIM_ICPSC_DIV8检测到输入信号的每8个有效边沿触发1次捕获成员变量ICPrescaler的取值范围Timer15--

南昌大学“卓越”辅导员培养工程建设接口函数:HAL_TIM_IC_Start_IT()函数原型uint32_t HAL_TIM_IC_Start_IT()

(TIM_HandleTypeDef*htim,uint32_t

Channel)功能描述用于在中断方式下启动定时器的输入捕获功能入口参数1*htim:定时器句柄的地址入口参数2Channel:定时器通道号,取值范围是TIM_CHANNEL_1~TIM_CHANNEL_4返回值HAL状态值注意事项该函数在定时器初始化完成之后调用函数需要由用户调用,用于使能定时器的捕获中断,并启动定时器运行16--

南昌大学“卓越”辅导员培养工程建设接口函数:HAL_TIM_IC_Stop_IT()函数原型HAL_StatusTypeDef HAL_TIM_IC_Stop_IT()

(TIM_HandleTypeDef*htim,uint32_t

Channel)功能描述用于停止中断模式下的定时器输入捕获功能入口参数1*htim:定时器句柄的地址入口参数2Channel:定时器通道号,取值范围是TIM_CHANNEL_1~TIM_CHANNEL_4返回值HAL状态值注意事项1.

该函数需要由用户调用,用于禁止捕获中断,关闭输入捕获通道,停止定时器运行173 输入捕获中断回调函数HAL_TIM_IC_CaptureCallback接口函数:HAL_TIM_IC_CaptureCallback()函数原型voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef

*htim)功能描述用于处理所有定时器的输入捕获中断,用户在该函数内编写实际的任务处理程序入口参数*htim:定时器句柄的地址返回值无注意事项该函数由定时器中断通用处理函数HAL_TIM_IRQHandler调用,完成所有定时器输入捕获中断的任务处理函数内部需要根据定时器句柄的实例来判断是哪一个定时器的哪一个通道产生的本次输入捕获中断函数由用户根据具体的处理任务编写18--

南昌大学“卓越”辅导员培养工程建设接口函数:HAL_TIM_ReadCapturedValue()函数原型uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef*htim,uint32_t

Channel)功能描述用于读取捕获/比较寄存器TIMx_CCR的值,即捕获值入口参数1*htim:定时器句柄的地址入口参数2Channel:定时器通道号,取值范围是TIM_CHANNEL_1~TIM_CHANNEL_4返回值捕获值注意事项1.

函数需要由用户调用,用于读取发生捕获时的捕获值19--

南昌大学“卓越”辅导员培养工程建设5 捕获边沿设置函数:

HAL_TIM_SET_CAPTUREPOLARITY接口函数:

HAL_TIM_SET_CAPTUREPOLARITY()函数原型HAL_TIM_SET_CAPTUREPOLARITY(

HANDLE

,

CHANNEL

,

POLARITY

功能描述用于设置输入信号的捕获边沿参数1

HANDLE

: 定时器句柄的地址参数2CHANNEL

定时器通道号,取值范围是TIM_CHANNEL_1~TIM_CHANNEL_4参数3POLARITY

:捕获边沿,取值范围是TIM_INPUTCHANNELPOLARITY_RISING/FALLING/BOTHEDGE返回值无注意事项该函数是宏函数,进行宏替换,不发生函数调用函数需要由用户调用,用于设置输入信号的有效捕获边沿203 基础任务:信号测量2122任务实施任务实施之前必须准备好表3-48所列的设备/资源Timer表3-48设备/资源清单序号设备/资源数量是否准备到位(√)1STM32F407ZET6最小系统1

2HC-SR04超声波测距模块1

3USB转串口线1

23硬件连接硬件连接,如表3-49所示Timer表3-49HC-SR04与STM3F407核心板连接序号HC-SR04STM32F407ZET6核心板1VCC5V电源2TrigGPIOA.33EchoGPIOA.2(TIM2_CH3)4GND电源地24实施步骤要完成本任务,实施步骤分成以下几步。Timer创建项目。引脚分配。配置FSMC外设。添加代码包。修改程序。编译、下载验证。具体实施步骤如下。1.设置CubeMX环境启动CubeMX软件,依次选择“NewProject”→“StartMyprojectfromMCU”,在PartNumberSearch搜索框中输入“STM32F407ZE”,选中搜索结果“STM32F407ZETx”,点选右上角的StartProject选项,进入开发板初始化对话框。创建项目,并将其设置为相应的IDE生成代码首先,在主窗口中选择“ProjectManager”项目管理器选项,打开“Project”标签,打开ProjectSetting项目设置窗口。在相应的文本框中输入项目名称,选择项目保存路径。将Toolchain/IDE选项设置为“MDK-ARMV5”。时钟源配置:HSE配置为“Crystal/CeramicResonator”,时钟树配置选“HSE”、内核时钟为168MHz。具体配置可参阅前述相关介绍。25实施步骤3.引脚及片内外设定时器、串口配置TimerTrig端接PA3,应设置为推挽式输出,配置结果如图3-57所示Echo端接PA.2,应配置为TIM2_CH3,即定时器2的通道3,用于获取输入捕获超声波模块的回应信号的宽度,具体配置如图3-58、图3-59所示。图3-57图3-58图3-5926实施步骤3.引脚及片内外设定时器、串口配置Timer使用定时器TIM3,配置成一个60ms的定时器,用于以一定的频率触发超声波,并使能中断,具体配置参见图3-60。串口1用于打印超声波模块与障碍物的距离,故需要配置串口1,默认配置即可,如图3-61所示图3-60图3-6127编码Timer生成基础工程切换到“CodeGenerator”选项卡,进行勾选。最后单击右上角的“GENERATECODE”按钮生成基础工程。在工程中添加代码用KeilMDK打开基础工程,单击编译按钮开始编译,若提示0个错误0个警告,表示编译通过。打开main.c文件,按如下步骤添加代码。先创建一个有关超声波的参数的结构体和定义一些参数,以及结构体的初始化函数。/*USERCODEBEGINPTD*/typedefstruct{ floatdistance; //计算出来的距离 uint8_tloop_num; //溢出次数 uint32_trising_time; //捕获上升沿的时间 uint32_tfalling_time; //捕获下降沿的时间 uint8_tcapture_state; //当前捕获的状态 uint32_ttime; //计算出来的时间}Supersonic;/*USERCODEENDPTD*/28编码Timer②打开main.c文件,按如下步骤添加代码。添加超声波初始化函数。/*USERCODEBEGIN0*/voidSupersonic_Init(){ supersonic.distance=0; supersonic.rising_time=0; supersonic.falling_time=0; supersonic.capture_state=0; supersonic.time=0; supersonic.loop_num=0; HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_3);//开启捕获中断 HAL_TIM_Base_Start_IT(&htim3); //开启60ms定时中断 __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);//开启溢出中断}/*USERCODEEND0*/29编码Timer③打开main.c文件,按如下步骤添加代码。定义一些宏/*USERCODEBEGINPD*/#defineCPU_FREQUENCY_MHZ168//F407主频,用来写20μs延时函数#defineRELOADVALUE100000 //(TIM2溢出时间:0.1s,即100000μs)/*USERCODEENDPD*/

/*USERCODEBEGINPM*/#defineTrig(state)HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,(GPIO_PinState)(state))//触发引脚/*USERCODEENDPM*/④定义一个结构体变量。/*USERCODEBEGINPV*/Supersonicsupersonic;/*USERCODEENDPV*/30编码Timer④打开main.c文件,按如下步骤添加代码。 定义一个微秒级延时函数。31编码Timer打开main.c文件,按如下步骤添加代码。 定义一个触发超声波的函数。在/*USERCODEBEGIN2*/和/*USERCODEEND2*/之间添加启动超声波Trig信号。代码如下:voidSupersonic_Start(){Trig(0);delay_us(20);//20us的高电平Trig(1);}

/*USERCODEBEGIN2*/Supersonic_Init();

/*USERCODEEND2*/⑦在/*USERCODEBEGIN3*/和/*USERCODEEND3*/之间添加打印超声波模块与障碍物之间的距离。代码如下:while(1){

/*USERCODEENDWHILE*/

/*USERCODEBEGIN3*/ printf("distance%dCm\r\n",(int)supersonic.distance); HAL_Delay(500);}

/*USERCODEEND3*/32编码Timer⑧在/*USERCODEBEGIN4*/和/*USERCODEEND4*/之间添加定时器捕获声波模块Echo输出的高电平时间。代码如下:33编码Timer在更新中断中,我们要处理溢出中断和定时器60ms中断。34编码Timer⑨因为要用到串口打印,需要编写串口重定向函数,打开usart.c文件,添加如下代码:/*Includes--------------------------------------*/#include"usart.h"/*USERCODEBEGIN0*/intfputc(intch,FILE*fp){ HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY); returnch;}/*USERCODEEND0*/⑩编译整个工程文件。6.程序下载、调试,并测量(1)连接好HC-SR04和STM32F407核心板的连接,连接好PC与和开发板的串口。使用ST-Link仿真器下载程序到开发板。35实验结果Timer(2)打开串口调试助手,在HC-SR04模块的T端、R端前面放置障碍物(材质要平滑、坚硬),并移动模拟障碍物,即可实时测量出模块与模拟障碍物之间的距离了,实验结果如图3-62所示。36任务拓展Timer利用定时器TIM2的通道1(对应引脚PA0)来检测一个外部信号的周期、频率、高电平脉冲宽度和占空比。外部信号由引脚PA6输入,并把测量结果通过串口发送到PC上显示。硬件原理利用杜邦线将STM32F407ZET6核心板引脚PA0和引脚PA6连接。设置PA6为定时器3通道1的输出引脚TIM3_CH1,输出PWM信号。设置引脚PA0为定时器2的通道1的输入引脚TIM2_CH1,启动输入捕获功能,测量由引脚PA6输出的PWM信号。37任务拓展Timer2.任务实现1)设计思路设置引脚PA0为定时器2通道1的输入引脚(TIM2_CH1),开启输入捕获功能,采用上升沿触发,定时器2定时时钟TIM2_CLK为84MHz,设置预分频系数PSC为0。设置引脚PA6为定时器3通道1的输出引脚(TIM3_CH1),开启PWM输出功能,输出一个频率为10kHz、占空比为30%的PWM信号[PSC为(840-1),ARR为(10-1),CCR为3]。程序采用前后台编程模式。在捕获中断回调函数中,记录捕获事件发生时的计数值。一个完整的信号周期记录完成后,设置测量完成标志。在主程序中检测该标志,一旦置位则计算信号的各类参数,并清除标志位。一个完整的信号周期捕获过程如图3-63所示。38任务拓展Timer2)引脚分配本例的引脚分配直接使用外设配置时所默认分配的引脚,即定时器2通道1的输出引脚TIM2_CH1对应的GPIO引脚为PA0,定时器3通道1的输出引脚TIM3_CH1对应的GPIO引脚为PA6,因此不需要进行引脚分配。定时器2的输入捕获功能设置定时器2捕获参数设置定时器2中断设置39任务拓展Timer(2)配置定时器3的PWM输出功能定时器3的PWM输出功能设置定时器3的PWM输出参数设置40任务拓展Timer4)程序编写打开main.c文件,添加如下语句。在/*USERCODEBEGINPV*/和/*USERCODEENDPV*/之间添加如下语句:/*USERCODEBEGINPV*/ uint32_tCapVal[3]={0};//存放捕获值//捕获状态指示:0表示没有开始捕获,1表示捕获完成一次,2表示完成两次捕获uint32_tCapIndex=0; volatileuint32_tCapFlag=0;//捕获完成标志:0表示未完成,1表示完成 uint32_tPeriod=0;//存放信号周期 uint32_tHighTime=0;//存放高电平脉冲宽度/*USERCODEENDPV*/②在/*USERCODEBEGIN2*/和/*USERCODEEND2*/之间添加如下语句:/*USERCODEBEGIN2*/ printf("TimerCaptureFunction:\r\n"); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//启动定时器3通道1输出PWM信号 HAL_Delay(1000); HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//启动定时器2上升沿捕获

/*USERCODEEND2*/41任务拓展Timer4)程序编写在/*USERCODEBEGIN3*/和/*USERCODEEND3*/之间添加如下语句:42任务拓展Timer4)程序编写打开tim.h文件,添加如下语句:/*USERCODEBEGINPrivatedefines*/externTIM_HandleTypeDefhtim

温馨提示

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

评论

0/150

提交评论