瑞萨MCU模型车设计与制作_第1页
瑞萨MCU模型车设计与制作_第2页
瑞萨MCU模型车设计与制作_第3页
瑞萨MCU模型车设计与制作_第4页
瑞萨MCU模型车设计与制作_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

目录TOC\o"1-5"\h\z摘要IAbstractI\o"CurrentDocument"引言1\o"CurrentDocument"MCU模型车的结构组成及工作原理2\o"CurrentDocument"2.1传感器基板22.2传感器子基板32.3CPU主板4\o"CurrentDocument"2.4马达驱动电路5\o"CurrentDocument"2.5伺服舵机控制电路8\o"CurrentDocument"2.6发光二极管电路92.7开/关电路102.8电源10\o"CurrentDocument"MCU模型车的几何模型、运动学模型和动力学模型分析11\o"CurrentDocument"3.1模型车几何模型的建立与分析:11\o"CurrentDocument"3.2模型车动力学模型的建立与分析:123.3模型车运动学模型的建立与分析:16MCU模型车在指定轨道上运行的程序设计17\o"CurrentDocument"影响MCU模型车稳定运行的因素31结论32致谢错误!未定义书签。参考文献错误!未定义书签。1引言MCU模型车的设计与制作起源于由日本社团法人全国高中协会等主办的“JAPANMCU模型车大赛(英文:JapanMicomCarRally)”,目前这项赛事已经在日本成功举办了十余届。由于这项大赛的科技层次较高,并且具有很强的竞争性和观赏性,如今“JAPANMCU模型车大赛”已经成为日本国内的全国性重大赛事。2007年,由瑞萨科技冠名赞助的“瑞萨超级MCU模型车大赛”首次在北京举行,并被教育部列为“全国大学生IT&AT就业技能大赛”系列赛事之一。这个活动的目的是提高学生的制作能力和编程技巧水平,并培养业界相关人才。该项赛事首次举办就吸引了四十多所高校的六十多支参赛队伍,其中不乏许多知名高校。此次大赛的成功举办,不仅在于高校和大学生们对此项赛事的关注,更在于对大家对专业人才培养和锻炼的重视。该项赛事还将继续在我国举办。在高兴的同时,我们也应该清楚地看到,我国选手的MCU模型车在科技含量与创新层次上与国外高水平选手还有一定的差距。因此,为提高我国MCU模型车赛事的观赏性和赛事水平的竞争力,同时也为了提高我国高校大学生的科研能力、制作能力及创新层次,加强对MCU模型车的理论研究和科技创新具有一定的实际意义。

2MCU模型车的结构组成及工作原理MCU模型车基本上由以下几部分组成:传感器基板,传感器子基板,H8/3048F-ONE型号的CPU主板,马达驱动基板等。其整体结构如图1所示。图1传感器基板位于模型车的最前方,用于检测赛道信息。而传感器子基板则被固定在模型车车身上,对传感器输出的信号进行初步的预处理。安装在中心位置的CPU主板是整个模型车的核心部件,可以对模型车的各控制电路发出控制指令。位于车身最后的马达驱动基板是模型车驱动电路的集合体,在CPU的控制下它可以完成对左右马达和伺服舵机的驱动。21传感器基板如图2所示,传感器基板主要由8个一字等距排开的传感器组成。每个传感器都可以识别赛道上的黑白颜色,通过发光二极管显示传感器检测到的状态,并能将其转化为数字信号“0”或“1”输出。传感器基板作为整个模型车控制系统的起始端,就好比人的眼睛,能读取赛道路面信息,为模型车要产生的相应动作提供必要依据,其作用不可忽视。同时,其识别精度及响应时间都将对整个控制过程造成较大的影响。传感器主要由两部分组成,利用“白色反射光线,黑色吸收光线”的原理,一部分发射光线,另一部分接收光线。发射光线部分为发光二极管,其发射到赛道上的光线为红外线,并不能被肉眼察觉。接受光线部分为光传感器S7136,它能判断出是否有光线被反射到其接受面上,并能将其转化为数字信号“0”或“1”输出。传感器的工作原理为:如果赛道上光线集中的地方是白色(光线由传感器的发光部分射出),光线将会被反射,并且被传感器的光线接收部分接收。这样,传感器输出数字信号“0”,赛道上的该处被认为是“白色”,同时,具有指示作用的发光二极管工作。同理,如果赛道上光线集中的地方是黑色,光线将会被吸收,不能被光线接收部分接收,传感器输出数字信号“1”,该处将会被认为是“黑色”,具有指示作用的发光二极管不工作。传感器基板上的蓝色方形旋钮为可调电阻,可以调节传感器的灵敏度。当传感器在赛道上的白线处正常工作,黑线处不工作时,传感器灵敏度的调节工作就可以结束了。如果赛道上有灰色,要通过调节旋钮使发光二极管在灰色处也能正常工作,模型车才能够在整个赛道上顺利运行。光传感器S7136主要由震荡电路、时钟信号发生电路、发光二极管驱动电路、缓冲放大电路、标准电压发生电路、比较电路、信号处理电路、输出电路等组成。它属于标准元件,共有四个引脚,此处不对其内部结构做过多介绍。传感器基板的电路如图3所示:发射红外线的发光二极管(LED2)的阴极与光传感器S7136(接收光线部分)的引脚1连接,阳极通过旋钮调节电阻(该电阻可以调节LDE2的输出)与电源相连。S7136的引脚3是输出端,并与发光二极管(LED1)相连。因为在数字电路中“0”通常表示0V,“1”通常表示“5”V,因此,当S7136接收到光线时,引脚3输出“0”,LED1工作。反之,当S7136没有接收到光线时,引脚3输出“1”,LED1不工作。为了将每个光传感器引脚3的输出值送到CPU做后续处理,引脚3还与接口CN1的引脚2-9分别相连。另外,光传感器S7136的引脚2和引脚4还要分别与电源和地相连,这样就构成了完整的传感器基板电路。图3要注意:此时由传感器基板输出的信号为:“1”代表“黑色”,“0”代表“白色”。这与人们通常的思维习惯相矛盾。为了便于在设计程序时理解起来更方便,还需要对传感器基板的输出信号做进一步的处理。这就是下面要介绍的传感器子基板的作用。2.2传感器子基板传感器子基板的作用是将来自传感器的输入信号取反,使输出信号满足:当赛道颜色

为白色时输出值为“1”,当赛道颜色为黑色时输出值为“0”。从而符合人们的思维习惯。又因为来自传感器的输入信号并不是非常清楚,因此传感器子基板同时还具有波形成型和防止信号抖动的功能。传感器子基板的外观如图4所示。由上述内容可知:传感器基板与传感器子基板间的关系密切,理论上可以将二者合为一体,放到一块板子上。但是,考虑到传感器基板的重量会影响到伺服舵机转向的快速性,因此将传感器子基板固定在车身上以减轻传感器基板的重量。图5为传感器子基板的电路图:电路中,利用非门电路将输入信号取反,并采用元件74HC04实现该功能。图中电阻起到限流的作用。经过转化后的信号分别与接口CN12的图6图示即为模型车的CPU主板。该主板采用由日本瑞萨科技生产的H8/3048F-ONE芯片。它是整个模型车的核心,也是提高模型车性能的关键所在。它的主要作用是利用控制程序对模型车的各驱动部分发出控制指令,从而实现对整个MCU模型车系统的程序控制。CPU主板的结构较复杂。共有11个接口,分别为接口1至B,其中大部分为8位接口,还有4个是少于8位的接口。另外,主板上还有一个4位的DIP开关,可以调节控制马达转速的PWM输出值。CPU主板的核心部分为H8/3048F-ONE芯片,该芯片共有100个引脚,可以实现对整个模型车的程序控制。而控制程序的输入还需要通过一个导入开关才能实现。然而,虽然主板上有11个接口,但是整个模型车系统只用到了接口7和接口B两个接口,使整个系统并未变得特别复杂。模型车开始工作后,该CPU主板从接口7读取传感器数值,经过执行芯片中定义的接口程序和创建的主控制程序得出左、右马达和伺服舵机的响应动作及其输出值,并将其通过接口B输出到马达驱动基板,以达到对模型车驱动系统控制的目的。2.4马达驱动电路马达驱动电路位于马达驱动基板上(马达驱动基板整体外观如图7所示),其作用是根据微处理器的指令来控制马达。但是来自微处理器的信号非常微弱,即使把马达直接与信号线相连,也不会产生任何响应。为了能控制马达,这个微弱的控制信号必须转化成可以诱发数百至数千毫安电流的信号。图7要使马达旋转,只需施加相应的电压。而要使马达停止,只需撤掉电压即可。但是,要如何才能实现速度的精确控制呢?下面将对这个问题进行详述的讨论。采用调节电阻可以改变电压。但是,这个调节电阻必须具有很大的热容量,因为马达工作时,将有大量的电流流向马达。对于没有施加到马达上的过剩电压,将会在电阻上以热辐射的形势被消耗掉。而此处采用的方法是不断重复高速的开、关操作来进行电压控制,其最终的结果就好像是高低电平间的某个电压值被输出。在固定的周期内,重复的开、关操作可以控制开、关比率的改变。这种控制方法称为“脉宽调制”,简称为PWM控制。脉宽的开通比率称为工作比率。当在一个周期内开通宽度被设定为50%时,可以称作工作比率为50%。还可以简称为PWM50%。下图即为脉宽调制(PWM)的示意图。图8不过“PWM”听起来有些难以理解。其实手动“接通”、“断开”马达与电池线的连接也被称为PWM。当接通时间较长时,马达旋转速度快。当断开时间较长时,马达旋转速度慢。手动“接通”、“断开”操作的执行可以在数秒内完成,但是,如果采用微处理器的话,这个过程只需要数毫秒。当这个PWM信号与马达相连时,马达的旋转速度就可以按照程序的设定来工作,哪怕只发生微小的变化。这样一来,精细的速度控制就能够实现了。当电路中连有发光二极管时,发光二极管的明亮程度可以通过PWM来改变。如果用CPU进行PWM控制,这项工作可以在数毫秒,甚至数微秒内完成。一个平稳的马达控制就可以实现了。这里,之所以采用脉宽控制,而不采用电压控制,是因为CPU非常善于处理数字值“0”和“1”,对于类似于xV这样的值处理起来则非常困难。虽然通过改变“0”、“1”的宽度表现的就像是电压控制一样,但实际上却是PWM控制。马达正、反转以及刹车的控制是通过H桥电路来实现的。H桥电路的原理图如图9所示,马达位于中心位置,4个开关分别位于两侧,共同构成一个H形。改变4个开关的状态就可以实现马达正、反转以及刹车的控制。此处的开关,是由FET(场效应晶体管)组成的控制开关。P沟型FET用在电源正极,N沟型FET被用在负极。对于P沟型FET而言,当G端电压<S端电压时,导通电流。而对于N沟型FET而言,当G端电压>S端电压时,导通电流。也就是说,无论是P沟型还是N沟型的FET,只要D端与,端有电压,就会有电流从其中导通。图9必须注意:左侧或右侧的两个FET不能同时接通。因为,如果那样的话,10V的电源与接地之间就没有任何负载存在了,就好像短路一样。它将会烧毁FET或者导线。马达在实现正、反转以及刹车的控制过程中,H桥电路的左侧和右侧两个FET的G端电压总是相同的。因此,可将左右两侧的上下两个FET的G端分别相连,以简化电路。

当H桥电路被连接到整个控制电路中,并且执行PWM控制时,FET将会变得很热。这是因为,当信号从FET的门输入,并且PWM控制在FET的D端与S端执行时,根据图10中的“理想波形”图可知,由于P沟型FET和N沟型FET反应迅速,正转与刹车之间可以实现平稳的转换。然而实际波形中却存在延时,并不能立即执行。事实上,FET由开变关时的延时要比由关变开时的延时长。正如图10中的“实际波形”所示。虽然延时很小,但是同侧的两个FET都将会因延时造成短时间导通,引起电路短路,并产生大量的热能。j:BrakeNormalrotationONj:BrakeNormalrotationONxjr1rONOFFMotorGatePchFBTOperationNchFBTOperationBrake[rotationrake【**s87ns3L_._.….is;225ns-〜\…7Motor•GateiPchFETOperationNchFETOperationONOFFCNOFF理想波形实际波形图10从接通到实际开始产生反应的延时的持续时间称为“接通延时”,第一次打开到实际接通的时间称为“上升时间”。从断开到实际开始产生反应的延时的持续时间称为“断开时间”,第一次断开到实际断开的时间称为“下降时间”。实际上,由断开到接通的时间是“接通延时+上升时间”,由接通到断开的时间为“断开时间+下降时间”。由于延时的作用,马达驱动电路会产生短路的现象。防止短路的方法是利用电路及FET的开关特性来产生特定的延时,从而使同侧的P通道和N通道的FET不同时接通或断开。马达驱动基板中用来产生延时的部分是积分电路(图11所示)。因为有许多有关于积分电路的专业书籍,此处不对其作过多叙述。积分电路图如下,并可通过下式计算延时T=CR[s]。其中,电阻值为9.1千欧姆,电容大小为4700皮法,因此,延时T=42.77[us].图11该电路中采用了74HC14。对于74HC系列产品而言,当输入电压为3.5V或者更高时,电信号将会被转换为数字信号“1”。在74HC14的实际波形中,电压达到3.5V所需要的时间大约为50us。这个50us的延时是由上面积分电路产生的。因为,除了FET,数字品体管对于电压转换的延时取决于FET门的容量。综上所述,我们可以得到较完整的马达驱动电路。下图即为左马达的驱动电路图。它除了包含积分电路和由FET组成的H桥电路外,还包含了正、反转变换电路。电路图中,PB1是PWM的终端,PB2可以改变马达的正、反转。当接口PB1信号为“0”时,可以实现马达制动;为“1”时,执行接口PB2能够实现的操作。而对于PB2的信号而言,为“0”时,马达正转;为“1”时,马达反转。电路中还采用了分别由74HC08和74HC32实现的与门电路和或门电路。图12电路分析:品体管元件TR5、TR6、TR7、TR8可以分别将0V—5V的电压信号转换为10V—0V的电压信号。当PB1的信号由“0”变为“1”时,FET2的门电压由10V变为0V,FET2断开。然而,由于FET2自身延时的作用,FET2的断开将会被拖延。此时,由于FET1和FET2均断开,马达将进入自由状态。由于积分电路也会产生延时,FET1的门电压将会在自身延时和积分电路产生的50us延时后由10V变为0V,FET1接通。相反,当PB1的信号由“1”变为“0”时,FET1的门电压由0V变为10V,FET1断开。同样由于FET1自身的延时作用,FET1的断开将也将会被拖延。此时,由于FET1和FET2均断开,马达也会进入自由状态。由于积分电路也会产生延时,FET2的门电压将会在自身延时和积分电路产生的50us延时后由0V变为10V,FET2接通。对FET3和FET4的分析与FET1和FET2类似。虽然马达驱动电路能很好的满足控制要求,可是,在过程中却去出现了暂时无法控制的自由状态。自由状态是为了避免短路,而由积分电路产生的。因此,在程序中无法控制这个自由状态。改变积分电路中电阻和电容的值,就可以改变自由状态存在的时间。2.5伺服舵机控制电路伺服舵机(如图13所示)为模型车的前轮转向机构,是模型车不可或缺的重要组成部分。其转动范围、响应速度及动作准确性均会对模型车的运行状态产生较大影响。伺服舵机的控制方法仍采用PWM控制,这样不仅能够保证动作的准确性,而且便于实现。加载到伺服舵机的脉冲周期为16ms,并且伺服舵机的转角大小取决于脉冲的接通宽度。伺服舵机的旋转角度与接通脉宽之间的关系为:当接通脉宽为0.7ms时,伺服舵机向左旋转90度;当接通脉宽为1.5ms时,伺服舵机位于中心位置;当接通脉宽为2.3ms时,伺服舵机向右旋转90度。控制该伺服舵机的PWM信号由H8微处理器的复位同步脉宽调制模式产生。并且由接口B的第5位输出。改变控制程序中的ITU4_BRB(ITU4寄存器中的缓冲寄存器)的值就可以实现对接通脉宽的调节。ZH50图14ZH50伺服舵机的控制电路图如图14所示。虽然接口可以与伺服舵机的引脚1直接相连,但是或门电路仍然作为一个缓冲器而存在于电路中。因为,当电源线错误的与引脚1相连或者有噪声混入且使端脚毁坏时,如果采用直接相连的方法,微处理器的接口将被烧毁,那将是致命的。相比之下,如果采用74HC32作为缓冲器,由于它的结构更简单、价格更便宜,即使毁坏,也不会造成太大的麻烦。伺服舵机的引脚2是电源供应接口。当为马达提供电源的电池少于4节时,JP1的上部短接,直接与电源连接。当电池数多于4节时,为了避免电压过高,供给给伺服舵机的电压被3端调节器限定为6V,并且JP1的下部短接。2.6发光二极管电路马达驱动基板上连有3个发光二极管。其中,两个(LED3和LED2)可以通过微处理器中的控制程序来控制其开/关状态。这两个发光二极管的负极分别直接与微处理器的接口6和接口7相连,正极与电源相连。限流电阻为1千欧姆。显而易见,该电路中的导通电流I=(电源电压一发光二极管的端电压)/限流电阻。如果数字信号“0”从PB7输出,发光二极管LED2负极电势为0V,电流导通,发光二极管工作。如果数字信号“1”从PB7输出,发光二极管LED2负极电势为5V,两端电压为0V,电流不导通,发光二极管不工作。发光二极管LED3的工作原理与上述相同,不同之处是与接口6相连。

IFB&>图152.7开/关电路马达驱动基板上还有一个按钮开关,其作用是使模型车由无限等待状态跃变为开始执行主控制程序。该按钮开关通过10千欧姆的限流电阻与接口B的第0位(即PB0)相连。如果按钮没被按下,数字信号“1”将通过限流电阻输入到PB0。相反,如果按钮被按下,数字信号“0”将会通过接地端输入到PB0。R1Oi0k图162.8R1Oi0k众所周知,提升驱动系统的电压可以提高马达的旋转速度。整个模型车系统系统采用8节AA型电池作为动力源,电压可以达到9.6V。而这8节电池为控制系统和驱动系统所共享。对于马达,即使加载9.6V的电压也不会出现故障。然而,由于CPU能够保证正常工作的电压仅在4.5V-5.5V之间,如果电压高于5.5V,CPU将会损坏,如果电压低于4.5V,CPU将会复位。因此,需要三端调节器(LM2940-5)将CPU控制系统电压限定为5V。而LM350及其附件部分,将会产生供给给伺服舵机的6V恒定电压。3MCU模型车的几何模型、运动学模型和动力学模型分析对MCU模型车的研究,除了要编写并调试相关的控制程序外,还要对其运动过程作深入的分析。模型车在赛道上的运行过程包括较多种情况,其中最典型的为弯道制动过程。对这些运行情况的综合分析,有利于我们更好地了解模型车的整个运行过程,并为程序的编写提供充足的理论依据和科学的运行参数。本文以转弯过程为例,对模型车建立了相关的几何模型、运动学模型及动力学模型,并做了较详细的分析。3・1模型车几何模型的建立与分析:模型车的几何模型如下:其左右后轮的中心距离T=0.14m,前后轮轴心距W=0.175m。图17当模型车转弯时,伺服舵机转角与左右马达PWM值之间应保持一个确定的比例关系,使三者之间相互协调,才能保证模型车在弯道以最佳状态通过,其关系可通过下面的推导方法得出。在转弯过程中,左后轮、后轮轴中心、右后轮以及伺服舵机中心的轨迹为同心圆,并设其轨迹半径分别为r1、r2、r3和r。同时,设伺服舵机的转角为0。根据图18所示几何关系,可得出r2与转角0的关系为:tan0=W/r2而由r2又可得出半径r1与r3的值:r1=r2-T/2;r3=r2+T/2若假设右马达的速度比率为100,则可以求得舵机转向时与之相匹配的左马达的速度比率,其值为:r1/r3x100。利用上述方法,可以求出右马达速度比率为100,舵机转角从1度变至45度时,左马达相应的速度比率值。并以表格形式列出(参见附件)。若右马达的速度比率不是100,此时设为x,则左马达的速度比率为:x/100x(r1/r3x100)。

图18当在程序中涉及到伺服舵机转角时,除了降低马达转速以外,还要尽可能使左右后轮满足上述关系,以使伺服舵机和左右马达在模型车运行过程中达到相互协调的效果。上面讨论的是舵机左转时,左右马达的速度比率情况。对于舵机右转的情况分析,与上述思想相同。如果舵机的中心值调节合适,因为其具有对称性,可以通过将左转时左右马达的速度比率对换,即可得到右转时与舵机转角相对应的速度比率值。3.2模型车动力学模型的建立与分析:在模型车的整个运动过程中,其弯道的动力学分析最具有代表性,难度也最大。本文以模型车弯道制动过程为例,来建立其动力学模型,并作简要分析。为了使对模型车的分析与汽车更接近,从而具有更深刻的实际意义,此处假设不存在舵机,模型车的转向依靠左前轮和右前轮的自身转向来实现。由于模型车的重量较实际汽车的重量轻许多倍,这样的假设并不会对模型车的理论分析造成太大的误差。当模型车在水平的弯道上等速行驶时,拟作如下的假设:1)模型车是做平行于路面的平面运动,即只有前进运动、侧向运动和绕垂直轴的横摆运动。不考虑其俯仰运动和侧倾运动,及制动时负荷的前后转移。但计及了做圆周运动时由于向心加速度引起的左右负荷转移。2)不考虑制动过程中赛道摩擦系数的变化,即认为附着系数为常数。3)只考虑滚动阻力。4)在制动过程中,当某一车轮(i轮)达到附着极限工况时,认为该车轮所受的纵向力、侧向力和垂直力满足下面的关系:F2+(mF)2=(甲F)式中F、F"七分别表示作用于车轮上的纵向力、侧向力和垂直力,单位N;中表示纵向道路附着系数;m表示轮胎系数。下图为模型车弯道制动动力学模型。oxyz为固结于模型车上的动坐标,o为模型车的重心;x轴、z轴处于模型车纵向垂直于地面的中平分面内,z轴过模型车垂心垂直于地面,指向下放为正;x轴过重心平行于地面,指向模型车前进方向为正;y轴过重心,面对模型车前进方向时,指向右侧为正。根据右手定则确定模型车绕z轴的横摆角速度丫的正方向为顺时针方向。图19该动力学模型中,模型车具有三个自由度:沿x轴的纵向运动V;沿y轴的侧向运动v;绕z轴的转动丫。根据达朗贝尔原理,可得到三自由度的模型车运动方程:EF=M(V-Yv)x<EF=M(v-YV)

勇吃」Y

式中M——模型车总质量,单位kg;V一模型车质心处速度在动坐标系中沿x轴方向的速度分量,单位m/s;v一模型车质心处速度在动坐标系中沿y轴方向的速度分量,单位m/s;『——模型车绕z轴的横摆角速度,单位rad/s;模型车对Z轴的惯性矩,单位kg.m2。设F/L2,3,4)为作用于各轮上的地面制动力(N),其值为:fFfFF=〈PBi肿FziF<9FmziF>9FMizi制动器制动力,N;F——各轮所受的垂直负荷,N。由于模型车前轮无制动,即F和F均为0,因此前轮的地面制动力为0。而模型车MiM2的后轮转速是靠PWM值控制的。改变驱动后轮的PWM值,就可以改变后轮的转速。模型车后轮速度改变的过程,即为模型车的制动过程。其制动力的大小与PWM值的改变程度、齿轮啮合的紧密性及马达的响应速度密切相关。设车轮的滚动阻力为F,其值为:F=fMg,式中f为滚动阻力系数。设E(i=1,2,3,4)为各轮所受的侧向力,取轮胎系数m=1,其计算公式为:ka

::二7(9F)2一FM0F2+(ka)2<(9F)2F2+(ka)2>(9F)2且F<9FFka

::二7(9F)2一FM0而各侧偏角的计算公式如下:v+v+a•yQa=oV+*y2v一b•y

a=V+•y23V-*12y23V-*12y2V-34•y2"2、134分别表示前后轴轮距,单位为m。而o代表前轮平均转角,单位为rad。a、b分别表示前轮轴心到重心的距离和后轮轴心到重心的距离,单位为m。其中,模型车各轮垂直负荷的确定方法如下:当模型车处于静平衡状态时,各轮的静载荷为:F=F=业一MgF=F=^—Mgz10z202Lz30z402L当模型车转弯行驶时(右侧),左侧车轮负荷增大,右侧车轮负荷减小,左右各轮负荷转移量为:△Fz11=—△Fz12Chb+—hL1M+—MMh)—s巨1t12.(v+YV)=(+1匕1+匕2T—Mg△Fz31=—△Fz41C/m2ha+—hL2M1LL2M-我\.l(v+yV)=(+2匕1+匕2—M,g+,-MR2t34其中,C甲1、C史——前后悬架侧倾角刚度,N•m/rad;h中一一模型车悬挂质量质心至侧倾轴线的距离,m;h1、h2——前后侧倾中心离地高度,m;M、M一一前后非悬挂质量,kg;|J1|J2h卬、h“——前后非悬挂质量质心至侧倾轴线的距离,m;M、一一模型车的悬挂质量,kg;L一模型车前后轮轴的中心距离,m。因此,可知在模型车转弯制动过程中,各轮所受的垂直动负荷为:F=F+F(i=1,2,3,4)也就是说:F=z1M.「心cTJ/T71/C91h9-+b—hL1+M——^1MshR1M)st12.-(v+YV)Lbg—H(V—Yv)]+(2LC卬1+C92—MgF=z2M.C91h9+b—hL1+M——Mshr1)M.(v+YV)2lLbg-H(V-Yv)]-(91+C92—Msh9gst12F=z3M.2ltag+H(V—Yv)]+(91+C92h9C—M92Rg+ah2+MR2MshR2M)st34.:(v+YV)F=z4M.匕人+a+Mnc_rM)「t34.l(v+YV)Lag+H(V—Yv)]—(2LC91+929C92—M/9ghL2任2MshR2综上所述,我们可以得到模型车在弯道制动过程中的动力学模型方程:-(F+F)cos8-(E+E)sin8-F-F-F=M(V-yv)(E1+E)cos8-(F+F)sin8+E+E=M(v+yV)vt[(E+E)cos8-(F+F)sin8]a+[(F一F)cos8+(E一E)sin8]-^+12B1B2B2B1212t.(F-F)f-(E+E)b=Iy通常情况下,模型车是由直道进入弯道的,因此模型车进入弯道时的初始条件为:V=V,v=0,y=0,V'=0,v=0,y'=0。可利用四阶龙格库塔法求解有0m00000关初值的问题,此处不作介绍。模型车在弯道的行驶过程为先做弯道制动运动,稳定后再做匀速圆周运动。上面已经对弯道减速制动过程的动力学模型做了详尽叙述,随后的匀速圆周运动过程与弯道减速制动过程的分析方法相似,且比较简单,此处同样不做过多分析。3.3模型车运动学模型的建立与分析:此处同样以模型车在弯道的运动过程为例,进行建模分析。不考虑模型车的弯道制动过程,只分析其做匀速圆周运动的过程。模型车在弯道的理想运动状态是模型车舵机产生摆角后的运动轨迹与圆弧赛道为一组同心圆。设传感器基板中心运动轨迹半径为R,舵机中心运动轨迹半径为1,圆弧赛道中心半径为‘°,传感器基板中心至圆弧赛道中心的距离为d,舵机中心全传感器基板中心的距离为1。假设模型车在弯道运行过程中,传感器的状态保持不变,也就是说,舵机以恒定的摆角通过弯道,则其运动学模型简图如下:图20由于赛道为指定的赛道,则其弯角中心轨道的半径,。已知。而1和d的值可以通过测量获得。又根据几何关系得出:R-‘=d,r=\R2+12且W/r=sin0。将上式联立,可得到模型车在理想状态下弯道运行的最佳舵机摆角值:0=arcsinK=arcsin.叱「=arcsin,叱r\R2+l2\.'(r+d)2+l2并且,可以根据舵机摆角值求出与之相关的左右马达的速度之比。然而,模型车在赛道上的运行情况受到诸如:进入弯道前的直道速度、弯道制动过程、轮胎与赛道表面的摩擦系数、舵机的响应速度等一系列因素的影响,其理论值并不能很好的满足其运行状态。因此,必须通过大量的实验对其理论值进行修改和校正,才能的到满意的运行结果。至此,我们已经完成了对模型车在赛道上运行的典型过程(即:弯道运行过程)的几何模型分析、动力学模型分析和运动学模型分析。而根据对弯道运行过程的建模与分析,我们又可以很容易得到模型车在任何运行情况下的模型,并能对其做出科学的理论分析。这对于模型车运行状态的研究有着至关重要的作用,并能依此对各运行状态编写相关的控制程序,最后经过综合得到能使模型车在指定赛道上顺利运行的主控制程序。4MCU模型车在指定轨道上运行的程序设计MCU模型车是在预先设定好的具有明显黑白条纹的赛道上运行的,具有自动识别功能的MCU汽车模型。它的自动识别控制主要靠输入到瑞萨科技所生产的单片机芯片中的控制程序来实现。由于模型车组件较多,结构较复杂,且功能多样,其中任何一部分出现问题都将会影响模型车的正常运行。为了保证各部分均能按指定的要求工作,我们还需要对每个部分分别进行调试。因此,特为其编写了两组程序,分别为测试程序kit05test.c和主程序kit05.c。由于单片机不能直接执行C/C++程序,必须将编好的测试程序kit05test.c和主程序kit05.c进行转换后才能够输入到单片机中。以主程序的转换过程为例:已经编好的程序kit05start.src与kit05.c分别经过汇编和编译后,生成的文件kit05start.obj和kit05.obj再与文件kit05.sub进行连接,生成kit05.abs,然后再将其进行编译就可以得到瑞萨单片机所能执行的kit05.mot文件。首先,介绍一下程序中定义的一些变量的意义及其计算方法。#defineTIMER_CYCLE3071#definePWM_CYCLE49151#defineSERVO_CENTER4585#defineHANDLE_STEP26#defineMASK2_20x66#defineMASK2_00x60#defineMASK0_20x06#defineMASK3_30xe7#defineMASK0_30x07#defineMASK3_00xe0#defineMASK4_00xf0#defineMASK0_40x0f#defineMASK1_10x81ITU标志着CPU操作时钟的时间。而TIMER_CYCLE是在ITU0寄存器中设置一毫秒时间所需要的值,它将会被存放到变量ITU0_GRA(通用寄存器A)中,通过与ITU0_CNT(定时器计数器)进行比较来设定这1ms的时钟周期。ITU0_CNT好比时钟的秒针,每隔一段确定的时间间隔,其值就会增加1。它是一个标准值。此处,我们需要让它循环一次的时间为一毫秒。单片机上石英晶体的固有频率为①=24.576MHz,我们取其频率的1/8,则每一次计数的时间间隔T=1/f=325.52ns。由于我们要设置的时间为1ms,因此,需要3072次计数,即ITU0_CNT=3072时,结束一个循环周期。但是,根据ITU的标准执行程序,知道只有当“ITU0_CNT=ITU0_GRA+1”时,才产生一次中断,即经过一个时钟周期。因此,需要使ITU0_GRA=3071,也就是说TIMER_CYCLE=3071。PWM_CYCLE是控制PWM周期大小的变量,它被存放到ITU3_GRA(通用寄存器A)中,由于要加载到左马达、右马达和伺服舵机的PWM周期为16ms,而定时计数器ITU3_CNT与ITU3_GRA的标准关系为:当满足ITU3_CNT=ITU3_GRA+1的条件时,产生一次中断,ITU3_CNT(ITU3寄存器的定时计数器)循环一个周期,该周期即为PWM的周期值。而又知ITU3_CNT=(16x10-3)+[1;(①+8)]=49152。因此,需要使ITU3_GRA=49151,也就是说PWM_CYCLE=49151。变量SERVO_CENTER是在程序中控制伺服舵机面向前方(即:转角为0)的值。而上面提到,伺服舵机的PWM周期为16ms,当接通脉宽大约为1.5ms时,舵机面向正前方,所以变量SERVO_CENTER的值应该为(1.5x10-3);[1;(①;8)]=4608。然而,由于伺服舵机在生产过程中受各种因素的影响,不可能使每一个舵机的中心值均与理想值相同。因此,要使舵机在转角值恰为中心值SERVO_CENTER时,面向正前方,还需要对理论值进行调试校正。经过调试后,将该值取为4585。HANDLE_STEP是舵机旋转1度时,程序中与之对应的舵机转角值应增大或减小的幅度。对于伺服舵机而言,PWM的接通脉宽为2.3ms时舵机向右旋转90度,程序中与之对应的转角值为(2.3x10-3)+[1H①+8)]=7065;PWM的接通脉宽为0.7ms时舵机向左旋转90度,程序中与之对应的转角值为(0.7x10-3)-[1-(①;8)]=2150。两值之差4915即为舵机旋转180度时要改变的程控值。因此,舵机旋转1度要改变的程控值为27。然而此处变量HANDLE_STEP的值定义为26,是为了保持其兼容性。MASK2_0是一个十六进制的值,它标志着对传感器输入状态的限制。其意义为:传感器基板上的左侧4个传感器中的两个传感器输出值和右侧4个传感器中的0个传感器输出值可以被正常使用,其余的全部被掩盖,值为0。MASK2_0定义为:传感器基板上除了第6、5位的输出值可以正常使用外,其余各位的输出值均被“0”覆盖。同理,MASK2_2定义为:传感器基板上除了第6、5、2、1位的输出值可以被正常使用外,其余各位的输出值均被“0”覆盖。MASK0_2定义为:传感器基板上除了第2、1位的输出值可以被正常使用外,其余各位的输出值均被“0”覆盖。MASK3_3定义为:传感器基板上除了第7、6、5、2、1、0位的输出值可以被正常使用外,其余各位的输出值均被“0”覆盖。MASK0_3定义为:传感器基板上除了第2、1、0位的输出值可以被正常使用外,其余各位的输出值均被“0”覆盖。MASK3_0定义为:传感器基板上除了第7、6、5位的输出值可以被正常使用外,其余各位的输出值均被“0”覆盖。MASK4_0定义为:传感器基板上除了第7、6、5、4位的输出值可以被正常使用外,其余各位的输出值均被“0”覆盖。MASK0_4定义为:传感器基板上除了第3、2、1、0位的输出值可以被正常使用外,其余各位的输出值均被“0”覆盖。MASK1_1定义为:传感器基板上除第7、0位的输出值可以被正常使用外,其余各位的输出值均被“0”覆盖。为简化程序的设计结构,程序中还用到一些函数。这里,对这些函数的具体内容及作用作简单介绍。位转换函数charunsignedbit_change(charunsignedin){unsignedcharret;inti;for(i=0;i<8;i++){ret>>=1;ret|=in&0x80;in<<=1;}returnret;}函数中,变量“in”是位转换前的8位二进制数值,变量ret是经过位转换后函数的返回值。该函数的功能是将8位二进制数的前后对称的二进制位两两互换。其实现过程如下:先将变量ret右移一位,使第7位为0,第0位消失。随后,对变量ret的第7位与输入变量in的第7位进行或操作,并将取或后的值存到前者中。由于ret的第7位通常为“0”。因此,或操作后,变量ret的第7位中存放的值就是输入参数in的第7位的值。最后,将变量in左移一位,结束一次循环。如此循环8次后,就能实现函数预定的位转换功能。传感器状态读取函数unsignedcharsensor_inp(unsignedcharmask){unsignedcharsensor;sensor=P7DR;sensor=bit_change(sensor);sensor&=mask;returnsensor;}因为传感器子基板的输出端与CPU主板的接口7相连,所以传感器值由接口7输入并将该值存放到变量sensor中。函数的输入参数mask可以限制传感器的输入状态,将制定的传感器位覆盖为“0”。由于如今的传感器基板的第0位在最左侧,第7位在最右侧(与之前的传感器基板相反),为了保持其兼容性,变量sensor中的值经过位转换后再次存储到sensor中。经过位转换后的传感器值与函数的输入参数mask进行与操作,最终就可得到需要的传感器状态值,并存放到变量sensor中,作为返回值。interrupt_timer0函数voidinterrupt_timer0(void){ITU0_TSR&=0xfe;cnt0++;cnt1++;该函数通过中断产生1ms的时间间隔来执行,变量cnt0和cntl的值分别增加1。由于interrupt_timer0函数执行一次需要1ms,因此可以通过检测主程序中cnt0或cntl的值来测量所持续的时间。变量ITU0_TSR表示计时器状态寄存器,它与0xfe执行与操作,并将结果保存到前者中,相当于将ITU0_TSR的第0位置“0”。之所以要在函数中编写这一句,是因为当中断产生时ITU0_TSR的第0位可以自动地变为“1”,但是却不会再自动的由“1”变为“0”。因此要利用与操作使第0位置“0”,为下一次操作做准备。等待计时器函数voidtimer(unsignedlongtimer_set){cnt0=0;While(cnt0<timer_set);}改变函数输入参数timer_set的值,可以改变等待计时器的工作时间。例如:取输入参数timer_set的值为1000,全局变量cnt0首先被初始化为0,接着执行while语句,程序转到cnt0被操作的地方,由于执行interrupt_timer0函数而产生的1ms中断将使cnt0的值增加1。然后,再次执行while语句,如此往复循环,直至cnt0的值为1000时终止,最后可以得出等待计时器函数的工作时间为1000毫秒,即1s。横白线检测函数intcheck_crossline(void){unsigndecharb;intret;ret=0;b=sensor_inp(MASK2_2);if(b=0x66||b=0x64||b=0x26||b=0x62||b=0x46){ret=1;}returnret;}该函数为无参数函数,主要用来判断是否已经检测到直角弯道前具有提示作用的第一条横白线。如果检测到横白线,返回值为1。相反,如果没有检测到横白线,则返回值为0。函数中,首先将作为返回值的变量ret置0,认为没有检测到横白线。然后,读取经MASK2_2掩盖后的传感器状态,并将该状态值存入变量b中。也就是说,除了左侧中间两个和右侧中间两个传感器的数据能正常使用外,其余各位传感器输出值均被置为“0”。当变量b中传感器的输入状态满足if语句中列举的几种状态中的一种时,就可以认为已经检测到横白线,变量ret置为1。否则,变量ret仍为0,认为没有检测到横白线。DIP开关状态读取函数unsignedchardipsw_get(void){unsignedcharsw;sw=~P6DR;sw&=0x0f;returnsw;}由于DIP开关与接口6相连,故从接口6读取数据。如果DIP开关关闭,则接口数据为“1”。如果DIP开关打开,则接口数据为“0”。因为关闭与“0”对应,而打开与“1”对应,更容易理解。因此这里采用符号“〜”对DIP开关的状态值进行取反,并将其存放到变量sw中。“〜”称为“逻辑否定”。由于DIP开关只有4位,所以这里采用sw与0cf0的与操作将变量sw的前4位屏蔽。最后,将变量sw作为函数的返回值。按钮开关状态读取函数unsignedcharpushsw_get(void){unsignedcharsw;sw=~PBDR;sw&=0x01;returnsw;}接口B的第0位用来读取按钮开关的状态数据。如果按钮没被按下,数据为“1”。相反,如果按钮被按下,则数据为“0”。这里同样采用符号“〜”对按钮开关的状态值取反,以便符合人们的思维习惯,容易理解。由于按钮开关的状态值只有一位,因此需要使用语句“sw&=0x01”对第0位以外的其余各位进行屏蔽。最后,将变量sw作为函数的返回值输出。发光二极管控制函数voidled_out(unsignedcharled){unsignedchardata;led=~led;led<<=6;data=PBDR&0x3f;PBDR=data|led;}对于发光二极管,接通时信号为“0”,断开时信号为“1”。因此,为了符合人的逻辑思维,同样采用符号“〜”,对其进行取反,并将取反后的值仍存放在变量led中。由于发光二极管与接口B的第7位和第6位连接,而变量中的信号在第1位和第2位,因此要将变量led中的值左移6位。为了将信号输入到接口B中而不引起误动作,首先要将接口B的第7位和第6位通过语句“data=PBDR&0x3f”置0,然后再利用对变量data和变量led的或操作将变量led中的值输入到接口B中。这样,就实现了对发光二极管的程序控制。马达速度控制函数voidspeed(intaccele_l,intaccele_r){unsignedcharsw_data;unsignedlongspeed_max;sw_data=dipsw_get()+5;speed_max=(unsignedlong)(PWM_CYCLE-1)*sw_data/20;if(accele_l>=0)/*左马达*/{PBDR&=0xfb;ITU3_BRB=speed_max*accele_l/100;}else{PBDR|=0x04;accele_l=-accele_l;ITU3_BRB=speed_max*accele_l/100;}if(accele_r>=0)/*右马达*/{PBDR&=0xf7;ITU4_BRA=speed_max*accele_r/100;}else{PBDR|=0x08;accele_r=-accele_r;ITU4_BRA=speed_max*accele_r/100;}}与其它函数不同,该函数无返回值。由于左右马达的速度控制为PWM控制,而PWM的值又受到模型车CPU主板上DIP开关状态的限制。因此,函数中首先调用“dipsw_get()”函数,来获得CPU主板上DIP开关的状态值,并将其值加5后存放到变量sw_data中。这样变量sw_data的值就位于5至20之间,并取决于DIP开关的状态值。在运用变量sw_data计算马达的最大速度时,由于计算过程中,数值较大,可能会造成溢出,而使结果发生错误。因此,暂时将其定为无符号变量,来防止发生溢出,保证结果的正确性。左马达的转速控制过程如下:首先检测输入参数accele_l是否大于等于0。如果大于等于0的话,则将接口B的第2位置0,使马达正转。接着,计算左马达的工作比率。虽然,工作比率的设置似乎是靠通用寄存器B来完成的,而实际上,在程序中是靠缓冲寄存器B(ITU3_BRB)来实现的。要注意,通过速度函数设置的比率并不直接输出到马达,而是将“DIP的比率速度函数设置的比率”输出到马达作为控制信号。如果accele_l小于0的话,则将接口B的第2位置1,使马达反转。随后将输入参数accele_l取相反数,然后再进行工作比率的计算,其计算方法与正转时的算法相同。对于右马达的转速控制分析,与左马达非常相似。不同之处为:控制右马达正、反转的信号由接口B的第3位输出,并且对右马达工作比率的设置是依靠ITU4_BRA(ITU4寄存器中的缓冲寄存器A)来实现的。伺服舵机转角控制函数voidhandle(intangle){ITU4_BRB=SERVO_CENTER-angle*HANDLE_STEP;}伺服舵机与接口B的第5位相连。由于采用了复位同步脉宽调制模式,改变缓冲寄存器B(ITU4_BRB)的值就可以改变PB5的工作比率,从而改变舵机的转角值。SERVO_CENTER是伺服舵机的中心值,其对应舵机的转角值为0度。存放在输入参数angle中的唯一转角值是舵机由0度开始,需要转动的角度。其实现方法为:在中心值的基础上增加或减少相应的值,并存放到ITU4_BRA中。然而,缓冲寄存器B(ITU4_BRB)中的一个单位并不代表一度。在变量HANDLE_STEP中,存放着1度转角所对应的值。因此,需要将变量angle与变量HANDLE_STEP相乘后,再在SERVO_CENTER的基础上进行加减。初始化函数voidinit(void){P1DDR=0xff;/*I/O接口设置*/P2DDR=0xff;P3DDR=0xff;P4DDR=0xff;P5DDR=0xff;P6DDR=0xf0;P8DDR=0xff;P9DDR=0xf7;PADDR=0xff;PBDR=0xc0;PBDDR=0xfe;ITU0_TCR=0x23;/*ITU0每一秒产生一次中断*/ITU0_GRA=TIMER_CYCLE;ITU0_IER=0x01;ITU3_TCR=0x23;/*左右马达和伺服舵机的ITU3、*/ITU_FCR=0x3e;/*ITU4复位同步脉宽调制模式*/ITU3_GRA=PWM_CYCLE;ITU3_GRB=ITU3_BRB=0;ITU4_GRA=ITU4_BRA=0;ITU4_GRB=ITU4_BRB=SERVO_CENTER;ITU_TOER=0x38;/*ITU开始计时*/ITU_STR=0x09;}I/O接口是输入/输出接口的简称,是执行输入和输出操作的地方。这里共有11个接口,分别为接口1至接口B。其中,大部分接口为8位,也有一些是少于8位的(例如:接口5只有4位,接口6只有7位,接口8只有5位,接口9只有6位。)。这些接口分别由DDR寄存器和DR寄存器组成。但是,要注意接口7是一个多余的输入接口,没有相关的P7DDR寄存器。DDR是“数据方向寄存器”的简称,它决定输入——输出的方向。二进制位为“0”时,表示相应的引脚为输入引脚。二进制位为“1”时,表示相应的引脚为输出引脚。以程序中的“PBDDR=0xfe;”语句为例进行分析:它是对接口B各引脚进行的输入/输出设置,将十六进制数0xfe转换成二进制数为“11111110",它表示接口B的第1位至第7位引脚均为输出引脚,只有第0位引脚为输入引脚。DR是“数据寄存器”的简称,它可以将数据输出到引脚或从引脚输入。对于被设置为输入接口(DDR=0)的引脚,通过读取数据寄存器DR中的数据来获得引脚的电压水平:输入给引脚的电压为低电平时,数据寄存器DR中相应的二进制位为“0”;输入给引脚的电压为高电平时,数据寄存器DR中相应的二进制位为“1”。而对于被设置为输出接口(DDR=1)的引脚,通过向DR写入数据来输出引脚的电压水平:从引脚输出的电压为低电平时,向数据寄存器DR中相应的二进制位写入“0”;从引脚输出的电压为高电平时,向数据寄存器DR中相应的二进制位写入“1”。因此,程序中的“PBDR=0xco;”语句表示:接口B的引脚6和引脚7为高电平,其余引脚均为低电平。下面以表格的形式介绍一下接口B所连接的具体信号及其作用,以便对程序中为何如此设置PBDDR和PBDR的初始值有所了解。马达驱动基板接口引脚信号方向具体信号内容二进制值“0”代表的意义二进制值“1”代表的意义1+5V2PB7至基板发光二极管LED1接通断开3PB6至基板发光二极管LED0接通断开4PB5至基板伺服舵机信号PWM信号5PB4至基板右马达PWM停止PWM运动6PB3至基板右马达旋转方向正转反转7PB2至基板左马达旋转方向正转反转8PB1至基板左马达PWM停止PWM运动9基板至PB0按钮按下未按下10接地初始化程序的后一部分是对ITU0寄存器进行设置,使其每隔1ms就产生一次中断,并设置左、右马达和伺服舵机的PWM生成方式。程序中,ITU0_TCR(计时器控制寄存器)首先被初始化为0x23,随后又令“ITU0_GRA=TIMER_CYCLE;”,其意义为:ITU0_CNT(计时计数器)可以与ITU0_GRA(通用寄存器A)进行比较,而ITU0_CNT每隔特定的一段时间,其值就会增加1,当满足条件"ITU0_CNT=ITU0_GRA+1”时,也就是说,经过1ms后,ITU0_CNT的自身值将会再次被置为0,为下一次定时计数做准备。ITU0_IER是计时器中断允许寄存器,,“ITU0_IER=0x01;”表示允许寄存器产生中断。程序最后的ITU_STR是计时器开始寄存器,将其初始化为十六进制数0x09,可以命令计时器开始计时。控制左、右马达和伺服舵机的PWM生成方式为复位同步脉宽调制模式。该模式采用ITU3寄存器和ITU4寄存器,通过结合输出3组触发的PWM波形。而且,这3组PWM波形的反波形也同时被输出。但是,必须保证3组波形的周期均相同。因此,程序中首先将ITU3_TCR设置为十六进制数0x23,即允许ITU3_CNT与ITU3_GRA进行比较。而ITU3_CNT与ITU0_CNT一样,每隔相同的一段时间,其值就会增加1。又由于ITU3_GRA=PWM_CYCLE,因此当满足条件"ITU3_CNT=ITU3_GRA+1”时,已经过16ms的时间,这个时间就是3组PWM波形共同具有的循环周期。程序中,语句“ITU_TOER=0x38”表明:对左、右马达和伺服舵机进行PWM控制的三组PWM波形是分别从接口PB1、PB4和PB5输出的触发产生的PWM波形的反波形。改变缓冲寄存器ITU3_BRB、ITU4_BRA和ITU4_BRB的值就可以改变通用寄存器ITU3_GRB、ITU4_GRA和ITU4_GRB的值,从而分别实现对左、右马达和伺服舵机的PWM控制。其中,当ITU3_CNT(ITU3_GRB+1)时,PB1的输出信号开始翻转;当ITU3_CNT(ITU4_GRA+1)时,PB4的输出信号开始翻转;当ITU3_CNT=(ITU4_GRB+1)时,PB5的输出信号开始翻转。所以,改变上述通用寄存器的值就可以达到改变脉宽工作比率的目的。而当ITU3_CNT=(ITU3_GRA+1)时,ITU3_CNT清0,为下一个循环周期做准备。在介绍上述各函数时,用到了许多接口寄存器,必须先对这些接口寄存器进行定义,才能在程序中调用它们,从而保证程序的正确运行。H8/3048F-ONE芯片中,对这些具有内置外围功能的I/O寄存器的定义保存在名为“h8_3048.h”的文件中(见附件)。这里只介绍一些对于有关I/O寄存器定义的理解。以程序中的语句“#definePADDR(*(unsignedchar*)0xfffd1)”为例,其意义是:无论何时,只要程序中出现字符串’PADDR”,它都将会被字符串"(*(unsignedchar*)0xfffd1)"代替。字符串"(*(unsignedchar*)0xfffd1)”中的批号0xfffd1代表具有内置外围功能(包括I/O接口)的I/O寄存器被分配到存储器中的地址,而存储到存储器地址中的值将作为要输出或输入的信号。至此,编写MCU模型车在指定轨道上运行的主程序及对模型车各部分组件进行检测的测试程序所需的准备工作已大体完成。利用上述各函数所能实现的功能及对模型车几何模型、动力学模型、运动学模型的分析,我们可以得出模型车在当前传感器显示的状态下理论上应该实现的动作,并用C++程序语句表达出来。这样就完成了主程序的大体结构设计。然而,由于模型车在赛道上运行时可能出现的情况较多,必然会使理想的主控制程序的整体结构变得较为复杂。一般需要经过多次的调试和修改才能使其满足控制要求。同时,程序中调用马达速度控制函数和伺服舵机转角控制函数时,其最优参数的确定同样离不开实验的校核与修正。因此,主控制程序具体内容的确定及完善必须以实验结果为准则。模型车的主控制程序基本上可以分为以下几块内容(各程序块之间主要靠switch(pattern)语句进行有机的连接):等待按钮开关输入:这是主体运行程序开始执行前的等待过程。该过程可以无限运行,直至按钮开关被按下。当开关未被按下时,执行该部分程序,使发光二极管LED0和LED1交替闪烁,每个发光二极管闪烁的时间间隔为0.1s。这样,只通过简单的观察,就可以清楚地判断出整个程序正处在等待阶段。如果开关被按下,则程序的流程转向下一阶段,准备执行主体运行程序。可用下面的程序语句来实现该等待过程。case0:if(pushsw_get()){pattern=1;cnt=0;break;}if(cnt1<100){led_out(0x1);}elseif(cnt1<200){led_out(0x2);}else{cnt1=0;}break;按钮开关按下后等待一秒钟:之所以要在按钮被按下后,等待一段时间再执行轨迹控制程序,是为了避免按钮被按下后,模型车立即快速行驶,可能会与按按钮的手相撞,从而破坏模型车的正常运行轨迹。由于盲目的等待总会让人感到焦虑,担心模型车是否出现故障,因此用两个发光二极管分别闪亮0.5秒来指示这1s的等待过程。用C++语句表示为:case1:if(cnt1<500){led_out(0x1);}elseif(cnt1<1000){led_out(0x2);}else{led_out(0x0);pattern=11;cnt1=0;}break;普通轨迹运行过程:该过程包括模型车在直道和圆弧弯道上的运行过程。利用变量“MASK3_3”,在程序中将传感器基板上中间两个传感器的输出值覆盖为“0”。相当于只采用左侧3个传感器和右侧3个传感器对赛道的路面状况进行探测。这样不仅减少了对不同传感器状态的分析情况,而且利于编程。当传感器处于赛道中心位置(即伺服舵机摆角为0度)时,可以提升马达速度。为了避免模型车在运行过程中冲出赛道,传感器基板越偏离中心位置,伺服舵机的转角值应该越大,马达速度越低。同时,还需要考虑模型车转向时,伺服舵机转角与左右马达PWM值之间相互协调的数值关系。因此,在程序中,马达速度控制函数和伺服舵机转角控制函数通常要一起使用。改变舵机的转角,必然要改变马达的速度;而改变马达的速度,则未必要改变舵机的转角。以传感器输入状态为0x06为例(如图21所示)。图21此时,模型车向左偏离赛道。为了避免其冲出赛道,必然要对舵机转角和马达速度进行控制。其程序语句为:case0x06:handle(35);speed(50,28);break;也就是说,根据对传感器状态变化情况的分析,就可得出模型车应该产生的响应,并以此来校正其偏离中心轨道的距离,使其始终保持在中心轨道附近稳定运行。但由于模型车在运行过程中存在许多对其稳定性造成影响的因素(如:轮胎与赛道的摩擦系数,各响应动作的延时以及模型车的惯性等),使理论计算的响应值与实际偏差较大。因此,需要通过多次实验来进行比较校核,才能得到较满意的响应值。又因为模型车的速度与稳定性是一对不可调和的矛盾体,所以要获得既高速又稳定的运行状态势必会遇到很大困难。4)检测急转弯结束:模型车在急转圆弧弯道上运行时,其最佳路径是与赛道同心的一个圆弧。然而,由于模型车在弯道的运行轨迹很大程度上受到其进入弯道时初速度的影响,使其不可能按理想轨迹运行。为了防止在急转弯道上由于模型车转向不及时,使传感器在模型车转弯过程中检测到赛道边缘的白线,造成传感器状态发生变化,并引起误动作,致使模型车冲出赛道。应该让模型车在急转过程中始终保持急转动作,直至其返回到一个比较稳定的状态(赛道中心附近)时,再恢复它在普通赛道上的运行程序。以右弯道为例(如图22所示),其程序语句为:case12:if(sensor_inp(MASK3_3)==0x06){pattern=11;}break;

图225)直角弯道处理过程:直角弯道是整个赛道上,模型车最难以通过的地方。因此在赛道上,直角弯道前一定距离处通常设置有特定标记(两条有一定间距的横白线)。当传感器检测到这个特定标记(图23)时,可以被模型车利用,来预知前面即将有直角弯道,并提前采取动作。图23模型车的直角转弯过程可分为制动和转向两个过程。在制动过程中应该同时调整模型车的位置,使其尽量处在赛道中心附近,并保持传感器基板与前面的直角弯道平行。以免在弯道处传感器状态的波动使模型车产生误动作。下面结合两条横白线的作用来简述一下模型车的直角转弯过程:当传感器检测到第一条横白线时,模型车开始制动,经过一段时间(要保证模型车在这段时间内已经顺利地通过了第二条横白线,以免再次检测到横白线时,程序跳转到上一步)后,模型车继续制动,并调节车身位置使其稳定在中心线附近。再经过一段时间,当传感器的检测状态变为0x07或0xe0时,表明传感器已经检测到直角弯,模型车立即做出响应,开始以最大舵机转角执行转弯过程。如果传感器状态为0x07,模型车向右转。如果传感器状态为0xe0,则模型车向左转。然而,模型车不能一直这样转下去,那样势必会冲出赛道。以左转弯为例,对模型车转弯结束状态进行分析(图24所示):当模型车在转向过程中回到赛道中心附近,即传感器状态变为0x60时,可以认为直角弯结束,然后开始再次执行普通赛道运行程序。但是,当传感器状态为0xe0(也就是说,模型车刚开始转弯)时,由于中间的白线具有一定的宽度,很有可能使传感器状态在转向瞬间变为0x60,然后模型车误执行普通轨迹运行程序,致使其直接冲出赛道。因此,还要对转弯过程进行时间上的限定。只有当转向过程经过一段时间(这个时间要大于传感器脱离误动作区域的时间)后,传感器状态变为0x60时,才标志着转弯结束,并开始执行普通轨迹运行程序。图24对于右直角弯结束状态的分析,与上述方法相同。因此,整个直角弯道的控制程序语句为:case21:/*检测到第一条横白线时的程序*/led_out(0x3);handle(0);speed(0,0);pattern=22;cnt1=0;break;case22:/*跳过第二条横白线*/if(cnt1>50){cnt1=0;pattern=23;}break;case23:/*制动过程*/if(cnt1>50){cnt1=0;pattern=24;break;}switch(sensor_inp(MASK3_3)){case0x00:handle(0);speed(0,0);break;case0x04:handle(0);speed(0,0);break;case0x06:case0x07:case0x03:handle(8);speed(20,18);break;case0x20:handle(0);speed(0,0);break;case0x60:case0xe0:case0xc0:handle(-8);speed(18,20);break;default:break;}break;case24:/*转向过程*/switch(sensor_inp(MASK3_3)){case0xe0:led_out(0x1);handle(-44);speed(13,30);pattern=31;cnt1=0;break;case0x07:led_out(0x2);handle(44);speed(30,13);pattern=41;cnt1=0;break;case0x00:handle(0);speed(0,0);break;case0x04:case0x06:case0x03:handle(8);speed(20,18);break;case0x20:case0x60:case0xc0:handle(-8);speed(18,20);break;default:break;}break;case31:/*左直角弯转向时间控制*/if(cnt1>450){pattern=32;cnt1=0;}break;case32:/*左直角弯结束*/if(sensor_inp(MASK3_3)==0x60){led_out(0x0);pattern=11;cnt1=0;}bre

温馨提示

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

评论

0/150

提交评论