毕业设计-基于stm32的智能小车设计_第1页
毕业设计-基于stm32的智能小车设计_第2页
毕业设计-基于stm32的智能小车设计_第3页
毕业设计-基于stm32的智能小车设计_第4页
毕业设计-基于stm32的智能小车设计_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

摘要本次实验重要分析了基于STM32F103微解决器的智能小车控制系统的系统设计过程。此智能系统的构成重要涉及STM32F103控制器、电机驱动电路、红外探测电路、超声波避障电路。本次实验采用STM32F103微解决器为核心芯片,运用PWM技术对速度以及舵机转向进行控制,循迹模块进行黑白检测,避障模块进行障碍物检测并避障功效,其它外围扩展电路实现系统整体功效。小车在运动时,避障程序优先于循迹程序,用超声波避障电路进行测距并避障,在超声波模块下我们使用舵机来控制超声波的发射方向,用红外探测电路实现小车循迹功效。在硬件设计的基础上提出了实现电机控制功效、智能小车简朴循迹和避障功效的软件设计方案,并在STM32集成开发环境Keil下编写了对应的控制程序,并使用mcuisp软件进行程序下载。核心词:stm32;红外探测;超声波避障;PWM;电机控制

AbstractThisexperimentmainlyanalyzesthecontrolsystemofsmartcarbasedonmicroprocessorSTM32F103systemdesignprocess.ThecompositionoftheintelligentsystemmainlyincludingSTM32F103controller,motordrivecircuit,infrareddetectioncircuit,circuitofultrasonicobstacleavoidance.ThisexperimentadoptsSTM32F103microprocessorasthecorechip,usingPWMtechniquetocontrolspeedandsteeringgearsteering,trackingmoduleisusedtodetecttheblackandwhite,obstacleavoidancemoduleforobstacledetectionandobstacleavoidancefunction,otherperipheralextendedcircuittorealizethewholesystemfunction.Whenthecarismoving,obstacleavoidanceprogrampriortotracking,usingultrasonicrangingandobstacleavoidanceobstacleavoidancecircuit,weusesteeringgearunderultrasonicmoduletocontroltheemissiondirectionofultrasonic,infrareddetectioncircuitisusedtoimplementthecartrackingfunction.Onthebasisofthehardwaredesignisproposedformotorcontrolfunction,simpleintelligentcartrackingandobstacleavoidancefunctionofsoftwaredesign,andintheSTM32integrateddevelopmentenvironmentundertheKeil.Writethecorrespondingcontrolprogram,anduseMcUispprogramdownloadsoftware.Keywords:STM32;Infrareddetection;Ultrasonicobstacleavoidance;PWM;Motorcontrol目录1.绪论 -4-1.1研究概况 -4-1.2研究思路 -4-2.软硬件设计 -5-2.1中央解决模块 -5-2.1.1stm32f103内部构造 -6-2.1.2stm32最小系统电路设计 -7-2.1.3stm32软件设计的基本思路 -9-2.1.4stm32中断介绍 -9-2.1.5stm32定时/计数器介绍 -11-2.1.6主程序设计流程图 -12-2.2电机驱动模块 -13-2.2.1驱动模块构造及其原理 -13-2.2.2驱动模块电路设计 -13-2.2.3驱动软件程序设计 -14-2.3避障模块设计 -18-2.3.1避障模块器件构造及其原理 -19-2.3.2HC-SR04模块硬件电路设计 -21-2.3.3HC-SR04模块程序设计 -21-2.4循迹模块设计 -28-2.4.1循迹模块构造及其原理 -28-2.4.2循迹模块电路设计 -30-2.4.3红外循迹模块程序设计 -30-3.软件调试 -33-3.1程序仿真 -33-3.2程序下载 -34-4.系统测试 -35-5.总结 -37-致谢 -39-参考文献 -40-附录 -41-1.绪论智能小车通过多个感应器获得外部环境信息和内部运动状态,实现在复杂环境背景下的自主运动,从而完毕含有特定功效的机器人系统。而随着智能化电器时代的到来,它们在为人们提供的舒适的生活环境的同时,也提高了制造智能化电器对于人才规定的门槛。智能小车是集成了多个高新技术,它不仅融合了电子、传感器、计算机硬件、软件等许多学科的知识,并且还涉及到当今许多前沿领域的技术,它是一种国家高科技技术水平的重要体现。通过建立起简易智能小车的设计,引导学生从理论走向实践,培养同窗们的动手能力,使同窗们在理解智能化电器的工作原理的基础上,还使同窗们获得完毕整体项目的能力,并掌握了Stm32开发板的编程原理,为同窗们进入ARM领域提供了基础。另外,本次课程设计,使同窗们理解自己的局限性之处,从而使同窗们有目的的提高自己的能力。1.1研究概况国外研究概况:上世纪50年代初,国外就有智能车辆的研究,从90年代开始,智能车辆的研究就进入了系统化、大规模的研究阶段。特别突出的是美国卡内基-梅陇大学机器人研究所已经完毕了Navlab系列的自主车辆的研究,这一研究成果代表了国外智能车辆的重要研究方向。国内研究概况:我国对于智能车辆的研究较晚,始于上世纪80年代,并且现在大部分还是使用入门级别的51单片机进行设计与研究的,为了弥补与国外研究的差距,开设了全国大学生电子设计竞赛。1.2研究思路系统将采集的传感器信号送入stm32微控制器中,stm32微控制器根据采集的信号做出不同的判断,从而控制电机运动方向和运动速度。系统以stm32微控制器为核心,通过传感器采集不同的信号做出判断,继而变化电机的运动方向和运动速度。实验系统构造如图1.1所示:图1.1实验系统构造图2.软硬件设计智能小车控制系统含有了障碍物检测、自主避障、自主循迹等功效。对应的控制系统重要由下列四个模块构成:避障模块、循迹模块、电机驱动模块、中央解决模块四个模块构成,系统总体框架如图2.1所示:这个图调节下,和下面的编号看起来位置不协调这个图调节下,和下面的编号看起来位置不协调图2.1系统框架图我们本节重要任务是理解各个模块的功效,掌握各个模块所使用的器件的使用办法,并能够编写对应的程序代码。掌握各个模块的功效。2.1中央解决模块在人类身体构造中,大脑能够根据各个器官所传输的信息做出对应的行为动作用以确保人体所必须的生理原料,而stm32解决器之于智能小车就相称于大脑之于人类,它能够从各个模块之间获得数据,并对所传输的数据进行实时解决,来驱使电机模块做出对应的行为动作。由ARM公司设计的基于ARMv7架构的Cortex系列的原则体系构造在推出,此构造是用来满足日渐复杂的不同性能规定的软件设计,根据所面对的领域,Cortex系列能够分为A、R、M三个分工明确的系列[1]。Stm32解决器的出现为微控制系统、工业控制系统、汽车车身系统和无线网络等对功耗和成本敏感的嵌入式应用领域实现高系统性能系统提供了基础,使编程的复杂性,集高性能、低功耗、低成本大大简化,并使它们融为于一体[2]。意法半导体ST公司作为一种半导体制造厂商,是ARM公司Cortex-M3内核开发项目一种重要合作方。6月11日由ST公司率先推出的基于Cortex-M3内核的STM32系列微控解决器研发而出。此中,A系列是面对复杂的尖端应用程序,用于运行开放式的复杂操作系统;R是Real的首字母缩写,是面对实时系统开发的;M是Mirco的首字母缩写,专门面对低成本的微控制领域开发研究。因此,Cortex-M3解决器是由ARM公司设计的首款基于ARMv7-M体系构造的32位原则解决器,它不仅含有低功耗、少门数等优点,并且还含有短中断延迟、低调试成本等众多优点,使它在众多的解决器中脱颖而出。现在为止,STM32系列解决器暂分为2个系列。其中,STM32F101系列是原则型系列,工作频率设定在36MHZ;STM32F103系列是增强型系列,工作频率设定在72MHZ,其带有更多片内RAM和更丰富的外设资源。这两个系列的产品在软件和引脚封装方面含有兼容性,并且拥有相似的片内Flash资源,使软件的开发和升级更加方便。本次实验,我们使用的是stm32f103解决器。2.1.1stm32f103内部构造STM32F103系列微解决器是首款基于ARMv7-M体系构造的32位原则RISC(精简指令集)解决器,含有执行代码效率高,外设资源丰富等众多优点。该系列微解决器工作频率设定在72MHz,高达128K字节的内置Flash存储器和20K字节的SRAM,方便程序编写,并且含有丰富的通用I/O端口。其内部构造图如图2.2所示:图2.2内部构造图Stm32解决器主系统重要由4个被动单元和4个驱动单元构成。4个驱动单元是:通用DMA1,通用DMA2,内核DCode总线和系统总线。4个被动单元由APB桥,APB设备,内部Flash闪存,内部SRAM、FSMC。我们实验所采用的芯片含有64KBSRAM、512KBFLASH、2个基本定时器,4个通用定时器,2个高级定时器,3个SPI,2个IIC,5个串口,1个USB,1个CAN,3个12位的ADC,1个12位DAC、1个SDIO接口,1个FSMC接口以及112个通用I/O口。2.1.2stm32最小系统电路设计Stm32的最小系统电路重要由系统时钟电路、实时时钟电路、JTAG调试接口电路,复位电路和启动模式选择电路构成。最小系统电路原理图如图2-1-3所示:图2.3最小系统电路原理图重要电路原理图的设计及功效以下所示:1.系统时钟电路系统时钟电路重要作用是提供节拍,就相称于人类的心脏跳动,随着心脏的跳动,血液就会达成全身部位,因此系统时钟的重要性就不言而喻啦。系统时钟的电路设计如图2.4所示:图2.4系统时钟电路图在时钟电路中,我们选用8M的晶振。2.复位电路复位电路的设计如图2.5所示:图2.5复位电路图本次实验所采用的开发板为低电平复位。如图所示,当按键悬空时RST输入为高电平,当按键按下时,RST脚输入为低电平,从而电路复位。3.JTAG电路JTAG电路原理图如图2.6所示:图2.6JAG电路原理图JTAG的重要功效是使目的文献烧到核解决器中。4.启动模式电路启动模式电路原理图如图2.7所示:图2.7启动模式电路原理图通过设立BOOT[1:0]引脚能够选择三种不同启动模式,启动模式如表2-1所示:表2-1启动模式表启动模式选择引脚启动模式阐明BOOT1BOOT0X0主闪存存储器主闪存存储器被选为启动区域01系统存储器系统存储器被选为启动区域11内置SRAM内置SRAM被选为启动区域2.1.3stm32软件设计的基本思路在对其它模块设计之前,我们必须理解stm32的编程规则。任何解决器,涉及stm32解决器,想要解决器完毕某项对应的动作,就必须对解决器的寄存器进行操作。例如,我们在单片机C51中,同样,我们在stmM32的开发中过程中,我们同样能够对寄存器直接操作:GPIOx->BRR=0x0011。(x能够是A,B,C,D,E…例如GPIOA就是端口A)但是,对于stm32这种级别的解决器,几百个寄存器记起来谈何容易。因此,ST(意法半导体)提出了固件库的概念,运用固件库进行编程。固件库的本质就是函数的集合,固件库将那些寄存器的底层操作都封装起来,提供一整套API供开发者使用。例如,上面通过控制BRR寄存器来控制电平的变化,官方库封装了一种函数:VoidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin){GPIOx->BRR=GPIO_Pin;}(x能够是A,B,C,D,E…例如GPIO_A就是端口A)通过使用GPIO_ResetBits()函数就能够直接对寄存器进行操作啦。2.1.4stm32中断介绍本方案中,我们要使用stm32的中断,在程序设计中,我们要启动各个管道的中断,打开各个中断通道,配备中断方式,我们先来讲述下stm32单片机的中断机制。构造图以下所示:图2.32stm32外部中断/事件控制器构造图图中的实线箭头,为外部中断信号的传输途径。首先外部信号从编号为1的输入线进入。另一方面这个外部信号通过编号2的边沿检测电路,这个边沿检测电路受到“上升沿选择寄存器”、“下降沿选择寄存器”的控制,我们能够控制这两个寄存器来选择中断的触发方式。我们能够在程序中进行设立,例如全部段落设立为首行缩进2个字符EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;设立为上升沿触发中断全部段落设立为首行缩进2个字符然后该外部信号进入编号为3或门,或门另一端是软件中断寄存器,如果,软件中断/事件寄存器的对应位置1,编号3的输出总是为有效信号1。之后进入“中断挂起请求寄存器”,该寄存器统计了外部信号的电平变化。最后通过编号为4的与门进入NVIC中断控制器,如果“中断屏蔽寄存器”的对应位置0,外部的中断请求信号不能传输到NVIC中断控制器,从而实现中断的屏蔽。由于我们采用的是外部信号触发中断,因此我们只需理解外部中断的请求机制,对于事件的中断请求机制,我们在这里不做介绍。我们以PE1为例,介绍下外部中断的普通环节。环节以下:启动I/O的复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);初始化I/O为输入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GPIOE,&GPIO_InitStructure);初始化线上中断,设立触发条件GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1);EXTI_InitStructure.EXTI_Line=EXTI_Line1; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);配备中断分组NVIC,并使能中断NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x06; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);编写中断服务函数voidEXTI1_IRQHandler(void){}重要代码详见附录2.2.1.5stm32定时/计数器介绍Stm32系列的单片机普通包含8个计数/定时器,TIM1、TIM8分别为高级控制订时器,TIM2~TIM5为通用定时器,TIM6以及TIM7为基本定时器。对于定时器的具体内容,我们不在这里一一介绍。然后我们介绍一下本实验采用了那些定时器,以及这些定时器所要完毕的功效有哪些。本实验所采用的定时器以及功效以下表所示:表2-2定时器介绍表定时器名称定时器配备模式重要功效TIM2定时器中断模式通过定时器中断,控制超声波的扫描周期TIM3PWM复用输出模式控制小车速度及舵机转向TIM5输入捕获模式采集超声波发射到接受的高电平持续时间t2.1.6主程序设计流程图在本节实验中,循迹模块以及避障模块都是采用中断方式进行工作的,因此其主程序流程图以下图所示:图1.2主程序流程图根据程序设计图,主程序设计以下:intmain(void){ u8TIM5CH1_CAPTURE_STA=0; //输入捕获状态 u16 TIM5CH1_CAPTURE_VAL; //输入捕获值delay_init(); //延时函数初始化 NVIC_Configuration();//设立NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); GPIO_Configuration();//端口初始化 EXTIX_Init(); //扫描轨迹 TIM2_Int_Init(4999,7199);//控制超声波扫描周期TIM3_PWM_Init(1999,719);//控制舵机方向 TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 while(1) {farward_Low();delay_ms(10);}}2.2电机驱动模块Stm32对小车的控制,就是对电机的控制,通过控制电机的转向,小车的运动状态就会发生变化。电机驱动模块的重要器件为LM293N,我们下面就具体解说下电机驱动模块。2.2.1驱动模块构造及其原理电机驱动模块的实物图如图2.8所示:图2.8驱动电路实物图电机驱动模块的重要器件是芯片LM293D,内部原理图如图2.9所示:K4K2K1K3S4K4K2K1K3S4图2.9电机驱动内部原理图全桥式驱动电路的4只开关管都工作在斩波状态,如图1.2所示,K1、K2为一组,K3、K4为另一组,两组的状态互补,一组导通则另一组必然关断。当K1、K2导通时,K3、K4关断,电机两端加正向电压,电机实现正转或反转制动;当K3、K4导通时,K1、K2关断,电机两端为反向电压,电机实现反转或正转制动。2.2.2驱动模块电路设计电机驱动模块的电路原理如图2.10所示:图2.10驱动模块电路原理图表2-2是各个端口状态与运动方向的关系,其关系以下表所示:表2-2端口与运动方向关系表电机M1IN1IN2电机M2IN3IN4停止00停止00正转10正转10反转01反转01-11-112.2.3驱动软件程序设计车轮电机的动作由GPIO口的输出实现,本节重要配备运动方向和运动速度,对于运动速度的控制,我们必须使用PWM,通过变化PWM的占空比来调节速度的大小,其重要代码设计以下所示:voidTIM3_PWM_Init(u16arr,u16psc){….}要想使stm32的通用定时器TIMx产生PWM输出,需要用到的寄存器有:预分频寄存器(TIMx_PSC)、自动重装载寄存器(TIMx_ARR)、捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。我们先介绍这几个寄存器,然后介绍如何使用库函数产生PWM输出。下面我们就简朴介绍下这些寄存器:首先是预分频寄存器(TIMx_PSC),该寄存器能够用设立对时钟进行分频,然后在提供应计数器作为计数器的时钟。该寄存器的各位功效如图所示:图2.11TIMx_PSC寄存器各位描述接下来介绍自动重装载寄存器(TIMx_ARR),该寄存器的各位描述以下图所示:图2.12TIMx_ARR寄存器各位描述通过设立这两个寄存器,我们就能够算出PWM的输出周期,计算公式为:Tout=((arr+1)*(psc+1))/Tclk。其中Tclk为系统时钟周期。另一方面我们介绍捕获/比较模式寄存器(TIMx_CCMR1/2),总共有两个,TIMx_CCMR1和TIMx_CCMR2,TIMx_CCMR1控制通道CH1和CH2,TIMx_CCMR2控制CH3和CH4。由于这2个寄存器差不多,我们仅以通道CH1为例,介绍其中的TIMx_CCMR1为例,该寄存器的各位描述以下图所示:图2.13TIMx_CCMR1/2寄存器各位描述这里我们只介绍该寄存器的OCxM位,我们就以TIMx_CCMR1中的OC1M(控制通道CH1)为例,该位功效以下图所示:图2.14OC1M功效描述我们使用的是PWM输出模式,因此OC1M必须设立为110/111。OC2M(控制通道CH2)各位描述与OC1M相似,我们这要不在叙述。然后我们介绍捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入/输出通道的开关,对于该寄存器,各位描述以下图所示:图2.15TIMx_CCER寄存器描述该寄存器比较简朴,由于我们只介绍通道1,因此我们只讲CC1E位。如果我们想使能输入/捕获1,我们只需使用CC1E位。要想使PWM从I/O口输出,此位必须设立为1。最后介绍捕获/比较寄存器(TIMx_CCR1~4),总共有4个,分别对应CH1~4,由于这4个寄存器相似,我们仅以TIMx_CCR1为例,该寄存器的给位介绍以下图所示:图2.16TIMx_CCR1寄存器各位描述在输出模式下,该寄存器的值与CNT中的值进行比较,根据成果,实现电平的翻转。至此,我们把用到的几个寄存器都介绍完毕,下面我们就介绍如何通过库函数来配备实现PWM三路输出。启动TIM3时钟以及复用功效输出。使能GPIO和端口复用功效时钟。库函数使能TIM3、GPIO以及复用功效时钟的办法是:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);初始化TIM3,设立TIM3的PSC和ARR。在启动了TIM3的时钟之后,我们要设立PSC和ARR寄存器的值来控制PWM的输出周期。调用的格式以下: TIM_TimeBaseStructure.TIM_Period=arr; TIM_TimeBaseStructure.TIM_Prescaler=psc; TIM_TimeBaseStructure.TIM_ClockDivision=0; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);设立TIM3_CH1、CH2、CH3的PWM模式,使能TIM3的CH1、CH2、CH3输出。在库函数中PWM通道设立是通过TIM_OC1Init~TIM_OC4Init来设立的,这里我们需要3路PWM输出,因此我们需要使用函数TIM_OC1Init、TIM_OC2Init、TIM_OC3Init。库函数的调用格式以下: TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse=0; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OC2Init(TIM3,&TIM_OCInitStructure); TIM_OC1Init(TIM3,&TIM_OCInitStructure); TIM_OC3Init(TIM3,&TIM_OCInitStructure);使能TIM3。完毕以上配备后,我们要使能定时器TIM3。库函数调用格式以下: TIM_Cmd(TIM3,ENABLE);通过修改TIM3_CCRx(x为1,2,3)来控制占空比。库函数格式以下:VoidTIM_SetComparex(TIM3,uint16_tCompare2);我们能够懂得,通过定时器3控制PWM波的占空比,从而实现速度方面的控制。其中arr和psc能够控制PWM波的周期,TIM3_CCRx能够控制PWM波的占空比。我们只需要调用此函数就能够实现不同的速度控制。对于运动方向控制的代码我们就后来退为例,由于端口寄存器过于简朴,我们不在此介绍端口的寄存器。我们仅介绍如何通过库函数进行端口配备。对各个I/O端口配备的过程相似,我们仅以PD8为例:重要过程以下所示:使能I/O口时钟,调用格式以下所示:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);初始化I/O参数,调用格式以下所示:GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);操作I/0口GPIO_SetBits(GPIOD,GPIO_Pin_8);PD8置1GPIO_ResetBits(GPIOD,GPIO_Pin_8);PD8置0我们懂得了如何对端口进行操作之后就能够随意的控制小车的运动啦,运动方向的程序设计,其基本函数单元以下所示:voidLeft_Low(void);…我们调用这些函数,就能够实现不同运动方向的控制。重要代码详见附录3.2.3避障模块设计在人类身体构造系统中,眼睛能够使我们非常方便的采集到外界环境的信息,然后把信息及时的传输到大脑,并对外界环境信息的变化做出对应的解决。而对智能小车来说,避障模块之于小车就相称于眼睛之于人类。避障模块能够采集外部地形数据,然后把所采集的地形数据传输到中央解决模块,从而实现规避障碍的功效。避障模块所采用的器件在市场中有许多类型,例如红外检测,光位移检测,超声波检测等。本次实验我们使用的是HC-SR04超声波检测,超声波由于含有检测能力强,传输途径宽,因此我们决定使用HC-SR04器件。在使用HC-SR04模块进行超声波测距的同时,我们能够使用舵机进行辅助。舵机的重要作用是变化HC-SR04模块的照射方向,从而控制超声波的发射方向。在程序编写过程中,如果小车前方遇见障碍时,我们能够直接控制舵机的转向,而小车的车身能够保持不变,在测量结束后,小车再做对应的动作。2.3.1避障模块器件构造及其原理HC-SR04超声波测距模块测量范畴在2cm-400cm之间,能够实现无接触式测距功效。HC-SR04超声波测距模块由一种超声波发射器、一种超声波接受器和控制电路构成,避障模块的实物构造图如图2.17所示:图2.17实物正背面构造图如构造图所示VCC提供5v电源,GND为接地线,TRIG为触发信号线,ECHO为回向信号输出线。基本原理以下:采用IO口TRIG触发测距,给最少10us的高电平信号,在TRIG触发沿到来后,超声波发射器会自动发出8个40KHz的方波,并且检测与否有信号返回,当超声波接受器接受到超声波时,表明有信号返回,通过IO口ECHO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。因此测量距离=(高电平持续时间*340m/s)/2。测量时序图如图2.18所示:图2.18超声波时序图我们根据时序图,能够编写对应的程序代码。为了避免发射信号对回向信号的影响,我们的测量周期不易过小。并且由于HC-SR04的感应角度不不不大于15°,因此测距时,为了避免发射信号丢失,我们规定被测物体的面积不应不大于0.5平方米,否则可能造成测量成果不精确。舵机在避障模块的重要作用前面已经提到,本节重要解说舵机的工作特性。舵机的实物图如图2.19所示:图2.19舵机实物图舵机的工作工作原理是stm32微解决器发出数据给舵机,舵机内部有一种基准电路,它会产生周期为20ms,宽度为1.5ms的基准信号,它将微解决器传输的直流偏置电压与电位器的电压数据进行比较,获得电压差输出。经由电路板上的IC

判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回反馈信号。舵机的转动角度与stm32所提供的PWM信号有关。原则信号PWM周期为20ms,理论上来讲脉宽为1~2ms,实际我们的脉宽为0.5~2.5ms,脉宽与所转的角度一一对应。角度与脉宽的对应图如图2.20所示:图2.20舵机角度与脉宽对应图2.3.2HC-SR04模块硬件电路设计超声波模块硬件原理图以下图所示:图2.21超声波硬件原理图HC-SR04模块重要由发射器、接受器和部分电路构成。在此实验中,我们只需简朴理解电路的设计,对于其基本原理能够不用过多涉猎,我们只需明白它们的工作原理,并且能够简朴运用即可。2.3.3HC-SR04模块程序设计根据硬件电路的设计,我们对避障子程序进行设计,程序流程图如图2.22所示:图2.22避障程序流程图避障模块在程序设计中,我们的工作重要是:1、控制超声波的扫描周期2、采集超声波发射到接受的高电平持续时间t3、对采集的高电平持续时间t进行解决,判断前方与否有障碍下面我们就具体介绍我们是怎么通过软件设计来完毕这几个环节的:1、控制超声波的扫描周期根据表2-2,我们采用的是TIM2来控制超声波的扫描周期。首先我们把TIM2设立为定时器中断模式,代码格式为voidTIM2_Int_Init(u16arr,u16psc);由于配备定时器中断模式十分简朴,我们就不在具体介绍,其具体代码见附录4.定时器TIM2的中断周期计算公式为T=((arr+1)*(psc+1))/Tclk。Tclk为系统周期,普通为72Mhz.我们在中断服务程序中控制超声波的发射,我们采用PC7作为触发信号,根据超声波时序图,我们需要在中断程序中给PC7一种持续10ms的高电平,中断服务程序以下:voidTIM2_IRQHandler(void)//TIM2中断{ if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) {TIM_ClearITPendingBit(TIM2,TIM_IT_Update); GPIO_SetBits(GPIOC,GPIO_Pin_7); delay_ms(10); GPIO_ResetBits(GPIOC,GPIO_Pin_7);}}2、采集超声波发射到接受的持续时间t在本节实验中,我们使用了通用定时器TIM5的输入捕获功效,输入捕获模式含有测量频率或者测量脉冲的宽度的功效。我们启动TIM5通道CH1(定时器5)的输入捕获模式,采集ECHO端口的高电平持续时间。配备定时器5代码格式为:voidTIM5_Cap_Init(u16arr,u16psc){…}下面我们就具体解说一下,如何启动并使用通用定时器的输入捕获功效。输入捕获的原理,简朴的讲就是通过检测TIM5(定时器)通道CH1的边沿信号,当边沿信号发生变化时,现在寄存器的值TIM1_CNT寄存到通道的捕获/比较寄存器(TIM5_CCR1)里面。我们的实验就是采集捕获/比较寄存器(TIM5_CCR1)中的值并进行解决,完毕对应的动作。为了使TIM5通道CH1含有捕获功效,我们需要用到TIM5_PSC、TIM5_ARR、捕获/比较模式寄存器(TIM5_CCMR1)、捕获/比较使能寄存器(TIM5_CCER)、捕获/比较寄存器(TIM5_CCR1)、DMA/中断使能寄存器(TIM5_DIER)、控制寄存器(TIM5_CR1)。我们下面就简朴介绍下下这几个寄存器。TIM5_PSC、TIM5_ARR、TIM5_CCR1这3个寄存器使用方法与前节中相似,我们就不在赘述,而在本实验中,捕获/比较寄存器TIM5_CCMR1非常重要,该寄存器的各位描述以下图所示:图2.23TIMx_CCMR1各位描述我们使用的是TIM5捕获/比较通道CH1,因此图中只介绍[7:0]位。本次实验我们设立CC1S[1:0]=01,IC1PSC[1:0]=00,IC1F[3:0]=0000。接着我们再来看看捕获/比较使能寄存器TIMx_CCER,本节用到了CC1E和CC1P两位,描述以下图所示:图2.24TIMx_CCER最低两位描述因此要使能通道CH1输入捕获,CC1E必须设立为1,而CC1P则能够根据实际状况设立。另一方面,我们再看看DMA/中断使能寄存器(TIM5_DIER),由于我们使用的是通道CH1,因此我们仅介绍控制通道CH1的位,以下图所示:图2.25TIMx_DIER各位描述通过此图我们懂得,我们需要设立CC1IE为1即可。然后,我们再看看控制寄存器TIMx_CR1,我们只用到了最低位,因此我们仅介绍位0的功效,TIMx_CR1寄存器各位描述及位0功效描述以下如所示:图2.26TIMx_CR1寄存器各位描述及位0功效描述我们要使能计数器,因此位0设立为1。至此,我们所使用的寄存器一一介绍完毕,下面介绍怎么配备输入/捕获环节:启动TIM5时钟以及GPIOA时钟。RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);初始化TIM5,设立TIM5的psc和arr。TIM_TimeBaseStructure.TIM_Period=arr;TIM_TimeBaseStructure.TIM_Prescaler=psc; TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);设立TIM5的输入比较参数,启动捕获模式。TIM5_ICInitStructure.TIM_Channel=TIM_Channel_1; TIM5_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; TIM5_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;TIM5_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; TIM5_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000TIM_ICInit(TIM5,&TIM5_ICInitStructure);设立TIM5的DIER寄存器,使能捕获和更新中断功效。TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);设立中断分组并编写中断服务函数NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);使能定时器TIM_Cmd(TIM5,ENABLE);我们懂得了如何设立TIM5的CH1为输入捕获模式,我们是在TIM5的中断服务函数中采集持续时间t的,TIM5CH1_CAPTURE_STA为输入捕获状态,TIM5CH1_CAPTURE_VAL为输入捕获值,中断服务函数以下所示:if((TIM5CH1_CAPTURE_STA&0X80)==0)//尚未成功捕获 { if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET) { if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了 {if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了 {TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次 TIM5CH1_CAPTURE_VAL=0XFFFF; }elseTIM5CH1_CAPTURE_STA++;}} if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)//捕获1发生捕获事件 {if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一种下降沿 {TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);//CC1P=0设立为上升沿捕获 }else //尚未开始,第一次捕获上升沿 {TIM5CH1_CAPTURE_STA=0; //清空 TIM5CH1_CAPTURE_VAL=0; TIM_SetCounter(TIM5,0); TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1设立为下降沿捕获}}}3、对采集的时间t进行解决,判断前方与否有障碍我们对采集时间t的解决也是在TIM5的中断服务函数中的,我们根据因测量距离=(高电平持续时间t*340m/s)/2,得出只要高电平持续时间t<1500us,距离就不大于25cm,就会鉴定前方有障碍,其具体代码以下: if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 { temp=TIM5CH1_CAPTURE_STA&0X3F; temp*=65536;//溢出时间总和 temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间 TIM_Cmd(TIM2,DISABLE); if(temp<1500) {stopward();t++;flag++; if(t==1) {Midstate=temp; TIM_SetCompare2(TIM3,60);//舵机右转} if(t==2){Leftstate=temp; TIM_SetCompare2(TIM3,250); //舵机左转 } if(t==3) {t=0; Rightstate=temp; TIM_SetCompare2(TIM3,150); rotate_Left();}} else { if(flag==0){farward_Low();} if(flag==1){turn_Left();} if(flag==2){turn_Right();} if(flag>=3) {flag=0;rotate_Left();} TIM_SetCompare2(TIM3,150);t=0;flag=0; } TIM_Cmd(TIM2,ENABLE); TIM5CH1_CAPTURE_STA=0;//启动下一次捕获}}2.4循迹模块设计这节要完毕的任务是使小车沿着黑带运动。要想使小车沿着黑带运动,必须使小车感应到黑迹在什么地方,然后让小车的中央解决单元驱动硬件电路完毕对应的行为动作。循迹模块的设计就是使小车能精确的识别黑带的轨迹。小车的中央解决模块从循迹模块获得数据,然后中央解决模块根据采集的数据驱动电机模块完毕对应的动作。考虑到成本和操作,本实验使用的红外探测器。2.4.1循迹模块构造及其原理红外探测器(IR)是由红外发射管、红外接受管和部分电路构成。要做到4路循迹,需要使用4个独立的红外探测器器件。我们使用的IR5是一种集成模块,这个集成模块由5个红外探测器构成。其中中间的1个IR探测器在本实验中并未使用。红外循迹模块实物图如图2.27所示:图2.27红外模块正背面本实验使用的IR5集成模块是由5个相似的IR探测器电路构成的,因此我们只需要理解一种IR探测器的工作原理即可。我们懂得IR探测器是由红外发射管、红外接受管和部分电路构成。基本原理是红外发射管发射红外光经地面反射,在黑色区域红外光被吸取,在非黑色区域红外光被反射,红外接受管根据反射光的强度为比较器提供模拟量,从而输出对应的电平量。其单个IR探测器电路原理图如图2.28所示:图2.28IR探测器电路原理图根据原理图详解下IR探测器的工作原理:VCC为模块提供电源,是IR探测器工作的前提条件,红外发射管DF2发射红外光达成“地面”,经反射后红外光会达成DS2红外接受管,由于不同颜色的地面会对光的吸取有着不同的效果,因此发射后的光的强度也会不同,反射强度不同,LM339的5脚会输入一种变化的电压量,LM339是一种电压较器,当LM339的“+”端输入信号不不大于“-”端的比较信号后,LM339的输出端截止,在外部的上拉电源的作用下,使IR探测器的输出端输出+5v的电压。同理,在“+”端电压不大于“—”端电压时,LM339输出端电压饱和使IR探测器输出为低电压。因此能够通过调节R2的电阻值,变化比较电压的大小即“—”端电压的大小,从而控制探测的距离。R4是整个正反馈电路的重要构成部分,由于“+”输入端电压会经常发生在比较电压附近扰动的现象,这些微小的扰动都会造成输出端的巨大变化,因此,我们采用正反馈的方式避免这种现象的发生。加入R4电阻,就成为人们所说的“施密特触发器”,其特性图如图2.29所示:图2.29施密特触发器特性图当输入端的电压发生转化时,只要在比较电压值附近的干扰不超出du之值,输出的电压就不会变化。R4正反馈的引入,不仅提高了电路的解决速度,并且能够免去由于寄生电路耦合而产生的自己震荡。但是,在提高电路的解决速度的同时,带来的缺点就是分辨率减少,由于只要在du附近输出的电压值就不会变化。2.4.2循迹模块电路设计IR5探测器的集成模块的电路原理图如图2.30所示:图2.30红外循迹模块电路图2.4.3红外循迹模块程序设计根据电路原理图,我们对循迹子程序进行设计,循迹子程序流程图如图2.31所示:图2.31循迹子程序流程图我们在循迹程序设计中,重要工作为:1、配备管脚与红外探测器的对应关系当红外探测器模块在黑带上方时,输出为0。当红外探测器模块在白色上方时,输出为1。因此我们采用中断的方式进行循迹,由于采用的是4路循迹,因此我们需要4个管脚与其一一对应,对应关系以下表:表2-3管脚与红外探测器位置对应关系表管脚名称红外探测器位置PE1左PE2最左PE3右PE4最右在配备好管脚与红外位置关系之后,我们就需要进行中断初始化,中断程序上文2.1.4节中已经讲过,我们在这里就不做介绍。2、编写中断服务函数我们在中断初始化之后,就需要写中断服务函数啦,我们就以PE1为例,当PE1的值发生变化时,我们就进入中断服务函数,在中断服务函数中判断红外探测器与否在黑带上方,如果在,此时我们需要使小车向左转,如果不在黑带上方,小车就继续迈进。其中断服务函数代码以下:#defineKEY3GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1)voidEXTI1_IRQHandler(void){if(KEY3==0) {Right_Low();} EXTI_ClearITPendingBit(EXTI_Line1);}//去除LINE2上的中断标志位3.软件调试每一章单独分页每一章单独分页上文提到了各个模块的电路设计及其程序设计,本章就根据各个模块的电路设计进行对应的编程。我们使用keil3软件进行程序仿真,然后使用mcuscip软件把我们得到的目的文献烧到解决器中,即程序下载。3.1程序仿真RVMDK源自德国的KEIL公司,是RealViewMDK的简称。支持ARM7,ARM9,和最新的Cortrx-M3核解决器,自动配备启动代码,含有强大的软件仿真功效,并且含有启动代码小,性能高的优点,软件keil3的操作主界面如图3.1所示:图3.1Keil主界面在程序仿真中,我们只能观察PC7脚位的电平变化,来判断与否满足超声波的发射条件,而对于超声波发射到接受的高电平持续时间t,我们在程序仿真中是无法观察到的。因此我们只能通过对硬件进行测试,来完毕对整个产品设计的考核。PC7的软件仿真成果以下图所示:图3.2PC7脚电平仿真图3.2程序下载串口下载软件使用mcuisp,该软件属于第三方软件,由单片机在线编程网提供,该软件启动界面如图3.2所示:图3.2mcuisp启动界面我们使用mcuisp软件进行程序下载,程序下载图以下所示:图3.3mcuisp程序下载图4.系统测试在程序调试中,我们懂得PC7的电平变化已经满足了超声波的发射条件,我们本节就是对硬件进行测试,验证本次方案与否成功。小车实物图以下所示图4.1智能小车实物图当小车前方碰到障碍时,小车舵机左转,观察左侧与否有障碍物,测试图以下:图4.2智能小车检测障碍图小车检测到前方有障碍时,舵机左转,检测小车左方与否有障碍,如果无,则小车左转,测试图以下图所示:图4.3智能小车避障图循迹模块采用的是中断的方式工作的,stm32微解决器通过采集红外探测器的数据,对电机发出不同的命令,下图为智能小车在循迹过程中所拍摄的画面:5.总结本文根据毕业设计开题报告书所布置的任务,制订了具体的设计方案,并按照此方案逐步完毕了电路原理图的设计以及软件程序的设计。本文的重点是基于stm32微解决器为核心,添加其它外围电路为辅助,并且加载必要的程序设计,使小车智能化行动。整个智能小车系统以stm32微解决器为核心,外围电路涉及避障电路、循迹电路、电机驱动电路等,这些外围电路通过stm32微解决器结合起来,使得各个模块在确保工作精确性的同时,提高了小车的智能化。论文首先分析了研究智能小车的研究意义,对于本次研究的必要性进行了可行性分析。然后分析了国内外的研究概况,最后再此基础上提出了设计思路与程序流程,对于设计思路进行了可行性的分析。接着分别介绍了各个模块的硬件设计方案以及软件设计方案。在硬件设计方案中涉及对各个硬件电路所采用的器件进行分析和对硬件电路的设计分析,从而决定器件的使用方案,以及硬件电路图的设计。而在软件设计方案中,我们只分析软流程件设计,以拟定对应的程序编码。最后我们对软件、硬件进行测试,对于软件测试,我们使用keil软件进行程序仿真,而对于硬件测试,我们使用mcuisp硬件调试工具进行程序下载,验证了系统的稳定性和实用性。在本方案中,由于受到所采购的硬件模块尺寸的影响,循迹模块在进行工作的时候,受到外部影响的因素很大。在本次实验设计中,由于循迹探头的安装距离小车车轮很近,当循迹探头采集数据传输到CPU时,小车已经向前行驶了一段时间。假设小车的转弯时间为T,小车的转弯时的速度为V,我们要确保小车转弯的路程不超出额定值S,那么就有公式VT<=S。要解决此问题,有两种方案可供选择。减小转弯时间T小车的转弯时间T与小车的转弯敏捷度成反比。在确保小车速度合适的状况下,我们只有减少小车的转弯时间来完毕对应的行为动作,即提高小车的转弯敏捷度。小车的转弯敏捷度与小车的车轮直径有关,具体来讲就是:在车轮角速度一定的状况下,车轮直径越大,有公式V=ωR,车轮的线速度就越大,那么在单位时间内有,小车的行驶距离就会变大。因此,小车的车轮直径与转弯敏捷度成反比,车轮直径越大,敏捷度就越小,相反车轮直径越小,敏捷度就越高。在本次实验中我们采用的车轮直径稍大,从而造成小车转弯的敏捷度大大下降。因此,我们能够通过减少小车车轮的直径大小来解决此问题。增加转弯额定值S在本次实验中,循迹探头距小车的车轮距离太近,造成小车的额定值S过小,进而造成小车在循迹工作时误差较大。解决此问题,我们能够拉大车轮与循迹探头的距离。上文提到的两种办法,又受到所采购的器件的物理尺寸的影响。在本次实验中,器件的物理尺寸限制了小车转弯敏捷度的最大值,因此本实验的循迹模块不是很抱负,但是只要我们采用上述的两种办法,一定能够提高循迹模块的执行效率。总的来说,设计方案是完善的,基本上达成了设计所规定的目的。致谢一种学期的学习和锻炼,使我的毕业论文设计基本完毕。在这期间,我在所学的基础知识之上,去接触stm32,在接触之初,我不停的碰到问题,而我也懂得不经一番寒彻骨,哪的梅香扑鼻来的道理,最后我克服了种种困难,不仅使自己的知识更加牢固,并且也锻炼了自己的心性。固然以上全部成绩的获得都离不开老师和同窗的协助。我首先要感谢的是我的母校,它为我提供了一种良好的学习环境,非常感谢学院领导对我们毕业设计有关工作精心合理的安排。固然,我的指导老师张健,我非常感谢他在我毕业设计的整个过程中始终予以的热情指导和督促,对我提出的疑惑耐心地指点,他的指点是我克服困难、完毕设计的重要因素,对我一种月的实习也产生了激励和支持的作用。同时我还要感谢汤飞同窗、柳晓峰同窗的真诚指点,以及其它各位老师和同窗的不吝指教,使我度过了紧张而又充实的三个月。毕业设计的这三个月,我不仅收获了知识、能力,也深刻的体会到了师情和友情的贵重,这段时光将成为我人生中少有的美妙回想,路漫漫其修远兮,吾将上下而求索,我会以此激励自己继续努力,争取使自己的人生对社会产生些许主动的价值!参考文献[1]杜春雷.ARM体系构造与编程[M].北京:清华大学出版社,-02-01[2]姚文详,宋岩.ARMCortex-M3权威指南[M].北京:北京航空航天大学出版社,-07[3]范书瑞.Cortex-M3嵌入式解决器原理与应用[M].北京:电子工业出版社,-01-01[4]李宁.基于MDK的STM32解决器开发应用[M].北京:北京航空航天大学出版社,:1-260.[5]刘军,张洋.原子教你玩STM32[M].北京:北京航空航天大学出版社,-05-01[6]彭刚,秦志强.基于ARMCortex-M3的STM32系列[M].北京:电子工业出版社,-01[7]张自强,晏英俊.基于stm32的步进电机转速控制实验设计[J].实验室科学,-12,13(6):59-61[8]周柱,孟文,田环宇.基于stm32智能小车设计[J].技术与市场,-06,18(6):1-2[9]李亚巨,樊东.基于stm32f103zet6的智能小车的制作[J].电子制作,-11,(19):52-53[10]赵志昊.智能小车的制作[J].科技传输,-11,(21):202-203[11]李婕.基于STM32的智能小车的制无线视频监控智能小车设计[D].兰州:兰州理工大学出版社,-4:1-56附录附录1voidTIM5_Cap_Init(u16arr,u16psc){ GPIO_InitTypeDefGPIO_InitStructure; TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; NVIC_InitTypeDefNVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //使能TIM5时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PA0去除之前设立 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//PA0输入 GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0下拉 //初始化定时器5TIM5 TIM_TimeBaseStructure.TIM_Period=arr;//设定计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler=psc; //预分频器 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设立时钟分割:TDTS=Tck_tim TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式 TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM5输入捕获参数 TIM5_ICInitStructure.TIM_Channel=TIM_Channel_1;//CC1S=01 选择输入端IC1映射到TI1上 TIM5_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿捕获 TIM5_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上 TIM5_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //配备输入分频,不分频 TIM5_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配备输入滤波器不滤波 TIM_ICInit(TIM5,&TIM5_ICInitStructure); //中断分组初始化 NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;//TIM5中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//先占优先级2级 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//从优先级0级 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能 NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断,允许CC1IE捕获中断 TIM_Cmd(TIM5,ENABLE); //使能定时器5}附录2voidEXTIX_Init(void){ EXTI_InitTypeDefEXTI_InitStructure; NVIC_InitTypeDefNVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE); //使能复用功效时钟//GPIOD.2中断线以及中断初始化配备下降沿触发 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1); EXTI_InitStructure.EXTI_Line=EXTI_Line1; //左1 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2); EXTI_InitStructure.EXTI_Line=EXTI_Line2; //最左 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOD.3 中断线以及中断初始化配备下降沿触发//右 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3); EXTI_InitStructure.EXTI_Line=EXTI_Line3; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOD.4 中断线以及中断初始化配备下降沿触发 //最右 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4); EXTI_InitStructure.EXTI_Line=EXTI_Line4; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn; //使能左1所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x06; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn; //使能最左所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x04; //子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; //使能右1所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x07; //子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn; //使能最右所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //抢占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x05; //子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指

温馨提示

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

评论

0/150

提交评论