微型计算机课程设计步进电机远程控制系统设计.docx

上传人:b****6 文档编号:12945993 上传时间:2023-06-09 格式:DOCX 页数:21 大小:775.98KB
下载 相关 举报
微型计算机课程设计步进电机远程控制系统设计.docx_第1页
第1页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第2页
第2页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第3页
第3页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第4页
第4页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第5页
第5页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第6页
第6页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第7页
第7页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第8页
第8页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第9页
第9页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第10页
第10页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第11页
第11页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第12页
第12页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第13页
第13页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第14页
第14页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第15页
第15页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第16页
第16页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第17页
第17页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第18页
第18页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第19页
第19页 / 共21页
微型计算机课程设计步进电机远程控制系统设计.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

微型计算机课程设计步进电机远程控制系统设计.docx

《微型计算机课程设计步进电机远程控制系统设计.docx》由会员分享,可在线阅读,更多相关《微型计算机课程设计步进电机远程控制系统设计.docx(21页珍藏版)》请在冰点文库上搜索。

微型计算机课程设计步进电机远程控制系统设计.docx

微型计算机课程设计步进电机远程控制系统设计

目录

一、需求分析1

1.1设计的硬件资源环境1

1.2设计的软件资源环境1

1.3设计的具体要求1

二、概要设计1

2.1运行方式与方向的控制—循环查表法2

2.2步进电机运行速度的控制—软件延时法3

2.3步进电机接口3

2.4步进电机的驱动3

2.5步进电机的起/停控制—设置开关4

2.6步进电机设计电路的搭建4

2.7双机远程通信原理5

三、详细设计6

3.1硬件设计6

3.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.2步进电机运行速度的控制—软件延时法

控制步进电机速度有两个途径:

一是硬件改变输入脉冲的频率,通过对定时器(如:

8253)定时常数的设定,使其升频、降频或恒频。

二是软件延时,或调用延时子程序。

采用软件延时方法来改变步进电机速度,虽然简单易行,但延时受CPU主频的影响,导致在主频较低的微机上开发的步进电机控制程序换到主频较高的微机上,就不能正常运行,甚至由于频率太高,步进电机干脆不动了。

应该指出的是,步进电机的速度还受到本身矩-频特性的限制,设计时应满足运行频率与负载力矩之间的确定关系,否则,就会产生失步或无法工作的现象。

2.3步进电机接口

步进电机接口的硬件部分主要是提供输送相序代码的并行接口数据线(8根),以及保护电机绕组的器件,所以接口电路以8255A为主芯片(8255A的介绍详见前面音乐发生器中的介绍),将PA口作为数据口,传送加电代码,再加上锁存器74LS373作绕组保护,74LS73芯片的引脚分配如图2.1所示,功能对应表如表2.2所示,功

能表中当G为高时,Q输出将随数据D输入而变;当G为低时,Q输出将锁存已建立的数据电平。

另外,还有功率驱动管TIP122,以及二极管(用作保护TIP驱动管)、按键开关SW等。

很明显,这里并没有什么联络线。

这是因为此处的被控对象步进电机总是处于准备好接收8255A传来的数据(相序加

电代码)的,不需要查询是否准备好,即无条件传送。

2.4步进电机的驱动

步进电机在系统中是一种执行元件,都要带负载,因此,需要功率的驱动。

在电子仪器和设备中,一般所需功率较小,常采用达林顿复合管作功率驱动。

驱动原理图如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所示。

图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//kbhit();

#include//printf();

#include//delay();

#definedata510x308//8251A数据口

#definectrl510x309//8251A命令/状态口

#definectrl550x303//8255命令口

#definetimer20x306//8253的2号计数器端口

#definetimctl0x307//8253命令口

#definefactor16//波特率因子16

#ifdef__cplusplus//ifinC++mode

#define__CPPARGS...

#else#define__CPPARGS

#endif

unsignedlongintclk=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();//初始化8251a

voidset_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:

\n0---110\n1---150\n2---300\n3---600\n4---1200\n5---2400\n6---4800\n7---9600\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

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{

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2