单片机课程设计基于AT89S52单片机控制的步进电机.docx
《单片机课程设计基于AT89S52单片机控制的步进电机.docx》由会员分享,可在线阅读,更多相关《单片机课程设计基于AT89S52单片机控制的步进电机.docx(21页珍藏版)》请在冰豆网上搜索。
![单片机课程设计基于AT89S52单片机控制的步进电机.docx](https://file1.bdocx.com/fileroot1/2023-2/4/dc83a15b-621b-4fe9-9950-51e638a5da39/dc83a15b-621b-4fe9-9950-51e638a5da391.gif)
单片机课程设计基于AT89S52单片机控制的步进电机
单片机原理与应用课程设计
【项目名称】基于AT89S52单片机控制的步进电机
【指导教师】XXX
【班级】XXX
【学号】XXX
【姓名】XXX
一、项目概述
步进电机是一种将电脉冲转换成相应角位移或线位移的电磁机械装置,也是一种能把输出机械位移增量和输入数字脉冲对应的驱动器件。
步进电机具有快速启动、停止的能力,精度高,控制方便,因此,在工业上得到广泛应用。
二、项目要求
基于AT89C52单片机的控制步进电机正反转,具体要求如下:
1、开始通电时,停止位指示灯亮,步进电机停止工作。
2、单片机分别接有按键开关K1、K2、K3、K4、K5用来控制步进电机的转动,具体要求如下:
(1)K1为正转按钮。
当按下K1时,步进电机正转,同时正转指示灯亮。
(2)K2为反转按钮。
当按下K2时,步进电机反转,正转指示灯熄灭,同时反转指示灯亮。
(3)K4为加速按钮。
当步进电机处于正转或反转状态时,每按下一次加速按钮,步进电机将正转或反转加速一次,最高加速四次,达到最大速度后再按加速按钮步进电机的状态不再变化。
(4)K5为减速按钮。
当步进电机处于正转或反转状态时,每按下一次减速按钮,步进电机将正转或反转减速一次,最高减速四次,减到最小速度后再按减速按钮步进电机的状态不再变化。
(5)K3为步进电机停止按钮。
当按下K3时,步进电机将停止转动。
3、一位数码管用来显示步进电机当前速度的档位。
当步进电机开始转动或按下加速减速按钮开关后数码管都会显示相应数字,数码管显示的数字表示步进电机当前工作档位。
4、正传采用1相激磁方式,反转采用1~2相激磁方式。
三、知识要点
通过学习和查阅资料,本项目需要掌握如下知识:
1、+5电源原理设计,USB供电接口的连接。
2、单片机复位电路工作原理及设计。
3、按键电路的设计。
4、光隔离电路、驱动电路的原理及设计。
5、步进电机工作原理及控制设计。
6、AT89C52单片机引脚。
7、单片机控制步进电机C语言程序设计。
(一)AT89C52的资料
引脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,
被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部
必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口作为AT89C51的一些特殊功能口,管脚备选功能:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
(二)ULN2003资料
ULN2003的内部结构和功能:
ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。
它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTLCOMS,由达林顿管组成驱动电路。
ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE约1V左右,耐压BVCEO约为36V。
用户输出口的外接负载可根据以上参数估算。
采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。
通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。
ULN2003是一个非门电路,包含7个单元,但独每个单元驱动电流最大可达350mA.资料的最后有引用电路,9脚可以悬空。
比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。
ULN2003的作用:
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。
可直接驱动继电器等负载。
输入5VTTL电平,输出可达500mA/50V。
ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。
该电路的特点如下:
ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器。
ULN2003是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
ULN2003是高耐压、大电流、内部由七个硅NPN达林顿管组成的驱动芯片。
经常在以下电路中使用,作为:
1、显示驱动
2、继电器驱动
3、照明灯驱动
4、电磁阀驱动
5、伺服电机、步进电机驱动等电路中。
ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还可以在高负载电流并行运行。
ULN2003的封装采用DIP—16或SOP—16
ULN2003在各种控制电路中常用它作为驱动继电器的芯片,其芯片内部做了一个消线圈反电动势的二极管。
ULN2003的输出端允许通过IC电流200mA,饱和压降VCE约1V左右,耐压BVCEO约为36V。
输出电流大,故可以直接驱动继电器或固体继电器(SSR)等外接控制器件,也可直接驱动低压灯泡。
四、系统设计
(一)系统框图设计
图4-1基于AT89C52单片机的控制步进电机的控制框架
(二)说明
根据系统要求画出基于AT89C52单片机的控制步进电机的控制框架如图4-1所示。
系统主要包括单片机、晶振电路,电源电路、按键电路、步进电机及驱动电路几部分。
五、硬件设计
(一)电路原理图
根据图4-1,可以设计出单片机控制步进电机的硬件电路图,如4-2所示。
其他各部分器件及功能如下:
1、按键功能
单片机分别接有按键开关K1、K2、K3、K4、K5用来控制步进电机的转动,具体要求如下:
(1)K1为正转按钮。
当按下K1时,步进电机正转,同时正转指示灯亮。
(2)K2为反转按钮。
当按下K2时,步进电机反转,正转指示灯熄灭,同时反转指示灯亮。
(3)K4为加速按钮。
当步进电机处于正转或反转状态时,每按下一次加速按钮,步进电机将正转或反转加速一次,最高加速四次,达到最大速度后再按加速按钮步进电机的状态不再变化。
(4)K5为减速按钮。
当步进电机处于正转或反转状态时,每按下一次减速按钮,步进电机将正转或反转减速一次,最高减速四次,减到最小速度后再按减速按钮步进电机的状态不再变化。
(5)K3为步进电机停止按钮。
当按下K3时,步进电机将停止转动。
2、驱动电路
单片机的输出电流太小,不能直接与步进电机相连,需要增加驱动电路。
对于电流小于0.5A的步进电机,可以采用UL2003类的驱动IC。
ULN2003技术参数如下所示:
●最大输出电压:
50V。
●最大连续输出电流:
0.5A。
●最大连续输入电流:
25mA。
●功耗:
1W。
如图4-3所示为2001、2002、20030、2004系列驱动器引脚图,左侧1~7引脚为输出端,接单片机P1口的输出端,引脚8接地;右侧10~16引脚为输出端,接步进电机,引脚9接电源+5V,该驱动器可提供最高0.5A的电流。
正转采用1相激磁方式,反转采用1~2相激磁方式。
1~7为输入端10~16为输出端
8号引脚接地9号引脚接+5V电源
驱动器引脚图
(二)元件清单
AT89C52单片机控制步进电机系统元件清单如下表4-1所示。
表4-1单片机控制步进电机系统元件清单
六、软件设计
(一)程序流程图
程序设计流程图如图4-4所示,,主要包括键盘扫描模块、步进电机正反转切换模块、步进电机停止及指示灯模块。
(二)源程序
#include//开始,只正转,不反转,用flag做全局变量来控制转向
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#defineCLK_WISE0//顺时针方向转动
#defineINVERSE1//逆时针方向转动
bitdirection=CLK_WISE;/***方向标志,取值为CLK_WISE或INVERSE*/
staticuintspeedcount=0;//加速标志,越大转速越快,最大到4,然后回归到0,循环。
//程序中可以依据它来改变占空比
//ucharstep[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};//8个步
ucharstep4[]={0x01,0x02,0x04,0x08,0x01,0x02,0x04,0x08};/*一相激磁,一整步*/
ucharstep8[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};/*一、二相激磁,半步*/
ucharth_0[8]={0x5D,0x85,0x9E,0xAE,0xBA,0xC2,0xC9,0xCF};//8个定时器值,高8位
uchartl_0[8]={0x3D,0xEE,0x58,0x9E,0x3E,0xF7,0xBF,0x2C};//8个定时器值,低8位
ucharshuma[8]={0x3f,0x06,0x5b,0x4f,0x66};//0----4//,0x7f,0x66,0x6d,0x7d,0x07
intstep_i=0;//当前处于哪一步
sbitk1=P0^0;
sbitk2=P0^1;
sbitk3=P0^2;
sbitD1=P0^5;
sbitD2=P0^6;
sbitD3=P0^7;
ucharflag;
//intstep_i=0;
/***定时器t0***/
voidtime0(void)interrupt1using1//控制转向//方向反后,正转快于反转?
?
?
难道是一二相激磁的原因?
{
//P1=step4[step_i];//输出电机控制信号
if(flag==1)//顺时针转
{
P1=step4[step_i];//输出电机控制信号
TR0=1;
step_i++;
}
else
if(flag==2)//反时针转
{
P1=step8[step_i];//输出电机控制信号
TR0=1;
step_i++;
}
if(step_i>7)//顺时针到最后一步,需要调整到第一步
step_i=0;
if(step_i<0)//顺时针到第一步,需要调整到最后一步
step_i=7;
TH0=th_0[speedcount];//根据当前速度设定定时器初值
TL0=tl_0[speedcount];
}
/****速度标志*****/
voidint0_srv(void)interrupt0using0//外部中断0服务程序//加速与减速结果相反,调整后,减速最小后,电机停止运动,难道是因为我把TR0设置取消了?
{
if(INT0==0)//加速
{
//TR0=1;
while(!
INT0);
if(flag==1)
{
speedcount++;
if(speedcount>4)
{
speedcount=4;
}
}
if(flag==2)
{
speedcount++;
if(speedcount>4)
{
speedcount=4;
}
}//最大为7,然后从0开始循环//没次调速度,电机就会回到原来的位置,如果连续按加速,电机一直上下运动,因此把三句放到前面,值先调整变化,再改变速度
P2=shuma[speedcount];
TH0=th_0[speedcount];//根据当前速度设定定时器初值
TL0=tl_0[speedcount];
}
}
voidint1_srv(void)interrupt2using2//外部中断1服务程序
{
if(INT1==0)
{
//TR0=1;
while(!
INT1);
if(flag==1)
{
speedcount--;
if(speedcount<=0)
{
speedcount=0;
}
}
if(flag==2)
{
speedcount--;
if(speedcount<=0)
{
speedcount=0;
}
}
P2=shuma[speedcount];
TH0=th_0[speedcount];//根据当前速度设定定时器初值
TL0=tl_0[speedcount];
}
}
/*******加速********/
voidmain()
{
P2=0x00;
EA=1;
TMOD=0x01;
ET0=1;//定时器0初始化
//TR0=1;
EX0=1;
IT0=1;//外部中断0
EX1=1;
IT1=1;//外部中断1
TH0=th_0[0];
TL0=th_0[0];//定时器0初始值
D3=0;
while
(1)
{
if(k3==0)//停止位
{
P2=0x3f;
flag=0;
TR0=0;
D1=1;
D2=1;
D3=0;
speedcount=0;
}
if(k1==0)//正转
{
flag=1;
TR0=1;
D1=0;
D2=1;
D3=1;
}
if(k2==0)//反转
{
flag=2;
TR0=1;
D1=1;
D2=0;
D3=1;
}
}
}
(三)系统仿真及调试
1、硬件调试
硬件的调试主要是把电路各种参数调整到符合设计要求。
具体步骤如下:
(1)先检查排除硬件电路故障,包括设计性错误和工艺性障碍。
一般原则是先静态再动态
(2)利用万能板或逻辑测试仪器,检查电路中的各器件以及引脚是否连接正确,是否有短路故障。
(3)先要将AT89C52取下,对电路板进行通电检查,通过观察看是否有异常,然后用万能表测试各电源电压,若这些都没有问题,则接上仿真机进行联机调试观察各接口电路是否正常。
2、软件调试
软件调试是利用仿真工具如PROTUES等进行在线仿真调试,除发现和解决程序错误外,也可以发现硬件故障。
七、总结
(一)遇到的问题及其解决方法
1、硬件部分
(1)焊接过程中芯片底座某个引脚不慎弄断,不过整个电路设计中没有用到那个引脚,所以影响不大。
(2)有很多地方要接高电平或低电平,为了防止导线杂乱无章或方便检测电路,我将焊接电路板的上面固定一条接高电平的导线,在下面固定一条接低电平的导线,采用这种方式后,电路板上的导线布局比较合理美观了,电路性能检测也非常方便。
(3)连接用导线的绝缘皮非常薄,不耐高温,焊接时容易被电烙铁的高温熔化从而导致线路短路,为避免此问题,焊接时尽量少用纯金属丝,不是焊接点的地方均需要有绝缘皮包裹导线,同时注意焊接时的细节,不要将非焊接点的绝缘皮熔化了。
(4)焊接发光二极管时犯了一个低级错误,本来应该二极管的正极接高电平负极接I/O口的,全部搞成了正极接I/O口负极接低电平,后来又得修改,造成了不小的麻烦。
(5)完成设计作品后在使用过程中,发现数码管的某一段始终不能显示,即那一段始终是暗的,用万用表检查之后确定为焊接地方出现了技术上的问题,于是对症下药,对其重新焊接,将其他地方也进行了检测及巩固,之后产品性能总体效果不错。
2、软件部分
(1)开始的时候,步进电机只是振动,没有转动。
程序中通过控制TR0来控制步进电机的转动与否,所以要使开始的时候电机不转动,就要先缺少TR0=1这个条件。
(2)步进电机反转后,正转快于反转。
是一二相激磁的原因。
(3)加速与减速结果相反。
程序调整了speedcount--后,减速到最小速度后,如果再按减速键,电机停止运动,数码管显示一横。
(4)每次调速度,电机就会回到原来的位置,然后继续动,如果连续按加速键,电机一直左右摆动。
因此把三句放到前面,值先调整变化,再改变速度
(5)程序开始时,数码管显示8,不是预想的0。
在主程序里,先设置P2=0x00让数码管全黑,在循环里设置P2=0x3f显示0。
不过,还是一开始会闪一下8
(6)原本是加速8次,但步进电机显示不明显,所以就改为4次。
(7)减到0后,再按减速键,数码管显示一横和一竖。
(8)以正转加速为例,如果直接设K4=P3.2,在中断程序中,显示有错误。
所以,又设置了一个标志flag,当正转键按下时,flag=1,以flag=1为条件后,程序没有错。
(二)功能扩展
1、已经实现的扩展功能
(1)在控制正转、反转和停止的三个开关旁边增加了三个发光二极管(三个发光二极管分别由P0.5,P0.6和P0.7控制)用来显示步进电机当前工作状态,相应开关旁的灯亮则表示步进电机工作于当前状态。
(2)增加了一个加速(K4)和一个减速(K5)按钮开关(加速和减速开关分别P3.2和P3.3控制),按下加速或减速按钮步进电机则会变化到相应状态。
(3)在P2口接一位数码管用来显示当前速度的档位。
在单片机的P3.2(INT0)、P3.3(INT1)接入两个开关,分别为K4、K5,K4是用来加快单片机转速,K5是用来降低单片机转速,当按下加速或减速开关时,P2端口接的数码管显示当前速度的档位。
2、暂未实现的扩展功能预想
(1)增加一个三位的数码管用来显示步进电机当前档位及转速(XX转/分钟),数码管的第一位用来显示步进电机当前档位,后两位用来显示步进电机当前实际转速。
当加速或减速按钮开关被按下时,步进电机的档位和转速会发生相应变化,同时数码管上的数字也会发生相应变化来显示当前状态。
(2)增加一个蜂鸣器装置用来提醒用户操作。
步进电机的速度不会无限增大或减小,所以在使用说明上会说明产品可以达到的加速或减速次数,当达到最大或最小速度后,若用户继续按加速或减速按钮开关,则步进电机和数码管显示的状态不再发生变化,同时蜂鸣器会发出声音来提示用户当前操作无效或错误。