步进电机运动控制器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];