




已阅读5页,还剩58页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件系统设计与实现毕业设计目录1简介11.1背景与意义11.2研究内容与思路12现有迷宫算法简述32.1迷宫的数字模型表征32.2迷宫问题的搜寻准则42.3迷宫问题的搜寻策略53硬件系统分析63.1实验平台与设计工具63.2硬件控制模块分析63.3电机选择与分析73.3.1电机比较83.3.2电机选择83.4传感器模块分析93.5测试赛道104软件系统设计与实现124.1路径决策功能的实现124.1.1迷宫探测算法134.1.2路径决策功能程序及分析144.2驱动控制功能的实现195验证结果与改进方案245.1实验验证结果245.2改进方向与研究方案245.2.1迷宫墙壁信息的记录245.2.2迷宫路口信息的记录256结论266.1结论26附录301 简介1.1 背景与意义电脑鼠(Micro-Mouse)是指采用嵌入式微处理器、传感器、机械电子运动部件为一体的微型智能移动机器人1,可实现探测、分析、行走等基本功能控制,且集合传感、机械移动等设计功用2。国际电气和电子工程学会(IEEE)每年都要举办一次国际性的电脑鼠走迷宫竞赛,而对应的赛事要求、设计成果等内容业已成为参与电脑鼠研究的关注点3。目前电脑鼠迷宫竞赛就参与程度、设计水平、发展程度而言,主要集中在美国、日本、英国、新加坡等,例如APEC(美国)、ALL JAPAN MICROMOUSE CONTEST(日本)、Singapore Inter-School Micromouse Competition(新加坡)、Euromouse maze contest(英国)4。我国于2007年开始举办“IEEE 标准电脑鼠走迷宫”邀请赛,而比赛发展至今,比赛规模和参赛质量上均取得了显著的进步5。目前电脑鼠迷宫边塞规定,电脑鼠在按下启动键后将自行选取搜寻法则,并且在迷宫行进过程中实现前行、转弯、往返、记忆迷宫墙壁资料、计算最优路径、探测障碍物、寻找目标终点等功能内容6。1.2 研究内容与思路本文以“IEEE 标准电脑鼠走迷宫”竞赛规则为研究背景,选取电脑鼠MicromouseV3.2作为研究对象和实验工具,以STM32F103R8T6增强型系列微控制器8作为电脑鼠主控制器,具体依据课题设计要求分别完成规定部分,包括三个独立部分:(1)往返运动:电脑鼠从起始点A处出发,运行到挡板B处,并原路返回至起始点A处,如图1.1所示。图1.1“往返运动”示意图(2)连续转弯:电脑鼠从A点出发,先后经B,C,D点之后,到达A处;之后掉头原路返回,如图1.2所示。图1.2 “连续转弯”示意图(3)寻找目标点:电脑鼠从A点出发,寻找到迷宫终点B处,并最终运行到终点B处。 如图1.3所示。图1.3 “寻找目标点”示意图课题研究具体的研究内容分为以下几个部分:(1)电脑鼠硬件结构研究与分析,包括电脑鼠主控制模块的特征与开发原理、电机选择与驱动模块分析、红外检测模块、迷宫挡板探测模块、电源模块、速度感应与状态调整模块、电动机选取与分析等等。(2)电脑鼠软件系统实现,包括程序初始化模块、迷宫墙壁记忆模块、红外探测与反馈模块、运动及其驱动控制模块、决策模块等等。(3)电脑鼠迷宫路径搜寻与避障算法的研究,包括现代典型迷宫算法的分析对比、迷宫数字化表征方式、迷宫路径的数学模型研究、基于硬件语言的迷宫算法实现、记忆与决策功能算法的实现等等。(4)实现软件系统设计和算法程序载入后,利用电脑鼠MicromouseV3.2在专用比赛跑道进行系统测试和调整,最终使电脑鼠具有基本的运动、探测、控制功能,并完成课题规定的竞赛功能。2 现有迷宫算法简述迷宫算法的研究属于移动机器人路径规划研究的一部分9,是优化与提升移动机器人性能的重要研究环节。面向不同环境的路径规划决策方式与实时避障功能是当前移动机器人性能研究中表征自主能力的重要检测指标10。针对移动机器人(或面向电脑鼠)的路径规划算法和实时避障算法的研究已经获得众多理论成果,重点分为两类:(1)基于已知地图的路径规划方法,如栅格法11、Free Space Approach、V-Graph等;(2)基于未知地图的路径规划方法,遗传算法、势场法、模糊逻辑算法9、深广结合算法9、粒子群算法10等等。各类算法都有针对性的适用范围和使用优势,对电脑鼠迷宫路径算法研究具有重要参考意义。2.1 迷宫的数字模型表征本次毕业设计面向的迷宫模型如图2.1所示,共有1010个方格组成。由于设计中“连续转弯”规定部分的需要,迷宫外围是一个封闭式的挡板。对应地,电脑鼠的起点位置是封闭挡板内的任意位置单元。因此,电脑鼠实际的运动范围为88个方格。101088图2.1 迷宫示意图依据上述分析,迷宫的位置单元,即每一个方格,可以用一个数值属性来表征该位置是否可以通行,而所有位置单元的数值属性的集合可以用一个矩阵来描述。基于该思想,将迷宫格栅(挡板)表征为数值“1”,迷宫空格表征为数值“0”,据此可以利用一个二值的二维矩阵表征迷宫,即将迷宫进行数学化的抽象描述。图2.2为迷宫中部分区域进行抽象化和数字化之后的表征结果。abc图2.2 迷宫抽象化、数字化的结果2.2 迷宫问题的搜寻准则结合计算机图形学、图论学、拓扑学、数据结构等领域对于迷宫问题的解释与解决方法,电脑鼠等移动机器人面对的迷宫路径规划和决策判定问题可以进一步转化为迷宫路径最优化选择问题12-14。在具体的迷宫环境中,以图2.1所示迷宫为例,电脑鼠前进至一个位置单元(假设为一个方格),最多面对三个前进方向(三种选择),最少面对三个挡板(唯一选择退回)。在迷宫行进过程中,如果出现至少两个方向,即有两个以上的选择,通过设计好的搜寻算法,电脑鼠判定优先行进的方向和顺序。目前常用的搜寻准则如下所示1, 4, 12, 15, 16:(1)左手准则:在迷宫中行进的电脑鼠面对两种以上选择方向时,优先选择向左行进,其次选择向前行进,最后选择向右行进。(2)右手准则:在迷宫中行进的电脑鼠面对两种以上选择方向时,优先选择向右行进,其次选择向前行进,最后选择向左行进。(3)中左准则:在迷宫中行进的电脑鼠面对两种以上选择方向时,优先选择向前行进,其次选择向左行进,最后选择向右行进。(4)中右准则:在迷宫中行进的电脑鼠面对两种以上选择方向时,优先选择向前行进,其次选择向右行进,最后选择向左行进。(5)乱序准则:或称乱数准则,在迷宫中行进的电脑鼠面对两种以上选择方向时,以随机值(随机方向)作为下一步的行进方向。(6)向心准则:在迷宫中行进的电脑鼠面对两种以上选择方向时,优先选择距离迷宫中心最近的方向作为行进方向。上述各类法则基本能够解决迷宫中的路径选择问题。对于单迷宫(无回路)而言,其“入口”与“出口”的在拓扑学上始终是封闭的,因此,在迷宫中的行进者只需一直沿单一墙壁前进必然抵达目的地;对于复迷宫而言,上述“法则”不能完全解决,但是只考虑本次课题中设计的迷宫问题,可以认为课题中面向的迷宫是由多个单迷宫组成,因此利用上述准则中的任意一种就可以充分解决目标搜寻问题。2.3 迷宫问题的搜寻策略上述的搜寻准则解决的是电脑鼠在迷宫行进中微观的最优决策问题,即保证目标地点的成功抵达,而搜寻策略(或称搜寻模式1, 18, 19)则解决的是迷宫墙壁记忆、等高线绘制、最短路径等问题。目前的搜寻策略包括两类,如下:(1) 全部迷宫路径搜索策略:电脑鼠从出发到终点过程中会进行地毯式搜索,将迷宫中全部道路进行逐一行进,然后选择一条最优路径(根据不同要求选择路径最短,或时间最短),再从起点出发由最优路径抵达终点。 (2)单一迷宫路径搜索策略:电脑鼠在出发后只沿一条路径前进,直至终点,不再搜寻其他迷宫区域,不再返回,结束搜寻任务。面向全迷宫的搜寻策略可以获得迷宫的全部位置信息,利于未来获取目标最优路径的选取和算法优化,但是对于时间要求较高的任务或比赛,该策略会耗费大量时间而不具有实用性。面向局部的迷宫搜寻策略可以迅速解决目标搜寻任务,具有时间上的优势。如果进一步结合最佳路径判定算法,即返回时选取最短路径,则在时间上会具有明显优势。本次课题中采用单一迷宫路径的搜寻策略和优化算法。3 硬件系统分析3.1 实验平台与设计工具本次毕业设计以“IEEE 标准电脑鼠走迷宫”竞赛规则为研究背景,选取电脑鼠MicromouseV3.2作为研究对象和实验工具,选用基于“IEEE 标准电脑鼠走迷宫”标准的课题测试赛道作为测试环境。电脑鼠系统可以划分为硬件系统和软件系统。硬件系统包括10, 19, 20:电源模块、红外传感器模块、驱动电机模块、微处理器控制模块、机身模块。软件系统包括:红外检测模块、控制判断模块、驱动模块、运动调整模块、存储记忆模块(功能性模块)等。针对本次课题要求,电脑鼠功能系统的设计主要针对于控制模块、驱动模块、传感器模块等。本次毕设的软件开发平台是基于ARM公司发布的RealView MDK开发工具中集成的Keil uVision4。Keil uVision4支持目前市场上多种不同的MCS51架构的芯片以及ARM,具有编辑、编译、仿真等一体功能,且操作界面与VC+相类似,形成友好的操作界面21。 3.2 硬件控制模块分析本次设计以ST旗下的STM32F103R8T6增强型系列微控制器作为电脑鼠控制系统的控制器。在实际工程应用中,STM32F103R8T6适用于多种工作场合:电机驱动、探测控制等常规电子设备;可编程控制器、继电器等工业设备等。STM32F103R8T6核心使用的是ARM® Cortex-M3处理器。芯体尺寸32位,速度72MHZ,RAM为20KB,程序存储64KB,存储类型FLASH,数据转换器为A/D16*12B,电压-电源(Vcc/Vdd)为2V-3.6V,工作温度为-4085摄氏度。外设为DMA、电机驱动控制PWM、PDR等。在本次毕业设计中,基于STM32微处理器的控制模块需要完成对传感器探测模块的迷宫环境与路径信号做出处理和分析,并下达判定指令;对迷宫环境信息进行记忆和最优返回路径的计算;对电脑鼠运动姿态进行调整修正等任务。上述功能的完成需要配合其他模块进行系统合作和反馈。本次毕设使用的电脑鼠MicromouseV3.2对应的MCU电路如图3.1所示。图3.1 电脑鼠MCU电路原理图3.3 电机选择与分析本次毕业设计采用的电脑鼠驱动模块使用的是基于脉宽调制的集成电路芯片L298N,实现驱动和控制两个直流电机。采用74HC245作为驱动器与主控芯片的缓冲器,实现数据总线的双向异步通信。驱动电路依据PWM脉冲信号的占空比进行速度调节,进一步控制运动姿态和行进方向。驱动电路如图3.2所示。图3.2 驱动电路图3.3.1 电机比较驱动模块中电机是决定电脑鼠行进与运动姿态调整的基本工具13, 22。目前,步进电机和普通直流电机是使用最为广泛的两种驱动电机。步进电机的核心思路是利用控制电路将供给的直流电转换为分时的多相时序电流,并以此供电。直流电机(direct current machine)是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机,的结构应由定子和转子两大部分组成。上述两种电机的优缺点如表3.1。表3.1 步进电机与直流电机的比较电机类型优点缺点控制方式步进电机每步的进度在3%5%,且误差不会累积,具有行进准确的优势;开环控制使得电机结构简单,成本较低;电机转速范围较大且易于控制。高转速难以获得,效率低,耗电大。加减速齿轮利用闭环回路控制。直流电机速度调整具有范围广、过程平滑等特征;抗负载能力强,适应频繁冲击负载;制动、旋转等功能可以在短期内频繁实现;耗电较低。速度同步控制、低速控制等难度大,且低速启动有振动,价格高,控制器要求高。CPU 输出脉冲控制。考虑步进电机与直流电机的特点,可以发现:步进电机能够达到快速启动与停止、精度高、反转控制灵活的要求;直流电机能够达到调速性能优良、过载能力强、冲击负载承受度高的要求。3.3.2 电机选择考虑本次毕设的研究背景和设计要求,驱动模块中电机需要满足以下几个方面的要求:(1)可靠性:保证在电脑鼠行驶过程中电机控制能够满足系统自动控制要求,及时稳定执行关于转向、姿态调整等指令。(2)精度:在执行行进、方向调整、姿态控制等过程中,驱动模块接收控制模块命令并由电机执行,而较高的电机精度能够保证上述命令的执行效果与测试结果。此外,因为控制系统的精度与步进电机的步距精度、直流电机的线性度、矢步振荡直接相关。(3)启动、反向、停止能连续完成,响应快。(4)较高的速度调整性能、较强的过载和承担频繁冲击负载的能力。结合近期我校的迷宫鼠竞赛均换成了直流电机,因此可以预测直流电机将越来越会被普及到各种赛事中。而且步进电机在执行点到点的移动命令时(假设为直线),需要经过提速、恒速、减速的过程。如果在启动阶段,速度一次达到预定速度,启动频率有可能超过极限启动频率,而步进电机会发生失步先现象,导致启动失控。在本次课题研究中,电脑鼠需要完成连续转弯、路径探测、姿态调整等任务,速度的连续转换与调整会导致电机需要承担过负载和频繁冲击负载的状况。显然,在该条件下步进电机难以高效完成任务。相对地,直流电机可以在短期内实现制动、旋转等功能且具有较高的过负载能力和较大的速度调节范围,有利于电脑鼠在此次研究环境下的任务执行。因此,电脑鼠选取直流电机具有更明显的优势和任务适应性。3.4 传感器模块分析本次毕设采用的传感器模块是由5个分别位于“左前”、“左”、“前”、“右”、“右前”的反射式红外发射接收传感器检测电路构成,如图3.3。通过设置不同的发射频率实现在各个方向上远距和近距的环境探测功能。利用5个传感器检测电路完成对行进方向挡板的检测,获得迷宫墙壁信息。此外,利用非理想带通滤波器截止频率处幅频响应非理想的特征,通过调整发射频率,例如到35KHz,可以实现探测范围的控制,从而保证电脑鼠在行进过程中与挡板的距离保持在预定范围内,达到姿态调整的目的。图3.3 反射式红外发射接收传感器检测电路图3.4 模拟滤波器如图3.4所示,利用模拟滤波器对频率响应非理想的特性,在略微偏离中心频率的频点上可以获得探测距离稍短的探测结果。 码盘是测量角位移的数字编码器,在电脑鼠中与车轮同轴转动,通过用光电传感器计数从而监测码盘的转动角速度,因而测量车轮转动次数,结合迷宫位置单元的长度完成行进路径的计数,从而获得方位信息。码盘如图3.4所示。 码盘转一圈记录车轮行进距离(l)根据码盘转动圈数(n)计算迷宫鼠行进距离(L) L=n*l/圈图3.5 码盘示意图3.5 测试赛道本次毕设所使用的赛道是依据“IEEE 标准电脑鼠走迷宫”竞赛规则(如图3.4)而设计的测试迷宫。按照位置单元,迷宫可以划分为88的方格,示意图如图2.1所示。出发位置为任意位置,终点目的地中心位置的四个空白位置单元(如图1.3中的B)。一个位置单元对应于一个15cm15cm的方格,挡板单元为10cm1.5cm(高度厚度)。测试使用的迷宫为单迷宫,且迷宫包含挡板、方柱(挡板连接)、地板。图3.6 竞赛迷宫模型图4 软件系统设计与实现此次课题电脑鼠软件设计采用模块化设计方法,通过主程序调用各模块程序实现设计任务。主程序流程图见图4.1。其中路径决策功能模块、驱动功能模块完成迷宫探测与路径优化。开始N等待触发初始化Y探测到终点Y路径优化N结束回到起点Y迷宫探测N红外探测,读取传感器数值路口检测姿态控制路程控制图4.1 主程序流程图4.1 路径决策功能的实现本次毕业设计的要求包括(1)“连续转弯”、(2)“目标搜寻”。(1)主要是电脑鼠运动姿态的调整和在岔路口路径决策的判定等功能的基本应用。(2)是基于前述功能的基础上结合搜寻准则和策略完成确定任务。电脑鼠传感模块包括5个分别位于“左前”、“左”、“前”、“右”、“右前”的反射式红外发射接收传感器检测电路。其中,“左”、“前”、“右”反馈的挡板信息用于路径判定;“左前”、“右前”反馈的信息用来调整电脑鼠行进姿势,防止与挡板碰撞。基于此组信号,主控制模块做出路径决策判定。4.1.1 迷宫探测算法在具体实现中,考虑到设计要求,本次毕业设计选用“左手准则”作为搜寻准则、选用“面向局部迷宫的搜寻策略”作为搜寻策略。迷宫探测算法流程图如图4.2所示。开始前、左、右可行方向是否为终点左方可行且未探测过前方可行且未探测过右方可行且未探测过死路,按原数组元素值递减1方向返回1个单元是否有新路口左转并前进1个单元前进1个单元右转并前进1个单元数组更新进入终点结束YNYYYNNNNY图4.2 迷宫探测流程图4.1.2 路径决策功能程序及分析依据上述分析,具体实现如下:switch( sensorsState&0x1c)case 0x18:/Fif(sensorsStateAuxiliary&0x04)/*判断前方的墙距离是否较近,如果是,离墙距离远向左慢速转大弯,否则距离墙较近,向左快速转小弯*/MoveLeft(3);elseTurnLeft(2);break;case 0x14:/LF电脑鼠在跑道中位置朝向过于偏左,向右调整TurnRight(3);break;case 0x0c:/Lif(sensorsStateAuxiliary&0x10) /*如果左方墙壁距离较远,继续前行,如果距离较近,向右转。防止与墙壁碰撞*/MoveForward(5);elseMoveRight(3);break;case 0x10:/LF F如果左前和左方存在墙壁且距离较近,向右调整TurnRight(2);break;case 0x08:/L F 如果左方和前方均有墙壁(转弯),如果距离较远,向右调整,反之向右转。if(sensorsStateAuxiliary)&0x14)TurnRight(3);elseMoveRight(3);break;case 0x04:/L LF 如果左方或左前方存在墙壁,如果墙壁过近(30度角左右),向右转;反之,向右调整if(sensorsStateAuxiliary&0x10)MoveRight(3);elseTurnRight(2);break;case 0x1c:/none 四周不存在墙壁,向左转MoveLeft(3);break;case 0x00:/死路,向右调整或向右转,返回if(sensorsStateAuxiliary)&0x14)TurnRight(2);elseMoveRight(3);break;上述程序中各类情况如下列各图进行描述:电脑鼠电脑鼠(a)case 0x18:11000判断前方的墙距离是否较近,如果是,离墙距离远向左慢速转大弯,否则距离墙较近,向左快速转小弯(b)case 0x14:10100电脑鼠在跑道中位置朝向过于偏左,向右调整电脑鼠电脑鼠(c)case 0x0c:01100如果左方墙壁距离较远,继续前行,如果距离较近,向右转。防止与墙壁碰撞。(d)case 0x10:10000如果左前和左方存在墙壁且距离较近,向右调整电脑鼠电脑鼠(e)case 0x08:01000如果左方和前方均有墙壁(转弯),如果距离较远,向右调整,反之向右转。(f)case 0x04:00100如果左方或左前方存在墙壁,如果墙壁过近(30度角左右),向右转;反之,向右调整电脑鼠电脑鼠(g)case 0x1c:11100四周不存在墙壁,向左转(h)case 0x00:00000死路,向右调整或向右转,返回图4.3 路径决策功能执行情况4.2 驱动控制功能的实现电脑鼠搜寻迷宫以及该过程中的运动调整等机械运动均是基于位于左右两侧的电机驱动实现的。通过对两个电机分别下达控制各自转速和转向的指令信息,可以实现对电脑鼠行进速度、行进方向的控制与调整。本次毕业设计采用的电脑鼠配备的是直流电机,而基于标准定时器的PWM是目前调控直流电机的典型模块。具体的工程实现中,改变输入电机驱动链路的PWM占空比来实现上述对转速和转向的控制。电脑鼠处于直行状态时,左右两部电机输入的PWM一致;电脑鼠发生左、右转弯(路径调整)或小角度转向(运动状态调整)时,左右两部电机分别采用不同占空比的PWM信号。在具体实现时,利用L298N对两个电机分别进行驱动控制。表4.1 L298N控制电机功能表输入电机状态运行标志Ven(6脚、11脚)C(5脚、10脚)D(7脚、12脚)HHL正转电机转动LH反转00停止电机制动11停止L停止电机未受控制本次毕业设计利用电脑鼠自带芯片的PWM模块产生PWM信号(含占空比调整)实现对电机的控制,程序处理流程图如图4.7所示。微处理器下达驱动指令向前:分别对左右车轮产生PWM波,占空比为50%,驱动车。停止:产生信号为0的控制信号,左右车轮分别停止车。控制行进步数车。原地左转:左轮向后转,右轮向前原地右转:左轮向前转,右轮向后向左偏转,左右轮转速比为2:5向右偏转,左右轮转速比为5:2图4.7 驱动模块程序流程框图具体程序如下所示:/* * 文件名 :motor.c * 描述 :直流电机 L298N 驱动函数库 * 实验平台:emouse STM32竞赛平台 * 硬件连接:- * | L298N硬件连接: | * | PC6 - IN1(右电机) | * | PC7 - IN2 | * | PC8 - IN3 (左电机) | * |PC9 - IN4 | * | PA8 - ENA (右电机PWM) | * | (TIM1-CH1) | * | PA9 - ENB (左电机PWM) | * | (TIM1-CH2) | * |-| * | 测速传感器接口: | * | PB8 - SL (左电机测速) | * | (TIM4-CH3) | * | PB9 - SR (右电机测速) | * | (TIM4-CH4) | * - * 库版本 :ST3.5.0 * 时间 :13/06/26 * 作者 :温世波*/#include motor.h/* 电机模块初始化配置*/* * 函数名:Motor_GPIO_Config * 描述 : 电机模块IO端口配置 * * 输入 :无 * 输出 :无 * 调用 :内部调用 */static void Motor_GPIO_Config (void) /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOA,GPIOC,GPIOD 的外设时钟*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); /*(IN1,IN2,IN3,IN4)*/*选择要控制的GPIOC引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; /IN1,IN2,IN3/*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIOC*/ GPIO_Init(GPIOC, &GPIO_InitStructure); /*(ENA-PA8,ENB-PA9)*/*选择要控制的GPIOA引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; /PA10:右电机PWM输入/*设置引脚模式为复用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIOA*/ GPIO_Init(GPIOA, &GPIO_InitStructure);/* 关闭电机模块的所有输入引脚*/ GPIO_ResetBits(GPIOC, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);/* * 函数名:TIM1_Motor_Config * 描述 :TIM1配置,电机PWM信号,如周期、极性、占空比 * * 输入 :无 * 输出 :无 * 调用 :内部调用 * 注释 :L298N 开关频率正常为25KHz,最大为40KHz, * 此处设置为25KHz */static void TIM1_Motor_Config(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); TIM_DeInit(TIM1); /重设为缺省值 /*TIM1时钟配置*/ TIM_TimeBaseStructure.TIM_Prescaler = 72-1; /预分频(时钟分频)72M/72=1000K TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /向上计数 TIM_TimeBaseStructure.TIM_Period = 40-1; /装载值 1000k/40=25khz 就是说向上加的40便满了 /TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /无影响 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; /周期计数器值 不懂得不管 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); /初始化TIMx的时间基数单位 /* Channel 1 Configuration in PWM mode 通道一的PWM */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; /PWM模式2 先输出无效电平 再输出有效电平 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; /使能输出 /TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; /反向通道也有效 PB13 TIM_OCInitStructure.TIM_Pulse = 39; /占空时间 39 中有39的时间为高,互补的输出正好相反 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; /输出极性 有效为低 / TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; /互补端的极性 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; /空闲状态下的非工作状态 不管 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; /先不管 TIM_OC1Init(TIM1,&TIM_OCInitStructure); /通道1 TIM_OC2Init(TIM1,&TIM_OCInitStructure); /通道2 TIM_Cmd(TIM1,ENABLE); /* TIM1 Main Output Enable 使能TIM1外设的主输出*/ TIM_CtrlPWMOutputs(TIM1,ENABLE);/* * 函数名:Motor_Init * 描述 :电机模块初始化,初始化成功后有两路PWM波输出 * 输入 :无 * 输出 :无 * 调用 :外部调用 */void Motor_Init(void)Motor_GPIO_Config();TIM1_Motor_Config(); /* 电机模块功能函数*/* * 函数名:Motor_Left_Run * 描述 :左电机正转 * 输入 :无 * 输出 :无 * 调用 :内部调用 */void Motor_Left_Run(void) / IN3: 0 / IN4: 1/GPIO_ResetBits(GPIOC, GPIO_Pin_9);/GPIO_SetBits(GPIOC, GPIO_Pin_8);GPIO_SetBits(GPIOC, GPIO_Pin_8);GPIO_ResetBits(GPIOC, GPIO_Pin_9);/* * 函数名:Motor_Left_Stop * 描述 :左电机停止 * 输入 :无 * 输出 :无 * 调用 :内部调用 */void Motor_Left_Stop(void)/ IN3: 0/ IN4: 0GPIO_ResetBits(GPIOC, GPIO_Pin_9);GPIO_ResetBits(GPIOC, GPIO_Pin_8);/* * 函数名:Motor_Left_Back * 描述 :左电机反转 * 输入 :无 * 输出 :无 * 调用 :内部调用 */void Motor_Left_Back(void) / IN3: 1 / IN4: 0GPIO_ResetBits(GPIOC, GPIO_Pin_8);GPIO_SetBits(GPIOC, GPIO_Pin_9);/ GPIO_SetBits(GPIOC, GPIO_Pin_9);/ GPIO_ResetBits(GPIOC, GPIO_Pin_8);/*void Motor_Turn(void) GPIO_SetBits(GPIOC, GPIO_Pin_7); /1GPIO_ResetBits(GPIOC, GPIO_Pin_6); /0GPIO_SetBits(GPIOC, GPIO_Pin_8); /1GPIO_ResetBits(GPIOC, GPIO_Pin_9); /0*/* * 函数名:Motor_Right_Run * 描述 :右电机正转 * 输入 :无 * 输出 :无 * 调用 :内部调用 */void Motor_Right_Back(void) / IN1: 0 / IN2: 1GPIO_SetBits(GPIOC, GPIO_Pin_6);GPIO_ResetBits(GPIOC, GPIO_Pin_7);/* * 函数名:Motor_Right_Stop * 描述 :右电机停止 * 输入 :无 * 输出 :无 * 调用 :内部调用 */void Motor_Right_Stop(void) / IN1: 0 / IN2: 0GPIO_ResetBits(GPIOC, GPIO_Pin_7);GPIO_ResetBits(GPIOC, GPIO_Pin_6);/* * 函数名:Motor_Right_Back * 描述 :右电机反转 * 输入 :无 * 输出 :无 * 调用 :Motor_Direct_Set内部调用 */void Motor_Right_Run(void) / IN1: 1 / IN2: 0GPIO_ResetBits(GPIOC, GPIO_Pin_6);GPIO_SetBits(GPIOC, GPIO_Pin_7);void Motor_Run_Speed(u8 lspeed, u8 rspeed)Motor_Left_Run();Motor_Right_Run();TIM_SetCompare1(TIM1, rspeed); /设置左右电机PWM占空比TIM_SetCompare2(TIM1, lspeed);void Motor_TurnL_Speed(u8 lspeed, u8 rspeed)Motor_Left_Back();Motor_Right_Run();TIM_SetCompare1(TIM1, rspeed);TIM_SetCompare2(TIM1, lspeed);void Motor_TurnR_Speed(u8 lspeed, u8 rspeed)Motor_Left_Run();Motor_Right_Back();TIM_SetCompare1(TIM1, rspeed);TIM_SetCompare2(TIM1, lspeed);void Motor_Back_Speed(u8 lspeed, u8 rspeed)Motor_Left_Back();Motor_Right_Back();TIM_SetCompare1(TIM1, rspeed);TIM_SetCompare2(TIM1, lspeed);void Car_Run(void) Motor_Right_Run();Motor_Left_Run();void Car_TurnL(void) Motor_TurnL_Speed(26, 26);Delay_ms(80);Motor_Right_Stop(); Motor_Left_Stop();void Car_TurnR(void) Motor_TurnR_Speed(26, 26);Delay_ms(90);Motor_Right_Stop(); Motor_Left_Stop();void Motor_Brake(void) Motor_Right_Stop(); Motor_Left_Stop(); void Car_TurnBL(void) Motor_Left_Back();Motor_Right_Run();Delay_ms(175);Motor_Right_Stop(); Motor_Left_Stop();void Car_TurnBR(void) Motor_Right_Back();Motor_Left_Run();Delay_ms(175);Motor_Right_Stop(); Motor_Left_Stop();/* 电机测速模块*/* * 函数名:TIM4_Cap_Init * 描述 : 定时器4通道3输入捕获设置 * 拥有左电机测速 * PB8 *右电机 *PB9(未加入) * 输入 : * arr: 自动重装载值 * psc: 预分频值 * 输出 :无 * 调用 :内部调用 */ void TIM4_Cap_Init(u16 arr,u16 psc)GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【语文】浙江省杭州市胜利小学小学四年级上册期末试题
- 医院科室火灾应急预案演练方案
- 钢筋工程专项施工方案
- 工伤保险知识竞赛题库及参考答案
- 2024年通信安全员ABC证新版试题及通信安全员ABC证考试试题及答案
- 压力容器操作工实操题库及答案
- 咨询服务立项方案模板
- 汽车数字营销的咨询方案
- 2025年内联网安全系统项目立项申请报告
- 开业庆典策划活动方案内容
- 大圆满前行考试题及答案
- 2025贵州毕节威宁自治县面向社会招聘城市社区工作者17人考试参考试题及答案解析
- 建筑工地垃圾清理与处理方案
- 修井现场安全培训内容课件
- 2022届辽宁省大连市高三一模语文试题
- 企业后备干部培养及管理办法
- 2025年标准服装行业安全员考试题库及答案
- 2025年宜昌专业技术人员公需科目培训考试题及答案
- 山区道路施工施组
- 数控heidenhain说明书TNC直接提供两种加工孔模板的循环
- GB/T 42453-2023信息安全技术网络安全态势感知通用技术要求
评论
0/150
提交评论