基于AT89C51单片机步进电机控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于AT89C51单片机步进电机控制
————————————————————————————————作者:————————————————————————————————日期:
控制系统项目
课程设计论文
题目:基于AT89C51单片机步进电机控制
姓名
陈悟宇
学号
201103820129
年级
2011级
专业飞
行器制造工程
系(院)机
械工程学院
指导教师
徐波
2014年5月23日
目录
摘要: (3)
1设计要求 (3)
2步进电机原理 (3)
2.1步进电机工作方式
3
2.2框图设计
5
2.3知识点
6
3硬件设计 (6)
3.1电路原理
6
3.2驱动电路
7
3.3晶振电路
7
3.4总体电路图
8
4软件设计 (8)
4.1程序流程图
8
4.2程序清单
10
5遇到的问题及解决方案 (10)
5.1问题
10
5.2解决方法
10
参考文献 (10)
设计心得体会 (11)
附录一.原器件清单 (12)
附录二.Proteus 仿真图 (14)
附录三.ULN2003作用及引脚介绍 (15)
附录四.程序清单 (17)
基于AT89C51单片机步进电机控制
摘要:步进电机是机电一体化的关键产品之一,被广泛应用在各种自动化控制系统中。
由于其精度高、体积小、控制方便灵活,因此在智能仪表和位置控制中得到了广泛的应用。
大规模集成电路的发展以及单片机技术的迅速普及,为设计功能强,价格低的步进电机控制驱动器提供了先进的技术和充足的资源。
关键词:步进电机单片机控制
1设计要求
(1)最小系统:选择AT89C51单片机为核心元件构成系统。
有时钟产生电路和复位电路。
(2)控制电路:C语言编程控制。
由操作者根据相应的工作需要进行操作。
(3)驱动部分:对单片机输出的脉冲进行功率放大,从而驱动电机转动.
(4)主要功能:实现步进电机的正转,反转,加速,停转。
2步进电机原理
2.1步进电机工作方式
由于步进电机是一种将电脉冲信号转换成直线或角位移的执行元件,它不能直接接到交直流电源上,而必须使用专业设备----步进电机控制驱动器,典型步进电机控制系统如图1所示
控制器可以发出脉冲频率从几赫兹到几千赫兹可以连续变化的脉冲信号,它为环形分配器提供脉冲序列,环形分配器的主要功能是把来自控制环节的脉冲序列按一定的规律分配后,经过功率放大器的放大加到步进电机驱动电源的各项输入端,以驱动步进电机的转动,环形分配器主要有两大类:一类是用计算机软件设计的方法实现环形分配器要求的功能,通常称软环形分配器。
另一类是用硬件构成的环形分配器,通常称硬环形分配器。
功率放大器主要对环形分配器的较小输出信号进行放大,以达到驱动步进电机的目的,步进电机的基本控制包括转向控制和速度控制两个方面。
从结构上看,步进电机分为三相单三拍、三相双三拍和三相六拍3种,其基本原理如下:
(1)换相顺序的控制通电换相这一过程称为脉冲分配。
例如,三相步进电机在单三拍的工作方式下,其各相通电顺序为A→B→C→A,通电控制脉冲必须严格按照这一顺序分别控制A、B、C相的通断。
三相双三拍的通电顺序为AB→BC→CA→AB,三相六拍的通电顺序为A →AB→B→BC→C→CA→A。
(2)步进电机的换向控制如果给定工作方式正序换相通电,步进电机正转。
若步进电机的励磁方式为三相六拍,即A→AB→B→BC→C→CA→A。
如果按反序通电换相,即A→AC→C →CB→B→BA→A,则电机就反转。
其他方式情况类似。
(3)步进电机的速度控制如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。
两个脉冲的间隔越短,步进电机就转得越快。
调整送给步进电机的脉冲频率,就可以对步进电机进行调试。
(4)步进电机的起停控制步进电机由于其电气特性,运转时会有步进感。
为了使电机转
动平滑,减小振动,可在步进电机控制脉冲的上升沿和下降沿采用细分的梯形波,可以减小
步进电机的步进角,跳过电机运行的平稳性。
在步进电机停转时,为了防止因惯性而使电机
轴产生顺滑,则需采用合适的锁定波形,产生锁定磁力矩,锁定步进电机的转轴,使步进电
机转轴不能自由转动。
(5)步进电机的加减速控制在控制系统中,通过实验发现,如果信号变化太快,步进电
机由于惯性跟不上电信号的变化,这时就会产生堵转和失步象。
所有步进电机在启动时,必
须有加速过程,在停止时波形有减速过程。
理想的加速曲线一般为指数曲线,步进电机整个
降速过程频率变化规律是整个加速过程频率变化规律的逆过程。
选定的曲线比较符合步进电
机升降过程的运行规律,能充分利用步进电机的有效转矩,快速响应性好,缩短了升降速的
时间,并可防止失步和过冲现象。
实际的控制系统中,根据负载的情况来选择步进电机。
步
进电机能响应不失步的最高步进频率称为“启动频率”,于此类似“停止频率”是指系统控
制信号突然关断,步进电机不冲过目标位置的最高步进频率。
电机的启动频率、停止频率和
输出转矩都要和负载的转动惯量相适应,有了这些数据,才能有效地对电机进行加减速控制。
加速过程有突然施加的脉冲启动频率f0。
步进电机的最高启动频率(突跳频率)一般为
0.1KHz 到3~4KHz ,而最高运行频率则可以达到N*102KHz ,以超过最高启动频率的频率直接
启动,会产生堵转和失步的现象。
2.2 框图设计
根据C51芯片的工作方式设计总体设计方框图如图 2 所示。
控制信号
内部时钟 XTAL
RST
复位
键盘 电
P2.0~P2.6 P1.0~P1.3
P0.0~P0.6
AT89C51
图2总体设计方框图
2.3知识点
●本项目需要通过学习和查阅资料,掌握和了解如下知识点:
●+5V电源原理及设计
●单片机复位电路工作原理及设计
●单片机晶振电路工作原理及设计
●ULN2003大电流驱动阵列
●AT89C51单片机引脚
●单片机汇编语言及程序设计
3硬件设计
本设计的硬件电路只要包括控制电路、最小系统、驱动电路三大部分。
最小系统只要是为了使单片机正常工作。
控制电路只要由开关和按键组成,由操作者根据相应的工作需要进行操作。
显示电路主要是为了显示电机的工作状态和转速。
驱动电路主要是对单片机输出的脉冲进行功率放大,从而驱动电机转动。
3.1电路原理
基于AT89C51单片机进电机速度控制原理如图3所示。
步进电机的驱动信号必须为脉冲信号,转动的速度和脉冲的频率成正比。
步进电机步进角为7.5度,一圈360度,需要48个脉冲完成。
A组线圈对应 P2.4
B组线圈对应 P2.5
C组线圈对应 P2.6
D组线圈对应 P2.7
正转次序: AB组--BC组--CD组--DA组 (即一个脉冲,正转 7.5 度)
3.2驱动电路
通过ULN2003构成比较多的驱动电路,电路图如图3所示。
通过单片机的P1.0~P1.3输出脉冲到ULN2003的1B~4B口,经信号放大后从1C~4C口分别输出到电机的A、B、C、D相。
图3步进电机驱动电路
3.3晶振电路
晶振电路如图4所示:
图4晶振电路
3.4总体电路图
把各个部分的电路图组合成总电路图,如图 5所示。
图5总体电路图
4软件设计
4.1程序流程图
程序分主程序和中断程序,采用C语言编程,计时采用延时程序。
步进电机从静止到高速转动需要一个加速的过程,否则电机很容易被“卡住”。
在此程序中,当转速参数speedlevel为2时,可以算出,此时步进电机的转速为1500RPM,而当转速参数speedlevel 1时,转速为3000RPM。
当步进电机停止,如果直接将speedlevel 设为1,此时步进电机将被“卡住”,而如果先把speedlevel 设为2,让电机以1500RPM 的转速转起来,几秒种后,再把speedlevel 设为1,此时电机就能以3000RPM的转速高速转动,这就是“加速”的效果。
开始
延时去抖动
初始化
改变转速
是是停转
转速计数≠1 改变转向
反转
是
改变转速
记录当前步进,等待再次输入
停转
否
否
4.2程序清单
程序清单见附录。
5遇到的问题及解决方案
5.1问题
(1).焊接的线路有问题
(2).电动机不转
(3).要求正转出现发转
5.2解决方法
(1)检查电路并重新焊接。
(2)ULN2003的驱动直接用单片机系统的5V电压,可能力矩不够大,加大驱动电压到12V。
(3)ABCD接线反向。
参考文献
[1] 周向红. 51系列单片机应用与实践教程[M]. 北京:北京航空航天大学出版社,2008.
[2] 马淑华,王凤文,张美金.单片机原理与接口技术[M].北京:北京邮电大学出版社,2007.
[3] 张靖武,周灵彬.单片机系统的PROTEUS设计与仿真[M].北京:电子工业出版社,2007.
[4] 杨居义,杨尧,王益斌,杨晓琴. 单片机课程设计指导 [M]. 清华大学出版社.2009.
[5] 匿名.ULN2003.[DB/OL]./view/1584257.htm,2013.
设计心得体会
设计通过分析步进电机结构、工作原理,查阅步进电机控制系统的相关科技文献,遵循实用、简单、可靠和低成本的原则,设计了一种既可用于精度要求不高,但控制需完备的场合。
对本次设计,有以下结论:
采用单片机为控制核心,利用其强大的功能,把计算机与集成电路有机的结合起来,组成一个操作方便、交互性强的控制系统。
而且整个系统所包含的技术几乎包括了现本科学校控制专业所要求的知识,有利于实践教学取得最大效果。
系统软件采用结构化设计,具有易维护性,根据用户新的要求,对软件系统进行少量的修改,使系统功能得到一定程度的提高。
课程设计过程中,用到了大量的理论知识,我们通过查资料、上网搜索来获取。
这样我们不仅复习了课本上的基本理论知识,也学到了很多新的知识,通过设计,使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。
本人深知该课程还不够好,由于软件和硬件的各方面原因,系统的应用讨论不够,精度还有待于进一步提高。
可以肯定,随着技术的不断发展,步进电机的控制应用前景将越来越宽阔,而其控制系统也将向着智能化和网络化的方向发展。
本课程设计的研究和探讨还远远不够,还要在现在的基础上,不断吸取新的技术和方法,进一步深化研究深度,争取有更多的收获。
附录一.原器件清单
元件名称型号数量用途单片机AT89C51 1 控制核心步进电机- 1 实验核心驱动器UNL2003 1 放大信号电源Vcc 5V/12V 1/1 提供电源电容30pF 2 晶振电路电解电容20μF 1 复位电路按键- 1 控制开关电阻1KΩ 1 保护电路
附录二.Proteus 仿真图
附录三.ULN2003作用及引脚介绍
UNL2003[5]
作用:ULN2003是大电流驱动阵列,多用于控制电路中,可直接驱动继电器等负载。
引脚1:CPU脉冲输入端,端口对应一个信号输出端。
引脚2:CPU脉冲输入端。
引脚3:CPU脉冲输入端。
引脚4:CPU脉冲输入端。
引脚5:CPU脉冲输入端。
引脚6:CPU脉冲输入端。
引脚7:CPU脉冲输入端。
引脚8:接地。
引脚9:集电极对地接通。
引脚10:脉冲信号输出端,对应7脚信号输入端。
引脚11:脉冲信号输出端,对应6脚信号输入端。
引脚12:脉冲信号输出端,对应5脚信号输入端。
引脚13:脉冲信号输出端,对应4脚信号输入端。
引脚14:脉冲信号输出端,对应3脚信号输入端。
引脚15:脉冲信号输出端,对应2脚信号输入端。
引脚16:脉冲信号输出端,对应1脚信号输入端。
附录四.程序清单
基于AT89C51单片机步进电机速度控制程序清单如下:
程序中,步进电机的运转控制放在时间中断函数之中,这样主函数就能很方便的加入其它任务的执行,而对步进电机的运转不产生影响。
在此程序中,不但实现了步进电机的转速和转向的控制,另外还加了一个停止的功能,以防损坏步进电机甚至烧毁系统。
#include <AT89X51.h>
static unsigned int count; //计数
static int step_index; //步进索引数
static bit turn; //步进电机转动方向
static bit stop_flag; //步进电机停止标志
static int speedlevel; //步进电机转速参数
static int spcount; //步进电机转速参数计数
void delay(unsigned int endcount); //延时函数
void gorun(); //步进电机控制步进函数
void main(void)
{
count = 0;
step_index = 0;
spcount = 0;
stop_flag = 0;
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
EA = 1; //打开CPU中断
TMOD = 0x11; //设定时器0和1为模式1
ET0 = 1; //打开定时器0中断
TH0 = 0xFE;
TL0 = 0x0C; //设定时中断
TR0 = 1; //开始计数
turn = 0;
speedlevel = 2;
delay(10000);
speedlevel = 1;
do{
speedlevel = 2;
delay(10000);
speedlevel = 1;
delay(10000);
stop_flag=1;
delay(10000);
stop_flag=0;
}while(1);
}
void timeint(void) interrupt 1 {
TH0=0xFE;
TL0=0x0C; //设定时中断
count++;
spcount--;
if(spcount<=0)
{
spcount = speedlevel;
gorun();
}
}
void delay(unsigned int endcount) {
count=0;
do{}while(count<endcount);
}
void gorun()
{ if (stop_flag==1)
{
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
return;
}
switch(step_index)
{
case 0: //0
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
break;
case 1: //0、1
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 2: //1
P1_0 = 0;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 3: //1、2 P1_0 = 0;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
break;
case 4: //2
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 0;
break;
case 5: //2、3 P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 1;
break;
case 6: //3
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
break;
case 7: //3、0 P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
}
if (turn==0)
{
step_index++;
if (step_index>7) step_index=0; }
else
{
step_index--;
if (step_index<0) step_index=7; }
}。