基于51单片机的步进电机直线插补Word格式.docx
《基于51单片机的步进电机直线插补Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的步进电机直线插补Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
在本次课程设计中,我们小组选用的是28BYJ48型四相八拍的步进电机,供电电压为DC5V。
该步进电机有四根控制线,对应A-B-C-D,另一根为电源线。
四根线排列方式为:
A-AB-B-BC-C-CD-D-DA-A……。
当对步进电机施加控制脉冲时,它可以转动,四相八拍步进电机给定八个脉冲时,步进电机才会相应的转动一周。
由于本电机采用的时减速电机,减速比为64:
1,所以当内部转子转动64圈后,外部才会相应的转动一圈。
每一个脉冲信号对应步进电机的某一相或两相绕组,通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
四相步进电机可以在不同的通电方式下运行,28BYJ48步进电机四相八拍相序表如表1所示:
序号
四相通电情况
通电情况
1
01H
2
03H
3
02H
4
06H
5
04H
6
0CH
7
08H
8
09H
表128BYJ48步进电机相序表
当根据时序表整列给电时,步进电机会正转,当逆着相序表给脉冲时,步进电机相应的则反转,从而可以实现电机正反转的控制。
28BYJ48步进电机主要技术参数如表2所示
表2步进电机主要技术参数
由表可知,每个脉冲电机会转动5.625度,当给8个脉冲后,电机则转动45度,给定64个脉冲,电机则转动一圈。
由于减速比为64:
1,故需要内部线圈转动64*64=4096圈,外部转子才转动一圈。
2.3逐点比较法直线插补法原理
所谓直线插补就是只能用于实际轮廓是直线的插补方式。
当刀具或绘图笔每走一步,都要和给定的轨迹上的坐标进行比较,看这点是在直线的上方还是下方,或是给定轨迹的里面还是外面,从而决定下一步进给的方向。
如果在轨迹上方,就往下方走,在下方,就往上方走,从而逐步逼近轨迹。
2.3.1逐点比较法的四个基本步骤
①偏差判别:
根据偏差判断应该向哪个坐标方向进给;
②坐标进给:
根据判别结果,沿相应的坐标方向进给;
③新偏差计算:
根据偏差函数,计算进给后偏差,作为下次偏差判别的依据;
④终点比较:
判断是否达到终点,若达到终点则结束本次插补,否则转①继续执行。
2.3.2四个象限的直线插补
设A1、A2、A3、A4分别表示第一、第二、第三、第四象限的四种线型。
它们的加工起点均从坐标原点开始,则刀具进给方向如图2-3所示。
凡F≥0时,向x方向进给,在第一、四象限向+x方向进给;
在二、三象限,向-x方向进给;
凡F<
0时,向y方向进给,在第一、二象限向+y方向进给;
在三、四象限,向-y方向进给。
不管是哪个象限,都采用与第一象限相同的偏差计算公式,只是式中的终点坐标值均取绝对值。
图2-3四个象限给进方向
表3四象限的进给脉冲和偏差计算
四种线型的偏差计算公式是相同的,差别在于进给方向不同。
流程图中的“沿xe方向走一步”或“沿ye方向走一步”,因不同线型的xe、ye位于不同象限,因而实际的进给方向是不相同的。
因此,对任一直线在插补前,应根据xe、ye的符号判断该线型属于哪一象限。
2.4设计目标
利用四相八拍步进电机实现四个象限的直线插补,使用两个四相八拍步进电机,一个电机实现X正方向正转,负方向反转,另一个电机实现y正方向正转,负方向反转。
当按键按下启动插补后,液晶显示屏每一步插补进给的方向。
第3章设计思路与具体内容
3.1设计思路
本系统主要由供电电源模块、单片机最小系统、按键电路、步进电机驱动电路、步进电机以及液晶显示屏等几部分组成。
本系统采用两个独立步进电机,一个电机实现X正方向正转,负方向反转,另一个电机实现y正方向正转,负方向反转。
使用的步进电机为28BYJ48型四相八拍电机,采用独立DC5V供电。
使用按键实现插补的启动过程,液晶显示插补方向。
总体设计框图如图3.1所示。
图3.1总体设计框图
3.2单片机最小系统及按键部分
51单片机主要完成对驱动步进电机以及显示的控制,其中最小系统是单片机能正常工作的必不可少得一部分。
51单片机是一种低功耗/低电压、高性能的8位单片机,它是一种功能强、灵活性高且价格合理的单片机,且支持在线编程,完全满足本系统设计需要。
单片机最小系统包括单片机和复位电路,晶振,电源部分。
最小系统电路如图所示:
图3.2AT89S52单片机
图3.3晶振电路
图3.4复位电路
图3.5电源电路
3.3按键电路
按键电路实现插补过程的启动,其原理图如图3.6所示。
图3.6按键电路
3.4步进电机驱动电路
步进电机的驱动芯片采用ULN2003A,其硬件电路如图3.7所示。
图3.7步进电机的驱动电路
3.5液晶显示电路
使用液晶显示插补过程中电机转动的方向,其电路图如图3.8所示
图3.8步进电机的驱动电路
第四章程序设计
根据单片机外围电路的设计以及插补过程原理,基于51单片机的C语言软件功能实现四个象限的直线插补过程。
基本软件设计流程如图4.1所示。
该图按照插补计算过程的4个步骤:
偏差判别,坐标进给,偏差计算,终点判断来实现插补计算程序。
偏差判别,偏差计算,终点判别是逻辑运算和算术运算,容易编写程序,而坐标进给是给步进电机发送走步脉冲,通过步进电机带动机床工作台或道具移动。
图4.1程序流程图
此外,为了反映坐标进给方向的情况,本设计添加了液晶显示模块,实现记录显示进给过程。
第五章心得体会
通过此次课程设计,我明白了理论学习中插补过程及步进电机工作原理的实际应用,进一步加深了对理论知识的理解。
从设计程序到完成程序,我用了近两天时间,在这两天中,思路在一遍又一遍的更新,程序在一遍又一遍的更改。
从之前的第一象限插补改进到了四个象限的插补,从单调的电机转动,到按键控制启动,液晶显示的过程。
在这个过程中,我遇到许许多多的问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期知识的欠缺和经验的不足。
实践出真知,通过亲自动手制作,使我掌握的知识不再是纸上谈兵,而是学以致用。
这次课程设计是我认识到计算机控制技术在现代生产发展中的重要地位,使我明白了平时枯燥的理论学习原来那么重要。
通过实际动手,我深刻感受到理论基础知识学习与实践结合的重要性,我觉得平时的课堂不再那么无聊,反而给了我学习这门课程的积极性,让我充满好奇的去慢慢探索它的奥妙。
最重要的是,在本次课程设计中,我学会了很多学习的方法,而这些都将为日后做准备,会使我们终身都受益匪浅。
面对社会的挑战,只有不断的学习、实践,再学习、再实践,才能在最大程度上发掘自己,实践是检验真理的唯一标准。
这对于我们的将来有莫大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
参考文献
[1] 丁元杰著.单片微机原理及应用[M].机械工业出版社,2010年1月
[2] 于海生著.计算机控制技术[M].机械工业出版社,2011年9月
附录
1、作品实物图
2、主要程序代码
#include<
reg51.h>
//51芯片管脚定义头文件
intrins.h>
//内部包含延时函数_nop_();
#include"
LCD1602.h"
//LCD1602液晶头文件
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeFFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
/*四相八拍正转编码*/
ucharcodeREV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
/*四相八拍反转编码*/
sbitK1=P3^2;
//启动按键
intXe=-8;
//终点X坐标
intYe=6;
//终点Y坐标
intYm=0;
//当前X坐标
intXm=0;
//当前Y坐标
uintXOY;
//象限(1,2,3,4)
uintZF;
//方向标志位(+X,+Y,-X,-Y)
intr;
//变量
intN=64;
//N步进电机运转圈数
intM=5;
//变量,与液晶显示位置有关
intMM=0;
intcstep;
//步数
intabs(intx);
//取绝对值函数
voiddelay(uintt);
//延时函数
voidXZstep();
//X正向走步函数
voidYZstep();
//Y轴正向走步函数
voidXFstep();
//X轴反向走步函数
voidYFstep();
//Y轴反向走步函数
intpdxoy(intx,inty);
//判断哪个象限函数
voidInitLCD()//LCD初始化
{
LCDReset();
InputMode(0x06);
//增量方式,不移位
DispControl(0x0c);
//显示开,光标关,闪烁关
FunctionSet(0x38);
//8位,2行,5×
}
/********************************************************
*主程序
*********************************************************/
main()
{
intFm=0;
//偏差判别式
cstep=abs(Xe)+abs(Ye);
//走的总步数
InitLCD();
//液晶初始化
XOY=pdxoy(Xe,Ye);
//XOY为象限值
while
(1)
{
//液晶显示DIR:
(direction标志)
DispCharacter(0,1,'
D'
);
DispCharacter(0,2,'
I'
DispCharacter(0,3,'
R'
DispCharacter(0,4,'
:
'
if(K1==0)//判断按键是否按下
{
while(cstep!
=0)//当步数不为零时执行程序,为零时停止
{
if(Fm>
=0)//偏差判别
{
if((XOY==1)||(XOY==4))//判别是否为第1或第四象限
{
ZF=1;
//方向标志位
}
else
ZF=2;
Fm=Fm-abs(Ye);
//更新偏差判别式
}
else
{
if((XOY==1)||(XOY==2))
ZF=3;
}
ZF=4;
Fm=Fm+abs(Xe);
switch(ZF)//判断不同方向标志位执行不同结果
{
case1:
{
YZstep();
//Y正轴走步
if(M==16||M==17)/*此判断与液晶显示有关,若第一行显示满,则换行显示,显示方向,即四种情况:
X,-X,Y,-Y*/
{
DispCharacter(1,MM++,'
X'
}
else
{
DispCharacter(0,M++,'
}break;
case2:
YFstep();
//Y反轴走步
if(M>
=16)
{
-'
}
else
{
}break;
case3:
XZstep();
//X正轴走步
if(M==16||M==17)
DispCharacter(1,MM++,'
Y'
DispCharacter(0,M++,'
}
case4:
XFstep();
//X反轴走步
DispCharacter(1,MM++,'
else
DispCharacter(0,M++,'
}
delay(200);
cstep--;
}}}}
intabs(intx)//取绝对值函数
if(x<
0)
x=-x;
return(x);
voiddelay(uintt)//延时函数
{
uintk;
while(t--)
for(k=0;
k<
125;
k++);
}
/*步进电机X正转********/
voidXZstep()
uchari,j;
for(j=0;
j<
64;
j++)//该电机为减速电机,减速为64:
for(i=0;
i<
8;
i++)//一个周期转45度
P1=FFW[i];
//顺序取数据
delay
(1);
//调节转速
}
/*步进电机Y正转**/
voidYZstep()
for(j=0;
j++)
P1=REV[i];
//取数据
/*步进电机X反转***/
voidXFstep()
P1=FFW[i];
}}
/*步进电机Y反转***/
voidYFstep()
}}
intpdxoy(intx,inty)//判断位于那一象限
inth;
if(x>
0&
&
y>
h=1;
}
else
y<
h=3;
h=2;
h=4;
return(h);
【本文档内容可以自由复制内容或自由编辑修改内容期待你的好评和关注,我们将会做得更好】