电脑鼠程序设计

上传人:沈*** 文档编号:68980815 上传时间:2022-04-05 格式:DOC 页数:29 大小:521.50KB
收藏 版权申诉 举报 下载
电脑鼠程序设计_第1页
第1页 / 共29页
电脑鼠程序设计_第2页
第2页 / 共29页
电脑鼠程序设计_第3页
第3页 / 共29页
资源描述:

《电脑鼠程序设计》由会员分享,可在线阅读,更多相关《电脑鼠程序设计(29页珍藏版)》请在装配图网上搜索。

1、1、 绪论所谓“电脑鼠”,英文名叫做MicroMouse,是使用嵌入式微控制器、传感器和机电运动部件构成的一种智能行走装置的俗称,它可以在“迷宫”中自动记忆和选择路径,寻找出口,最终达到所设定的目的地。国际电工和电子工程学会(IEEE)每年都要举办一次国际性的电脑鼠走迷宫竞赛,自举办以来参加国踊跃,为此许多大学还开设了“电脑鼠原理和制作”选修课程。电脑鼠可谓是一种具有人工智能的小型机器人,依照新制的比赛规则,当电脑鼠放入起点,按下启动键之后,它就必须自行决定搜寻法则并且在迷宫中前进、转弯、记忆迷宫墙壁资料、计算最短路径、搜寻终点等功能。电脑鼠更结合了机械、电机、电子、控制、光学、程序设计和人工

2、智能等多方面的科技知识。人类在科技的发展史上,一直在尝试着想要创造出一个具有肢体、感官、脑力等综合一体的智能机器人,而电脑鼠就是一个很能够用来诠释肢体、感官及脑力综合工作的基本实例,这也是当初电脑鼠被发明的理由,希望能够借助电脑鼠的创作来进而研究与发明更加复杂的机械。图1.1 电脑鼠走迷宫一只电脑鼠是具有机电知识整合的基本架构,本身就像是一个智能的机器人。要在指定的迷宫中比赛,就像是一个人置身于竞赛中,必须要靠本身的判断力、敏捷动作及正确探查周边环境,来赢得胜利。一般来说,一只电脑鼠需具备有下列三件基本能力:(1) 拥有稳定且快速的行走能力;(2) 能正确判断能力;(3) 记忆路径的能力。行走

3、能力指的就是电机,当电机收到讯号时,系统必须判断是否能同步行走,遇到转角时,转弯的角度是否得当,一个好的电机驱动程序,可以减少行走时所需要做的校正时间。判断能力的关键就在于传感器,它的地位如同人类的双眼,一个好的传感器驱动程序,可避免一些不必要的错误动作,如撞壁、行走路线的偏移等等。而记忆能力就像是大脑,它的功能并没有因为看不见而遭到忽视,相反地,它的地位在整场比赛中是最重要的,他必须把所走过的路都能一一记下来,并将其资料送给系统,让系统整理出最佳路径以避开不必要的路段。1.1 电脑鼠的发展历史最初,电脑鼠是机械的。1972 年,机械设计杂志发起了一场比赛。在比赛中,仅由捕鼠器弹簧驱动的机械鼠

4、不停地与其它参赛鼠竞赛,以判断哪个机械鼠能够沿着跑道跑出最长的距离。冠军是“mousemobile”,它跑了825.3 英尺。1977 年,IEEE Spectrum 杂志提出电脑鼠的观念。电脑鼠是一个小型的由微处理器控制的机器人车辆,在复杂迷宫中具有译码和导航的功能和能力。1977 年5 月,Spectrum 宣布首场美国令人震惊的电脑鼠迷宫大赛在1979 年于纽约举行。在6000 个参赛作品中仅有15个电脑鼠比赛胜出。一些电脑鼠被报道为“大脑智障”(“brain failure”),另外一些则被宣布为电脑鼠“爆炸”(“blow up”)。当大家都非常关心这个话题时,智能电脑鼠的设计和制作显

5、然就被证实比想象中的困难得多。1980 年,在伦敦Euromicro80 举办了一场欧洲版的比赛,但是18 个参赛鼠都没能成功地完成这个迷宫赛。在比赛的观众当中,有五位来自日本新科学基金会的代表。他们将此比赛规则带回了东京,后来还在1980 年11 月举办了首场全日本电脑鼠比赛。1985 年8 月,在日本Tsukuba 举行了首场世界电脑鼠大赛。电脑鼠来自整个欧洲和美国,使用的传感器有红外的、超声波的和CCD 的,驱动装置有步进电机的和DC 伺服电机的。所有最高奖项均由日本的电脑鼠Noriko-1 赢得,一举成为世界冠军。1987 年,电机工程协会(IEE)在伦敦举办了一场电脑鼠锦标赛,13

6、个电脑鼠角逐冠军。来自美国麻省理工学院(MIT)的David Otten 带着他的两个参赛鼠Mitee Mouse I 和Mitee MouseII 获得了一等奖和二等奖。比赛采用新的得分体制,以奖励那些能够智能、高效地解开迷宫的方案和能够独立运行的电脑鼠。一位新加坡工程协会(IES)的议会成员在1986 年偶然发现了电脑鼠。因为他对电脑鼠以及电脑鼠的复杂程度和前景非常感兴趣,所以他觉得在新加坡举办一场国际电脑鼠大赛非常合适(IES 作为主要的赞助商)。1987 年10 月,新加坡举行了第一届新加坡电脑鼠比赛。比赛的冠军MIR3+(来自Nanyang技术协会)是1988 年在伦敦举行的IEE

7、UK 国际电脑鼠比赛的季军。1989 年7 月,由第二届新加坡电脑鼠比赛的获胜者组成比较大的新加坡队参加了在伦敦举行的1989 年IEE UK 国际电脑鼠大赛。新加坡参赛者获得了最高8 个奖项中的6 个。David Otten 的Mittee Mouse III 夺得了亚军,UK 某企业则获得了第五名。在1989 年10 月21 日,IES 邀请澳大利亚、日本、台湾、UK 和美国最好的电脑鼠来参加新加坡首场国际电脑鼠大赛。来自美国和台湾的电脑鼠等待着复仇的时机,因为他们在7月份的伦敦大赛曾一度被新加坡打败。13 个来自当地的和外国的参赛者的电脑鼠在3 个小时的比赛中,表演出来的速度和敏捷程度使

8、得观众叹为观止。新加坡获得第2 名、第4 名、第5 名和第7 名的事实出乎了很多人的意外。1991 年,世界锦标赛在香港举行,这是继1985 年Tsukuba 世界锦标赛的又一场最大的国际盛会:来自13 个国家的21 位选手带着30 个电脑鼠来比赛。自1991 年以来,世界级的比赛数目显著增加。原来一年举行56 场比赛,现在增加到100 场以上。电脑鼠比赛在中国大陆还很少见,直到2007 年,由上海市计算机学会主办的IEEE 标准电脑鼠走迷宫邀请赛(长三角地区)在上海师范大学举行,有三十多所院校参加,反响强烈。1.2 电脑鼠比赛规则最新的电脑鼠比赛规则是2006 年国际电工和电子工程学会(IE

9、EE)制定的电脑鼠走迷宫竞赛规则,这个规则将会对我们制作电脑鼠具体方案的设计提供依据,其具体内容请参见附录A()。1.3 电脑鼠走迷宫标准套件1.3.1 电脑鼠比赛标准迷宫由广州周立功单片机发展有限公司设计和生产的电脑鼠比赛专用迷宫完全符合 IEEE 国际标准。针对不同的需求,目前共有两种可供选择的型号。1. MicroMouse Maze 88:四分之一迷宫,如图1.2 所示。即该迷宫是标准迷宫的四分之一大小。该迷宫底板的尺寸为1.48m1.48m,上面共有88 个标准迷宫单元格。该迷宫可以用来初期调试学习使用,也可以用来做学校课程设计、毕业设计和内部竞赛的比赛迷宫。图1.2 MicroMo

10、use Maze 882. MicroMouse Maze 1616:标准迷宫,如图1.1 所示。该迷宫尺寸规格等完全符合IEEE 国际标准。迷宫底板的尺寸为2.96m2.96m,上面共有1616 个标准迷宫单元格。1.3.2 MicroMouse615如图1.3 所示,MicroMouse615 是由广州致远电子设计生产的一款电脑鼠,它的微控制器是由Luminary 公司生产的Cortex-M3 内核的ARM 处理器LM3S615,它具有以下一些特点:图1.3 MicroMouse615􀁺 体积小,宽度只有迷宫格的一半;􀁺 五组可测距的红外线传感器,灵敏度

11、方便现场调节;􀁺 电机为步进电机,控制容易;􀁺 电池为 2200mAh,7.4V 的可充电锂电池;􀁺 支持电池的电压监测,避免电量不足带来的麻烦;􀁺 一个按键,完全满足了实际需要;􀁺 为用户预留了 6 个GPIO 口,一个串口,一个SPI 接口。1.3.3 配套的开发工具如图 1.4 所示,与MicroMouse615 配套的有充电器、LM LINK USB JTAG 调试器和SPI接口的键盘显示模块,使用户开发调试更为方便。图1.4 MicroMouse615 及配套开发工具1.4 文档阅读说明本文以广

12、州致远电子有限公司生产的MicroMouse615 型电脑鼠作为硬件开发平台,从硬件原理到程序设计都做了详细分解。文中附了大量程序源代码,在程序设计过程中,为了便于阅读和编写,使用了一套变量的定义方法。1 数据类型定义如程序清单1.1 所示,重新定义几种常用的数据类型名。程序清单1.1 数据类型重定义typedef unsigned char uint8; / 无符号8 位整型变量typedef signed char int8; / 有符号8 位整型变量typedef unsigned short uint16; / 无符号16 位整型变量typedef signed short int16

13、; / 有符号16 位整型变量typedef unsigned int uint32; / 无符号32 位整型变量typedef signed int int32; / 有符号32 位整型变量typedef float fp32; / 单精度浮点数(32 位长度)typedef double fp64; / 双精度浮点数(64 位长度)2 局部变量定义局部变量名包含变量类型和变量描述两个部分,以局部变量Temp 为例,在不同类型下的定义如表1.1 所示。可以看出,在变量Temp 前加上了其类型的缩写。表1.1局部变量的定义变量类型变量名整形(int、unsigned int)Itemp、uit

14、emp短整型(short、unsigned short)Stemp、ustemp长整形(long、unsigned long)Itemp、ultemp浮点型(float、double)Ftemp、dtemp字符型(char、unsigned char)Ctemp、uctemp3. 局部变量定义全局变量定义与局部变量定义相似,唯一的区别是在变量前还加了一个大写字母“G”,代表该变量为全局变量,还是以temp为例,在不同类型的定义如表1.2所示。表1.2全局变量的定义变量类型变量名整形(int、unsigned int)GItemp、Guitemp短整型(short、unsigned short)

15、GStemp、Gustemp长整形(long、unsigned long)GItemp、Gultemp浮点型(float、double)GFtemp、Gdtemp字符型(char、unsigned char)GCtemp、Guctemp4. 结构体本文中共定义两种结构体类型,分别如程序清单1.2和程序清单1.3所示。程序清单1.2结构体“MOTOR”struct motor int8 cState; /* 电机运行状态 */ int8 cDir; /* 电机运行方向 */ uint32 uiPulse; /* 电机需要转动的步数 */ uint32 uiPulseCtr; /* 电机已转动的步

16、数 */ int32 iSpeed; /* 电机转动速度 */;typedef struct motor MOTOR;程序清单1.3结构体“MAZEGOOR”Struct mazecoorInt8 cX;Int8 cY;Typedef struct mazecoor MAZECOOR;我们分别定义“m”和“mc”为“MOTOR”类型和“MAZECOOR”类型,还是以temp变量为例,如表1.3所示。表1.3 结构体类型变量的定义变量类型局部变量全局变量MOTORMtempGmtempMAZECOORMctempGmctemp2、Micromouse 硬件原理2.1原件布局图Micromouse

17、原件布局图如图2.1所示图2.1micromouse 原件布局图2.2 电路原理图Micromouse整体电路原理图Micromouse整体电路原理图3程序设计电脑鼠是一个智能机器鼠,其灵活性和智能程度不但取决于硬件的结构和性能,还取决与软件设计的优良,越是智能的电脑鼠,其的软件设计就越不简单。在电脑鼠程序设计中,可以把程序整体结构简单分为两层,即底层驱动程序和顶层算法程序。底层驱动程序主要实现电脑鼠的一些基本功能,比如直线控制其前进N个单位坐标格,测量它前进的距离,向右或向左转90度、向后转、防止碰撞墙壁、迷宫格四周墙壁信息的检测等。顶层算法程序则主要是一些电脑鼠的智能算法,比如根据迷宫信息

18、决定电脑鼠动作,记住走过迷宫的地图,寻找达到目的地的最优路径等。3.1 7289EX BOARD的使用7289EX BOARD模块是一个键盘控制以及数码管驱动PACK板,控制芯片为ZLG7289B,ZLG7289B提供了SPI接口和键盘中断信号,方便与处理器连接,可驱动8位共阴数码管或64只独立LED和64个按键。在本模块上有8个8段共阴极数码管及12个按键。ZLG7289与微控制器的接口采用三线制SPI串行总线,与LM3S615上的标准四线制SPI接口有所差别,所以只能用软件来模拟三线制SPI接口与ZLG7289通信。#include Zlg7289.h#include hw_memmap.

19、h#include hw_ints.h#include interrupt.h#include gpio.h#include sysctl.h/* Function name: GPIO_Port_A_ISR* Descriptions: 端口A中断服务函数* input parameters: 无* output parameters: 无* Returned value: 无*/void GPIO_Port_A_ISR (void) uint8 ucIntStatus; uint8 ucKey; ucIntStatus = GPIOPinIntStatus(GPIO_PORTA_BASE,

20、 true); /* 读PA口中断状态*/ if(ucIntStatus & ZLG7289_KEY) /* 判断是否为按键中断 */ GPIOPinIntClear(GPIO_PORTA_BASE,ZLG7289_KEY); /*清中断*/ ucKey = zlg7289Key(); /* 读按键值 */ /*若按键有效,则让8个数码管一起显示出来 */ if (ucKey != 0xff) zlg7289Download(1, 0, 0, ucKey); zlg7289Download(1, 1, 0, ucKey); zlg7289Download(1, 2, 0, ucKey); zl

21、g7289Download(1, 3, 0, ucKey); zlg7289Download(1, 4, 0, ucKey); zlg7289Download(1, 5, 0, ucKey); zlg7289Download(1, 6, 0, ucKey); zlg7289Download(1, 7, 0, ucKey); /* Function name: main* Descriptions: 主函数* input parameters: 无* output parameters: 无* Returned value: 无*/main (void) SysCtlClockSet( SYSC

22、TL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); /* 使能PLL,50M */ zlg7289Init(); /* 初始化ZLG7289 */GPIODirModeSet(GPIO_PORTA_BASE, ZLG7289_KEY, GPIO_DIR_MODE_IN); /* 设置KEY端口为输入 */GPIOIntTypeSet(GPIO_PORTA_BASE, ZLG7289_KEY, GPIO_FALLING_EDGE); /* 配置引脚下降沿触发中断 */ GPIOPinIntEnable(GPIO

23、_PORTA_BASE, ZLG7289_KEY); /* 使能引脚输入中断*/ IntEnable(INT_GPIOA); /* 使能GPIO PA口中断 */ /*显示数据 */ zlg7289Download (0, 0, 0, 0); zlg7289Download (0, 1, 0, 1); zlg7289Download (0, 2, 0, 2); zlg7289Download (0, 3, 0, 3); zlg7289Download (0, 4, 0, 4); zlg7289Download (0, 5, 0, 5); zlg7289Download (0, 6, 0, 6)

24、; zlg7289Download (0, 7, 0, 7); while (1); /* 等待按键中断 */3.2 红外线传感器的测距Micromouse上共有5组红外线传感器,每组红外传感器由红外线发射和红外线接收组成。Micromouse上的红外接收头是一体化红外线接收头。程序:#include hw_memmap.h#include hw_ints.h#include hw_types.h#include interrupt.h#include gpio.h#include sysctl.h#include Systick.h#include Pwm.h#include Zlg7289

25、.h#include Type.h/* PB端口定义*/#define IRSEND_BEVEL GPIO_PIN_0 /* 驱动斜角红外的PWM */#define LEFTSIDE GPIO_PIN_1 /* 左方传感器输出的信号 */#define FRONTSIDE_L GPIO_PIN_2 /* 左前方传感器输出的信号 */#define FRONTSIDE GPIO_PIN_3 /* 前方传感器输出的信号 */#define FRONTSIDE_R GPIO_PIN_4 /* 右前方传感器输出的信号 */#define RIGHTSIDE GPIO_PIN_5 /* 右方传感器输出

26、的信号 */* PE端口定义*/#define IRSEND_SIDE GPIO_PIN_0 /* 驱动左前右正向红外的PWM */* Function name: irSendFreq* Descriptions: 设置PWM频率* input parameters: uiFreq: 红外线载波频率* cNumber: 选择需要设置的PWM模块* output parameters: 无* Returned value: 无*/void irSendFreq (uint32 uiFreq, int8 cNumber) uiFreq = SysCtlClockGet() / uiFreq; s

27、witch (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的周期*/ PWMPulseWidt

28、hSet(PWM_BASE, PWM_OUT_4, uiFreq / 2); /* 设置PWM4输出的脉冲宽度*/ PWMGenEnable(PWM_BASE, PWM_GEN_2); /* 使能PWM发生器2 */ break; default: break; /* Function name: SysTick_ISR* Descriptions: 系统定时器中断服务函数。* input parameters: 无* output parameters: 无* Returned value: 无*/void SysTick_ISR (void) static uint8 ucState =

29、0; uint8 ucIRCheck; switch (ucState) case 0: irSendFreq(35000, 2); /* 探测左右两侧近距*/ irSendFreq(35000, 1); /* 驱动斜角上的传感器检测 */ break; case 1: ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0x3e); /* 读取传感器状态*/ PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM发生器2 */ PWMGenDisable(PWM_BASE, PWM_GEN_1); /* 禁止PWM发生器1 */

30、 if (ucIRCheck & RIGHTSIDE) zlg7289SegOff(38); else zlg7289SegOn(38); if (ucIRCheck & LEFTSIDE) zlg7289SegOff(6); else zlg7289SegOn(6); if (ucIRCheck & FRONTSIDE_R) zlg7289SegOff(24); else zlg7289SegOn(24); if (ucIRCheck & FRONTSIDE_L) zlg7289SegOff(8); else zlg7289SegOn(8); break; case 2: irSendFre

31、q(38000, 2); /* 驱动检测左前右三个方向远距 */ break; case 3: ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0x2a); /* 读取传感器状态*/ PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM发生器2 */ if (ucIRCheck & RIGHTSIDE) zlg7289SegOff(32); else zlg7289SegOn(32); if (ucIRCheck & LEFTSIDE) zlg7289SegOff(0); else zlg7289SegOn(0); if (

32、ucIRCheck & FRONTSIDE) zlg7289SegOff(16); else zlg7289SegOn(16); break; default: break; ucState = (ucState + 1) % 4; /* 循环检测 */* Function name: sensorInit* Descriptions: 传感器控制初始化* input parameters: 无* output parameters: 无* Returned value: 无*/void sensorInit (void) SysCtlPeripheralEnable( SYSCTL_PERI

33、PH_GPIOB ); /* 使能GPIO B口外设*/ SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOE ); /* 使能GPIO E口外设 */ /*设置连接到传感器信号输出脚的I/O口为输入模式*/ GPIODirModeSet(GPIO_PORTB_BASE, LEFTSIDE | FRONTSIDE_L | FRONTSIDE | FRONTSIDE_R | RIGHTSIDE, GPIO_DIR_MODE_IN); /*用PWM驱动红外线发射头产生调制的红外线信号*/ SysCtlPeripheralEnable(SYSCTL_PERIPH_P

34、WM); /* 使能PWM模块 */ SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /* PWM时钟配置:不分频*/ /*初始化PWM2,该PWM驱动斜角红外发射头*/ GPIOPinTypePWM(GPIO_PORTB_BASE, IRSEND_BEVEL); /* PB0配置为PWM功能 */ PWMGenConfigure(PWM_BASE, PWM_GEN_1, /* 配置PWM发生器1 */ PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); /* 加计数,立即更新*/ PWMOutputState(PWM_BASE,

35、 PWM_OUT_2_BIT, true); /* 使能PWM2输出 */ PWMGenDisable(PWM_BASE, PWM_GEN_1); /* 禁止PWM发生器1 */ /* 初始化PWM4,该PWM驱动左前右正方向红外发射头*/ GPIOPinTypePWM(GPIO_PORTE_BASE, IRSEND_SIDE); /* PE0配置为PWM功能 */ PWMGenConfigure(PWM_BASE, PWM_GEN_2, /* 配置PWM发生器2 */ PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); /* 加计数,立即更新*/ PW

36、MOutputState(PWM_BASE, PWM_OUT_4_BIT, true); /* 使能PWM4输出 */ PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM发生器2 */* Function name: sysTickInit* Descriptions: 系统节拍定时器初始化。* input parameters: 无* output parameters: 无* Returned value: 无*/void sysTickInit (void) SysTickPeriodSet(SysCtlClockGet() / 1600); /*

37、设置定时时钟为625us */ SysTickEnable(); /* 使能系统时钟 */ SysTickIntEnable(); /* 使能系统时钟中断 */* Function name: main* Descriptions: 主函数* input parameters: 无* output parameters: 无* Returned value: 无*/main (void) SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); /* 使能PLL,50M */

38、 sensorInit(); /* 传感器初始化 */ sysTickInit(); /* 系统时钟初始化 */ zlg7289Init(); /* 显示模块初始化 */ while(1);3.3 步进电机控制Micromouse上有两个两相四线制的异步电机,采用的是BA6845的驱动芯片。程序:#include hw_memmap.h#include hw_ints.h#include hw_types.h#include interrupt.h#include gpio.h#include sysctl.h#include Systick.h#include Timer.h#include

39、 Pwm.h#include Type.h/* PC端口定义*/#define KEY GPIO_PIN_4 /* 按键连接的端口 */* PD端口定义*/#define PHRA1 GPIO_PIN_0 /* 右侧步进电机的A1相 */#define PHRA2 GPIO_PIN_1 /* 右侧步进电机的A2相 */#define PHRB1 GPIO_PIN_2 /* 右侧步进电机的B1相 */#define PHRB2 GPIO_PIN_3 /* 右侧步进电机的B2相 */* 常量宏定义-电机状态*/#define STOP 0 /* 电机停止 */#define RUN 1 /* 电机

40、运行 */* 常量宏定义-电机运行方向*/#define GOAHEAD 0 /* 电机前进 */#define GOBACK 1 /* 电机后退 */* 结构体定义*/struct motor int8 cState; /* 电机运行状态 */ int8 cDir; /* 电机运行方向 */ uint32 uiPulse; /* 电机需要转动的步数 */ uint32 uiPulseCtr; /* 电机已转动的步数 */ uint32 uiSpeed; /* 电机转动速度 */;typedef struct motor MOTOR;/* 定义全局变量*/static MOTOR GmRigh

41、t = STOP, GOAHEAD, 0, 0, 0; /* 定义并初始化右电机状态 */* Function name: delay* Descriptions: 延时函数* input parameters: uiD :延时参数,值越大,延时越久* output parameters: 无* Returned value: 无*/void delay (uint32 uiD) for (; uiD; uiD-);/* Function name: rightMotorContr* Descriptions: 右步进电机驱动时序* input parameters: 无* output pa

42、rameters: 无* Returned value: 无*/void rightMotorContr (void) static int8 cStep = 0; /* 保存电机当前位置 */ switch (GmRight.cDir) case GOAHEAD: /* 向前步进 */ cStep = (cStep + 1) % 8; break; case GOBACK: /* 向后步进 */ cStep = (cStep + 7) % 8; break; default: break; switch (cStep) case 0: /* A2B2 */ GPIOPinWrite(GPIO

43、_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA1 | PHRA2 | PHRB1 | PHRB2); break; case 1: /* A2 */ GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA1 | PHRA2); break; case 2: /* A2B1 */ GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA1 | PHRA2 | PHRB2); break; case

44、3: /* B1 */ GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRB2); break; case 4: /* A1B1 */ GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA2 | PHRB2); break; case 5: /* A1 */ GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA2); break; case 6: /* A1B2 */ GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!