2022年机电体化与机器人技术优秀论文 .pdf
机电一体化与机器人技术论文姓名:学号:专业:组号:同组成员:完成日期:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 22 页目录机电一体化与机器人技术- 1 -一、机电一体化技术- 1 -1.概念 - 1 -2.来源 - 1 -3.要素 - 1 -4.机电一体化内容- 2 -5.机电一体化发展前景- 3 -二、电脑鼠运行原理- 3 -三、软件程序流程- 5 -四、总结 - 19 -五、心得体会 - 19 -精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 22 页一、 机电一体化技术1. 概念机电一体化技术是在以微型计算机为代表的微电子技术、信息技术迅速发展向机械工业领域迅猛渗透并与机械电子技术深度结合的现代工业的基础上,综合应用机械技术、微电子技术、信息技术、自动控制技术、传感测试技术、电力电子技术、接口技术及软件编程技术等群体技术,从系统理论出发根据系统功能目标和优化组织结构目标,以智力、动力、结构、运动和感知组成要素为基础,对各组成要素及其间的信息处理,接口耦合,运动传递,物质运动,能量变换进行研究,使得整个系统有机结合与综合集成,并在系统程序和微电子电路的有序信息流控制下,形成物质的和能量的有规则运动,在高功能、高质量、高精度、高可靠性、低能耗等诸方面实现多种技术功能复合的最佳功能价值系统工程技术。2. 来源电一体化在国外被称为Mechatronics是日本人在20 世纪 70 年代初提出来的,它是将英文Mechanics 的前半部分和Electronics 的后半部分结合在一起构成的一个新词,意思是机械技术和电子技术的有机结合。这一名称已经得到包括我国在内的世界各国的承认,我国的工程技术人员习惯上把它译为机电一体化技术,机电一体化技术又称为机械电子技术,是机械技术、电子技术和信息技术有机结合的产物。3. 要素(1)五大组成要素一个机电一体化系统中一般由结构组成要素、动力组成要素、运动组成要素、感知组成要素、智能组成要素五大组成要素有机结合而成。a. 机械本体(结构组成要素)是系统的所有功能要素的机械支持结构,一般包括有机身、框架、支撑、联接等。b. 动力驱动部分(动力组成要素)依据系统控制要求,为系统提供能量和动力以使系统正常运行。c. 测试传感部分(感知组成要素)对系统的运行所需要的本身和外部环境的各种参数和状态进行检测,并变成可识别的信号,传输给信息处理单元,经过分析、处理后产生相应的控制信息。d.控制及信息处理部分(职能组成要素)将来之测试传感部分的信息及外部直接输入的指令进行集中、存储、分析、加工处理后,按照信息处理结果和规定的程序与节奏发出相应的指令,控制整个系统有目的的运行。e.执行机构(运动组成要素)根据控制及信息处理部分发出的指令,完成规定的动作和功能。(2)机电一体化四大原则构成机电一体化系统的五大组成要素其内部及相互之间都必须遵循结构耦合、运动传递、信息控制与能量转换四大原则。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 22 页a.两个需要进行信息交换和传递的环节之间,由于信息模式不同(数字量与模拟量,串行码与并行码,连续脉冲与序列脉冲等)无法直接传递和交换,必须通过接口耦合来实现。而两个信号强弱相差悬殊的环节之间,也必须通过接口耦合后,才能匹配。变换放大后的信号要在两个环节之间可靠、快速、准确的交换、传递,必须遵循一致的时序、信号格式和逻辑规范才行,因此接口耦合时就必须具有保证信息的逻辑控制功能,使信息按规定的模式进行交换与传递。b.运动传递使构成机电一体化系统各组成要素之间,不同类型运动的变换与传输以及以运动控制为目的的优化。c.在系统中,所谓智能组成要素的系统控制单元,在软、硬件的保证下,完成信息的采集、传输、储存、分析、运算、判断、决策,以达到信息控制的目的。对于智能化程度高的信息控制系统还包含了知识获得、推理机制以及自学习功能等知识驱动功能。d.两个需要进行传输和交换的环节之间,由于模式不同而无法直接进行能量的转换和交流,必须进行能量的转换,能量的转换包括执行器,驱动器和他们的不同类型能量的最优转换方法及原理。4. 机电一体化内容(1) 机械技术机械技术是机电一体化的基础,机械技术的着眼点在于如何与机电一体化技术相适应,利用其它高、新技术来更新概念,实现结构上、材料上、性能上的变更,满足减小重量、缩小体积、提高精度、提高刚度及改善性能的要求。在机电一体化系统制造过程中,经典的机械理论与工艺应借助于计算机辅助技术,同时采用人工智能与专家系统等,形成新一代的机械制造技术。(2) 计算机与信息技术信息交换、存取、运算、判断与决策、人工智能技术、专家系统技术、神经网络技术均属于计算机信息处理技术。(3) 系统技术系统技术即以整体的概念组织应用各种相关技术,从全局角度和系统目标出发,将总体分解成相互关联的若干功能单元,接口技术是系统技术中一个重要方面,它是实现系统各部分有机连接的保证。(4) 自动控制技术其范围很广,在控制理论指导下,进行系统设计,设计后的系统仿真,现场调试,控制技术包括如高精度定位控制、速度控制、自适应控制、自诊断校正、补偿、再现、检索等。(5) 传感检测技术传感检测技术是系统的感受器官,是实现自动控制、自动调节的关键环节。其功能越强,系统的自动化程序就越高。现代工程要求传感器能快速、精确地获取信息并能经受严酷环境的考验,它是机电一体化系统达到高水平的保护。(6) 伺服传动技术包括电动、气动、液压等各种类型的传动装置,伺服系统是实现电信号到机械动作的转换装置与部件、对系统的动态性能、控制质量和功能有决定性的影响。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 22 页5. 机电一体化发展前景机电一体化的出现不是孤立的,它是许多科学技术发展的结晶,是社会生产力发展到一定阶段的必然要求。当然,与机电一体化相关的技术还有很多,并且随着科学技术的发展,各种技术相互融合的趋势将越来越明显,机电一体化技术的广阔发展前景也将越来越光明。中国是从20 世纪 80 年代初开始进行机电一体化技术方面的研究和应用的。虽然经过20 多年的努力取得了一定成果,但与发达国家相比仍有相当差距。为了加快发展、缩小与发达国家的差距,需要我们在产业政策、金融政策和市场导向上,对机电一体化技术和产业予以积极支持,主要包括:国家在政策上对机电一体化技术给予大力支持,特别是涉及基础技术、综合技术等方面,要给予强有力的财政和各种扶助。由于机电一体化技术是各种高新技术的综合和升华,需要多学科、多技术、多种机构协调研发,这也对技术研发机构和产业界的协调能力提出了挑战,因而需要继续发挥主管部门的作用。要明确机电一体化技术开发和产业化推广的主力军是企业,在这方面,技术和综合实力雄厚的大型企业将发挥举足轻重的作用。有关部门应该在税收、金融和其他方面给予一定的优惠倾斜。要把发展机电一体化技术作为增强自主创新能力的重要内容,鼓励和促进企业在这个领域有所作为。同时,为缩小与发达国家的差距,可以通过引进、消化、升级来逐步达到提高自主创新能力的目的。有关部门可以通过政府采购、工程设立等措施,达到支持和鼓励自主创新的目标。二、 电脑鼠运行原理“电脑鼠”,英文名叫做MicroMouse,是使用嵌入式微控制器、传感器和机电运动部件构成的一种智能行走装置的俗称,它可以在“迷宫”中自动记忆和选择路径,寻找出口,最终达到所设定的目的地。电脑鼠可谓是一种具有人工智能的小型机器人,依照新制的比赛规则,当电脑鼠放入起点,按下启动键之后,它就必须自行决定搜寻法则并且在迷宫中前进、转弯、记忆迷宫墙壁资料、计算最短路径、搜寻终点等功能。电脑鼠更结合了机械、电机、电子、控制、光学、程序设计和人工智能等多方面的科技知识。一只电脑鼠是具有机电知识整合的基本架构,本身就像是一个智能的机器人。要在指定的迷宫中比赛,就像是一个人置身于竞赛中,必须要靠本身的判断力、敏捷动作及正确探查周边环境,来赢得胜利。一般来说,一只电脑鼠需具备有下列三件基本能力:(1) 拥有稳定且快速的行走能力;(2) 能正确判断能力;(3) 记忆路径的能力。行走能力指的就是电机,当电机收到讯号时,系统必须判断是否能同步行走,遇到转角时,转弯的角度是否得当,一个好的电机驱动程序,可以减少行走时所需要做的校正时间。判断能力的关键就在于传感器,它的地位如同人类的双眼,一个好的传感器驱动程序,可避免一些不必要的错误动作,如撞壁、行走路线的偏移等等。而记忆能力就像是大脑,它的功能并没有因为看不见而遭到忽视,相反精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 22 页地,它的地位在整场比赛中是最重要的,他必须把所走过的路都能一一记下来,并将其资料送给系统,让系统整理出最佳路径以避开不必要的路段。一只电脑鼠是具有机电知识整合的基本架构,要在指定的迷宫中比赛,在迷宫中探索以找出通往终点的路径,并随时掌握自身的位置信息,准确获取墙壁信息并做记录,最终依靠记忆找出走出迷宫的最佳路径,以最短的时间解开迷宫,赢得比赛。一只优秀的电脑鼠必须具备良好的感知能力,有良好行走能力,优秀的智能算法和强健体魄。一只完整的电脑鼠可大体分为以下五个部分:1传感器传感器是电脑鼠感知外界环境的窗口,是电脑鼠的双眼。好的传感器是电脑鼠准确获取外部环境信息以做出正确判断的依据,是电脑鼠灵敏快捷的保证。红外测距方式在电脑鼠上应用最广。电脑鼠不但要求测距传感器能够准确测量,对测量速度也有较高要求,而且必须能够抗干扰。此外加速度计和角度传感器等也越来越多的在电脑鼠上使用。2执行部件电机是电脑鼠的动力源,是电脑鼠的四肢。只有具备健壮且灵活的四肢的电脑鼠才有可能在比赛中高效的解开迷宫。电机不但要能输出足够的马力还要便于控制,在此基础上再配以合适的控制算法就能使电脑鼠快速而精确的行走。电脑鼠中常用的是步进电机和直流电机。步进电机控制容易,但直流电机使电脑鼠控制更加灵敏。优秀的电机配上合适的减速和速度反馈装置使电脑鼠控制精度更高,更加灵敏。3微处理器微处理器是电脑鼠的核心部分,是电脑鼠的大脑。几乎所有的信息,包括墙壁信息,位置信息,角度信息和电机状态信息等都需要经过微处理器处理并做出相应的判断。所有的数据分析,算法实现和执行指令的发出等都需要由微处理器来完成。由于需要实时控制以保证电脑鼠的速度和灵敏度就必须要求处理器有足够快的中断处理能力和运算能力,另外还需要有足够的数据和代码存储空间。4机械结构电脑鼠要能够在迷宫里面灵活穿梭,必须有一副好身板,有适合在迷宫中快速运行的身体结构。首先他必须结实,拥有两只东倒西歪的轮子的电脑鼠是很难不在迷宫中碰壁的。在IEEE 竞赛标准中就有规定电脑鼠长宽。事实上,身材娇小的电脑鼠在迷宫里是会更灵活的,它有更大的空间用于完成转弯,有更大的空间用于纠正姿势。另外体重太大和没有平衡感的老鼠也是不适宜迷宫竞赛的。基于如此多的考虑,一只学富五车而又娇小玲珑的电脑鼠需要我们从机械上面有更多创新。5算法算法是电脑鼠的灵魂。电脑鼠必须采用一定的算法才能找到终点,才能找到一条最短的路径,在最短的时间内到达终点。算法的效率决定了解迷宫的效率。优良的电机控制算法能让电脑鼠走得更快更平稳,降低微处理器负荷。在国际赛事和一些其他赛事中广泛的采用IEEE 电脑鼠竞赛规则。2006 IEEE 电脑鼠比赛规则规定电脑鼠允许在迷宫中运行的最大时间是15 分钟。在这 15 分钟时间内电脑鼠可以运行任意多次。比赛成绩由运行时间、迷宫时间与碰触奖励时间组成。运行时间指电脑鼠从起点到终点的时间。迷宫时间从电脑精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 22 页鼠第一次被激活开始计。碰触指电脑鼠在运行期间由操作者手动干预,若有碰触则减去 10秒的碰触奖励时间,否则不减。为了满足具体需求,目前在许多国家都有专门针对在校学生和刚参与这项比赛新手的电脑鼠走迷宫竞赛,大体都是在IEEE 标准竞赛规则上做一些修改以降低难度,考核的是标准电脑鼠的一个或几个性能,如速度、加速度和转弯速度和精度等。三、 软件程序流程本小组在不断的实验与总结后,对于电脑鼠的源程序,主要以下方面的修改:小车参数、搜寻法则、等高图、红外传感器。具体分别如下: 小车参数小车参数修改主要包括小车电机搜索法则、搜索及冲刺行进速度、转弯的步数、有墙壁时行进的步数及电脑鼠转弯的方法和速度。以上参数对不同的小车有不同要求,同时只有将以上参数都调试到合适值的时候,调试效果才明显,才能达到一个较好的配合状态,否则如果只改其中一组,小车与调试前差别不大。经过我组成员的反复实验与修改,小车在速度和稳定性都得到了不错的提高。以下是修改后的参数值: #define MAXSPEED 205 /* 电机加速运行时的最大速度 */ #define SEARCHSPEED 90 /* 电机搜索迷宫时的最大速度 */ /* * Function name: mouseGoahead * Descriptions: 前进 N格* input parameters: iNblock: 前进的格数* output parameters: 无* Returned value: 无*/ void mouseGoahead (int8 cNBlock) int8 cL = 0, cR = 0, cCoor = 1。 if (_GmLeft.cState) cCoor = 0。 / if(tt)cCoor = 1。_GmLeft.uiPulseCtr=0。_GmRight.uiPulseCtr=0 。 /* * 设定运行任务 */ _GucMouseState = _GOAHEAD 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 22 页 if(cNBlock1) _GiMaxSpeed = MAXSPEED。 else if (cNBlock=1 ) _GiMaxSpeed = SEARCHSPEED+1。 _GmRight.cDir = _MOTORGOAHEAD 。 _GmLeft.cDir = _MOTORGOAHEAD 。 if(cNBlock1) _GmRight.uiPulse = _GmRight.uiPulse + cNBlock * ONEBLOCK - 20。/22 。 /-25 _GmLeft.uiPulse = _GmLeft.uiPulse + cNBlock * ONEBLOCK - 20。/22 。 /-25 else if (cNBlock=1) _GmRight.uiPulse = _GmRight.uiPulse + cNBlock * ONEBLOCK -0。/20 。0 _GmLeft.uiPulse = _GmLeft.uiPulse + cNBlock * ONEBLOCK -0。 /20;0 _GmRight.cState = _MOTORRUN 。 _GmLeft.cState = _MOTORRUN。 while (_GmLeft.cState != _MOTORSTOP) if (_GmLeft.uiPulseCtr = ONEBLOCK) /* 判断是否走完一格 */ _GmLeft.uiPulse -= ONEBLOCK。 _GmLeft.uiPulseCtr -= ONEBLOCK。 if (cCoor) cNBlock-。 _mouseCoorUpdate()。/* 更新坐标 */ else cCoor = 1。 if (_GmRight.uiPulseCtr = ONEBLOCK) /* 判断是否走完一格 */ _GmRight.uiPulse -= ONEBLOCK。 _GmRight.uiPulseCtr -= ONEBLOCK。 / - while( _GiMaxSpeed = SEARCHSPEED+1) / if (_GmLeft.uiPulseCtr + 20) _GmLeft.uiPulse) / goto End。 if (_GucDistance_FRONT) /* 前方有墙,则跳出程序精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 22 页*/ if(_GiMaxSpeed = MAXSPEED) if(_GmRight.iSpeed _GmLeft.uiPulse) goto End。 if (cNBlock 2) if (cL) /* 是否允许检测左边 */ if (_GucDistance _LEFT & 0 x01) = 0) /* 左边有支路,跳出程序 */ if( _GiMaxSpeed = MAXSPEED) if(_GmRight.iSpeed _GmLeft.uiPulse) goto End。 else /* 左边有墙时开始允许检测左边 */ if ( _GucDistance _LEFT & 0 x01) cL = 1。 if (cR) /* 是否允许检测右边 */ if (_GucDistance_RIGHT & 0 x01) = 0) /* 右边有支路,跳出程序 */ if( _GiMaxSpeed = MAXSPEED) if(_GmRight.iSpeed _GmLeft.uiPulse) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 22 页 goto End。 else if ( _GucDistance_RIGHT & 0 x01) /* 右边有墙时开始允许检测右边 */ cR = 1。 /* * 设定运行任务,让电脑鼠走到支路的中心位置 */ End: _mouseCoorUpdate()。/* 更新坐标 */ /* * Function name: mazeSearch */ void mazeSearch(void) int8 cL = 0, cR = 0, cCoor = 1。 if (_GmLeft.cState) cCoor = 0。 / if(tt)cCoor = 1。_GmLeft.uiPulseCtr=0。_GmRight.uiPulseCtr=0 。 /* * 设定运行任务 */ _GucMouseState = _GOAHEAD 。 _GiMaxSpeed = SEARCHSPEED。 _GmRight.cDir = _MOTORGOAHEAD 。 _GmLeft.cDir = _MOTORGOAHEAD 。 _GmRight.uiPulse = MAZETYPE * ONEBLOCK 。 _GmLeft.uiPulse = MAZETYPE * ONEBLOCK。 _GmRight.cState = _MOTORRUN 。 _GmLeft.cState = _MOTORRUN。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 22 页 while (_GmLeft.cState != _MOTORSTOP) if (_GmLeft.uiPulseCtr = ONEBLOCK) /* 判断是否走完一格 */ _GmLeft.uiPulse -= ONEBLOCK。 _GmLeft.uiPulseCtr -= ONEBLOCK。 mm+。 if (cCoor) _mouseCoorUpdate()。/* 更新坐标 */ else cCoor = 1。 if (_GmRight.uiPulseCtr = ONEBLOCK) /* 判断是否走完一格 */ _GmRight.uiPulse -= ONEBLOCK。 _GmRight.uiPulseCtr -= ONEBLOCK。 if (_GucDistance_FRONT) /* 前方有墙,则跳出程序*/ _GmRight.uiPulse = _GmRight.uiPulseCtr + 61 。/-70 60 _GmLeft.uiPulse = _GmLeft.uiPulseCtr + 61 。/-70 60 while (_GucDistance _FRONT) if (_GmLeft.uiPulseCtr + 20) _GmLeft.uiPulse) goto End。 _GmLeft.uiPulse = MAZETYPE * ONEBLOCK。 _GmRight.uiPulse = MAZETYPE * ONEBLOCK。 if (cL) /* 是否允许检测左边 */ if (_GucDistance _LEFT & 0 x01) = 0) /* 左边有支路,跳出程序 */ _GmRight.uiPulse = _GmRight.uiPulseCtr + 57。/-74 64 _GmLeft.uiPulse = _GmLeft.uiPulseCtr + 57。/-74 64 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 22 页 while (_GucDistance _LEFT & 0 x01) = 0) if (_GmLeft.uiPulseCtr + 20) _GmLeft.uiPulse) goto End。 _GmRight.uiPulse = MAZETYPE * ONEBLOCK。 _GmLeft.uiPulse = MAZETYPE * ONEBLOCK。 else /* 左边有墙时开始允许检测左边 */ if ( _GucDistance _LEFT & 0 x01) cL = 1。 if (cR) /* 是否允许检测右边 */ if (_GucDistance_RIGHT & 0 x01) = 0) /* 右边有支路,跳出程序 */ _GmRight.uiPulse = _GmRight.uiPulseCtr + 57。/-74 64 _GmLeft.uiPulse = _GmLeft.uiPulseCtr + 57。/-74 64 while (_GucDistance _RIGHT & 0 x01) = 0) if (_GmLeft.uiPulseCtr + 20) _GmLeft.uiPulse) goto End。 _GmRight.uiPulse = MAZETYPE * ONEBLOCK。 _GmLeft.uiPulse = MAZETYPE * ONEBLOCK。 else if ( _GucDistance_RIGHT & 0 x01) /* 右边有墙时开始允许检测右边 */ cR = 1。 End: _mouseCoorUpdate()。/* 更新坐标 */ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 22 页/* * Function name: SysTick_ISR * Descriptions: 定时中断扫描。* input parameters: 无* output parameters: 无* Returned value: 无*/ void SysTick_ISR(void) static int32 iL = 0, iR = 0。 /* * 如果左电机长时间停止,则断电 */ if (_GmLeft.cState = _MOTORSTOP) iL+ 。 else iL = 0。 if (iL = 500) GPIOPinWrite(GPIO_PORTD_BASE, _PHLA1 | _PHLA2 | _PHLB1 | _PHLB2, 0 x00)。 /* * 如果右电机长时间停止,则断电 */ if (_GmRight.cState = _MOTORSTOP) iR+。 else iR = 0。 if (iR = 500) GPIOPinWrite(GPIO_PORTD_BASE, _PHRA1 | _PHRA2 | _PHRB1 | _PHRB2, 0 x00)。 /* * 红外线检测 */ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 22 页 _irCheck()。 /* * Function name: _irSendFreq * Descriptions: 发送红外线。* input parameters: _uiFreq: 红外线调制频率* _cNumber: 选择需要设置的 PWM 模块* output parameters: 无* Returned value: 无*/ void _irSendFreq (uint32 _uiFreq, int8 _cNumber) _uiFreq = SysCtlClockGet() / _uiFreq。 switch (_cNumber) case 1: PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, _uiFreq)。/* 设置 PWM 发生器 1 的周期 */ PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, _uiFreq / 2) 。/* 设置 PWM2 输出的脉冲宽度 */ PWMGenEnable(PWM_BASE, PWM_GEN_1)。/* 使能 PWM 发生器 1 */ break。 case 2: PWMGenPeriodSet(PWM_BASE, PWM_GEN_2, _uiFreq)。/* 设置 PWM 发生器 2 的周期 */ PWMPulseWidthSet(PWM_BASE, PWM_OUT_4, _uiFreq / 2) 。/* 设置 PWM4 输出的脉冲宽度 */ PWMGenEnable(PWM_BASE, PWM_GEN_2)。/* 使能 PWM 发生器 2 */ break。 default: break。 /*精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 22 页* * Function name: _irCheck * Descriptions: 红外线传感器检测。* input parameters: 无* output parameters: 无* Returned value: 无*/ void _irCheck (void) static uint8 ucState = 0。 static uint8 ucIRCheck。 switch (ucState) case 0: _irSendFreq(32200, 2)。/* 探测左右两侧近距 */ _irSendFreq(35000, 1)。/* 驱动斜角上的传感器检测 */ break。 case 1: ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0 x3e)。/* 读取传感器状态 */ PWMGenDisable(PWM_BASE, PWM_GEN_2)。/* 禁止 PWM 发生器 2 */ PWMGenDisable(PWM_BASE, PWM_GEN_1)。/* 禁止 PWM 发生器 1 */ if (ucIRCheck & _RIGHTSIDE) _GucDistance_RIGHT &= 0 xfd。 else _GucDistance_RIGHT |= 0 x02。 if (ucIRCheck & _LEFTSIDE) _GucDistance_LEFT &= 0 xfd。 else _GucDistance_LEFT |= 0 x02。 if (ucIRCheck & _FRONTSIDE_R) _GucDistance_FRONTR = 0 x00。 else _GucDistance_FRONTR = 0 x01。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 22 页 if (ucIRCheck & _FRONTSIDE_L) _GucDistance_FRONTL = 0 x00。 else _GucDistance_FRONTL = 0 x01。 break。 case 2: _irSendFreq(36000, 2)。/* 驱动检测左前右三个方向远距 */ break。 case 3: ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0 x2a)。/* 读取传感器状态 */ PWMGenDisable(PWM_BASE, PWM_GEN_2)。/* 禁止 PWM 发生器 2 */ break。 case 4: _irSendFreq(36000, 2)。/* 重复检测左前右三个方向远距 */ break。 case 5: ucIRCheck &= GPIOPinRead(GPIO_PORTB_BASE, 0 x2a)。/* 读取传感器状态 */ PWMGenDisable(PWM_BASE, PWM_GEN_2)。/* 禁止 PWM 发生器 2 */ if (ucIRCheck & _RIGHTSIDE) _GucDistance_RIGHT &= 0 xfe。 else _GucDistance_RIGHT |= 0 x01。 if (ucIRCheck & _LEFTSIDE) _GucDistance_LEFT &= 0 xfe。 else _GucDistance_LEFT |= 0 x01。 if (ucIRCheck & _FRONTSIDE) _GucDistance_FRONT &= 0 xfe。 else _GucDistance_FRONT |= 0 x01。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 22 页 break。 default: break。 ucState = (ucState + 1) % 6。/* 循环检测 */ /* * Function name: mouseTurnright * Descriptions: 右转* input parameters: 无* output parameters: 无* Returned value: 无*/ void mouseTurnright(void) /* * 开始右转 */xx=1。 _GucMouseState = _TURNRIGHT 。 _GmRight.cDir = _MOTORGOAHEAD 。 _GmRight.iSpeed =75。 _GmRight.uiPulse =10。 /30 _GmRight.uiPulseCtr=0。 _GmLeft.cDir = _MOTORGOAHEAD 。 _GmLeft.iSpeed =60。 _GmLeft.uiPulse = 95。 _GmLeft.uiPulseCtr = 0。 _GmRight.cState = TURN。 _GmLeft.cState = _MOTORRUN。 GucMouseDir = (GucMouseDir + 1) % 4。/* 方向标记 */ while (_GmLeft.cState != _MOTORSTOP)。 while (_GmRight.cState != _MOTORSTOP)。 _mazeInfDebug()。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 22 页 ir=0。mm=0 。 /* * Function name: mouseTurnleft * Descriptions: 左转* input parameters: 无* output parameters: 无* Returned value: 无*/ void mouseTurnleft(void) /* * 开始左转 */xx=2。 _GucMouseState = _TURNLEFT 。 _GmRight.cDir = _MOTORGOAHEAD 。 _GmRight.iSpeed =60。 _GmRight.uiPulse = 94。 _GmRight.uiPulseCtr=0。 _GmLeft.cDir = _MOTORGOAHEAD 。 _GmLeft.iSpeed =75。 _GmLeft.uiPulse = 13。 _GmLeft.uiPulseCtr= 0。 _GmRight.cState = _MOTORRUN 。 _GmLeft.cState = TURN。 GucMouseDir = (GucMouseDir + 3) % 4。/* 方向标记 */ while (_GmLeft.cState != _MOTORSTOP)。 while (_GmRight.cState != _MOTORSTOP)。 _mazeInfDebug()。 il=0。mm=0 。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 22 页/* * Function name: mouseTurnback * Descriptions: 后转* input parameters: 无* output parameters: 无* Returned value: 无*/ void mouseTurnback(void) /* * 等待停止 */ / while(_GmLeft.iSpeed68)。/ while(_GmRight.iSpeed68)。 while (_GmLeft.cState != _MOTORSTOP)。 while (_GmRight.cState != _MOTORSTOP)。 /* * 开始后转 */ _GucMouseState = _TURNBACK 。 _GmRight.cDir = _MOTORGOBACK 。 if(mm!=0) _GmRight.uiPulse = 99。/-81 /162 * 10。 else if(xx=1) _GmRight.uiPulse = 93。 if(xx=2) _GmRight.uiPulse =93。 /93 _GmLeft.cDir = _MOTORGOAHEAD 。 if(mm!=0) _GmLeft.uiPulse = 98。/162 * 10。 else if(xx=1) _GmLeft.uiPulse = 93。 if(xx=2) _GmLeft.uiPulse =93。 _GmLeft.cState = _MOTORRUN。 _GmRight.cState = _MOTORRUN 。 GucMouseDir = (GucMouseDir + 2) % 4。/* 方向标记 */ while (_GmLeft.cState != _MOTORSTOP)。 while (_GmRight.cState != _MOTORSTOP)。 _mazeInfDebug()。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 20 页,共 22 页 _delay(100000)。 mm=0 。xx=0。 2、 搜寻法则修改首先修改搜寻法则为右手法则,避免由于选用的法则跟地图不太适合时出现较多的废步。RIGHTMETHOD - 右手法则LEFTMETHOD - 左手法则CENTRAL