毕业设计基于stm32的智能小车设计.docx
《毕业设计基于stm32的智能小车设计.docx》由会员分享,可在线阅读,更多相关《毕业设计基于stm32的智能小车设计.docx(51页珍藏版)》请在冰豆网上搜索。
毕业设计基于stm32的智能小车设计
摘要
本次试验主要分析了基于STM32F103微处理器的智能小车控制系统的系统设计过程。
此智能系统的组成主要包括STM32F103控制器、电机驱动电路、红外探测电路、超声波避障电路。
本次试验采用STM32F103微处理器为核心芯片,利用PWM技术对速度以及舵机转向进行控制,循迹模块进行黑白检测,避障模块进行障碍物检测并避障功能,其他外围扩展电路实现系统整体功能。
小车在运动时,避障程序优先于循迹程序,用超声波避障电路进行测距并避障,在超声波模块下我们使用舵机来控制超声波的发射方向,用红外探测电路实现小车循迹功能。
在硬件设计的基础上提出了实现电机控制功能、智能小车简单循迹和避障功能的软件设计方案,并在STM32集成开发环境Keil下编写了相应的控制程序,并使用mcuisp软件进行程序下载。
关键词:
stm32;红外探测;超声波避障;PWM;电机控制
Abstract
ThisexperimentmainlyanalyzesthecontrolsystemofsmartcarbasedonmicroprocessorSTM32F103systemdesignprocess.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.绪论
智能小车通过各种感应器获得外部环境信息和内部运动状态,实现在复杂环境背景下的自主运动,从而完成具有特定功能的机器人系统。
而随着智能化电器时代的到来,它们在为人们提供的舒适的生活环境的同时,也提高了制造智能化电器对于人才要求的门槛。
智能小车是集成了多种高新技术,它不仅融合了电子、传感器、计算机硬件、软件等许多学科的知识,而且还涉及到当今许多前沿领域的技术,它是一个国家高科技技术水平的重要体现。
通过建立起简易智能小车的设计,引导学生从理论走向实践,培养同学们的动手能力,使同学们在了解智能化电器的工作原理的基础上,还使同学们获得完成整体项目的能力,并掌握了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系列的标准体系结构在2006年推出,此结构是用来满足日渐复杂的不同性能要求的软件设计,根据所面向的领域,Cortex系列可以分为A、R、M三个分工明确的系列[1]。
Stm32处理器的出现为微控制系统、工业控制系统、汽车车身系统和无线网络等对功耗和成本敏感的嵌入式应用领域实现高系统性能系统提供了基础,使编程的复杂性,集高性能、低功耗、低成本大大简化,并使它们融为于一体[2]。
意法半导体ST公司作为一个半导体制造厂商,是ARM公司Cortex-M3内核开发项目一个主要合作方。
2007年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启动模式表
启动模式选择引脚
启动模式
说明
BOOT1
BOOT0
X
0
主闪存存储器
主闪存存储器被选为启动区域
0
1
系统存储器
系统存储器被选为启动区域
1
1
内置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的边沿检测电路,这个边沿检测电路受到“上升沿选择寄存器”、“下降沿选择寄存器”的控制,我们可以控制这两个寄存器来选择中断的触发方式。
我们可以在程序中进行设置,比如EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;设置为上升沿触发中断
然后该外部信号进入编号为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
定时器中断模式
通过定时器中断,控制超声波的扫描周期
TIM3
PWM复用输出模式
控制小车速度及舵机转向
TIM5
输入捕获模式
采集超声波发射到接受的高电平持续时间t
2.1.6主程序设计流程图
在本节实验中,循迹模块以及避障模块都是采用中断方式进行工作的,因此其主程序流程图如下图所示:
图1.2主程序流程图
根据程序设计图,主程序设计如下:
intmain(void)
{
u8TIM5CH1_CAPTURE_STA=0;//输入捕获状态
u16TIM5CH1_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所示:
S4
图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端口与运动方向关系表
电机M1
IN1
IN2
电机M2
IN3
IN4
停止
0
0
停止
0
0
正转
1
0
正转
1
0
反转
0
1
反转
0
1
-
1
1
-
1
1
2.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来设置的,这里