版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE25目录一、需求分析 11.1设计的硬件资源环境 11.2设计的软件资源环境 11.3设计的具体要求 1二、概要设计 12.1运行方式与方向的控制—循环查表法 22.2步进电机运行速度的控制—软件延时法 32.3步进电机接口 32.4步进电机的驱动 32.5步进电机的起/停控制—设置开关 42.6步进电机设计电路的搭建 42.7双机远程通信原理 5三、详细设计 63.1硬件设计 63.2软件设计 7四、调试与操作说明 8五、课程设计总结与体会 9致谢 10参考文献 11附录A:步进电机远程控制的接收端程序 12附录B:步进电机远程控制的发送端程序 19一、需求分析本课程的设计的题目为“步进电机远程控制系统设计”。从题目上可以看出,本课程设计的硬件中心是“步进电机远程控制系统”,我们的任务就是首先在理论上设计出一套抽象的硬件模型,然后根据理论与实际的需要选择我们需要的元件并进行制作,在制作的过程中需要对出现的各种问题以及障碍进行处理、对各个工作环节进行调试,并最终实现硬件实体的正常运转。我们的设计目的便是通过步进电机远程控制系统设计,深入了解与掌握利用RS232或RS485串行通信标准进行远距离传送的原理与方法。1.1设计的硬件资源环境(1)PC兼容机(2.MFID多功能微机实验平台(含PCI总线驱动板)(3)面包板(4)安装或焊接工具1.2设计的软件资源环境(1)Windows2000(2)M2KI集成开发环境1.3设计的具体要求(1)甲机通过RS-232或RS-485接口远距离控制乙机一侧步进电机的起/停;(2)甲机通过RS-232或RS-485接口远距离控制乙机上步进电机的方向;(3)甲机通过RS-232或RS-485接口远距离控制乙机上步进电机的起/停、方向、速度,并采用对话框选择控制项目。二、概要设计步进电机是将电脉冲信号转换成角位移的一种机电式数模转换器。步进电机旋转的角位移与输入脉冲的个数成正比;步进电机的转速与输入脉冲的频率成正比;步进电机的转动方向与输入脉冲对绕组加电的顺序有关。因此,步进电机旋转的角位移、转速以及方向均受输入脉冲的控制。而我们要实现的是采用软件的方法实现远程控制步进电机,也就是在两台微机之间按RS—232/RS—485标准协议进行零MODEM方式半双工串行通信。2.1运行方式与方向的控制—循环查表法步进电机的运行方式是指各相绕组循环流通电的方式。如四相步进电机有但单四拍A→B→C→D、双四拍AB→BC→CD→DA、单八拍AB→B→BC→C→CD→D→DA→A和双八拍AB→ABC→BC→BCD→CD→CDA→DA→DAB几种方式。为了实现对个绕组按一定方式轮流加电,需要一个脉冲循环分配器。循环分配器可用硬件电路来实现,也可用软件来实现。这里采用的是软件方法,软件方法又分为控制字法和循环查表法,这里采用的是循环查表法。相序表见表2.1所示。绕组与数据线的连接运行方式相序表方向绕组与数据线的连接运行方式相序表方向加电代码地址单元正向反向双八拍表2.1相序表DCBAD7D6D5D4D3D2D1D00000010100010101000101000101010001010000010100010100000101000101ABABCBCBCDCDCDADADAB05H400H15H401H14H402H54H403H50H404H51H405H41H406H
2.2步进电机运行速度的控制—软件延时法控制步进电机速度有两个途径:一是硬件改变输入脉冲的频率,通过对定时器(如:8253)定时常数的设定,使其升频、降频或恒频。二是软件延时,或调用延时子程序。采用软件延时方法来改变步进电机速度,虽然简单易行,但延时受CPU主频的影响,导致在主频较低的微机上开发的步进电机控制程序换到主频较高的微机上,就不能正常运行,甚至由于频率太高,步进电机干脆不动了。应该指出的是,步进电机的速度还受到本身矩-频特性的限制,设计时应满足运行频率与负载力矩之间的确定关系,否则,就会产生失步或无法工作的现象。2.3步进电机接口步进电机接口的硬件部分主要是提供输送相序代码的并行接口数据线(8根),以及保护电机绕组的器件,所以接口电路以8255A为主芯片(8255A的介绍详见前面音乐发生器中的介绍),将PA口作为数据口,传送加电代码,再加上锁存器74LS373作绕组保护,74LS73芯片的引脚分配如图2.1所示,功能对应表如表2.2所示,功Vcc8Q8D7DVcc8Q8D7D7Q6Q6D5D5Q使能G输出控制1Q1D2D2Q3Q3D4D4QGND图2.174LS373(八D寄存器)1234567891020191817161514131211控制输出使能GD输出QLHHHLHLLLLxQ0HxxZ表2.274LS373功能对应表2.4步进电机的驱动TIP122+12VATIP122+12VA图2.2步进电机驱动原理图步进电机在系统中是一种执行元件,都要带负载,因此,需要功率的驱动。在电子仪器和设备中,一般所需功率较小,常采用达林顿复合管作功率驱动。驱动原理图如2.2所示。图2.2中,在TIP122的基极上,加电脉冲为高时,加电代码=1时,达林顿管导通,使绕组A通电;加电代码=0时,绕组断电。2.5步进电机的起/停控制—设置开关为了控制步进电机的起/停,通常采用设置硬开关或软开关的方法。所谓硬开关方法,一般是在外部设置按键开关SW,并且约定当开关SW按下时启动运行或停止运动。为此,需要在程序中将开关SW的状态读入,以便检测SW是否按下。所谓软开关方法,就是利用系统的键盘,定义某一个键,当该按键按下时,启动或停止运动。为此,在程序中要利用DOS系统功能调用来检测键盘输入。2.6步进电机设计电路的搭建实验原理图设计好了以后,在面包板上搭建步进电机驱动模块的电路,并使用26芯的扁平电缆线,将面包板与平台上的并行接口插座J5连接起来。步进电机驱动模块的电路连接如图2.3所示,步进电机驱动模块的PCB图如图2.4所示。图2.3步进电机驱动模块电路连接图图2.4步进电机驱动模块电路PCB图2.7双机远程通信原理此次课程设计是在小于15m的距离下进行的,所以我们不需要采用调制解调器MODEM,通信双方可以直接通信,既只需要TxD,RxD,SG三根线连接就能通信。采用8251A作为接口的主芯片再配置少量附加电路,如波特率时钟发生器,RS-232C与TTL电平转换电路,地址译码电路等就可以构成一个串行通信接口,如图2.5所示。乙机CPUEIA/TTL变换EIA/TTL变换TxDRxDSG____TxC____RxC波特率发生器波特率发生器TxDRxDSG____TxC____RxC甲机CPU图2.5双机远程通信示意图三、详细设计3.1硬件设计(1)设计符合设计要求的电路图,如图2.3所示(2)根据电路图找到所需的电子元件及导线若干(3)区分各元件并进行分类(4)取来面包板。仔细研究面包板,分清它的内部结构、线路走向及插线原理等。(5)开始搭建元件,将其插到合适的位置上。(6)按图连线。要注意分清电源及地线,各元件的电器特性(如二极管的正负极问题),以便确保正确无误。(7)电路。要反复检查问题,看是否有线路搭错的情况。(8)区分电机的四相。因为我们做的是步进电机的设计,所以需要区分电机的四相。注意,A、B、C、D依次导线颜色为白、绿、蓝、红。用烙铁将导线焊接好。(9)在微机平台上做实验,运行系统自带的程序。看四个LED指示灯是否依次亮起,不能同时一起亮也不能全不都不亮,要依照双四拍AB→BC→CD→DA的顺序闪亮。检查电机是否按所要求顺序旋转,两个开关SW1和SW2能否起到控制电机的起/停、旋转方向、旋转速度等功能。(10)碰到问题、检查问题、解决问题、反复调试直到成功。3.2软件设计接口电路以8251为核心,8253提供收/发时钟,8255控制8253的GATE门。I/O端口地址:8255的四个端口地址为300H—303H。其中A口=304H,B口=301H,C口=302H,命令口=303H。8253的四个端口地址为304H—307H。其中通道0为304H,通道1为305H,通道2为306H,命令口为307H。8251的两个端口地址为:308H—309H,其中,308H为8251数据口,309H为命令/状态口。在程序中我们要求双方通信的传输速率只能在110~9600bps之间可选。实现方法是利用人——机对话的方式选择波特率,然后再按照Tc=CLK/(Baud*factor)公式,根据所选定的波特率,在程序中计算出8253的定时常数Tc,在装入8253的计数器。然后我们在发送端设置了一些特殊的字符,如发送端发送字符’a’为步进电机正向慢转,发送字符’b’为步进电机反向慢转,发送字符’c’为步进电机正向快转,发送字符’d’为步进电机反向快转。(1)程序流程图程序流程图如图3.1所示(2)程序通信程序有发送端程序和接收端程序,由发送端发送特定的字符,接收端接收到以后,引起步进电机的相应转动,以实现远程控制的要求。接收程序:见附录A,发送程序:见附录B。图3.1程序流程图四、调试与操作说明(1)首先检验步进电机在原有的程序中是否正常运转;(2)以原有的程序为参照,我们用C语言编写了一套步进电机的运转程序,然后检验它是否能使步进电机根据要求正常运转,结果发现在调试过程中,当SW2按下时步进电机虽然停止了工作,但指示灯仍然没有熄灭。最后在反复调试检验中发现如果加上outportb(0x300,0x00);语句灯就熄灭了,目的是将它清零(注:此时的步进电机的起/停是受开关SW1和SW2控制的)。(3)接下来做远程控制。我们用两台计算机来实现,一台作为发送端,一台作为接收端。通过发送端发送的特殊字符来控制接收端上步进电机的运转;(4)我们分别编制了两套程序(发送程序和接收程序)。调试中我们遇到了很多问题,比如,当我们将步进电机的程序与之搭配时,我们无法用键盘控制发送的字符,并且开关也失去了作用;(5)在进行远程控制时,端口之间也发生冲突,我们组采用了中断的方法,但每次远程控制只能实现一次。最后参照别的组,发现他们是将PC口改成了PB来进行多次控制。五、课程设计总结与体会我觉得此次课程设计不仅提高了我们在搭硬件方面的能力,还巩固了我们在软件方面的编程知识,在此过程中我们收获很多,但同时也遇到了各种各样的困难。步进电机的硬件电路是由男生完成的,但当我们测试时发现步进电机虽然在运转,但两个开关却不起作用,于是我对照电路图,并请教老师,又将开关的线重新连接了一遍,使开关可以控制电机的起/停。接下来就是实现软件编程,也是我主要负责的一部分,我查询了相关的知识,比如8255,8253和8251的工作方式和原理,以及它们之间的联系。然后我试着开始编程,首先我编写了控制步进电机运转的程序,让它可以在本地实现正/反运转,经过多次调试后,程序是没有逻辑上的错误了,但又出现了一个小问题,那就是按下SW2时,电机是停了,可灯没有全部熄灭,后来发现是没有将8255的300置零。接着是编写远程控制的程序,发送端我引用了电脑中已有的程序,而接收端是要将步进电机的程序嵌入到其中。在测试中我是不断改进程序,我先让接收端可以接收发送端发送的字符,然后再将电机接好,通过RS232/RS485进行串行通信。在通信过程中,一开始我设置一个字符,将信号传到接收端,告诉接收端电机可以运转了,但此时电机的起停还是由开关控制的。我原本打算通过循环查表的方法,发送端发送特定的字符而接收端接到后,控制电机相应的运转情况,但此方法屡次失败,甚至连字符都收不到,我请教了许多老师和相关的技术人员都没有解决这个问题。最后在老师的帮助下,通过中断的方式,我终于实现了远程控制步进电机,但每回只能发一个字符,即实现一次转。我觉得做到这里,都是不容易的,其间我遇到了许多的困难。其实有两组同学共同完成了这个课题,后来我也研究了一下,因为端口之间使用时存在冲突,那两组同学解决的方法是改成了PB口,这样线路也要跟着修改,总之完成这个课程设计期间,我受益良多,原本连面包板是什么东西我都不知道,现在我都可以自己动手搭电路了,并且我还了解到了元器件运行的原理。希望学校以后能多开展这样的活动,加强我们的动手能力,使原理可以和实践很好地结合起来,从而开拓我们的思维。致谢在这次的课程设计中,郭赟同学负责硬件电路,解决了很多复杂的硬件问题;周敏、李慧娟同学在软件环境中做了大量的程序设计和测试工作;叶新同学在硬件设计的前期做了细致的绘图;潘晶晶同学最后排版和整理了这份实验报告。正是因为有了大家的共同努力和集体的力量,我们的实验才获得了最后的成功,在此对他们表示诚挚的谢意。特别感谢龚义建主任以及其它辅导老师在这次课程设计期间对我们进行的孜孜不倦的指导,让我们得以顺利完成这次工作,并让我们学到了很多专业知识、培养了我们解决问题的能力以及自学的能力。其学者风度以及亲切的教导让我们收益匪浅。
参考文献[1]刘乐善主编《微机接口技术及应用》,华中科技大学出版社,2004年4月第1版。[2]实验硬件电路参考《32位微机实验指导书》,华中科技大学计算机学院。附录A:步进电机远程控制的接收端程序接收程序:#include<conio.h>//kbhit();#include<stdio.h>//printf();#include<dos.h>//delay();#definedata510x308//8251A数据口#definectrl510x309 //8251A命令/状态口#definectrl550x303//8255命令口#definetimer20x306//8253的2号计数器端口#definetimctl0x307//8253命令口#definefactor16 //波特率因子16#ifdef__cplusplus//ifinC++mode#define__CPPARGS...#else#define__CPPARGS#endifunsignedlongintclk=1193182;charbuffer[1024]="";intlen=0;//定时常数数组inttc_table[8]={ 110, //0=110bps150,//1=150b/s300,//2=300b/s 600,//3=600b/s1200,//4=1200b/s2400,//5=2400b/s 4800,//6=4800b/s9600//1=9600b/s};voidint51();//初始化8251avoidset_bps(intbps); //8253-5记数初值计算与装入voidinterrupthandler(__CPPARGS){intletter; disable(); letter=inportb(data51); buffer[len++]=letter; outportb(0xa0,0x62);//发中断结束命令(OCW2),向从片8259发EOI命令 outportb(0x20,0x20);//向主片8259发EOI命令 enable();}voidint51(){outportb(ctrl51,0x00); delay(100); outportb(ctrl51,0x40);//8251复位 delay(100); outportb(ctrl51,0x4a);//8251A方式命令 delay(100); outportb(ctrl51,0x27);//8251A工作命令}voidset_bps(intbps){intcount,sendhigh,sendlow; count=clk/bps; count=count/factor;//计算计数初值 sendhigh=(count>>8)&0x00ff; sendlow=count&0x00ff; outportb(timctl,0xb6); outportb(timer2,sendlow);//装计数初值低字节 outportb(timer2,sendhigh);//装计数初值高字节}voidmain(){intgetvalue=0,getout=1; inttemp=-1; voidinterrupt(*oldhandler)(__CPPARGS); intstatus; for(;;) {clrscr(); printf("baud-rate:\n0110\n1150\n2300\n3600\n41200\n52400\n64800\n79600\n");printf("\npleaseselectoneofbaud-rates\n"); getvalue=getch(); if((getvalue<'0')||(getvalue>'7')) {printf("\nInputerror!tryagainplease!\n"); //errormessage getch(); continue;} else{break;}} temp=getvalue-'0'; set_bps(tc_table[temp]);//8253-5记数初值计算与装入 int51();//初始化8251a printf("\nnowentertheserialcommunication"); printf("\nifyouwanttoend,pleasepress\"q\"or\"Q\"\n");outportb(0x303,0x80);//初始化8255 outportb(0x303,0x0d);//令PC6=1,打开8253的GATE2,输出方波 delay(100);oldhandler=getvect(0x72);//获取原中断向量 setvect(0x72,handler);//设置新中断向量status=inportb(0xa1); outportb(0xa1,status&0xfb);//打开IRQ10(OCW1) status=inportb(0x21); outportb(0x21,status&0xfb);//打开IRQ2(OCW1) delay(1000);while(getout)//按下Q/q就退出 {inti=0;while(i<len){printf("%c",buffer[i]);if(buffer[i]=='a'){intxu[8]={0x05,0x15,0x14,0x54,0x50,0x51,0x41,0x45};//相序表 unsignedinti=0; unsignedcharrecv; //printf("\nPresssw1tostart!\n"); //printf("Ifyouwanttoquit,presssw2!\n"); outportb(0x303,0x81);//初始化 outportb(0x303,0x09);//置PC4=1关闭74LS373//do{// recv=inportb(0x302); //}while((0x02&recv)!=0);//查SW1按下outportb(0x303,0x08);//置PC4=0,打开74LS373 do{outportb(0x300,xu[i]);//送相序代码到PA口 i++; if(i==8)i=0; delay(200);//延时}while((0x01&inportb(0x302))!=0);//查SW2按下 outportb(0x303,0x09);//置PC4=1,关闭74LS373}if(buffer[i]=='b'){intxu[8]={0x45,0x41,0x51,0x50,0x54,0x14,0x15,0x05};//相序表 unsignedinti=0; unsignedcharrecv; //printf("\nPresssw1tostart!\n"); //printf("Ifyouwanttoquit,presssw2!\n"); outportb(0x303,0x81);//初始化 outportb(0x303,0x09);//置PC4=1关闭74LS373 //do{// recv=inportb(0x302); //}while((0x02&recv)!=0);//查SW1按下outportb(0x303,0x08);//置PC4=0,打开74LS373 do{outportb(0x300,xu[i]);//送相序代码到PA口 i++; if(i==8)i=0; delay(200);//延时 }while((0x01&inportb(0x302))!=0);//查SW2按下 outportb(0x303,0x09);//置PC4=1,关闭74LS373}if(buffer[i]=='c'){intxu[8]={0x05,0x15,0x14,0x54,0x50,0x51,0x41,0x45};//相序表 unsignedinti=0; unsignedcharrecv; //printf("\nPresssw1tostart!\n"); //printf("Ifyouwanttoquit,presssw2!\n"); outportb(0x303,0x81);//初始化 outportb(0x303,0x09);//置PC4=1关闭74LS373 //do{ // recv=inportb(0x302); //}while((0x02&recv)!=0);//查SW1按下outportb(0x303,0x08);//置PC4=0,打开74LS373 do{outportb(0x300,xu[i]);//送相序代码到PA口 i++; if(i==8)i=0; delay(40);//延时 }while((0x01&inportb(0x302))!=0);//查SW2按下 outportb(0x303,0x09);//置PC4=1,关闭74LS373}if(buffer[i]=='d'){intxu[8]={0x45,0x41,0x51,0x50,0x54,0x14,0x15,0x05};//相序表 unsignedinti=0; unsignedcharrecv; //printf("\nPresssw1tostart!\n"); //printf("Ifyouwanttoquit,presssw2!\n"); outportb(0x303,0x81);//初始化 outportb(0x303,0x09);//置PC4=1关闭74LS373 //do{ // recv=inportb(0x302); //}while((0x02&recv)!=0);//查SW1按下outportb(0x303,0x08);//置PC4=0,打开74LS373 do{outportb(0x300,xu[i]);//送相序代码到PA口 i++; if(i==8)i=0; delay(40);//延时 }while((0x01&inportb(0x302))!=0);//查SW2按下 outportb(0x303,0x09);//置PC4=1,关闭74LS373} i++;} if(i==len)len=0; if(kbhit()) {if((getch()==0x51)||(getch()==0x71))getout=0;//ESC键按下返回 }}setvect(0x72,oldhandler);status=inportb(0xa1); outportb(0xa1,status|0x04);//屏蔽IRQ10(OCW1) status=inportb(0x21); outportb(0x21,status|0x04);//屏蔽IRQ2 outport(ctrl55,0x0c);//关闭8253}
附录B:步进电机远程控制的发送端程序发送程序:#include<conio.h>//kbhit();#include<stdio.h>//printf();#include<dos.h>//delay();#definedata510x308//8251A数据口#definectrl510x309 //8251A命令/状态口#definectrl550x303//8255命令口#definetimer20x306//8253的2号计数器端口#definetimctl0x307//8253命令口//#defineclk1193182#definefactor16 //波特率因子16unsignedlongintclk=1193182;//8251输入时钟频率(十六进制表示)//定时常数数组inttc_table[8]={110, //0=110bps150,//1=150b/s300,//2=300b/s600,//3=600b/s1200,//4=1200b/s2400,//5=2400b/s4800,//6=4800b/s9600//1=9600b/s};voidint51();//初始化8251avoidset_bps(intbps); //8253-5记数初值计算与装入voidmain(){intgetvalue=0; inttemp=-1; intsletter,rletter,status; for(;;){clrscr(); printf("\n0110\n1150\n2300\n3600\n41200\n52400\n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 脑卒中急性期护理措施指南
- 体积最大化盒体设计研究
- 感染科医院感染防控措施培训规范
- 糖尿病足康复训练方案
- 新员工入职宣讲
- ICU危重病患导尿管护理措施
- 《安全用电》课件
- 康复医学科脊柱损伤康复训练规范
- 东航公司期货投机介绍
- TLS加密性能优化实践课程设计
- 植物生长环境课件
- 中建安装弧形管道施工方案
- 国家开放大学《森林保护》形考任务1-4参考答案
- 《敏捷实践指南》
- 洞口开挖安全技术措施
- 2023年湖南省长沙市雨花区初中会考科目调研检测地理试题
- 人防区域顶板预留洞封堵方案
- GA/T 497-2016道路车辆智能监测记录系统通用技术条件
- 安全生产管理制度汇编(水利行业)
- 湖南省长沙市长郡教育集团2021-2022学年中考三模数学试题含解析
- 硬笔书法全册教案共20课时
评论
0/150
提交评论