微型计算机课程设计步进电机远程控制系统设计_第1页
微型计算机课程设计步进电机远程控制系统设计_第2页
微型计算机课程设计步进电机远程控制系统设计_第3页
微型计算机课程设计步进电机远程控制系统设计_第4页
微型计算机课程设计步进电机远程控制系统设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、目 录一、 需求分析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一、 需求分析本课程的设计的题目为“步进电机远程控制系统设计”。从

2、题目上可以看出,本课程设计的硬件中心是“步进电机远程控制系统”,我们的任务就是首先在理论上设计出一套抽象的硬件模型,然后根据理论与实际的需要选择我们需要的元件并进行制作,在制作的过程中需要对出现的各种问题以及障碍进行处理、对各个工作环节进行调试,并最终实现硬件实体的正常运转。我们的设计目的便是通过步进电机远程控制系统设计,深入了解与掌握利用RS232或RS485串行通信标准进行远距离传送的原理与方法。1.1 设计的硬件资源环境(1)PC兼容机(2.MFID多功能微机实验平台(含PCI总线驱动板)(3)面包板(4)安装或焊接工具1.2 设计的软件资源环境(1)Windows 2000(2) M2

3、KI集成开发环境1.3 设计的具体要求(1)甲机通过RS-232或RS-485接口远距离控制乙机一侧步进电机的起/停;(2)甲机通过RS-232或RS-485接口远距离控制乙机上步进电机的方向;(3)甲机通过RS-232或RS-485接口远距离控制乙机上步进电机的起/停、方向、速度,并采用对话框选择控制项目。 二、概要设计 步进电机是将电脉冲信号转换成角位移的一种机电式数模转换器。步进电机旋转的角位移与输入脉冲的个数成正比;步进电机的转速与输入脉冲的频率成正比;步进电机的转动方向与输入脉冲对绕组加电的顺序有关。因此,步进电机旋转的角位移、转速以及方向均受输入脉冲的控制。而我们要实现的是采用软件

4、的方法实现远程控制步进电机,也就是在两台微机之间按RS232/RS485标准协议进行零MODEM方式半双工串行通信。2.1 运行方式与方向的控制循环查表法步进电机的运行方式是指各相绕组循环流通电的方式。如四相步进电机有但单四拍ABCD、双四拍ABBCCDDA、单八拍ABBBCCCDDDAA和双八拍ABABCBCBCDCDCDADADAB几种方式。为了实现对个绕组按一定方式轮流加电,需要一个脉冲循环分配器。循环分配器可用硬件电路来实现,也可用软件来实现。这里采用的是软件方法,软件方法又分为控制字法和循环查表法,这里采用的是循环查表法。相序表见表2.1 所示。绕组与数据线的连接 运行方式 相序表

5、方 向加电代码地址单元正向反向 双八拍 表2.1 相序表D C B AD7 D6D5D4D3D2D1D00 0 0 0 0 1 0 10 0 0 1 0 1 0 10 0 0 1 0 1 0 00 1 0 1 0 1 0 00 1 0 1 0 0 0 00 1 0 1 0 0 0 10 1 0 0 0 0 0 10 1 0 0 0 1 0 1ABABCBCBCDCDCDADADAB05H 400H15H 401H14H 402H54H 403H50H 404H51H 405H41H 406H2.2 步进电机运行速度的控制软件延时法控制步进电机速度有两个途径:一是硬件改变输入脉冲的频率,通过对定

6、时器(如:8253)定时常数的设定,使其升频、降频或恒频。二是软件延时,或调用延时子程序。采用软件延时方法来改变步进电机速度,虽然简单易行,但延时受CPU主频的影响,导致在主频较低的微机上开发的步进电机控制程序换到主频较高的微机上,就不能正常运行,甚至由于频率太高,步进电机干脆不动了。应该指出的是,步进电机的速度还受到本身矩-频特性的限制,设计时应满足运行频率与负载力矩之间的确定关系,否则,就会产生失步或无法工作的现象。2.3 步进电机接口步进电机接口的硬件部分主要是提供输送相序代码的并行接口数据线(8根),以及保护电机绕组的器件,所以接口电路以8255A为主芯片(8255A的介绍详见前面音乐

7、发生器中的介绍),将PA口作为数据口,传送加电代码,再加上锁存器74LS373作绕组保护,74LS73芯片的引脚分配如图2.1所示,功能对应表如表2.2所示,功Vcc8Q8D7D7Q6Q6D5D5Q使能G输出控制1Q 1D 2D 2Q 3Q 3D 4D 4Q GND图2.1 74LS373(八D寄存器)1234567891020191817161514131211能表中当G为高时,Q输出将随数据D输入而变;当G为低时,Q输出将锁存已建立的数据电平。另外,还有功率驱动管TIP122,以及二极管(用作保护TIP驱动管)、按键开关SW等。很明显,这里并没有什么联络线。这是因为此处的被控对象步进电机总

8、是处于准备好接收8255A传来的数据(相序加控制输出 使能 G D 输出 Q L H H H L H L L L L x Q0 H x x Z表2.2 74LS373功能对应表电代码)的,不需要查询是否准备好,即无条件传送。2.4 步进电机的驱动TIP122+12VA图2.2 步进电机驱动原理图步进电机在系统中是一种执行元件,都要带负载,因此,需要功率的驱动。在电子仪器和设备中,一般所需功率较小,常采用达林顿复合管作功率驱动。驱动原理图如2.2所示。图2.2中,在TIP122的基极上,加电脉冲为高时,加电代码1时,达林顿管导通,使绕组A通电;加电代码0时,绕组断电。2.5 步进电机的起/停控制

9、设置开关为了控制步进电机的起/停,通常采用设置硬开关或软开关的方法。所谓硬开关方法,一般是在外部设置按键开关SW,并且约定当开关SW按下时启动运行或停止运动。为此,需要在程序中将开关SW的状态读入,以便检测SW是否按下。所谓软开关方法,就是利用系统的键盘,定义某一个键,当该按键按下时,启动或停止运动。为此,在程序中要利用DOS系统功能调用来检测键盘输入。2.6 步进电机设计电路的搭建实验原理图设计好了以后,在面包板上搭建步进电机驱动模块的电路,并使用26芯的扁平电缆线,将面包板与平台上的并行接口插座J5连接起来。步进电机驱动模块的电路连接如图2.3所示,步进电机驱动模块的PCB图如图2.4所示

10、。 图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 双机远程通信示意图三、详细

11、设计3.1 硬件设计(1)设计符合设计要求的电路图,如图2.3所示 (2)根据电路图找到所需的电子元件及导线若干(3)区分各元件并进行分类(4)取来面包板。仔细研究面包板,分清它的内部结构、线路走向及插线原理等。(5)开始搭建元件,将其插到合适的位置上。(6)按图连线。要注意分清电源及地线,各元件的电器特性(如二极管的正负极问题),以便确保正确无误。(7)电路。要反复检查问题,看是否有线路搭错的情况。(8)区分电机的四相。因为我们做的是步进电机的设计,所以需要区分电机的四相。注意,A、B、C、D依次导线颜色为白、绿、蓝、红。用烙铁将导线焊接好。(9)在微机平台上做实验,运行系统自带的程序。看四

12、个LED指示灯是否依次亮起,不能同时一起亮也不能全不都不亮,要依照双四拍ABBCCDDA的顺序闪亮。检查电机是否按所要求顺序旋转,两个开关SW1和SW2能否起到控制电机的起/停、旋转方向、旋转速度等功能。(10)碰到问题、检查问题、解决问题、反复调试直到成功。3.2 软件设计 接口电路以8251为核心,8253提供收/发时钟,8255控制8253的GATE门。I/O 端口地址:8255的四个端口地址为300H303H。其中A口=304H,B口=301H,C口=302H,命令口=303H。8253的四个端口地址为304H307H。其中通道0为304H,通道1为305H,通道2为306H,命令口为

13、307H。8251的两个端口地址为:308H309H,其中,308H为8251数据口,309H为命令/状态口。在程序中我们要求双方通信的传输速率只能在1109600bps之间可选。实现方法是利用人机对话的方式选择波特率,然后再按照 Tc=CLK/(Baud*factor)公式,根据所选定的波特率,在程序中计算出8253的定时常数Tc,在装入8253的计数器。然后我们在发送端设置了一些特殊的字符,如发送端发送字符a为步进电机正向慢转,发送字符b为步进电机反向慢转,发送字符c为步进电机正向快转,发送字符d为步进电机反向快转。(1)程序流程图程序流程图如图3.1所示 (2)程序通信程序有发送端程序和

14、接收端程序,由发送端发送特定的字符,接收端接收到以后,引起步进电机的相应转动,以实现远程控制的要求。接收程序:见附录A,发送程序:见附录B。图3.1 程序流程图四、调试与操作说明(1)首先检验步进电机在原有的程序中是否正常运转;(2)以原有的程序为参照,我们用C语言编写了一套步进电机的运转程序,然后检验它是否能使步进电机根据要求正常运转,结果发现在调试过程中,当SW2按下时步进电机虽然停止了工作,但指示灯仍然没有熄灭。最后在反复调试检验中发现如果加上outportb(0x300,0x00);语句灯就熄灭了,目的是将它清零(注:此时的步进电机的起/停是受开关SW1和SW2控制的)。(3)接下来做

15、远程控制。我们用两台计算机来实现,一台作为发送端,一台作为接收端。通过发送端发送的特殊字符来控制接收端上步进电机的运转;(4)我们分别编制了两套程序(发送程序和接收程序)。调试中我们遇到了很多问题,比如,当我们将步进电机的程序与之搭配时,我们无法用键盘控制发送的字符,并且开关也失去了作用;(5)在进行远程控制时,端口之间也发生冲突,我们组采用了中断的方法,但每次远程控制只能实现一次。最后参照别的组,发现他们是将PC口改成了PB来进行多次控制。五、课程设计总结与体会我觉得此次课程设计不仅提高了我们在搭硬件方面的能力,还巩固了我们在软件方面的编程知识,在此过程中我们收获很多,但同时也遇到了各种各样

16、的困难。步进电机的硬件电路是由男生完成的,但当我们测试时发现步进电机虽然在运转,但两个开关却不起作用,于是我对照电路图,并请教老师,又将开关的线重新连接了一遍,使开关可以控制电机的起/停。接下来就是实现软件编程,也是我主要负责的一部分,我查询了相关的知识,比如8255,8253和8251的工作方式和原理,以及它们之间的联系。然后我试着开始编程,首先我编写了控制步进电机运转的程序,让它可以在本地实现正/反运转,经过多次调试后,程序是没有逻辑上的错误了,但又出现了一个小问题,那就是按下SW2时,电机是停了,可灯没有全部熄灭,后来发现是没有将8255的300置零。接着是编写远程控制的程序,发送端我引

17、用了电脑中已有的程序,而接收端是要将步进电机的程序嵌入到其中。在测试中我是不断改进程序,我先让接收端可以接收发送端发送的字符,然后再将电机接好,通过RS232/RS485进行串行通信。在通信过程中,一开始我设置一个字符,将信号传到接收端,告诉接收端电机可以运转了,但此时电机的起停还是由开关控制的。我原本打算通过循环查表的方法,发送端发送特定的字符而接收端接到后,控制电机相应的运转情况,但此方法屡次失败,甚至连字符都收不到,我请教了许多老师和相关的技术人员都没有解决这个问题。最后在老师的帮助下,通过中断的方式,我终于实现了远程控制步进电机,但每回只能发一个字符,即实现一次转。我觉得做到这里,都是

18、不容易的,其间我遇到了许多的困难。其实有两组同学共同完成了这个课题,后来我也研究了一下,因为端口之间使用时存在冲突,那两组同学解决的方法是改成了PB口,这样线路也要跟着修改,总之完成这个课程设计期间,我受益良多,原本连面包板是什么东西我都不知道,现在我都可以自己动手搭电路了,并且我还了解到了元器件运行的原理。希望学校以后能多开展这样的活动,加强我们的动手能力,使原理可以和实践很好地结合起来,从而开拓我们的思维。致 谢 在这次的课程设计中,郭赟同学负责硬件电路,解决了很多复杂的硬件问题;周敏、李慧娟同学在软件环境中做了大量的程序设计和测试工作;叶新同学在硬件设计的前期做了细致的绘图;潘晶晶同学最

19、后排版和整理了这份实验报告。正是因为有了大家的共同努力和集体的力量,我们的实验才获得了最后的成功,在此对他们表示诚挚的谢意。特别感谢龚义建主任以及其它辅导老师在这次课程设计期间对我们进行的孜孜不倦的指导,让我们得以顺利完成这次工作,并让我们学到了很多专业知识、培养了我们解决问题的能力以及自学的能力。其学者风度以及亲切的教导让我们收益匪浅。参考文献1 刘乐善主编 微机接口技术及应用, 华中科技大学出版社,2004年4月第1版。2 实验硬件电路参考32位微机实验指导书,华中科技大学计算机学院。附录A:步进电机远程控制的接收端程序接收程序:#include <conio.h> /kbhi

20、t();#include <stdio.h> /printf();#include <dos.h> /delay();#define data51 0x308 /8251A数据口#define ctrl51 0x309 /8251A命令/状态口#define ctrl55 0x303 /8255命令口#define timer2 0x306 /8253的2号计数器端口#define timctl 0x307 /8253命令口#define factor 16 /波特率因子16#ifdef _cplusplus /if in C+ mode #define _CPPARG

21、S .#else #define _CPPARGS#endifunsigned long int clk = 1193182;char buffer1024 = ""int len = 0; /定时常数数组int tc_table8=110,/ 0=110bps 150, / 1=150b/s 300, / 2=300b/s600, / 3=600b/s 1200, / 4=1200b/s 2400, / 5=2400b/s4800, / 6=4800b/s 9600 / 1=9600b/s ;void int51(); /初始化8251avoid set_bps(int

22、bps); /8253-5记数初值计算与装入void interrupt handler(_CPPARGS) int letter;disable();letter = inportb(data51);bufferlen+ = letter;outportb(0xa0,0x62);/发中断结束命令(OCW2),向从片8259发EOI命令outportb(0x20,0x20);/向主片8259发EOI命令enable(); void int51() outportb(ctrl51,0x00);delay(100);outportb(ctrl51,0x40);/8251复位delay(100);o

23、utportb(ctrl51,0x4a);/8251A方式命令delay(100);outportb(ctrl51,0x27);/8251A工作命令 void set_bps(int bps) int count,sendhigh,sendlow;count=clk/bps;count=count/factor;/计算计数初值sendhigh = (count >> 8) & 0x00ff;sendlow = count & 0x00ff;outportb(timctl,0xb6);outportb(timer2,sendlow);/装计数初值低字节outportb

24、(timer2,sendhigh);/装计数初值高字节 void main() int getvalue=0,getout = 1;int temp=-1;void interrupt (*oldhandler)(_CPPARGS);int status;for(;) clrscr();printf(" baud-rate :n 0-110n 1-150n 2-300n 3-600n 4-1200n 5-2400n 6-4800n 7-9600n"); printf("n please select one of baud-ratesn");getval

25、ue=getch();if(getvalue<'0') | (getvalue>'7') printf("n Input error! try again please! n");/error messagegetch();continue; else break; temp = getvalue - '0'set_bps(tc_tabletemp);/8253-5记数初值计算与装入int51();/初始化8251aprintf("n now enter the serial communication&

26、quot;);printf("n if you want to end,please press "q" or "Q"n");outportb(0x303,0x80);/初始化8255outportb(0x303,0x0d);/令PC6=1,打开8253的GATE2,输出方波delay(100);oldhandler=getvect(0x72);/获取原中断向量setvect(0x72,handler);/设置新中断向量status=inportb(0xa1);outportb(0xa1,status&0xfb);/打开IRQ

27、10(OCW1)status=inportb(0x21);outportb(0x21,status&0xfb);/打开IRQ2(OCW1)delay(1000);while(getout)/按下Q/q就退出int i=0; while(i<len) printf("%c",bufferi); if(bufferi='a') int xu8=0x05,0x15,0x14,0x54,0x50,0x51,0x41,0x45;/相序表unsigned int i=0;unsigned char recv;/printf("nPress sw1

28、 to start!n");/printf("If you want to quit,press sw2!n");outportb(0x303,0x81);/初始化outportb(0x303,0x09);/置PC4=1关闭74LS373 /do /recv = inportb(0x302);/while(0x02&recv)!=0);/查SW1按下 outportb(0x303,0x08);/置PC4=0,打开74LS373do outportb(0x300,xui);/送相序代码到PA口 i+; if(i=8) i=0; delay(200);/延时w

29、hile(0x01&inportb(0x302)!=0);/查SW2按下outportb(0x303,0x09);/置PC4=1,关闭74LS373 if(bufferi='b') int xu8=0x45,0x41,0x51,0x50,0x54,0x14,0x15,0x05;/相序表unsigned int i=0;unsigned char recv;/printf("nPress sw1 to start!n");/printf("If you want to quit,press sw2!n");outportb(0x30

30、3,0x81);/初始化outportb(0x303,0x09);/置PC4=1关闭74LS373/do/recv = inportb(0x302);/while(0x02&recv)!=0);/查SW1按下 outportb(0x303,0x08);/置PC4=0,打开74LS373dooutportb(0x300,xui);/送相序代码到PA口 i+; if(i=8) i=0; delay(200);/延时while(0x01&inportb(0x302)!=0);/查SW2按下outportb(0x303,0x09);/置PC4=1,关闭74LS373 if(buffer

31、i='c') int xu8=0x05,0x15,0x14,0x54,0x50,0x51,0x41,0x45;/相序表unsigned int i=0;unsigned char recv;/printf("nPress sw1 to start!n");/printf("If you want to quit,press sw2!n");outportb(0x303,0x81);/初始化outportb(0x303,0x09);/置PC4=1关闭74LS373/do/recv = inportb(0x302);/while(0x02&a

32、mp;recv)!=0);/查SW1按下 outportb(0x303,0x08);/置PC4=0,打开74LS373do outportb(0x300,xui);/送相序代码到PA口 i+; if(i=8) i=0; delay(40);/延时while(0x01&inportb(0x302)!=0);/查SW2按下outportb(0x303,0x09);/置PC4=1,关闭74LS373 if(bufferi='d') int xu8=0x45,0x41,0x51,0x50,0x54,0x14,0x15,0x05;/相序表unsigned int i=0;unsi

33、gned char recv;/printf("nPress sw1 to start!n");/printf("If you want to quit,press sw2!n");outportb(0x303,0x81);/初始化outportb(0x303,0x09);/置PC4=1关闭74LS373/do/recv = inportb(0x302);/while(0x02&recv)!=0);/查SW1按下 outportb(0x303,0x08);/置PC4=0,打开74LS373do outportb(0x300,xui);/送相序代码

34、到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

35、(0x21);outportb(0x21,status|0x04);/屏蔽IRQ2outport(ctrl55,0x0c);/关闭8253附录B:步进电机远程控制的发送端程序发送程序:#include <conio.h> /kbhit();#include <stdio.h> /printf();#include <dos.h> /delay();#define data51 0x308 /8251A数据口#define ctrl51 0x309 /8251A命令/状态口#define ctrl55 0x303 /8255命令口#define timer2

36、0x306 /8253的2号计数器端口#define timctl 0x307 /8253命令口/#define clk 1193182 #define factor 16 /波特率因子16unsigned long int clk = 1193182;/8251输入时钟频率(十六进制表示) /定时常数数组int tc_table8=110, / 0=110bps 150, / 1=150b/s 300, / 2=300b/s 600, / 3=600b/s 1200, / 4=1200b/s 2400, / 5=2400b/s4800, / 6=4800b/s 9600 / 1=9600b/s ;void int51(); /初始化8251avoid set_bps(int bps); /8253-5记数初值计算与装入void main() int getvalue=0;int temp=-1;int sletter,rletter,status;for(;) clrscr();printf("n 0-110n 1-150n 2-300n 3-600n 4-1200n 5-2400n 6-4800n 7-9

温馨提示

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

评论

0/150

提交评论