三相步进电机控制系统的设计三相步进电机控制系统的设计1设计任务及要求设计一个三相步进电机控制系统,要求系统具有如下功能:用K0-K2做为通电方式选择键,K0为三相单三拍,K1为三相双三拍,K2为三相六拍;K3为启动/停止控制、K4方向控制;用4位LED数码管显示工作步数。用3个发光二极管显示状态:正转时红灯亮,反转时黄灯亮,不转时绿灯亮。2方案比较及选择2.1电机驱动选择方案方案1:使用功率三极管等电子器件搭建成功率驱动电路来驱动电机的运行。优点是电路简单,但信号不够稳定,器件较大而不便电路的集成。方案2:使用专门的电机驱动芯片ULN2004A来驱动电机运行。其优点是便于电路的集成,且驱动简单,驱动信号稳定,不受外部干扰。通过对方案的比较,我选择使用电机驱动芯片来作为驱动。2.2LED显示选择方案方案1:把所要显示的数据通过专用的七段显示芯片的转换输出给LED显示屏。其优点是输出简单,可以简化程序,但增加了芯片的费用。方案2:通过软件把所要的数据转化为七段显示的数据,直接通过单片机接口来显示,其优点是简化了电路,但增加了软件编写的负担。通过对方案的比较,我选择通过软件编写来输出显示信号。2.3按键状态的读取方案1:把按键接到单片机的中断口,若有按键按下,单片机接收到中断信号,再通过软件编写的中断程序来执行中断,优点是接线简单,简化了电路,但软件编写较为复杂,不易掌握。方案2:不使用中断,直接把开关分别接在单片机的接口上,通过查询端口信号来动作。其优点是程序得到简化,可读性加强。通过对方案的比较,我选择通过查询方式来读取端口信号。3系统实现的原理3.1步进电机控制工作原理3.1.1步进电机的启停控制步进电机由于其电气特性,运转时会有步进感,即振动感。为了使电机转动平滑,减小振动,可在步进电机控制脉冲的上升沿和下降沿采用细分的梯形波,可以减小步进电机的步进角,提高电机运行的平稳性。在步进电机停转时,为了防止因惯性而使电机轴产生顺滑,则需采用合适的锁定波形,产生锁定磁力矩,锁定步进电机的转轴,使步进电机的转轴不能自由转动。3.1.2步进电机的转向控制如果给定工作方式正序换相通电,步进电机正转。若步进电机的励磁方式为三相六拍,即A-AB-B-BC-C-CA。如果按反序通电换相,即则电机就反转。其他方式情况类似。3.2系统设计思路此次我们所设计的是一个步进电机控制系统,主要由单片机80C51,3相步进电机,7段数码管,及一些其他相关元件设计而成。可以通过开关来控制系统的启/停工作,当系统运转时,用开关来控制方向,并使相应的指示灯亮起,同样由开关来选择工作模式。运转时,用4位7段数码管来输出步数。最后根据思路所设计出来的硬件图设计相适应的软件。3.3系统的整体框图SHAPE\*MERGEFORMAT图1系统的整体框图4系统的硬件设计4.1总体设计设计一个单片机三相步进电机控制系统要求系统具有如下功能:(1)用K0-K2做为通电方式选择键,K0为单三拍,K1为双三拍,K2为三相六拍;(2)K3、K4分别为启动和方向控制;(3)正转时红色指示灯亮,反转时黄色指示灯亮,不转时绿色指示灯亮;(4)用4位LED显示工作步数。根据设计要求用PROTEUS所做的硬件连线图如下图1:图2总体硬件连线4.2步进电机控制电路4.2.1启/停控制、正/反转控制、工作模式控制电路分析原理图如下:图3按键控制图(1)K3为启/停控制开关,控制整个系统的开启和关闭。(2)K4为正/反转控制开关,控制步进电机的转向。(3)K0-K3为工作模式控制开关,KO接电时,为步进电机单三拍工作模式;K1接电时,为步进电机双三拍工作模式;K2接电时,步进电机工作模式为三相六拍。4.2.2步进电机控制电路将80c51的P1.0-P1.3作为步进电机的输出控制口。原理图如下:图4步进电机的输出控制口4.3显示电路4.3.1发光二极管显示电路用3个不同颜色的发光二极管来作为指示灯显示,将P3.5接红灯,P3.6接黄灯,P3.7接绿灯,正转时红色指示灯亮,反转时黄色指示灯亮,不转时绿色指示灯亮。原理图如下:图5指示灯接线图4.3.2八段数码管显示电路由80c51的P0口取出显示码,从80c51的P2.0-P2.3输出位选码,设计中我们主要用到4位显示步数既可。原理图如下:图6led接线图5系统软件设计5.1总体设计5.1.1步进电机的工作方式(1)三相单三拍工作方式在这种工作方式下,A、B、C三相轮流通电,电流切换三次,磁场旋转一周,转子向前转过一个齿距角。因此这种通电方式叫做三相单三拍工作方式。这时步距角θb(度)为θb=360/mz(公式1)式中:m──定子相数;z──转子齿数单三拍的数学模型:步序控制位工作状态控制模型P1.7P1.6P1.5P1.4P1.3P1.2C相P1.1B相P1.0A相100000001A01H200000010B02H300000100C04H表1(2)三相六拍工作方式在这种工作方式下,绕组以A—AB—B—BC—C—CA—A时序(或反时序)转换6次,磁场旋转一周,转子前进一个齿距,每次切换均使转子转动1.5°,故这种通电方式称为三相六柏工作方式。其步距角θb为:θb=360/2mz=180/mz(公式2)六拍的数学模型:步序控制位工作状态控制模型P1.7P1.6P1.5P1.4P1.3P1.2C相P1.1B相P1.0A相100000001A01H200000011AB03H300000010B02H400000110BC06H500000100C04H600000101CA05H表2(3)双三拍工作方式这种工作方式每次都是有两相导通,两相绕组处在相同电压之下,以AB─BC─CA─AB(或反之)方式通电,故称为双三拍工作方式。以这种方式通电,转子齿所处的位置相当于六拍控制方式中去掉单三拍后的三个位置。它的步距角计算公式与单三拍时的公式相同。极分度角/齿距角=R+k·1/m进一步化简得齿数z:z=q(mR+k)(公式3)式中:m──相数;q──每相的极数;k──≤(m-1)的正整数;R──正整数,为0、1、2、3……。双三拍的数学模型:步序控制位工作状态控制模型P1.7P1.6P1.5P1.4P1.3P1.2C相P1.1B相P1.0A相100000011AB03H200000110BC06H300000101CA05H表35.1.2系统总体流程图设计说明:首先复位单片机,然后从P3口读出开关状态,判断是否启动,没启动绿灯亮重新确认启动。启动后再次读取P3口数据,判断工作方式并将对应的用来存储步进电机工作方式字的数组首地址值给q。由P3.4口的双向开关来控制步进电机的正反转,如果是正转则红灯亮,反转则绿灯亮。在电机每走一步后,步数记数加1,然后通过LED显示把工作步数显示出来。再从P3口把状态信息读出来,与之前的P3口的状态信息进行比较。如果状态信息没有改变,电机继续运行。如果状态信息改变了,就需要重新返回程序的开端,对电机的运行状态进行判断,让电机重新以新的状态运行。由此,开关的状态在电机每走一步都会查询一遍,做到实时地反映。SHAPE\*MERGEFORMAT图7总体流程图5.2关键模块设计5.2.1.三相步进电机模块设计设计说明:在此设计中,采用的是三相步进电机,对于步进电机模块的程序设计采用循环程序设计方法。先把正反转向的控制模型存放在内存单元中,然后再逐一从单元中取出控制模块并输出。首先启动,选择步进电机的拍数,输入步数,然后读入正反转的控制模型驱动步进电机转动。三相步进电机的流程框图:SHAPE\*MERGEFORMAT图8三相步进电机的流程框图5.2.2显示模块设计设计说明:显示模块是用4位八段数码管来显示工作步数。先将显示码存入数组中,指向最左边一位,然后取出要显示的数据,指向换码表首地址,取出显示码,从P0口输出显示码,P2口输入位选码,显示出4位工作步数,最后修改数组地址,求下一位位选码继续显示。SHAPE\*MERGEFORMAT图9显示模块的程序框图6系统仿真当选择电机工作在单三拍,正转的模式下,K0、K4置高电平,K1、K2置低电平,系统启动,K3置高电平,电机开始转动。LED四位显示屏显示工作步数,LED指示灯红灯亮显示电机正转的状态。仿真图如下:图10系统仿真图7小结及体会经过这个学期对微机的深入学习,并且在老师的悉心指导和严格要求下,我们终于完成了三相步进电机设计课程。从书本上的知识到自己亲手的课程设计,每一步对我们来说无疑是巨大的尝试和挑战,也成就了我们目前在大学期间独立完成的最大的项目。记得在刚接到这个课题时,由于对相关知识不是很了解,我们都有些茫然不知所措。设计好一个步进电机需要什么专业知识?带着这个疑问我们开始了地学习和实验:去图书馆查阅相关资料、上网去了解相关的内容,渐渐头脑中的概念清晰了起来。在具体设计的过程中,我们遇到了更大的困难。我们不断地给自己提出新的问题,然后去论证、推翻,再接着提出新的问题。在这个循环往复的过程中,我们这篇稚嫩的设计日臻完善。虽然我们的设计作品不是很成熟,即使借鉴前人的很多资料仍然还有很多不足之处,但我仍然心里有一种莫大的幸福感,因为我们实实在在地走过了一个完整的设计所应该走的每一个过程,并且享受了每一个过程。参考文献[1]于海生编著.《计算机控制技术》.北京:机械工业出版社.2005[2]张义和、王敏男等编著.《例说51单片机》.北京:人民邮电出版社.2008[3]张靖武,周灵彬编著.《单片机系统的PROTEUS设计与仿真》.北京:电子工业出版社,2007.[4]求是科技编著.《单片机典型模块设计实例导航》.北京:人民邮电出版社,2008[5]顶明亮、唐前辉编著.《51单片机应用设计与仿真:基于keil与proteus》.北京:北京航空航天大学出版社,2009附录总程序如下:#includereg51.h#includestdio.hvoiddelay1(void);voiddelay2(void);voiddisplay(int);intbs=0;main(){chara,b,c,d,j,*q,done1[8]={0x01,0x02,0x04,0x00,0x01,0x04,0x02,0x00},done2[8]={0x03,0x06,0x05,0x00,0x03,0x05,0x06,0x00},done3[14]={0x01,0x03,0x02,0x06,0x04,0x05,0x00,0x01,0x05,0x04,0x06,0x02,0x03,0x00};P3=0x20;//P3.5口置1,绿灯亮,不工作delay1();L:a=P3;while(!(a&0x08))//判断是否启动,若没启动则重新启动{P3=0x20;a=P3;delay1();}a=P3;//判断工作模式if(a&0x01)//方式1模型q=done1;if(a&0x02)//方式2模型q=done2;if(a&0x04)//方式3模型q=done3;if(a&0x10)//判断电机是否要正转{P3=0x80;//P3.4口为1,电机正转,红灯亮b=0;}else{P3=0x40;//P3.4口为,电机反转,黄灯亮if(a&0x04)b=7;elseb=4;}d=b;while(1){c=*(q+b);//判断电机步数是否走完if(c==0)b=d;//步数走完,电机重新再走else{P1=c;//从P1输出电机控制信号b++;bs++;//总步数加1display(bs);//显示步数j=a;a=P3;if(a!=j)//判断P3口状态信号是否改变{if(!(a&0x08))bs=0;//若为停止信号,总步数清零gotoL;}//状态信号改变,返回到开始,重新对电机控制}}}voiddelay1(){inti,j;for(i=0;i200;i++)for(j=0;j300;j++);}voiddisplay(intn){unsignedchartab[10]={0x3f,0x06,0x5