步进电机运动控制器设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、项目概述:

用步进电机作为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

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

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];

相关文档
最新文档