基于MC9S12XS128微控制器智能车的软件设计.docx
- 文档编号:10410369
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:42
- 大小:804.90KB
基于MC9S12XS128微控制器智能车的软件设计.docx
《基于MC9S12XS128微控制器智能车的软件设计.docx》由会员分享,可在线阅读,更多相关《基于MC9S12XS128微控制器智能车的软件设计.docx(42页珍藏版)》请在冰豆网上搜索。
基于MC9S12XS128微控制器智能车的软件设计
基于MC9S12XS128微控制器的智能车软件设计与实现
摘要
2006年,第一届“飞思卡尔”杯全国大学生智能车竞赛在清华大学举行,随着2009年第四届竞赛的成功举办,该竞赛的影响力越来越大。
竞赛要求在组委会提供的赛车模型上,使用飞思卡尔半导体公司的8位或16位微控制器,通过自行增加传感及驱动电路,和编写相应控制软件,制作一个能自主识别道路的赛车,按照规定路线行驶,以完成时间最短者为胜。
因此,在智能车制作中,控制软件的设计和编写是非常关键和重要的技术。
本文主要介绍了,使用S12微控制器为核心和红外收发管为传感器智能车系统的软件设计。
包括PLL、PWM和ADC等主要模块的初始化,以及方向和速度的PID控制算法、无线数据采集等,还有设计过程中遇到的一些问题和解决办法。
关键字
微控制器,PID,智能车
DesignandImplementationofSmartCar’sSoftwareBasedonMC9S12XS128MCU
Abstract
In2006,thefirst"Freescale"NationalUniversityStudentSmartCarracewasheldinTsinghuaUniversity,withthefourthraceofthe2009success,theimpactofincreasingcompetition.
Racecarprovidedbytheorganizingcommitteeaskedthemodel,usingFreescaleSemiconductor's8or16-bitmicrocontrollers,throughtheuseadditionalsensoranddrivecircuit,Thepreparationofthecorrespondingcontrolsoftware,toproducearoadcarcanbeindependentlyidentified,inaccordancewiththeprovisionsofroutestocompletetheshortesttimeisthewinner.
Therefore,thesmartcarproduction,controlsoftwaredesignandpreparationiscriticalandimportanttechnology.ThispaperdescribestheuseofS12MCUcoreandtheinfraredtransceiver,intelligentvehiclesystemsforsensorcontrolsoftwaredesign.IncludingthePLL,PWM,andADCandothermajormoduleinitialization,andthedirectionandspeedofthePIDcontrolalgorithm,wirelessdataacquisition,aswellasdesigningsomeoftheproblemsencounteredandsolutions.
Keywords
MCU,PID,Smartcar.
第一章绪论
1.1背景
2006年,受教育部高等教育司委托,由教育部高等自动化专业教学指导分委员会主办,第一届“飞思卡尔”杯全国大学生智能车竞赛在清华大学举行。
该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。
竞赛要求在组委会提供的赛车模型上[1],使用飞思卡尔半导体公司的8位或16位微控制器,通过自行增加传感及驱动电路,和编写相应控制软件,制作一个能自主识别道路的赛车,按照规定路线行驶,以完成时间最短者为胜。
竞赛中的赛车模型按道路检测方式的不同,分为光电组、摄像头组、电磁组(第五届)分别进行比赛。
1.2现状
该竞赛迄今已成功举办了四届,从第一届共有25个省(自治区)、直辖市59所高校的112支队伍参赛开始,发展到第四届共有来自全国26个省(自治区)、直辖市的230余所高校的780支队伍参赛,分华南、西部、东北、华东与华北五大分赛区进行选拔。
说明该竞赛在全国高校中的影响力与日俱增,成为续教育部已举办的电子设计、数学建模、机械设计、结构设计等四大专业竞赛之后的又一重要赛事。
1.3技术路线
由于赛车是自行在赛道上行驶的,不允许人为操纵,而且赛道布局是比赛时当场揭晓,事先无法对赛车行驶路径进行预先设定,所以只能让赛车传感器反馈回的路径信息,自行在赛道上行驶。
要使赛车快速稳定的完成比赛,必须对其行驶过程的方向和速度进行控制[2],所以,要控制赛车的行驶方向和速度,就只能依据车身上各种传感器的反馈信息,来计算舵机和电机的控制量大小。
这就要涉及到各种各样的控制方法,比较常见的有比例积分微分控制(PID)、模糊控制(FUZZY)等方式。
其中PID控制以实现方法简单和控制过程稳定可靠,而应用范围最广,所以本文决定采用PID来作为小车方向和速度的控制算法。
1.4本文结构
本文主要是基于MC9S12XS128对智能车软件部分进行设计和开发。
第一章:
绪论(本章阐述了智能车竞赛的背景和现状,还有设计的大概思路。
)
第二章:
MCU(介绍了MCU的基本知识,以及MC9S12XS128的特点和资源。
)
第三章:
开发环境(介绍了IDE开发环境,以及CodeWarrior的基本使用方法。
)
第四章:
总体设计(介绍了智能车系统设计的各个模块和具体实现方法。
)
第五章:
软件设计(介绍了各模块的初始化,以及小车的控制算法的设计。
)
第六章:
设计总结(总结了设计的总体结果和过程中遇到的一些问题和不足。
)
第二章MCU
2.1什么是MCU?
MCU(MicroControlUnit)中文名称为微控制单元,又称单片微型计算机(SingleChipMicrocomputer)或者单片机,是指随着大规模集成电路的出现及其发展,将计算机的CPU、RAM、ROM、定时数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。
MCU按其存储器类型可分为无片内ROM型和带片内ROM型两种。
对于无片内ROM型的芯片,必须外接EPROM才能应用(典型芯片为8031)。
带片内ROM型的芯片又分为片内EPROM型(典型芯片为87C51)、MASK片内掩模ROM型(典型芯片为8051)、片内FLASH型(典型芯片为89C51)等类型,一些公司还推出带有片内一次性可编程ROM(OneTimeProgramming,OTP)的芯片(典型芯片为97C51)。
MASKROM的MCU价格便宜,但程序在出厂时已经固化,适合程序固定不变的应用场合;FALSHROM的MCU程序可以反复擦写,灵活性很强,但价格较高,适合对价格不敏感的应用场合或做开发用途;OTPROM的MCU价格介于前两者之间,同时又拥有一次性可编程能力,适合既要求一定灵活性,又要求低成本的应用场合,尤其是功能不断翻新、需要迅速量产的电子产品。
微控制器在经过这几年不断地研究、发展,历经4位,8位,到现在的16位及32位,甚至64位。
产品的成熟度,以及投入厂商之多,应用范围之广,真可谓之空前。
目前在国外大厂因开发较早、产品线广,所以技术领先,而本土厂商则以多功能为产品导向取胜。
但不可讳言的,本土厂商的价格战是对外商造成威胁的关键因素。
由于制程的改进,8位MCU与4位MCU价差相去无几,8位已渐成为市场主流;目前4位MCU大部份应用在计算器、车用仪表、车用防盗装置、呼叫器、无线电话、CD播放器、LCD驱动控制器、LCD游戏机、儿童玩具、磅秤、充电器、胎压计、温湿度计、遥控器及傻瓜相机等;8位MCU大部份应用在电表、马达控制器、电动玩具机、变频式冷气机、呼叫器、传真机、来电辨识器(CallerID)、电话录音机、CRT显示器、键盘及USB等;16位MCU大部份应用在行动电话、数字相机及摄录放影机等;32位MCU大部份应用在Modem、GPS、PDA、HPC、STB、Hub、Bridge、Router、工作站、ISDN电话、激光打印机与彩色传真机;64位MCU大部份应用在高阶工作站、多媒体互动系统、高级电视游乐器(如SEGA的Dreamcast及Nintendo的GameBoy)及高级终端机等。
2.2MC9S12XS128微控制器
MC9S12X系列[3]是HCS12系列的增强型产品,基于S12CPU内核,可达到25MHz的HCS12的2-5倍的性能。
S12X系列增加了172条额外指令,可以执行32位计算(共有280条指令),总线频率最高可达40MHz,并且具备完全的CAN功能,改进了中断处理能力。
S12X系列的CPU以复杂指令集CISC架构,集成了中断控制器,有丰富的寻址方式。
中断有7个优先级,并且内核支持优先级的调度,最多可有117个中断源,S12X可访问最多8MB的全部存储空间。
S12X系列最大的特点,是增加了一个平行处理的外围协处理器XGATE模块。
该模块是一个可编程的16位RISC核心,其设计运行频率可高达100MHz,是一个智能的、可编程的直接内存存储(DMA)模块,可以进行中断处理、通信和数据预处理,通过提供处围模块、RAM和I/O端口之间的高速数据处理与传输,卸载CPU的任务,提高单片机的数据处理能力。
S12XS系列保留了S12XCPU,去掉了另一个CPU——XGATE,保留了先进的技术,简化了操作,是S12X系列的经济型产品,目前有三种型号:
XS256、XS128和XS64,三者除了在内存方面有些差异,其余资源基本相同。
下面先简单地介绍下XS128的常用内部资源模块,如图2.1:
图2.1XS128内部资源
1.内存。
它拥有128KBFlash、8KRAM和8KDataFlash。
2.通信和I/O。
它拥有一个MSCAN模块,兼容CAN2.0A、B;一个串行外设接口(SPI)模块;两个支持LIN的串行通信接口(SCI);高达91个通用输入/输出(GPIO)引脚。
3.定时器和模数转换器。
它拥有一个ADC模块,提供8/10/12位分辨率,可复用为16个模拟输入通道;8通道8位,或4通道16位脉宽调制器(PWM);定时器(TIM),提供8通道16位输入捕捉或输出比较功能;PIT模块,提供4通道软件中断精确定时;RTI模块,提供基于晶振源频率的定时。
第三章开发环境
CodeWarriorDevelopmentStudio(开发工作室)是完整的用于编程应用中硬件bring-up的集成开发环境。
3.1CodeWarrior介绍
CodeWarrior[4]包括构建平台和应用所必需的所有主要工具:
IDE、编译器、调试器、编辑器、链接器、汇编程序等。
另外,CodeWarriorIDE支持开发人员插入他们所喜爱的工具,使他们可以自由地以希望的方式工作。
CodeWarrior开发工作室将尖端的调试技术与健全开发环境的简易性结合在一起,将C/C++源级别调试和嵌入式应用开发带入新的水平。
开发工作室提供高度可视且自动化的框架,可以加速甚至是最复杂应用的开发,因此对于各种水平的开发人员来说,创建应用都是简单而便捷的。
它是一个单一的开发环境,在所有所支持的工作站和个人电脑之间保持一致。
在每个所支持的平台上,性能及使用均是相同的,无需担心主机至主机的不兼容。
目前最新为5.0版本,该工具可以在Freescale公司首页上下载到,约329MB,如图3.1,是软件的整体界面。
图3.1CodeWarrior操作界面
3.1.1新建工程
一般初学,为了加深对MCU的了解,都采用手写代码的方式,初始化各个模块的寄存器,尝试新建一个项目[5],选择【GreateNewProject】,接下来选择MCU类型为【MC9S12XS128】,一般常用的调试模式为:
【FullChipSimulation】和【TBDML】,其它设置可以默认,也可以根据自己的需求来更改,比如需要在GUI界面下初始化时钟和输入输出等模块的话,可以选择【ProcessorExpert】,下面就可以开始编写自己的代码了。
3.1.2编写代码
工程文件生成以后,回到自动生成的文件系统。
这个文件系统中最重要的是main.c文件和TBDML_linker.prm文件。
main.c是用户需要开发的应用程序,TBDML_linker.prm文件定义程序的代码区和数据区,与系统硬件有关。
打开main.c,就可以直接在里面输入源码了。
3.1.3编译和仿真
编辑好源码后,单击【Make】按钮,如果没有报错,说明编译成功。
打开bin文件夹,有一个TBDML.abs.s19文件,这就是编译的结果。
再选择【FullChipSimulation】仿真模式,单击【Debug】按钮,可以在PC上仿真运行该程序。
3.1.4调试程序
CodeWarrior最大的特色就是支持在线背景调试模式【TBDML】[6],它可以让开发人员的调试过程变得简单直观,它支持单步运行、单步跳出、设置断点等。
它还能显示程序各个变量的值和标志位,以及汇编代码、内存地址数据,如图3.2,是整个调试工具的界面。
图3.2True-TimeSimulaor&Real-TimeDebugger
3.2编程语言
CodeWarrior目前支持C、C++和汇编语言,可以根据自己的喜好来选择。
针对智能车的软件设计来说,使用C和汇编语言,已经完全够用了。
C语言主要用来构建整个程序的框架[7],充实各个函数,而汇编语言用到的地方相对来说就要少很多,主要是用在单片机的软件复位和传感器的信号采集等,比如摄像头的采集,如果用C语言的循环结构来写的话,可能会出现采集到的信号不完整,或是完全采集不到信号的情况,这是因为其执行效率不够高、速度不够快的原因,在很短的周期内,根本执行不完所有的代码。
因此,需要换成汇编语言的顺序结构来执行,这样可以大大减少代码的执行时间,在下一个中断来之前,将中断服务程序中的代码顺利执行完毕,成功采集到视频信号。
3.3规范化代码
整个程序也许不是一个人就能完成的,因此,保持良好的代码格式很有必要。
全局变量,以及要用到的函数最好提前申明和初始化,这样在进行递归或嵌套调用的时候才不会出现错误。
在重点代码完成时,最好加上相应注释,不仅方便自己查找和修改BUG,也能为队友的学习和改进提供帮助。
在需要保证完全运行的函数,可以采用“临界区域保护的方法”,可以有效防止程序跑飞。
第四章总体设计
竞赛分为:
光电组、摄像头组、电磁组,因为所有的设计均要求在规则范围内实现,且本文主要介绍光电组智能车的软件设计,所以就只介绍光电组相关的规则和要求:
1.赛道。
宽60㎝(第五届为50㎝),白底,中间有25㎜的黑色引导线,赛道上有起始线、90°十字交叉线、窄道(第五届无)、15°之内的坡道,弯道最小曲率半径不小于50㎝(以中心引导线计算)。
2.车模。
尺寸不能超过250㎜×400㎜,不限高度。
3.传感器。
红外传感器接受单元计为1个传感器,发射单元不计算,编码电机算作一个传感器。
通过仔细的了解规则,才能准确的设计出符合要求的系统。
4.1硬件设计
经过分析,无论车模怎么设计,都离不开以下几个模块:
传感器采集模块、电机驱动模块[8]、舵机驱动模块、车速检测模块、MCU控制模块。
各个模块的具体功能流程图,如图4.1:
图4.1硬件模块功能流程图
下面介绍下硬件模块的功能:
1.传感器采集模块,使用12只光电收发一体管,每只间隔20㎜,用于对路面信息的采集,将实时路况反馈给MCU控制模块处理。
2.电机驱动模块,使用MC33886,通过MCU输出相应的PWM波,控制电机的运转。
3.舵机驱动模块,通过MCU直接输出相应的PWM给舵机,使其旋转相应角度。
4.车速检测模块,使用编码电机,结合MCU的脉冲输入捕捉功能,获得车模行驶时的速度,将其反馈给MCU进行处理和控制。
5.MCU控制模块,将各个模块所采集到的信息进行处理,通过相应控制算法,得出控制策略,从而保证车模的正常行驶。
4.2软件设计
通过对竞赛规则的仔细分析,得出详细的模块需求。
只有确定了具体硬件,才能设计出相应的软件。
因此,经过长时间的修改,最终得到了确定的外部硬件电路(此处本文不详述),从而设计出了软件部分的主体流程,如图4.2。
图4.2程序主体流程图
下面介绍下软件模块的功能:
1.系统模块初始化。
根据对比赛规则的了解和系统的规划设计,需要用到MCU的PLL、PIT、ADC、PWM、SCI、RTI、ECT、GPIO等模块,因此,在系统正常工作前,必须将用到的模块初始化。
2.路面信息和速度采集。
将传感器所采集到的电压经过AD转换后,得到数字量,用于取阀值和精确坐标计算,将编码电机的脉冲在一小段时间内进行记数,从而得到小车当前大致速度。
3.路面信息处理。
对AD转换后的数据先进行滤波,再进行黑线的提取和坐标的计算。
4.方向和速度控制。
通过PID控制算法,计算出方向和速度的偏差,从而进行调整控制。
第五章软件设计
根据总体设计里的程序主体流程图,可以将智能车的软件设计,主要分为:
系统模块初始化、路面信息和速度采集模块、方向和速度控制模块等。
5.1系统模块初始化
智能车系统软件,一般使用到微控制器的PLL、PIT、ADC、PWM、SCI、RTI、ECT、GPIO等模块。
本节重点介绍下PLL、PIT、ADC和PWM模块的初始化,因为这几个模块都是主要使用到的,其它模块就不一一详述了。
5.1.1PLL
MCU的指令执行速度跟总线频率成正比,XS128内置数字PLL锁相环,可以很方便的通过软件,需要用到得是如下几个寄存器:
1.CRGClockSelectRegister(CLKSEL),该寄存器控制着S12XECRG时钟选择,它的第7位PLLSEL,是PLL的使能位。
如果为0,禁止,则fBUS=fOSC/2;如果为1,使能,则fBUS=fPLL/2。
2.CRGSynthesizerRegister(SYNR),该寄存器是IPLL的分频因子,控制着fVCO的频率范围。
3.CRGReferenceDividerRegister(REFDV),该寄存器为IPLL提供更精确倍频系数。
4.CRGPostDividerRegister(POSTDIV),该寄存器控制VCOCLK和PLLCLK之间的频率比,fPLL=fVCO/(2*POSTDIV),如果POSTDIV=0x00,则fPLL=fVCO。
5.CRGFlagsRegister(CRGFLG),改寄存器是CRG模块的状态位和标志位,其中它的第三位LOCK,是IPLL当前状态标志位,写无效,为1时说明VCOCLK是在范围内的频率。
设置总线频率,是通过更改其分频因子寄存器SYNR和REFDV的值来实现的,如公式
(1):
公式
(1)
XS128的PLL设置,与DG128不太一样,分频因子寄存器的SYNR[7:
6](VCOFRQ[1:
0])和REFDV[7:
6](REFFRQ[1:
0])作了一些改动,如表5.1、5.2所示:
表5.1寄存器SYNR[7:
6]
表5.2寄存器REFDV[7:
6]
根据总体设计,需要40MHz的总线频率fBUS,也就是80MHz的fPLL,所以REFDV=0xc0|0x01,SYNR=0xc1|0x04。
值得注意的是,设置PLL模块后,需要两个指令周期左右的时间,等待锁相环稳定后再启用,才能初始化成功。
(程序详见附录1)
5.1.2PIT
该模块全称PeriodInterruptTimer,使用的是总线频率通过分频得到的定时周期,在XS128PIT模块中,需要用到得是如下几个寄存器:
1.PITContorlandforceLadMicroTimerRegister(PITCFLMT),该寄存器用于PIT模块的使能设置和工作方式设置,通常设置该寄存器中的PITE为即可,即PITCFLMT_PITE=1,使PIT使能。
2.PITChannelEnableRegister(PITCE),该寄存器用于对PIT模块中的4个通道使能进行设置。
如果使用某个通道时,对相关位进行置1即可,即PITCE_PCEx=1,其中x代表通道序号,为0~3。
3.PITMicroTimerLoadRegister0to1(PITMTLD0-1),该寄存器用于设置PIT模块中的8位计数器初值,以实现24位的计数。
设定值为0到255范围。
4.PITLoadRegister0to3(PITLD0-3),该寄存器用于设置PIT模块中的16位计数器初值,和8位计数器配合而成24位计数器。
设定值范围0-65535。
5.PITMultiplexRegister(PITMUX),该寄存器对定时器通道的8位时基进行选择。
因为8位计数器只有两个,所以在将8位计数器和16位计数器连接时,可以选择不同的8位时基。
当设置为0时,对应通道选择时基0;置1时,对应通道选择时基1。
如PITMUX_PMUX0=1为通道0选择时基1。
6.PITInterruptEnableRegister(PITINTE),该寄存器为中断使能寄存器,为不同的PIT通道中断使能。
设定为0时,相应通道中断禁止。
置1时,相应通道使能。
如PITINTE_PINTE0=1时,PIT通道0定时中断使能,当计数器递减溢出时,申请中断。
7.PITTime-OutFlagRegister(PITTF),该寄存器为溢出标志位,当某一通道的8位计数器和16位计数器递减到0时,该位置1。
给该位写1则清除该标志位,可以通过查询该位来判断定时是否完成。
本文设计使用PIT0作为小车运行时间的中断定时,周期为5ms;使用PIT1作为光电管采集路径信息、ADC转换和SCI无线数据发送的中断定时,周期为250us。
(程序详见附录2)
5.1.3ADC
该模块用于传感器采集,进行模数转换,将红外收发管的电压,转换为数字值给MCU处理,需要用到得是如下几个寄存器:
1.ATDControlRegister1(ATDCTL1),该寄存器的SRES[1:
0],是AD转换精度选择控制位,有8-bit、10-bit、12-bit可以选择。
2.ATDControlRegister2(ATDCTL2),该寄存器的第6位(AFFC),是选择是否使用ATD转换完成标志位快速清零,AD转换结束标志的清除方式有两种:
读结果寄存器自动清零和软件中断服务程序里手动写1清除。
3.ATDControlRegister3(AT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MC9S12XS128 控制器 智能 软件设计
![提示](https://static.bdocx.com/images/bang_tan.gif)