三相步进电机控制系统的课程设计说明书.docx
《三相步进电机控制系统的课程设计说明书.docx》由会员分享,可在线阅读,更多相关《三相步进电机控制系统的课程设计说明书.docx(19页珍藏版)》请在冰豆网上搜索。
三相步进电机控制系统的课程设计说明书
学号:
11
课程设计
题目
三相步进电机控制系统的设计
学院
自动化学院
专业
自动化专业
班级
自动化1201班
姓名
廖明黎
指导教师
石云
2015
年
5
月
20
日
课程设计任务书
学生:
廖明黎专业班级:
自动化1201班
指导教师:
石云工作单位:
自动化学院
题目:
三相步进电机控制系统的设计
初始条件:
设计三相步进电机控制系统,要求系统具有如下功能:
用K0-K2做为通电方式选择键,K0为三相单三拍,K1为三相双三拍,K2为三相六拍;K3为启动/停止控制、K4方向控制、K5加速、K6减速;用4位LED显示工作步数。
用3个发光二极管显示状态:
正转时黄灯亮,反转时绿灯亮,不转时红灯亮。
要求完成的主要任务:
1.硬件设计:
系统原理图
2.软件设计:
系统总体流程图、步进电机单三拍,双三拍,三相六拍各模块流程图、显示模块流程图等
3.编写程序:
能够完成上述任务并用仿真软件演示
4.完成符合要求的设计说明书
时间安排:
2015年4月28日~2015年5月29日
1概述6
2设计思路7
2.1步进电机的驱动7
2.2LED显示步数7
2.3按键状态的读取7
2.4控制系统的整体框图8
3系统的硬件设计9
3.1总体的硬件设计9
3.2步进电机控制电路10
3.3八段数码管显示电路11
3.4启/停控制、正/反转控制、工作模式控制电路11
3.5发光二极管显示电路13
4系统的软件设计14
4.1系统总体流程图14
4.2三相步进电机模块流程图16
4.3显示模块流程图16
5系统仿真18
6小结与体会20
参考文献21
附录22
三相步进电机控制系统的设计
1概述
本次计算机控制技术课程设计的题目是:
三相步进电机控制系统的设计。
本次课程设计使用89C51单片机作为主控芯片,利用ULN2003A集成电路作为三相步进电机的驱动电路,采用单极性驱动方式,使三相步进电机能在
(1)三相单三拍,
(2)三相双三拍,(3)三相六拍三种工作方式下正常工作;能实现的功能有:
启动/停止控制、方向控制;快速控制、慢速控制;用4位LED数码管显示工作步数。
用3个发光二极管显示状态:
正转时黄灯亮,反转时绿灯亮,不转时红灯亮。
本次课程设计采用89C51单片机作为主控芯片,程序采用C语言来编写,驱动电路采用ULN2003A集成电路,显示器采用7SEG-MPX4-CA,即四位共阳二极管显示器,P0接段码,P2的4位IO口接位选码。
用三个发光二极管显示电路的转动状况,黄灯指示正转,绿灯指示反转,红灯指示不转。
采用Proteus软件进行仿真。
在KeiluVsuon4编程环境下编程和编译生成HEX文件,导入到89C51单片机,实现对各个模块的控制,实现我们所需要的功能。
本次设计的方案电路结构比较简单,设计思路很清晰清晰,用Proteus软件进行联调仿真,结果比较直观。
在这次课程设计学习中我学到了很多知识,知道了三相步进电机控制系统的组成以及怎样用89C51单片机去控制它,这对我在课堂所学的计算机控制技术知识是个巩固和加强,让我把课堂所学的理论知识真实的用到实践中,亲自动手,增强了我的动手设计能力,对自己将来的学习和工作发展起到了很好的作用。
2设计思路
2.1步进电机的驱动
若使用功率三极管等电子器件搭建成功率驱动电路来驱动电机的运行。
优点是使用电子器件联接,电路比较简单,但容易受干扰,信号不够稳定,缺点是器件较大而不便电路的集成,使用时很不方便,联接时容易出错误。
而相对于使用专门的电机驱动芯片ULN2003A来驱动电机运行。
优点是便于电路的集成,且驱动电路简单,驱动信号很稳定,不易受外界环境的干扰。
因而设计的三相步进电机控制系统性能更好。
故选择使用ULN2003A电机驱动芯片来作为驱动。
2.2LED显示步数
把所需要显示的数据通过专用的七段显示译码器的转换输出给LED显示屏。
优点是输出比较简单,可以简化程序,但增加了芯片的费用,电路也比较复杂。
可以通过软件把所要的数据转化为七段显示的数据,直接通过单片机接口连接7SEG-MPX4-CA四位共阳二极管显示器来显示,尽管软件编写的负担,但大大简化了电路。
故使用软件编写来输出显示信号。
2.3按键状态的读取
按键的读取有中断与查询两种方式。
这里选择直接把开关分别接在单片机的接口上,通过查询端口信号来动作。
使程序得到简化,可读性加强。
2.4控制系统的整体框图
图2-1为系统总体设计整体框图,由单片机89C51、ULN2003A驱动芯片、三相步进电机、7段LED数码管、7个按键开关、3个led等一些电路模块组成。
89C51单片机
LED显示步数模块
开关选择电机工作模式
LED显示灯显示电机工作状态
三相步进电机驱动模块
图2-1控制系统总框图
3系统的硬件设计
3.1总体的硬件设计
设计一个单片机三相步进电机控制系统要求系统具有如下功能:
(1)用K0-K2做为通电方式选择键,K0为单三拍,K1为双三拍,K2为三相六拍;
(2)K3、K4分别为启动和方向控制;
(3)K5、K6分别为加速和减速控制;
(4)正转时黄色指示灯亮,反转时绿色指示灯亮,不转时红色指示灯亮;
(5)用4位LED显示工作步数。
根据设计要求用PROTEUS所做的系统原理图如图3-1所示:
图3-1系统原理图
3.2步进电机控制电路
将89C51的P1.0-P1.3作为步进电机的输出控制口。
通过芯片ULN2003A的功率放大,驱动步进电机。
电路图如图3-2所示:
图3-2步进电机控制电路图
3.3八段数码管显示电路
由89C51的P0口取出显示码,从89C51的P2.0-P2.3输出位选码,设计中我们主要用到4位显示步数即可。
电路图图如图3-3所示:
图3-3八段数码管显示电路图
3.4启/停控制、正/反转控制、工作模式控制电路
(1)K0-K2为工作模式控制开关,KO接电时,为步进电机单三拍工作模式;K1接电时,为步进电机双三拍工作模式;K2接电时,步进电机工作模式为三相六拍。
(2)K3为启动/停止控制开关,控制整个系统的开启和关闭。
(3)K4为正转/反转控制开关,控制步进电机的转向。
(4)K5为加速控制、K6为减速控制。
电路图如图3-4所示:
图3-4按键控制电路图
3.5发光二极管显示电路
用3个不同颜色的发光二极管来作为指示灯显示,将P1.7接黄灯,P1.6接绿灯,P3.3接红灯,正转时黄色指示灯亮,反转时绿色指示灯亮,不转时红色指示灯亮。
电路图如图3-5所示:
图3-5发光二极管显示电路图
4系统的软件设计
4.1系统总体流程图
首先以查询的方式,从P3口读出开关状态,判断是否启动,没启动红灯亮同时黄绿灯灭,重新确认启动。
启动后再次读取P3口数据,依次判断工作方式,并将对应的用来存储步进电机工作方式字的数组首地址值给q。
再判断速度方式,通过对P3.5、P3.6的询问,确定是加速还是减速。
由P3.4口的双向开关来控制步进电机的正反转,如果是正转则黄灯亮绿灯灭,反转则绿灯亮黄灯灭。
在电机每走一步后,步数记数加1,然后通过LED显示把工作步数显示出来。
再从P3口把状态信息读出来,与之前的P3口的状态信息进行比较。
如果状态信息没有改变,电机继续运行。
如果状态信息改变了,就需要重新返回程序的开端,对电机的运行状态进行判断,让电机重新以新的状态运行。
由此,开关的状态在电机每走一步都会查询一遍,做到实时地反映。
系统总体流程图如图4-1所示:
开始
启/停按键K3按下?
步数清零,数码管输出0,红色显示灯亮
判断工作方式
q存储方式字地址指针
正/反转按键K4按下?
正转,黄灯亮
反转,绿灯亮
红灯亮
方式1?
方式2?
方式3?
P1口输出控制模型
模型地址加1,总步数加1
显示总步数
P3口状态是否改变?
重新启动
N
N
N
N
N
Y
Y
Y
Y
图4-1系统总体流程图
4.2三相步进电机模块流程图
对于步进电机模块的程序设计采用循环程序设计方法。
先把正反转向的控制模型存放在存单元中,然后再逐一从单元中取出控制模块并输出。
首先启动,选择步进电机的拍数,输入步数,然后读入正反转的控制模型驱动步进电机转动。
三相步进电机的流程图如图4-2所示:
分模块入口
P3.0=1?
P3.1=1?
P3.2=1?
不输出任何信号
分模块出口
选择三相六拍控制字序列输出
选择双三拍控制字序列输出
选择单三拍控制字序列输出
N
N
N
Y
Y
Y
图4-2步进电机模块流程图
4.3显示模块流程图
显示模块是用4位八段数码管来显示工作步数。
先将显示码存入数组中,指向最左边一位,然后取出要显示的数据,指向换码表首地址,取出显示码,从P0口输出显示码,P2口输入位选码,显示出4位工作步数,最后修改数组地址,求下一位位选码继续显示。
动态显示步数子程序
取出要显示的步数
求待显示数据
送位选码到P2口
取出显示码,并从P0口输出显示码
延时
4位显示完?
返回主程序
求下一位选码
N
Y
如图4-3所示:
图4-3显示模块流程图
5系统仿真
图5-1为步进电机工作在三相单三拍,此时K0,K3接高电平,K1,K2接低电平启动;图5-2为步进电机工作在三相双三拍,此时K1,K3接高电平,K0,K2接低电平;图5-3为步进电机工作在三相六拍,此时K0,K1接低电平,K2,K3接高电平;若K4接高电平则反转,低电平则正转;若K5接高电平K6接低电平速度快,K5接低电平K6接高电平速度慢。
这三种工作方式工作不同,三相单三拍时,通电顺序为A-B-C-A;三相双三拍时,通电顺序为AB-BC-CA-AB;三相六拍时,通电顺序为A-AB-B-BC-C-CA-A;以上通电方式是三种工作方式正转的情况,若要反转,则通电方式K4反过来即可。
图5-1步进电机工作在三相单三拍
图5-2步进电机工作在三相双三拍
图5-3步进电机工作在三相六拍
6小结与体会
经过这个学期对《计算机控制技术》这门课的学习,使我很大程度上对单片机的应用,对各种设备的控制,有了很多切身的感悟和掌握。
在一个星期的努力下,完成了本次课程设计的设计、仿真和撰写,不仅提高了我的动手实践能力、动脑思考的训练,还使我更灵活的学会使用Proteus这个仿真软件;同时在完成课程设计中更加熟练地掌握了三相步进电机控制系统的设计,及其工作原理,以及电路所用到一些芯片的工作状况,如89C51单片机芯片和ULN2003A驱动芯片以及7SEG-MPX4-CA四位共阳二极管显示器,熟悉了它们各自的特点和用途。
本次课程设计涉及到了计算机技术,自动控制技术,微机技术,数字电子技术等众多知识。
需要我们把各个学科之间的知识融合起来,形成一个整体。
这是我明白的学科的联系和知识的整体性。
这不仅提升了我的专业思维,更让我享受了一番知识的旅行。
参考文献
[1]于海生编著.《计算机控制技术》.:
机械工业.2005
[2]谭浩强编著.《C程序设计》(第三版).:
清华大学.2008
[3]虎、周佩琳编著.《微机原理与接口技术》.:
电子工业.2007.
[4]教瑜、曾勇编著.《单片机原理与应用》.:
理工大学.2008
[5]顶明亮、唐前辉编著.《51单片机应用设计与仿真:
基于keil与proteus》.
:
航空航天大学.2009
[6]徐安编著.《微型计算机控制技术》.:
科学.2005.
[7]立编著.《计算机控制与仿真技术》.:
中国水利水电.2006
[8]旭昀编著.《机电控制系统原理及工程应用》.:
机械工业.2006
[9]益强、长虹编著.《控制器件》.:
中国水利水电》.2005
附录
#include
voiddelay(void);
voiddisplay(int);
sbitP1_0=P1^0;
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_6=P1^6;
sbitP1_7=P1^7;
intbushu=0;
intcishu=5;
main()
{
chara,b,c,d,j,*q,
done1[8]={0x01,0x02,0x04,0x00,0x01,0x04,0x02,0x00},
done2[8]={0x03,0x06,0x05,0x00,0x03,0x05,0x06,0x00},
done3[14]={0x01,0x03,0x02,0x06,0x04,0x05,0x00,0x01,0x05,0x04,0x06,0x02,0x03,0x00};
L:
a=P3;
while(!
(a&0x08))//判断是否启动,若没启动则重新启动
{
P1_6=0;//红灯亮,黄绿灯灭
P1_7=0;
a=P3;
}
a=P3;//判断工作模式
if(a&0x01)q=done1;//方式1模型
if(a&0x02)q=done2;//方式2模型
if(a&0x04)q=done3;//方式3模型
if(a&0x20)cishu=5;//控制脉冲次数,即速度
if(a&0x40)cishu=50;
if(a&0x10)//判断电机是否要正转
{P1_6=1;//P3.4口为1,电机正转,绿灯亮
P1_7=0;
b=0;}
else
{P1_7=1;//P3.4口为0,电机反转,黄灯亮
P1_6=0;
if(a&0x04)b=7;
elseb=4;}
d=b;
while
(1)
{c=*(q+b);
if(c==0)b=d;//判断电机步数是否走完步数走完,电机重新再走
else
{
P1_0=c&0x01;
P1_1=c&0x02;
P1_2=c&0x04;//从P1输出电机控制信号
b++;
bushu++;//总步数加1
display(bushu);//显示步数
j=a;
a=P3;
if(a!
=j)//判断P3口状态信号是否改变
{if(!
(a&0x08))bushu=0;//若为停止信号,总步数清零,跳出循环
if(!
(a&0x10));//若为方向信号,跳出循环
gotoL;}//状态信号改变,返回到开始,重新对电机控制
}
}
}
voiddisplay(intn)
{
unsignedchartab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
unsignedchari,k,t,num[4];
num[0]=n%10;//将总步数的各位分别存在num数组中
num[1]=(n/10)%10;
num[2]=(n/100)%10;
num[3]=(n/1000)%10;
for(t=0;t{k=0x08;//位选码指向最左一位,第四位
for(i=0;i<4;i++)
{P2=k;//从P2口输入位选码
P0=~(tab[num[i]]);//取出显示码,并从P0口输出显示码
k=k>>1;//求下一个位选码
delay();
}
}
}
voiddelay()
{
inti,j;
for(i=0;i<20;i++)
for(j=0;j<30;j++);
}