基于步进电机的画圆小车设计毕业论文.doc_第1页
基于步进电机的画圆小车设计毕业论文.doc_第2页
基于步进电机的画圆小车设计毕业论文.doc_第3页
基于步进电机的画圆小车设计毕业论文.doc_第4页
基于步进电机的画圆小车设计毕业论文.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

*大学毕业设计论文基于步进电机的画圆小车设计毕业论文第一章 绪论智能作为现代的新发明,是未来生产生活的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能画圆小车车就是其中的一个体现。本次设计的基于步进电机的自动画圆小车,采用AT89S52单片机作为小车的控制核心,通过控制步进电机的控制可以让小车自己在地上画圆,实现智能。本设计结构简单,较容易实现,但具有高度的智能化、人性化,一定程度体现了智能。1. 1背景移动机器人作为现代高科技的集成体,是21世纪的科技制高点之一。移动机器人技术的发展,应该说它是科学技术发展的一个综合性的结果。同时,它为社会经济发展产生了一门有着重大影响的科学技术,它的发展归功于在第二次世界大战后各国加强了经济的投入,而移动对机器人的研究成果又提高了本国的经济的发展水平。比如说日本,战后以后开始进行汽车工业,这时候由于它人力的缺乏,它迫切需要一种机器人来进行大批量的制造,提高生产效率降低人的劳动强度,这是社会发展需求本身的一个需求。另一方面它也是生产力发展的需求的必然结果,也是人类自身发展的必然结果,人们在不断探讨自然、认识自然、改造自然过程中,需求一种能够解放人的自动化装置。那么这种自动化装置就是代替人们能够从事复杂和繁重的体力劳动,实现人们对不可达到的世界的认识和改造,这也是人们在科技发展过程中的一个客观需要。但另一方面,尽管人们有各种各样的好的想法,但是它也归功于电子技术,计算机技术及制造技术等相关技术的发展而产生提供了强大的技术保证。1. 2国内外研究现状机器人技术是一个国家高技术实力的一个重要标准,它涉及到多个学科,机械、电工、自动控制、计算机测量、人工智能、传感技术等等,是众多领域的高科技。而移动机器人比赛就是机器人技术的一个重要研究方向,目前许多国家己经把移动机器人比赛作为创新教育的战略性手段。移动机器人比赛是一种高科技对抗活动,各国专家学者通过移动机器人竞赛,不断推进了在竞赛型移动机器人方面的研究,不断改进机器人寻址速度和算法研究,试图让机器人更接近智能化,它集高科技、娱乐和比赛于一体,引起了各国的广泛关注和极大兴趣,从而推动了移动机器人研究的热潮。1. 2设计本作品的意义通过独立设计并制作一辆具有简单画圆的小车,通过查阅资料了解目前专业的发展情况,获得项目整体设计的能力,对所学的模拟电路,数字电路,单片机应用和PCB制作方法进行实际应用,为未来设计出适合工业生产和生活的智能产品。本人是电子爱好者,需要帮助的可以加QQ354634241.第二章 硬件的设计系统底层电路的功能主要包括:由单片机控制驱动芯片ULN2003使小车按照设定的程序转动达到智能画圆的目的。系统采用模块化的硬件设计方法,综合底层电路功能,因此硬件部分主要包括电源电路、单片机小系统电路、ULN2003步进电机驱动电路、LCD1602液晶显示电路、按键电路。本章将对每个模块进行详细的说明。下图为硬件结构总体框图:单片机电源电路震荡电路复位电路LCD1602显示模块步进电机驱动按键电路M 图一 硬件总体结构图2.1电源电路因为单片机、LCD1602液晶、ULN2003和步进电机工作电源均为+5V,且底层电路功耗较小,电源采用电池供电。采用LM7805三端稳压片即可满足要求。采用7805三端稳压片即可满足要求。在使用时LM7805输入输出端加上滤波电容使输出的电压更稳定。而且还设计了开关和电源指示等,是系统设计更人性化,方便用户使用。用三端稳压IC来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。具体电路图如下: 图二 电源电路2.2 单片机小系统电路单片机的最小系统电路,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路等。单片机接口电路主要用来连接计算机和其它外部设备。这里我们使用Atmel公司生产的AT89S52单片机。AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。AT89S52各引脚功能介绍:VCC:AT89S52 电源正端输入,接+5V。 VSS:电源地端。XTAL1:单芯片系统时钟的反相放大器输入端。XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两个引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。RESET:AT89S52的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S52便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。EA/Vpp:EA为英文External Access的缩写,表示存取外部程序代码之意,低电平动作,也就是说当引脚为低电平后,系统会调用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。ALE/PROG:ALE是英文Address Latch Enable的缩写,表示地址锁存器启用信号。AT89S52可以利用这个引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0A7)锁进锁存器中,因为AT89S52是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。PSEN:此为Program Store Enable的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。AT89S52可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。其引脚分配如下:P3.0:RXD,串行通信输入。P3.1:TXD,串行通信输出。P3.2:INT0,外部中断0输入。P3.3:INT1,外部中断1输入。P3.4:T0,计时计数器0输入。P3.5:T1,计时计数器1输入。P3.6:WR:外部数据存储器的写入信号。P3.7:RD,外部数据存储器的读取信号。主要电路:(1) 复位电路:由电容串联电阻构成,由图并结合电容电压不能突变的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位。这里电阻值取R=10K,电容C=100uf。图三 复位电路 (2) 晶振电路: CPU工作时都必须有一个时钟脉冲。典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)。典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)。这里采用11.0592M的晶振。图四 晶振电路单片机小系统的整体电路图如下:图五 单片机小系统电路2.3 LCD1602液晶显示电路 LCD1602液晶显示电路的功能是显示小车的运行状态、显示设置的半径数据、提供良好的人机交互界面、方便用户使用。使用LCD1602 液晶显示,成本低,亮度高,外围电路简单。显示采用LCD1602字符型液晶,1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VDD接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平1时进行读操作,低电平0时进行写操作。 第6脚:E(或EN)端为使能(enable)端。 第714脚:D0D7为8位双向数据端。 第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 具体电路如图: 图六 LCD1602液晶显示连接电路2.5 按键电路本系统采用独立按键,直接将按键一段接I/O口,一端接地,当按键没有闭合时,I/O输入为高电平。当按键闭合时,I/O输入为低电平。因此只要检测对应I/O口的高低电平就可以判断哪个按键按下,该方案适用于需要按键少,I/0口使用比较少的系统。综合各种因素,独立按键比较适合,结构简单。本系统设计了三个独立按键作为人机交互接口,第一个键为半径加,第二个为半径减,第三个为确定键。 图 按键电路(从左到右依次是半径加 半径减 确定)2.6 ULN2003步进电机驱动电路ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTL COMS,由达林顿管组成驱动电路。 ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。ULN2003是一个非门电路,包含7个单元,但独每个单元驱动电流最大可达350mA.资料的最后有引用电路,9脚可以悬空。 比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。 ULN2003的作用:ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。 输入5VTTL电平,输出可达500mA/50V。ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。 ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器。ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。ULN2003A引脚图及功能: 图七 ULN2003引脚图ULN2003 是高耐压、大电流、内部由七个硅NPN 达林顿管组成的驱动芯片。 经常在以下电路中使用,作为显示驱动、继电器驱动、照明灯驱动、电磁阀驱动、伺服电机、步进电机驱动等电路中。ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受 50V 的电压,输出还可以在高负载电流并行运行。ULN2003 的封装采用DIP16 或SOP16 。ULN2003可以驱动7个继电器,具有高电压输出特性,并带有共阴极的续流二极管使器件可用于开关型感性负载。每对达林顿管的额定集电极电流是500mA,达林顿对管还可并联使用以达到更高的输出电流能力。因为本设计中需要双轮驱动,加上万向轮就能实现转向实现画圆的目的,所以采用2个ULN2003,下面是ULN2003与单片机的接口电路: 图 八 步进电机驱动芯片ULN2003与单片机的接口电路2.7四相八拍步进电机介绍采用四相小步进电机带动小车。采用步进电机的最大的好处是路程长度可以精确控制,而且不易打滑该步进电机为一四相步进电机,采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。图为是该四相反应式步进电机工作原理示意图。图八 四相步进电机步进示意图开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相 绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图a、b、c所示:图九 步进电机工作时序波形图第三章 软件的设计基于AT89S52单片机的画圆小车,输入5-30cm之间的半径值,可以绘制该半径的圆,本设计的硬件平台是AT89S52开发板,编译环境采用Keil uVision3C51编译器,程序全部采用C语言编写。程序采用模块化的程序设计思想,利用“文件包含”的处理方法,把个模块程序写成文件的形式,主要包括显示程序、按键检测程序、定时器程序、主程序。3.1 模块化编程方法的优点程序采用模块化的程序设计思想,利用“文件包含”的处理方法,把个模块程序写成文件的形式,模块化编程的优点如下:(1)有效率的程序开发:使用模块化方法可以更快地开发程序,因为较小的子程序比大程序更容易理解、设计和测试。定义好模块的输入和输出之后,程序员可以给模块提供需要的输入,通过检测输出来判断模块的正确性。然后由连接器把分立的模块连接、定位,生成一个单一的绝对地址的可执行的程序模块。最后,测试整个模块。(2)子程序可以重用:为一个程序编写的代码经常可以用于其它的程序。在模块化编程中,可以把这些部分保存起来,以备将来使用。因为代码可以被重定位,所以保存的模块可以连接到满足其输入和输出要求的任意程序中。而在单块程序编程中,这样的部分深埋在整个程序中,不易被其它的程序使用。(3)便于调试和修改:模块化程序一般比单块程序易于调试。因为精心定义了程序的模块接口,很容易把问题定位到特定的模块。一旦找到了有问题的模块,更正问题就相当容易了。模块化编程可以简化程序修改的工作。我们可以很有信心地把新的或调试过的模块连接到一个已有的程序,而不用更改程序的其余部分。 所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。利用 #include来实现“文件包含命令”。3.2 液晶显示程序液晶显示的作用是提供人机交互界面,显示系统正在进行的操作和状态。读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出无 (1)LCD1602基本操作时序(2)读时序操作 (3)写时序操作 通过读写时序,显示出需要显示的数据。下面是显示程序文件/*/#include #include lcd1602.hsbit lcden = P10;sbit lcdrs = P11;/* - 函数名:delay - 功能描述:用于操作LCD1602延时 - 函数属性:内部 - 输入参数:- z 延时参数 - 输出参数:无 - 返回值:无 */void delay(uint z)uint i, j;for(i = z; i 0; i-)for(j = 100; j 0; j-);/* - 函数名:write_com - 功能描述:LCD1602 写指令 - 函数属性:内部 - 输入参数:- com 待写入指令 - 输出参数:无 - 返回值:无 */void write_com(uchar com)lcden = 0;lcdrs = 0;LCDPORT = com;delay(5);lcden = 1;delay(5);lcden = 0;/* - 函数名:write_data - 功能描述:LCD1602 写数据 - 函数属性:内部 - 输入参数:- dat 待写入数据 - 输出参数:无 - 返回值:无 */void write_data(uchar dat)lcden = 0;lcdrs = 1;LCDPORT = dat;delay(5);lcden = 1;delay(5);lcden = 0;/* - 函数名:LCD_Init - 功能描述:LCD1602 液晶初始化 - 函数属性:内部 - 输入参数:无 - 输出参数:无 - 返回值:无 */void LCD_Init(void)write_com(0x38); /设置16*2显示,5*7点阵,8位数据接口write_com(0x0c); /开显示,不显示光标,光标不闪烁write_com(0x06); /地址和光标指针自动加一,整屏不移动write_com(0x01); /清屏/* - 函数名:LCD_DisplayStr - 功能描述:LCD1602 指定地址显示指定内容 - 函数属性:内部 - 输入参数:- address 待写入地址 - *s 待写入数据指针 - 输出参数:无 - 返回值:无 */void LCD_DisplayStr(uint address, uchar *s)uint i, len;len = strlen(s); /计算s字符串的长度,不含字符串结束标志0write_com(address); /写入显示地址for(i = 0; i len; i+) /显示字符串write_data(si);/* - 函数名:u32tostr - 功能描述:将一个32位的变量dat转为字符串,比如把1234转为1234 - 函数属性:内部 - 输入参数:- dat 带转的long型的变量 - str 指向字符数组的指针,转换后的字节串放在其中 - 输出参数:无 - 返回值:无 */ void u32tostr(unsigned int dat,char *str) char temp5; unsigned char i = 0,j = 0; i = 0; while(dat) tempi = dat % 10 + 0x30; i+; dat /= 10; j = i; for(i = 0;i j;i+) stri = tempj - i - 1; if(!i) stri+ = 0; stri = 0;/* - 函数名:LCD_DisplayNum - 功能描述:在LCD上显示数字 - 函数属性:外部 - 输入参数:- address 数字在LCD上显示的地址 - dat 待显示的数值 - 输出参数:无 - 返回值:无 */ void LCD_DisplayNum(uint address, unsigned long dat) char temp5; u32tostr(dat,temp);LCD_DisplayStr(address, temp);/* - 函数名:LCD_DisPlayInfo - 功能描述:在LCD上显示输入提示信息 - 函数属性:外部 - 输入参数:- r 画圆半径 - 输出参数:无 - 返回值:无 */void LCD_DisPlayInfo(unsigned char r)write_com(0x01); /清屏LCD_DisplayStr(0x80, Please input:);LCD_DisplayStr(0x80+0x40+0x04, R=);LCD_DisplayNum(0x80+0x40+0x06, r);LCD_DisplayStr(0x80+0x40+0x08, cm);/*/3.3 按键检测按键检测只需要检测低电平,并返回一个数值,程序就通过数值判断是哪个键按下,1键是加,2键是减,3键是确定。为了避免因按键抖动引起的操作不便,程序中还设计了延时消抖。按键检测程序流程图:是否有键按下延时确实有键按下判断哪个键按下3键1键2键返回1返回2返回3三Y是否松手YNN按键检测程序:/*/#include sbit key1 = P12;sbit key2 = P13;sbit key3 = P14;/* - 函数名:KeyDelay - 功能描述:按键消抖延时 - 函数属性:内部 - 输入参数:- t 延时参数 - 输出参数:无 - 返回值:无 */void KeyDelay(unsigned char t)unsigned char i, j;for(i = 0; i t; i+)for(j = 0; j 100; j+);/* - 函数名:KeyScan - 功能描述:按键扫描 - 函数属性:外部 - 输入参数:无 - 输出参数:无 - 返回值:- 0 无按键按下 - 1 按下key1 - 2 按下key2 - 3 按下key3 */unsigned char KeyScan(void)if(key1 = 0)KeyDelay(1);if(key1 = 0)while(key1 = 0);return 1;else if(key2 = 0)KeyDelay(1);if(key2 = 0)while(key2 = 0);return 2;else if(key3 = 0)KeyDelay(1);if(key3 = 0)while(key3 = 0);return 3;return 0;/*/3.4 定时器程序本程序是本系统程序设计的核心,主要完成步进电机的转动计算,转一圈步进电机需要变相次数供主函数调。通过不断变相使电机运转。#include #include lcd1602.hsbit MotorL_A = P20; /左轮电机控制端口sbit MotorL_B = P21;sbit MotorL_C = P22;sbit MotorL_D = P23;sbit MotorR_A = P27; /右轮电机控制端口sbit MotorR_B = P26;sbit MotorR_C = P25;sbit MotorR_D = P24;sbit LED = P15; /小车画圆指示灯,小车进行画圆时,指示灯亮起;停止画圆时,指示灯熄灭static unsigned char MotorL_PhaseNumber = 0; /左轮电机循环换相累计变量static unsigned char MotorR_PhaseNumber = 0; /右轮电机循环换相累计变量static unsigned int SpeedLnum = 0; /内径,即左轮电机换相时间累计变量static unsigned int SpeedRnum = 0; /外径,即右轮电机换相时间累计变量static unsigned int addcircle = 0;/左轮电机换相次数累计变量unsigned int Percent; /内径电机换相时间unsigned int circlenum; /小车按指定半径行进一周后停止,此变量为完成一周所需的换相次数extern unsigned char R;extern unsigned char CarRun;/* - 函数名:MotorInit - 功能描述:步进电机端口初始化 - 函数属性:外部 - 输入参数:无 - 输出参数:无 - 返回值:无 */void MotorInit(void)MotorL_A = 0;MotorL_B = 0;MotorL_C = 0;MotorL_D = 0;MotorR_A = 0;MotorR_B = 0;MotorR_C = 0;MotorR_D = 0;/* - 函数名:TurnLED - 功能描述:控制LED的状态 - 函数属性:外部 - 输入参数:- status 1 - 点亮LED 0 - 熄灭LED - 输出参数:无 - 返回值:无 */void TurnLED(unsigned char status)if(status = 1)LED = 0;elseLED = 1;/* - 函数名:Timer0Init - 功能描述:定时器0初始化,12M晶振时,每隔23us定时器0中断一次 - 函数属性:外部 - 输入参数:无 - 输出参数:无 - 返回值:无 */void Timer0Init(void)TMOD = 0x01;TH0 = (65536 - 23) / 256;TL0 = (65536 - 23) % 256;EA = 1;ET0 = 1;TR0 = 0; /关闭定时器/* - 函数名:timer0IRQ - 功能描述:定时器0中断处理函数 - 函数属性:内部 - 输入参数:无 - 输出参数:无 - 返回值:无 */void timer0IRQ(void) interrupt 1TH0 = (65536 - 23) / 256;TL0 = (65536 - 23) % 256;SpeedRnum+; /累计右轮电机换相时间if(SpeedRnum = 100) /外径速度比例为1,即2300usSpeedRnum = 0;MotorR_PhaseNumber+; /累计右轮电机循环换相if(MotorR_PhaseNumber = 5)MotorR_PhaseNumber = 1;switch(MotorR_PhaseNumber)case 1:MotorR_D = 0;MotorR_A = 1; /RA相通电break;case 2: MotorR_A = 0;MotorR_B = 1; /RB相通电break;case 3:MotorR_B = 0;MotorR_C = 1; /RC相通电break;case 4:MotorR_C = 0;MotorR_D = 1; /RD相通电break;default:break;/车轮转动一周需要2048次换相SpeedLnum+; /累计左轮电机换相时间if(SpeedLnum = Percent)SpeedLnum = 0;MotorL_PhaseNumber+; /累计左轮电机循环换相if(MotorL_PhaseNumber = 5)MotorL_PhaseNumber = 1;switch(MotorL_PhaseNumber)case 1:MotorL_D = 0;MotorL_A = 1; /LA相通电break;case 2: MotorL_A = 0;MotorL_B = 1; /LB相通电break;case 3:MotorL_B = 0;MotorL_C = 1; /LC相通电break;case 4:MotorL_C = 0;MotorL_D = 1; /LD相通电break;default:break;addcircle+; /累计左轮电机换相次数if(addcircle = circlenum)/小车已画完一圈TR0 = 0; /关闭定时器addcircle = 0;TurnLED(0); /画圆指示灯熄灭 TH0 = (65536 - 23) / 256;TL0 = (65536 - 23) % 256;LCD_DisPlayInfo(R);CarRun = 0;3.5 主程序设小车的两个轮间的距离为d,所作圆半径为r,内侧轮子的线速度为v1,外侧轮子的线速度为v2,运行时间t,则两个轮子运行距离分别为s1=v1*t,s2=v2*t,则v1/v2=s1/s2=(2*r1)/(2*r2)= r1 /r2=r/(r+d)。即控制内外两个轮子的速度比恒定,即可画出圆形,速度比为r/(r+d),半径即为r。默认小车向左转,进行绘图,即左电机为内径,右电机为外径。#include lcd1602.h#include timer0.h#include key.h#define d 18 /两车轮间距18cm#define PI 3.1415926 #define L 20.5 /小车车轮周长20.5cmextern unsigned int Percent; /定义内径电机换一次相,所需要等待的延时量extern unsigned int circlenum;unsigned char R = 18; /默认绘制半径为18cm的圆unsigned char CarRun = 0;/定义小车启动标志,1 - 小车正在绘图;0 - 小车停止绘图/* - 函数名:CalculateDelay - 功能描述:计算V1:V2的值,进而计算Percent内径电机换相时间以及 小车绘制完成r为半径的圆,所需内径电机换相次数circlenum - 函数属性:内部 - 输入参数:- r 待绘制圆的半径 - 输出参数:- Percent 换相时间 - circlenum 换相次数 - 返回值:无 */void CalculateDelay(unsigned char r)/V1 : V2 = r : (r + d)double x1;double S; /以R为半径时的小车画圆内径周长S/采用控制电机换相时间长短进行调速,实际调速本程序只对内径电机调速,外径电机一直为全速。/* - 函数名:main - 功能描述

温馨提示

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

评论

0/150

提交评论