当前位置:文档之家› 步进电机运动控制器设计

步进电机运动控制器设计

一、项目概述:用步进电机作为X-Y移动平台的执行机构,实现开环位置控制。

采用四相步进电机,一相激励时步距角为1.8°,由步进电机驱动器接受控制器的控制信号,采用单四拍方式,每拍为一步,可正反转。

步进电机的转动带动丝杆,将旋转运动转换为直线运动,步进电机的每一走步传递到X或Y方向的移动距离为0.02mm.系统中步进电机工作频率为500Hz--4KHz。

运动要求是:(1)当按键K1按下时,X方向步进电机正向运转,X正向移动1mm;当按键K2按下时,X方向步进电机反向运转,X反向移动1mm;当按键K3按下时,Y方向步进电机正向运转,Y正向移动1mm;当按键K4按下时,Y方向步进电机反向运转,Y反向移动1mm;(2)按键按住不放,连续运动直到按键释放,停止运转。

(3)控制器实时显示步进电机转过的步数和X或Y向移动的距离。

(4)系统供电电源为36 VDC。

二、系统设计:设计思想:1、用两台步进电机分别控制x、y方向的运动;2、采用动态显示方式,实时显示步数和距离;3、采用4个并行口输出控制信号以及采集开关输入信号。

总体方案:采用AT89C51作为控制器:P0口读入开关输入信号;P1口接步进电机驱动器ULN2003A;P2、P3口控制动态显示电路。

三、硬件设计:1、AT89C51晶振电路和手动复位电路:晶振电路:采用12MHz的晶振,其中电容C1,C2可在5—60pF之间选择,这两个电容的大小对振荡频率有微小的影响,可起频率微调的作用。

复位电路:当按键弹起时,相当于一个上电复位电路;当按键压下时,相当于RST端通过电阻与+5V的电源相连,提供足够宽度的阈值电压完成复位。

2、开关量读入:由P0口的低4位读入开关量信号。

3、步进电机控制电路:其中ULN2003A为步进电机驱动器,两台步进电机分别由P1口的低4位和高4位控制,并分别带动x,y方向的运动。

ULN2003A:输入高时,输出为低,COM端与步进电机中间两根线一起接高电平。

四相步进电机:采用单四拍方式通电,除去中间两根线,分别给每一相定子通电,磁场力带动转子转动。

从左上开始顺时针通电为正转;逆时针为反转。

4、动态显示电路:左边LED显示距离,右边显示步数。

P2口低4位输出压缩型BCD码:当步数为i时,用以下程序分别求出千位、百位、十位和个位。

并用TAB表转化为压缩型BCD码。

unsigned char TAB[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};i1=i/1000; 千位i2=(i%1000)/100; 百位i3=((i%1000)%100)/10; 十位i4=((i%1000)%100)%10; 个位i5=(i*2)/1000; 距离的十位(mm)i6=((i*2)%1000)/100; 距离的个位i7=(((i*2)%1000)%100)/10; 距离的小数点后一位i8=(((i*2)%1000)%100)%10; 距离的小数点后两位分别选通P2.4—P2.7,输出i1,i2,i3,i4;分别选通P3.0—P3.3,输出i5,i6,i7,i8;当显示左边LED第二根管时,使P3.4为低,显示小数点。

4511:输入为压缩型BCD码,输出为对应LED显示码。

5、总电路图:四、软件设计:#include<reg51.h>1、变量定义:sbit k1=P0^0; //开关输入sbit k2=P0^1;sbit k3=P0^2;sbit k4=P0^3;unsigned char xzz[]={0xfe,0xfd,0xfb,0xf7}; //x方向正转控制字unsigned char xfz[]={0xfb,0xfd,0xfe,0xf7}; //x方向反转控制字unsigned char yzz[]={0xef,0xdf,0xbf,0x7f}; //y方向正转控制字unsigned char yfz[]={0xbf,0xdf,0xef,0x7f}; //y方向反转控制字unsigned char TAB[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //将一位数转化为压缩型BCD码unsigned int bushu; //步数2、延时子程序;void DelayMs(unsigned int n) //毫秒级延时子程序{unsigned int i=0,j=0;for(i=0;i<n;i++)for(j=0;j<123;j++);}3、实时显示子程序:采集步数——运算出步数的千、百、十、个位以及距离的各个位数——置循环初值j=0——选通P2.4为低电平,输出i1的压缩型BCD码,延时5ms——选通P2.5为低电平,输出i2的压缩型BCD码,延时5ms——选通P2.6为低电平,输出i3的压缩型BCD码,延时5ms ——选通P2.7为低电平,输出千位的压缩型BCD码,延时5ms——选通P3.0为低电平,输出i5的压缩型BCD码,延时5ms——选通P3.1为低电平,输出i6的压缩型BCD码,延时5ms——选通P3.2为低电平,输出i7的压缩型BCD码,延时5ms——选通P3.8为低电平,输出i8的压缩型BCD码,延时5ms——判断j是否小于等于5,不是则完成循环。

void Displayss(unsigned int i) //实时显示子程序{unsigned int i1,i2,i3,i4,j,i5,i6,i7,i8;i1=i/1000;i2=(i%1000)/100;i3=((i%1000)%100)/10;i4=((i%1000)%100)%10;i5=(i*2)/1000;i6=((i*2)%1000)/100;i7=(((i*2)%1000)%100)/10;i8=(((i*2)%1000)%100)%10;for(j=0;j<=5;j++){P3=0xff;P2=0xe0;P2=P2|TAB[i1];DelayMs(5);P3=0xff;P2=0xd0;P2=P2|TAB[i2];DelayMs(5);P3=0xff;P2=0xb0;P2=P2|TAB[i3];DelayMs(5);P3=0xff;P2=0x70;P2=P2|TAB[i4];DelayMs(5);P3=0xee;P2=0xf0;P2=P2|TAB[i5];DelayMs(5);P3=0xfd;P2=0xf0;P2=P2|TAB[i6];DelayMs(5);P3=0xeb;P2=0xf0;P2=P2|TAB[i7];DelayMs(5);P3=0xe7;P2=0xf0;P2=P2|TAB[i8];DelayMs(5);}}4、稳定显示子程序:将实时显示的循环改为死循环,当再次按下开关则跳出。

void Display(unsigned int i) //稳定显示子程序{unsigned int i1,i2,i3,i4,i5,i6,i7,i8;i1=i/1000;i2=(i%1000)/100;i3=((i%1000)%100)/10;i4=((i%1000)%100)%10;i5=(i*2)/1000;i6=((i*2)%1000)/100;i7=(((i*2)%1000)%100)/10; i8=(((i*2)%1000)%100)%10; while(1){P3=0xff;P2=0xe0;P2=P2|TAB[i1];DelayMs(5);P3=0xff;P2=0xd0;P2=P2|TAB[i2];DelayMs(5);P3=0xff;P2=0xb0;P2=P2|TAB[i3];DelayMs(5);P3=0xff;P2=0x70;P2=P2|TAB[i4];DelayMs(5);P3=0xee;P2=0xf0;P2=P2|TAB[i5];DelayMs(5);P3=0xfd;P2=0xf0;P2=P2|TAB[i6];DelayMs(5);P3=0xeb;P2=0xf0;P2=P2|TAB[i7];DelayMs(5);P3=0xe7;P2=0xf0;P2=P2|TAB[i8];DelayMs(5);if(k1==0)break;if(k2==0)break;if(k3==0)break;if(k4==0)break;}}5、x、y方向正反转子程序:置初始步数为0,当有按键按下则触发相应运转子程序。

步数小于50则继续运行到50步(1mm);若按住按键不放,电机继续运转直到按键释放。

以x方向正转为例:置初始步数为0——判断k1是否为0(按下为0)或步数是否小于50 否跳出循环,结束子程序是将正转控制子送入P1口——步数+1——实时显示——延时10msvoid xzhengzhuan() //x方向正转子程序{bushu=0;while(k1==0||bushu<50){P1=xzz[bushu%4];bushu++;Displayss(bushu);DelayMs(10);}}void xfanzhuan() //x方向反转子程序{bushu=0;while(k2==0||bushu<50){P1=xfz[bushu%4];bushu++;Displayss(bushu);DelayMs(10);}}void yzhengzhuan() //y方向正转子程序{bushu=0;while(k3==0||bushu<50){P1=yzz[bushu%4];bushu++;Displayss(bushu);DelayMs(10);}}void yfanzhuan() //y方向反转子程序{bushu=0;while(k4==0||bushu<50){P1=yfz[bushu%4];bushu++;Displayss(bushu);DelayMs(10);}}6、主程序:置初值bushu=0,P2=0xf0,P3=0xff否判断k1是否为0 是执行xzhengzhuan子程序否判断k2是否为0 是执行xfanzhuan子程序否判断k3是否为0 是执行yzhengzhuan子程序否判断k4是否为0 是执行yfanzhuan子程序判断步数是否不为0 是执行Display子程序(稳定显示)void main() //主函数{bushu=0;P3=0xff;P2=0xf0;if(k1==0)xzhengzhuan();if(k2==0)xfanzhuan();if(k3==0)yzhengzhuan();if(k4==0)yfanzhuan();if(bushu!=0)Display(bushu);}五、系统仿真及调试:一旦有开关按下则连续走50步;按住按键不放,持续运转到按键释放。

相关主题