基于51单片机的步进电机的控制设计.docx
《基于51单片机的步进电机的控制设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的步进电机的控制设计.docx(21页珍藏版)》请在冰豆网上搜索。
基于51单片机的步进电机的控制设计
单片机应用系统设计报告
设计题目:
步进电机控制器设计
专业班级:
学生姓名:
指导教师:
设计时间:
2016年12月
一、设计要求及方案
1、设计要求
可以实现步进电机正转和反转控制及速度的控制,同时实现步进电机步数的控制。
2、设计方案
本次设计采用AT89C51单片机控制一个四相步进电机。
单片机输出脉冲序列,驱动步进电机转动;并设置开关、按键电路,来控制步进电机的2挡转速,即加速、减速;以及步数的变化,即四拍驱动方式、八拍驱动方式,同时控制步进电机的转动方向,即正转、反转。
设计方案总体框图:
二、步进电机简介
1、步进电机工作原理
步进电机是一种将电脉冲转化为角位移的执行机构。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。
步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的多相时序控制器。
虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。
它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。
因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。
步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
2、步进电机磁力方式选择
步进电机的励磁方式主要分为全步励磁和半步励磁两种,其中全步励磁又有一相励磁和二相励磁之分,半步励磁又称一-二相励磁。
一相励磁:
在每一瞬间,步进电机只有一个线圈导通。
每送出一个励磁信号,步进电机旋转1.8°,这是三种励磁方式中最简单的一种。
其特点是:
精确度好、消耗电力小,但输出转矩小,震动较大。
二相励磁:
在每一瞬间,步进电机有两个线圈同时导通。
每送一个励磁信号,步进电机旋转1.8°。
其特点是:
输出转矩大,振动小。
一-二相励磁:
为一相励磁与二相励磁交替导通的方式。
每送一个励磁信号,步进电机旋转0.9°。
其特点是:
分辨率高,运转平滑。
本次设计,八拍驱动时采用一相励磁方式,四拍驱动时采用二相励磁方式。
八拍磁力顺序表:
时序
1
2
3
4
5
6
7
8
置1
A
-
B
-
C
-
D
-
置0
-
D
-
A
-
B
-
C
四拍磁力顺序表:
时序
1
2
3
4
置0
D
A
B
C
置1
A,B
B,C
C,D
D,A
三、硬件电路设计
1、晶振电路设计
AT89C51单片机各功能部件的运行都以时钟控制信号为基准,有条不紊,一拍一拍地工作。
本次设计时钟电路采用内部时钟方式。
AT89C51内部有一个用于构成震荡器的高增益方向放大器,它的输入端为芯片引脚XTAL1,输出端引脚为XTAL2。
这两个引脚跨接石英晶体和微调电容,构成一个稳定的自激振荡器。
本次设计选择振荡频率为12MHZ的石英晶体。
图晶振电路
2、复位电路设计
AT89C51的复位是由外部的复位电路实现的。
复位引脚RST通过一个施密特触发器与复位电路相连,施密特触发器用来抑制噪声,在每个机器周期的S5P2,施密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电复位和按钮复位两种方式,本次设计采用上电复位方式。
图复位电路
3、开关、按键电路
本次设计采用开关、按键电路来控制步进电机的正转、反转、加速、减速、步数。
并且由单片机的P2口对其进行控制。
图开关、按键电路
4、驱动电路设计
本设计采用ULN2003作为驱动器驱动步进电机运转,把单片机P1口输出的脉冲信号转化为脉冲电流,驱动步进电机运转。
图驱动电路
5、总电路图
图总电路图
四、软件程序设计
1、程序设计思路
通过分析可以看出,实现系统功能可以采用多种方法,由于随时有可能输入加速、加速信号和方向信号,因而采用中断方式效率最高,这样总共要完成2个部分的工作才能满足课题要求,即主程序部分、定时器中断部分,其中主程序的主要功能是系统初始参数的设置及启动开关的检测,若启动开关合上则系统开始工作,反之系统停止工作;定时器中断器部分,控制按键标志位值的改变,从而可以控制主程序中步进电机转速、转向、步数。
2、程序框图
3、程序
#include
#defineucharunsignedchar
#defineuintunsignedint
uinttemp=4,flag=0;
intk=100,m=0;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
sbitP2_5=P2^5;
sbitP2_6=P2^6;
sbitP2_7=P2^7;
ucharcheck_key1()
{
ucharn;
P2=0xff;
n=P2;
if(n!
=0xdf)
return1;
else
return0;
}
ucharcheck_key2()
{
ucharn;
P2=0xff;
n=P2;
if(n!
=0xbf)
return1;
else
return0;
}
ucharcheck_key()
{
ucharn;
P2=0xff;
n=P2;
if(n!
=0x7f)
return1;
else
return0;
}
voidtimer0()interrupt1
{
switch(P2)
{
case0xde:
if(check_key1()==1)
{
delay(5);
if(check_key1()==1)
{temp=0;
P1=0xf0;}
}
break;
case0xdd:
if(check_key1()==1)
{
delay(5);
if(check_key1()==1)
{temp=1;
P1=0xf0;}
}
break;
case0xbb:
if(check_key2()==1)
{
delay(5);
if(check_key2()==1)
temp=2;
}
while(check_key2());
break;
case0xb7:
if(check_key2()==1)
{
delay(5);
if(check_key2()==1)
temp=3;
}
while(check_key2());
break;
case0x6f:
if(check_key()==1)
{
delay(5);
if(check_key()==1)
{
flag++;
if(flag>=2)
flag=0;
}
}
while(check_key());
break;
}
}
voidsudu0()
{
if(temp==2)
{
k+=200;
if(k>=1000)
k=1000;
temp=0;
}
if(temp==3)
{
k-=200;
if(k<=0)
k=100;
temp=0;
}
}
voidsudu1()
{
if(temp==2)
{
k+=200;
if(k>=1000)
k=1000;
temp=1;
}
if(temp==3)
{
k-=200;
if(k<=0)
k=100;
temp=1;
}
}
sbitP1_0=P1^0;
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_3=P1^3;
voidmain(void)
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
P1_0=0;
P1_1=0;
P1_2=0;
P1_3=0;
while
(1)
{
for(m=1;m<=8;m++)
{
if(flag==0)
{
if(temp==0)
{
switch(m)
{
case1:
P1_0=1;
delay(k);
break;
case2:
P1_3=0;
delay(k);
break;
case3:
P1_1=1;
delay(k);
break;
case4:
P1_0=0;
delay(k);
break;
case5:
P1_2=1;
delay(k);
break;
case6:
P1_1=0;
delay(k);
break;
case7:
P1_3=1;
delay(k);
break;
case8:
P1_2=0;
delay(k);
break;
}
sudu0();
if(flag==1)
P1=0xe0;
}
if(P1==0xe0)
break;
if(temp==1)
{
switch(m)
{
case1:
P1_3=1;
delay(k);
break;
case2:
P1_0=0;
delay(k);
break;
case3:
P1_2=1;
delay(k);
break;
case4:
P1_3=0;
delay(k);
break;
case5:
P1_1=1;
delay(k);
break;
case6:
P1_2=0;
delay(k);
break;
case7:
P1_0=1;
delay(k);
break;
case8:
P1_1=0;
delay(k);
break;
}
sudu1();
if(flag==1)
P1=0xe0;
}
if(P1==0xe0)
break;
}
if(flag==1)
{
if(temp==0)
{
switch(m)
{
case1:
P1_3=0;
P1_0=1;
P1_1=1;
delay(k);
break;
case2:
P1_0=0;
P1_1=1;
P1_2=1;
delay(k);
break;
case3:
P1_1=0;
P1_2=1;
P1_3=1;
delay(k);
break;
case4:
P1_2=0;
P1_3=1;
P1_0=1;
delay(k);
break;
}
sudu0();
if(flag==0)
P1=0xd0;
}
if(P1==0xd0)
break;
if(temp==1)
{
switch(m)
{
case1:
P1_0=0;
P1_3=1;
P1_2=1;
delay(k);
break;
case2:
P1_3=0;
P1_2=1;
P1_1=1;
delay(k);
break;
case3:
P1_2=0;
P1_1=1;
P1_0=1;
delay(k);
break;
case4:
P1_1=0;
P1_0=1;
P1_3=1;
delay(k);
break;
}
sudu1();
if(flag==0)
P1=0xd0;
}
if(P1==0xd0)
break;
}
}
}
}
五、新的体会
因为微机课和单片机课没怎么学好,故感觉在做这个设计时有点困难,比如汇编程序。
后来决定用c来编写程序,这样稍微轻松点,在设计程序中涉及到了中断程序的编写,发现已学的理论知识完全用不上来,也许这就是理论脱离时间的结果,在期间恶补了单片机的中断知识及其相应的程序编写。
通过这次课程设计实验,我对步进电机调速控制系统有了实际的了解和认识,提高了动手能力。
本次实验把书本上、课堂上学到的知识灵活地运用到实际的实物上,感觉是对学以致用的一种锻炼和考验提高了用所学知识解决实际问题的能力,加深和巩固的对知识的理解和掌握。
控制电路、驱动电路、测速反馈电路、步进电机几个模块的整合,也实际中提高了自己对系统的认识,有了些整体的概念和思维观。
实验是团队合作完成的,从设计电路到设计软件,然后仿真到做硬件做出符合要求的控制系统,不仅从实际中锻炼了动手能力而且学会了团队合作,互相学习,提高自己。
这次的课程设计总的感觉就是很累,但在不断的学习机实践当中学到了很多东西,知识的提高那是最基础的,中断,电路工作及相关的知识都是得到了提升;然后就是个人处理问题能力的提高,虽然说这次的设计不算一个大的项目,但也算是小的雏形,课题的选择,前期的准备,理论的实践,知识的提高,处理实际问题及后期的总结归纳。
付出去收获往往是成正比的,这次的课程设计中得到了充分的体现。
总的来说,这次设计的步进电机控制电路还是比较成功的在设计中遇到了很多问题,最后在自己的思考下,宿舍大家一起经过激烈的探讨下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。
不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识。
同时,对未来有了更多的信心。
最后,对文老师表示忠心的感谢,老师,你辛苦了。