基于51单片机的步进电机直线插补.docx
《基于51单片机的步进电机直线插补.docx》由会员分享,可在线阅读,更多相关《基于51单片机的步进电机直线插补.docx(18页珍藏版)》请在冰豆网上搜索。
![基于51单片机的步进电机直线插补.docx](https://file1.bdocx.com/fileroot1/2023-1/27/1f97ac0b-9213-45d6-8960-8a8745115926/1f97ac0b-9213-45d6-8960-8a87451159261.gif)
基于51单片机的步进电机直线插补
基于51单片机的步进电机直线插补
摘要
本设计为基于51单片机,利用两个四相八拍步进电机,实现四个象限中直线插补的过程。
其中一个电机正反转实现X正负方向的插补,另一个电机正反转代表Y轴正负方向插补。
并对该插补算法的原理及其实现过程进行了阐述,通过按键启动插补过程,插补结束后电机自动停止。
通过LCD1602液晶实现插补过程中插补方向的显示,最终完成了步进电机的插补过程。
关键词步进电机直线插补液晶显示
第1章概述
数字控制是近代发展起来的一种自动控制技术,利用数字化信号对机床及其加工过程进行自动控制,主要用于数控机床、线切割机、焊接机、气割机以及低速小型数字绘图仪等。
数控机床可以加工形状复杂的零件,具有加工精度高、生产效率高、便于改变加工零件品种等众多优点,是实现机床自动化的一个重要发展方向。
逐点比较法是数控机床在加工曲线时常用的一种方法,是常用的脉冲增量插补方法。
它是以阶梯折线来逼近直线或圆弧等曲线,与规定的加工直线或圆弧之间的最大误差为一个脉冲当量,当脉冲当量足够小时,就可以达到相当高的加工精度。
步进电机是数字控制系统中非常重要的工具之一,它是一种将电脉冲信号变换成角位移的机电式数模转换器。
它直接用数字信号驱动,使用非常方便。
当步进电机接收计算机发来的指令脉冲后,步进电机会相应的转动,步进电机与数控系统的工具台相连,从而可以驱动刀具对工件进行切割。
指令脉冲的数量决定道具的总移动量,指令脉冲的频率决定道具移动速度。
这样,利用步进电机可以很容易的控制操作台进行工件的加工。
第2章设计内容的介绍
2.1步进电机原理
步进电机的工作就是步进转动,其功用是将脉冲电信号变换为相应的角位移。
当给定一个脉冲信号,步进电机会转动一个角度,也就是步进角。
步进电机的角位移量与脉冲数成正比,我们可以通过控制给定的脉冲个数,从而精确控制电机转动的角度。
同样也可以通过控制脉冲频率控制它的转速,从而达到调速的目的。
如下所示的步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图2-1是该四相反应式步进电机工作原理示意图。
图2-1四相步进电机步进示意图
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D
四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2-2所示:
图2-2步进电机工作时序波形图
2.2步进电机的选择
现在比较常用的步进电机包括反应式步进电机、永磁式步进电机、混合式步进电机和单相式步进电机等。
在本次课程设计中,我们小组选用的是28BYJ48型四相八拍的步进电机,供电电压为DC5V。
该步进电机有四根控制线,对应A-B-C-D,另一根为电源线。
四根线排列方式为:
A-AB-B-BC-C-CD-D-DA-A……。
当对步进电机施加控制脉冲时,它可以转动,四相八拍步进电机给定八个脉冲时,步进电机才会相应的转动一周。
由于本电机采用的时减速电机,减速比为64:
1,所以当内部转子转动64圈后,外部才会相应的转动一圈。
每一个脉冲信号对应步进电机的某一相或两相绕组,通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
四相步进电机可以在不同的通电方式下运行,28BYJ48步进电机四相八拍相序表如表1所示:
序号
四相通电情况
通电情况
1
0
0
0
1
01H
2
0
0
1
1
03H
3
0
0
1
0
02H
4
0
1
1
0
06H
5
0
1
0
0
04H
6
1
1
0
0
0CH
7
1
0
0
0
08H
8
1
0
0
1
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//51芯片管脚定义头文件
#include//内部包含延时函数_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×7
}
/********************************************************
*主程序
*********************************************************/
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;
}
else
{
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++,'X');
}
}break;
case2:
{
YFstep();//Y反轴走步
if(M>=16)
{
DispCharacter(1,MM++,'-');
DispCharacter(1,MM++,'X');
}
else
{
DispCharacter(0,M++,'-');
DispCharacter(0,M++,'X');
}
}break;
case3:
{
XZstep();//X正轴走步
if(M==16||M==17)
{
DispCharacter(1,MM++,'Y');
}
else
{
DispCharacter(0,M++,'Y');
}
}break;
case4:
{
XFstep();//X反轴走步
if(M==16||M==17)
{
DispCharacter(1,MM++,'-');
DispCharacter(1,MM++,'Y');
}
else
{
DispCharacter(0,M++,'-');
DispCharacter(0,M++,'Y');
}
}break;
}
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:
1
{
for(i=0;i<8;i++)//一个周期转45度
{
P1=FFW[i];//顺序取数据
delay
(1);//调节转速
}
}
}
/*步进电机Y正转**/
voidYZstep()
{
uchari,j;
for(j=0;j<64;j++)
{
for(i=0;i<8;i++)//一个周期转45度
{
P1=REV[i];//取数据
delay
(1);//调节转速
}
}
}
/*步进电机X反转***/
voidXFstep()
{
uchari,j;
for(j=0;j<64;j++)
{
for(i=0;i<8;i++)//一个周期转45度
{
P1=FFW[i];//取数据
delay
(1);//调节转速
}
}}
/*步进电机Y反转***/
voidYFstep()
{
uchari,j;
for(j=0;j<64;j++)
{
for(i=0;i<8;i++)//一个周期转45度
{
P1=REV[i];//取数据
delay
(1);//调节转速
}
}}
intpdxoy(intx,inty)//判断位于那一象限
{
inth;
if(x>0&&y>0)
{
h=1;
}
else
if(x>0&&y<0)
{
h=3;
}
else
if(x<0&&y>0)
{
h=2;
}
else
{
h=4;
}
return(h);
}
【本文档内容可以自由复制内容或自由编辑修改内容期待你的好评和关注,我们将会做得更好】