基于单片机的步进电机控制系统01950.docx
基于单片机的步进电机开环限制系统胡啸峰,李俊生(北京机械工业学院机电工程学院)摘要:设计了以AT89C51单片机为主限制器的步进电机限制系统,该文主要介绍了系统硬件电路搭建、软件功能设计及相关机械结构的设计,其中重点阐述了步进电机驱动器的限制及LCD液晶显示,实现了步进电机的开环限制及界面显示。关键词:AT89C51;驱动器;步进电机;12864LCD液晶屏;开环限制Open-loopcontrolsystemofstep-motorbasedonsinglechipXiaofengHu,JunshengLi(collageofelectromechanicalengineering,Beijingindustrialmechanicalcollege)Abstract:thedesignuseAT89C51singlechiptocontrolthestep-motor.Thepapermainlyintroducesthedesignofstep-motorcontroller,step-motordrivers,thedisplayofLCD.thedesignsucceedsinrealizingcontrolofstep-motor.O.引言步进电机是1种纯数字限制电动机,它将电脉冲信号转换成相应位置的转换装置,是与输入脉冲对应的增量驱动元件,当负荷不超过步进电机所供应的动态转矩时,它就能实现快速起、停.另外,它的步距角和转速不受电压和负载变更的影响,也不受环境条件如温度、气压、冲击和振动等影响,仅与脉冲频率和脉冲数有关,因此特别适合于单片机限制.由于步进电机有快速响应特性,并且无积累误差(仅有小于7d的误差),在很多数控装置及仪器设备上都得到广泛应用.文中设计利用了单片机对步进电机对进行数字限制。在这个限制系统中,限制器是核心,它负责发脉冲和LCD显示的限制。下文对电机速度的限制及显示做出了具体的介绍。1 .总体方案设计系统框图如(1)所示,本系统主要由5部分组成,即:步进电机,步进电机驱动器,限制电路,LCD显示,执行元件。本文重点介绍步进电机限制电路,LCD显示两部分。图1系统框架2 .系统设计2.1 步进电机的限制系统步进电机的限制系统主要由单片机,晶振电路,复位电路,步进电机驱动器等组成。如图(2)所示。图2步进电机限制电路(1)晶振电路单片机的时钟信号通常用两种电路方式获得:内部震荡方式和外部震荡方式,在引脚XTALl和XTAL2外接晶体振荡器,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器。当外接晶振后,就构成了自激震荡器并产生震荡时钟脉冲,内部震荡方式的外部电路如图(3)所示,本系统选Cl和C2为30PF.XTALlC2XTAL2图3内部捻落电路图3晶振电路(2)复位电路:复位电路如图(4)所示:图4复位电路a.当系统上电时,C3导通,RESET键至高,系统复位。b.当SI按下,支线2导通,RESET键至高,系统复位。(3)步进电机脉冲产生在采纳单片机的步进电机开环系统中,限制系统的CP脉冲的频率事实上就是限制步进电机的运行速度。系统可以用两种方法实现:L延时;2.定时。在本电路设计中,采纳了步进电机驱动器,步进电机驱动器及其接线电路如图(5)所示,其脉冲的输入由单片机的定时器发出,在软件中由软件来实现。说明:在电路中,由于其他方面考虑,没有接方向信号和脱机信号两根线,读者可依据实际状况自行运用。脉冲信号由单片机TO定时器中断发出,能产生随意周期的定时信号,可以通过调整脉冲频率精确的限制电机的转速。考虑到精度的要求,在容许范围之内,不考虑由于定时器装载完重新启动起先到定时器申请中断止的那段时间。(4)键盘电路:4×4的矩阵键盘是由4条行线和4条列线组成,按键设置在行列线交点上,行列线分别连接到按键开关的两端。行线通过上拉电阻接到+5V上,平常无按键动作时,行线处于高电平状态,而当有按键按下时,行线状态将由与此相连的列线电平确定。键盘中有无按键按下是由列线送入全扫描字,将全部行由与门相连,输出接中断。当有键按下时,行线由高变低产生负跳变,即可进入中断进行处理。电路图如下:Pl. 4 -:P1.5 P1.6 Pl.7 741s21图5键盘电路图中R1,R2,R3,R4均为4.7K,目的是将行拉高,以便在有键按下时,可以跳进中断。2 .2LCD液晶显不本文采纳12864液晶显示,其与单片机P0口相接,用于显示限制界面信息。其引脚可参照说明书,本文主要对软件的设计进行具体的介绍。采纳的连接方式是直连方式,通过干脆的人为限制状态位,来实现LCD的显示。其硬件连接图如图6所示v图6LCD与单片机连接图2.3 执行机构用步进电机带动皮带进行切割机模拟运行。其基本位置关系及定位如下图所示:每块支架均有加强筋,图中未示出。2.4 数据采集本文采纳旋转式编码器采集实时速度,并通过LCD显示出来。编码器脉冲端接单片机TI计数器,通过脉冲的计数,转化为实际转数.其接线可参照有关资料。3 .软件设计。本例中,为了使步进电机有较高的转数,采纳曲线加速的方法,即不断的减小定时时间。使其由低速启动,以获得较高的转矩,之后不断的加速,最终获得所需高转速。目的在某些状况下,可以获得高转速,满意要求.其工作方式如下图:基本速度为基准的整数倍,1速为13倍,2为11倍,依次类推。要达到最高转速,由于受到转矩的限制,必需实行低转速启动,经过一段时间加到高转速。码盘数据的处理,本文中采纳AT89c51系列单片机,其只有2个定时器/计数器中断,因此如何处理码盘采回的脉冲数,是软件的核心部分。我们假设码盘在肯定时间内的脉冲数是N,设步进电机的转速为S,于是有如下的方程进行计算。Cn60×106360/Cln90×60×253×44n36060×253×444其中:采集编码器脉冲得时间为T(US)编码器旋转一周发生360个脉冲。流程图如下:键盘扫描加减速限制流程图源程序见附表(1)4结论步进电机开环限制系统具有成本低、简洁、限制便利等。在此方案中,通过曲线加速,可以获得较高的转速。通过步进电机驱动器使得步进电机的精度得以提高,运动较为平稳。运用码盘,将现有的速度实时反应在限制界面上。本试验目的在于模拟切割机的一部分,其基本功能均可实现,且步进电机的误差在容许范围之内,满意运用要求。参考文献(1)王福瑞,等单片机微机系统设计大全北京:北京航天航空高校(2)胡汉才单片机原理及其接口技术北京:清华高校说明:由于编者水平有限,仅供参考,如有不对之处还请多多指教。其中胡啸峰做软件设计,李俊生电路设计,卢胜军QQ:328510960特殊感谢机电工程学院姚小敏,李天剑老师的耐性指导和帮助。源程序:;定义限制位RSEQUP2.0RWEQUP2.1EEQUP2.2PULSEEQUP2.4DIREQUP2.5;程序标记位STATUSBITOOH;运转停止标记位,1转。停STATUS1BITOlH;正反转标记位,1正0反RESETFLAGBIT02H;系统复位标记位SPEEDSHOWFLAGBIT03H;转速刷新标记位RIGHTSHOWFLAGBIT;LCD显示的变量定义04H;版权显示标记位NDATA30H;行数显示ADDRDATA31HADDRlDATA32HNlDATA;键盘中断程序变量33HKEYlDATA38HKEY2DATA39HKEY3DATA3AH;程序中间变量GEWEIDATA40H;个位数SHIWEIDATA41H;十位数BAIWEIDATA42H;百位数CounterlDATA43H;存计数器低八位CounterhDATA44H;存计数器高八位speedlevelptdata50H;速度显示指针TIMPTDATA51H;转速定时器指针TIMNOWDATA52H;定时器周期当前值TIMN0W1DATA53H;递减用TimtargetDATA54H;定时器周期目标值TimcounteriDATA55H;采样显示计数1TIMC0UNTER2DATA56H;采样显示计数2STAYCOUNTERDATA57H;曲线加速阶段停留次数;延时子程序变量DRODATA48HDRlDATA49H;入口地址设置ORG0000H1.JMPSTARTORG0003HLJMPORGKEYBOARDOOOBHLJMPPULSE,GENERATORORG0013HLJMPLIMITSTART:MOVSP,#60HSETBEA;开中断限制位SETBEXO;开INTOSETBEXl;开INTlSETBETO;开定时器O中断SETBITO;INTo下降沿触发SETBITl;INTl下降沿触发MOVIP,#02H;设定中断优先级MOVTMOD,#52H;定时器0方式2,计数器1方式1STARTl:LCALLINITIAL_SYSLCALLINITIAL_LCD;初始化液晶面板LCALLGudingshow;液晶面板固定显示LOOP:CJNER5,ftOFFH,KEY;键值变更,则KEYJBRESETFLAG,STARTl;若按下复位键,则STARTlJBSPEEDSHOWFLAG,NEXT;若速度显示计时到,则NEXTSJMPLOOPNEXT:LCALLHEX2BCD;十六进制到BCD码转换LCALLSPEEDSHOW;显示转速SJMPLOOP;*;键值处理KEY:JNBRIGHTSHOWFLAG,NEXTO;没有显示版权,到NEXTO推断按下的键LCALLGudingshowLJMPNEXT5NEXTO:CJNER5,#OAH,NEXTlLCALLON_OFFNEXTl:CJNER5,#OBH,NEXT2LCALLFOR_BACKNEXT2:CJNER5,#OCH,NEXT3LCALLFASTNEXT3:CJNER5,#ODH,NEXT4LCALLSLOWNEXT4:CJNER5,#OEH,NEXT5LCALLRESETNEXT5:LCALLFORBACKSHOWLCALLSPEEDLEVELSHOWCJNER5,#OFH,EXITOLCALLABOUTLJMPEXIT9EXITO:CLRRIGHTSHOWFLAGSETBTROEXIT9:MOVR5,#0FFHLJMPLOOP;启停切换ON_OFF:CPLSTATUSJBSTATUS,EXITlMOVTIMNOW,#15;若要停止,匏原初始定时器周期15,实现低速启动EXITl:RET;正反转切换FOR_BACK:JNBSTATUS,EXIT2;运转中变更方向?MOVTIMNOW,#15;复原初始定时器周期15EXIT2:CPLDIRCPLSTATUS1RET;加速FAST:MOVDPTR,SspeedleveltabMOVA,SPEEDLEVELPTINCAMOVCA,A+DPTRJZEXIT3;已经最高速,则EXrr2INCSPEEDLEVELPTINCTIMPTLCALLSPEEDSHIFTEXIT3:RET;减速SLOW:MOVDPTR,#SPEEDLEVELTABMOVA,SPEEDLEVELPTDECAMOVCA,©A+DPTRJZEXIT4;已经最低速,EXIT3DECSPEEDLEVELPTDECTIMPTLCALLSPEEDSHIFTEXIT4:RET;复位RESET:SETBRESETFLAGRET;版权显示ABOUT:JBSTATUS,EXIT8JNBRIGHTSHOWFLAG,NEXT6CLRRIGHTSHOWFLAGSETBTROLJMPEXIT8NEXT6:LCALLRIGHTSHOWSETBRIGHTSHOWFLAGCLRTROEXIT8:RET;*;系统初始化INITIAL_SYS:MOVTLO,#0C4H;基准时间60微秒MOVTHO,#0C4HMOVTL1,#OOH;脉冲计数器清零MOVTH1,#OoHMOVSPEEDLEVELPT,#01H;速度档显示指针初值MOVTIMNOW,#15;初始定时器周期20MOVTIMNOW1,#15MOVTIMPT,#00H;定时器周期指针初值MOVDPTR,#TIMTAB;初始目标频率200HZMOVA,TIMPTMOVCA,©A+DPTRMOVTIMTARGET,AMOVTimcounteri,#253;采样显示计数1MOVTIMC0UNTER2,#44;采样显示计数2MOVSTAYCOUNTER,#40;阶段停留次数初值SETBTROSETBTRlMOVR5,ftOOH;键值初值MOVPl,#OFH;键盘列扫描线置零CLRSTATUS;启停标记初值SETBSTATUS1;正反转标记初值CLRRESETFLAG;初始化系统复位标记CLRRIGHTSHOWFLAG;初始化版权显示标记位CLRSPEEDSHOWFLAG;初始化速度显示标记位CLRPULSE;初始脉冲置高CLRDIR;初始转向RET;*;执行LCD初始化工作INITIAL_LCD:MOVA,#30H;功能设定LCALLW_COMMANDMOVA,#01HLCALLW_COMMAND;清屏MOVA,#06HLCALLW_COMMAND;进入模式设定MOVA,#0CHLCALLW_COMMAND;显示器限制,游标不显示,字闪耀RET;*;检查LCD劳碌标记CHKBUSY_LCD:PUSHACCCLRRSSETBRWSETBEMOVPO,#0FFH;打算读PO口CHK:MOVA,PO;PO口读到AJBACC.7,CHK;BF为1则CHK,再次查BFCLREPOPACCRET;*;写吩咐到LCDW_CONfMAND:CALLCHKBUSY_LCDCLRRSCLRRWMOVPO,ASETBECLRERET;写资料到LCDW_DATA:CALLSETBCLRMOVSETBCLRRETCHKBUSY_LCDRSRWPO,AEE;固定显示Gudingshow:MOVADDR1,#OOHMOVNl,#08HMOVDPTR,#DHZTABl1.CALLDHZMOVADDRI,#IOHMOVNl,#08HMOVDPTR,#DHZTAB21.CALLDHZMOVADDRl,#08HMOVNl,#08HMOVDPTR,#DHZTAB31.CALLDHZMOVADDRl,#18HMOVNl,#08HMOVDPTR,#DHZTAB41.CALLDHZRETDHZTAB1:DB电机限制界面DHZTAB2:DB转速:000转/分钟DHZTAB3:DB速度档:1DHZTAB4:DB转向:正;版权显示RIGHTSHOW:MOVADDR1,#OOHMOVNl,#08HMOVDPTR,#DHZTAB51.CALLDHZMOVADDR1,#IoHMOVNl,#08HMOVDPTR,ttDHZTAB61.CALLDHZMOVADDRl,#08HMOVNl,#08HMOVDPTR,ttDHZTAB71.CALLDHZMOVADDRl,#18HMOVNl,#08HMOVDPTR,ttDHZTAB8LCALLDHZRETDHZTAB5:DB卢胜军:机械架构DHZTAB6:DB李俊生:电路设计DHZTAB7:DB胡啸峰:软件设计DHZTAB8:DB版权全部;显示16*16点阵汉字DHZ:MOVADDR,ADDRlMOVB,N1DHZl:MOVA,ADDRORLA,#80HLCALLW_COMMANDDHZ2:CLRAMOVCA,©A+DPTRINCDPTRLCALLW_DATACLRAMOVCA,A+DPTRINCDPTRLCALLW_DATADJNZB,DHZ2RET;正反转显示子程序forbackshow:MOVA,#9CH1.CALLWCOMMANDJBSTATUS1,FORBACK:MOVA,#0B7H;显示反LCALLW_DATAMOVA,#0B4HLCALLW_DATALJMPEXIT6FOR:MOVA,#0D5H;显示正LCALLW_DATAMOVA,#0FDHLCALLW_DATAEXIT6:RET;速度档显示子程序SPEEDLEVELSHOW:MOVA,#8CH1.CALLW_COMMANDMOVA,#20H1.CALLW_DATAMOVA,SPEEDLEVELPTMOVDPTR,ttSPEEDLEVELTABMOVCA,A+DPTR1.CALLW_DATARET;转速显示子程序SPEEDSHOW:MOVA,R3ANLA,#0FHORLA,#30HMOVGEWEI,A;打算个位显示MOVA,R3SWAPAANLA,#0FHORLA,#30HMOVSHIWEI,A;打算十位显示MOVA,R2ANLA,#0FHORLA,#30HMOVBAIWEI,A;打算百位显示MOVA,#92HLCALLW_COMMANDMOVA,#3AHLCALLW_DATAMOVA,BAIWEI;显示百位LCALLW_DATAMOVA,SHIWEI;显示十位LCALLW_DATAMOVA,GEWEI;显示个位LCALLW_DATACLRSPEEDSHOWFLAGRET;速度切换SPEEDSHIFT:MOVDPTR,#TIMTABMOVA,TIMPTMOVCA,©A+DPTRMOVTIMTARGET,ARET;十六进制到BCD码转换结果存Rl,R2,R3,最高位存在Rl中HEX2BCD:MOVR4,#02HAGAINl:CLRC;除以4MOVa,CounterhRRCaMOVCOUNTERH,AMOVa,CounterlRRCaMOVCOUNTERL,ADJNZR4,AGAINlHB2:CLRA;BCD码初始化CLRCMOVRl,AMOVR2,AMOVR3,AMOVRO,#10H;转换双字节十六进制整数HB20:MOVa,Counterl;从高端移出待转换数的一位到CY中RLCaMOVCOUNTERL,AMOVa,CounterhRLCaMOVCOUNTERH,AMOVA,R3;BCD码带进位自身相加,相当于乘2ADDCA,R3DAA;十进制调整MOVR3,AMOVA,R2ADDCA,R2DAAMOVR2,AMOVA,RlADDCA,RlMOVRl,A;双字节十六进制数的万位数不超过6,不用DJNZRETRO,HB20;处理完16bit;发脉冲中断服务子程序PULSE.GENERATOR:PUSHPUSHACCPSW;计脉冲采集周期DJNZTimcounteri,ddiMOVTimcounteri,#253DJNZTIMC0UNTER2,DDlMOVTIMC0UNTER2,#44MOVCOUNTERL,TLlMOVCOUNTERH,THlMOVTL1,#OoHMOVTH1,#OOHSETBSPEEDSHOWFLAG;计发脉冲周期DDl:JNBSTATUS,DDDJNZTIMNOW1,DDCPLPULSEDJNZSTAYCOUNTER,DD6MOVSTAYCOUNTER,#40MOVA,TIMNOWCJNEA,TIMTARGET,DD4LJMPDD6DD4:JCDD5DECAMOVTIMNOW,ALJMPDD6DD5:INCAMOVTIMNOW,ADD6:MOVTIMNOW1,TIMNOWDD:POPPSWPOPACCRETI;键盘中断服务子程序KEYBOARD:PUSHDPLPUSHDPHPUSHACCLCALLDELAYMOVKEYl,ttOEFH;列扫描始值MOVKEY2,#04H;列数4MOVKEY3,#00H;列值计数器清零KEYSMl:MOVA,KEYlMOVPl,A;列扫描RLAMOVKEYl,A;列扫描左移一位ORLPl,#OFH;打算读行MOVA,Pl-Pl口ANLA,#0FH;屏蔽高四位,得到行值CJNEA,#OFH,JSADD;若被按键在本列,则JSADDINCKEY3;若被按键不在本列,KEY3加1DJNZKEY2,KEYSMl;若未扫完一遍,则循环LJMPEXIT;扫完一遍则退出JSADD:JBACC.O,JSADDl;被按键不在。行,则JSADDlMOVA,#00H;被按键在0行,则行首键号OOH送ALJMPJSADD4JSADDl:JBACC.1,JSADD2;被按键不在1行,则JSADD2MOVA,#04H;被按键在1行,则行首键号04H送ALJMPJSADD4JSADD2:JBACC.2,JSADD3;被按键不在2行,则JSADD3MOVA,#08H;被按键在2行,则行首键号08H送ALJMPJSADD4JSADD3:JBACC.3,EXIT;被按键不在3行,则JSADD4MOVA,#0CH;被按键在3行,则行首键号OCH送AJSADD4:ADDA,KEY3;A=行首键号+列值MOVDPTR,#KEYTAB;DPTR指向键值表MOVCA,A+DPTR;查表得键值MOVR5,A;键值保存在R5EXIT:MOVPl,#OFH;键盘列扫描线置零POPACCPOPDPHPOPDPLRETI;限位开关中断1.IMIT:1.CALLDELAYMOVRETIR5,#0BH;键值表KEYTAB:DB03H,02H,01H,OOHDB07H,06H,05H,04HDBOBH,OAH,09H,08HDBOFH,OEH,ODH,OCH;*;速度显示表SPEEDLEVELTAB:DBOOH,1,“2,3,"4","5",6,7,OOH;脉冲定时器初值表TIMTAB:DBOEH,08H,06H,05H,04H,03H,02H;转速89,156,208,250,312,417,625;延时20ms,键盘消抖用DELAY:MOVDRO,#40Dl:MOVDRl,#248DJNZDRl,$DJNZDROtDlRETEND