摘要
本设计详细介绍了基于单片机的三相步进电机控制系统。步进电机通过输入脉冲信号进行控制,即电机的总转动角度由输入脉冲总数决定,因此,单片机通过向步进电机发送控制信号就能实现对步进电机的控制。
单片机实现的步进电机控制系统具有成本低、使用灵活的特点,该系统采用80C51单片机作为主控芯片,来完成对步进电机转动及LED显示的控制。
本设计主要由单片机80C51,3相步进电机,7段数码管,及一些其他相关元件设计而成,分为按键选择工作状态模块、步进电机工作模块、LED二极管显示工作状态模块以及4位数码管显示步数模块。可以通过开关来控制系统的启/停工作,当系统运转时,用开关来控制方向,并使相应的指示灯亮起,同样由开关来选择工作模式。运转时,用4位7段数码管来输出步数。最后根据思路所设计出来的硬件图设计相适应的软件。
电路结构简单,设计思路清晰,同时利用Proteus进行联调仿真,结果比较直观。仿真结果收到了预期的效果。
1设计任务
(一)设计三相反应式步进电动机脉冲分配器,接收脉冲输入,要求三相单三拍、三相六拍运行方式控制(电平),正反转控制(电平)。
系统具有如下功能:用K0-K2做为通电方式选择键,K0为三相单三拍,K1为三相双三拍,K2为三相六拍;K3为启动/停止控制、K4方向控制;用4位LED数码管显示工作步数。用3个发光二极管显示状态:正转时红灯亮,反转时黄灯亮,不转时绿灯亮;
(二)任务分析
步进电动机是一种用电脉冲信号进行控制,并将电脉冲信号转换成相应的角位移的执行器,每一个脉冲信号可使步进电机旋转一个固定的角度,这个角度称为步距角。由于受脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比。
三相反应式步进电动机结构如图1.8所示。电机定子有六个磁极,相对的磁极为同一绕组励磁,整个电机有三个绕组,按Y形接法接线。转自为软磁材料,无绕组。若绕组通电顺序为Ⅰ-Ⅱ-Ⅲ-Ⅰ-Ⅱ-Ⅲ-…,则电动机逆时针转动;若绕组通电顺序为Ⅰ-Ⅲ-Ⅱ-Ⅰ-Ⅲ-Ⅱ-…,则电动机顺时针转动。此种控制方式称为三相单三拍方式。 若通电顺序为Ⅰ-ⅠⅡ-Ⅱ-ⅡⅢ-Ⅲ-ⅢⅠ-…(逆时针),称为三相六拍方式。
步进电机控制装置发出运行方式、旋转方向和旋转角度(步数),前两项一般由电平表示,后一项用脉冲个数表示。脉冲分配器根据步进电机控制装置发来的命令(电平信号和脉冲)使步进电机按照要求的工作方式、旋转方向及步数旋转。步进电机磁极的旋转有速率限制,如果过快,电动机会出现失步现象(转自跟不上磁极的旋转),特别是在电动机的起停阶段,要求有脉冲速率限制措施。
(三)系统硬件原理图
(四)系统软件设计
为防止输入脉冲频率过快导致电动机失步,可将输入脉冲在单片机缓存,之后在进行脉冲分配,分配时注意脉冲速率。脉冲输入模块在每个输入脉冲到来时,将缓存单元进行加1计数;脉冲分配模块时刻扫描缓存单元,当缓存单元不为零时,使步进电机旋转一步,之后缓存单元减1,减到0时停止分配脉冲。为使三相电平同时变化,程序中应予以考虑。非同步分配脉冲可能导致电机错转。
为使电动机以最快速度运行,脉冲分配速率应按照梯形曲线分配,如图1.10所示。图示的含义是:开始时(零转速)脉冲分配要慢,当电动机旋转起来后,脉冲速率逐渐加快,并达到最高速率;当要停止时,也不可马上停止,必须先降低脉冲速率,最后降到零,电动机停转。
图1.10 脉冲速率分配
2方案
2.1 设计思路与方案
本次设计是一个对于三相步进电机的控制系统,而单片机实现的步进电机控制系统具有成本低、使用灵活的特点,此系统选用51单片机即可。
根据要求整个设计大体可分为四块:
一是5个按键K0~K4将用户所需来选择步进电机的工作状态。我们将开关连入单片机的P1口,通过按键开关的高低电平状态来读入我们所需的控制信号。硬件上直接把开关分别接在单片机的接口上,通过查询端口信号来动作,将控制信号处理。在设计开关部分时,还考虑到机械抖动的影响,采取硬件方式—并联电容来去抖。
二是3个LED发光二极管的显示步进电机工作状态模块。在设计要求中步进电机正转是红灯亮,反转是黄灯亮,停止不转是绿灯亮。设计中将3个发光二极管分别接到单片机P3口,受到单片机的输出信号控制。
三是步进电机的工作模块。要想步进电机按照我们想要的方式运转,将步进电机一端接到+12V的电源,一端接到单片机P3口,受单片机的输出信号控制。
四是4位数码管显示步数的模块。设计中主要是利用软件编程的算法来实现步数的累计和显示,同样,4位数码管接到单片机的P0口和P2口受单片机输出信号的控制,在硬件上使用的是动态显示的接法。
由此可知所需要设计一个系统,可以通过不同按键来选择步进电机的工作方式,且有LED发光二极管来显示电机对应的工作状态,除此之外还能在数码管上显示出步进电机转动的步数。
2.2总体设计框图
此系统主要由单片机、步进电机、步数显示模块、工作状态控制与显示模块组成。整体框图如图1。
图1 系统整体框图
3系统实现的原理说明3.1 步进电机控制工作原理3.1.1步进电机的工作原理
步进电机的不同驱动方式,都是在工作时,脉冲信号按一定顺序轮流加到三相绕组上,从而实现不同的工作状态。由于通电顺序不同,其运行方式有三相单三相拍、三相双三拍和三相单、双六拍三种(注意:上面“三相单三拍”中的“三相”指定子有三相绕组;“拍”是指定子绕组改变一次通电方式;“三拍”表示通电三次完成一个循环。“三相双三拍”中的“双”是指同时有两相绕组通电)。
1.2.1三相单三拍运行方式:下页图所示为反应式步进电动机工作原理图,若通过脉冲分配器输出的第一个脉冲使A相绕组通电,B,C相绕组不通电,在A相绕组通电后产生的磁场将使转子 上产生反应转矩,转子的1、3齿将与定子磁极对齐,如果图(a)所示。第二个脉冲到来,使B相绕组通电,而A、C相绕组不通电;B相绕组产生的磁场将 使转子的2、4齿与B相磁极对齐,如图(b)所示,与图(a)相比,转子逆时针方向转动了一个角度。第三个脉冲到来后,是C相绕组通电,而 A、B相不通电,这时转子的1、3齿会与C组对齐,转子的位置如图(c)所示,与图(b)比较,又逆时针转过了一个角度。
图1.1 反应式步进电机工作原理图
当脉冲不断到来时,通过分配器使定子的绕组按着A相--B相--C相--A相……的规律不断地接通与断开,这时步进电动机的转子就连续不停地一步步的逆时 针方向转动。如果改变步进电动机的转动方向,只要将定子各绕组通电的顺序改为A相--C相--B相--A相,转子转动方向即改为顺时针方向。
单三拍分配方式时,步进电动机由A相通电转换到B相通电,步进电动机的转子转过一个角度,称为一步。这时转子转过的角度是30度。步进电动机每一步转过的角度称为步距角。
1.2.2
三相双三拍运行方式三相双三拍运行方式:每次都有两个绕组通电,通电方式是AB--BC--CA--AB……,如果通电顺序改为AB--CA--BC--AB……则步进电机反转。双三拍分配方式时,步进电动机的步距角也是30度
1.2.3三相单,双六拍运行方式:三相六拍分配方式就是每个周期内有六个通电状态。这六中通电状态的顺序可以使A--AB--B--BC--C--CA--A……或者A-- CA--C--BC--B--AB--A……六拍通电方式中,有一个时刻两个绕组同时通电,这时转子齿的位置将位于通电的两相的中间位置。在三相六拍分配 方式下,转子每一步转过的角度只是三相三拍方式下的一半,步距角是15度。
单三拍运行的突出问题是每次只有一相绕组通电,在转换过程中,一相绕组断电,另一相绕组通电,容易发生失步;另外单靠一相绕组通电吸引转子,稳定性不好,容易在平衡位置附近震荡,故用的较少。
双三拍运行的特点是每次都有两相绕组通电,且在转换过程中始终有一相绕组保持通电状态,因此工作稳定,且步距角与单三拍相同。
六拍运行方式转换时始终有一相绕组通电,且步距角较小,故工作稳定性好,但电源较复杂,实际应用较多。
3.1.2 步进电机的启停控制
步进电机由于其电气特性,运转时会有步进感 ,即振动感。为了使电机转动平滑 ,减小振动 ,可在步进电机控制脉冲的上升沿和下降沿采用细分的梯形波 ,可以减小步进电机的步进角 ,提高电机运行的平稳性。在步进电机停转时 ,为了防止因惯性而使电机轴产生顺滑 ,则需采用合适的锁定波形 ,产生锁定磁力矩 ,锁定步进电机的转轴 ,使步进电机的转轴不能自由转动。
3.1.3 步进电机的转向控制
如果给定工作方式正序换相通电 ,步进电机正转。若步进电机的励磁方式为三相六拍 ,即 A-AB-B-BC-C-CA。如果按反序通电换相 ,即则电机就反转。其他方式情况类似。
3.2步数显示模块原理
步数显示模块和工作状态显示模块,都是通过单片机输出信号控制发光二极管LED的亮灭。其中步数显示模块中LED构成数码管,要求显示4位十进制数,故用到4位数码管。要控制多位的显示电路,需要有字段控制和字位控制。控制方式分为静态显示方式和动态显示方式。静态显示方式,每一位的显示器都需要配一个8位输出口来输出该字位的七段码,需要片外扩展输出口。而动态显示方式将各数码管的对应字段的引脚都并联在一起,线路简单,减少接口,不需片外扩展。这里选用动态显示方式。
4硬件设计4.1系统总原理图
图3 系统总原理图
根据设计要求用PROTEUS所做的硬件连线图如图3。
4.2各部分硬件原理图设计4.2.1 单片机控制模块
单片机选用最经典的80C51,其4个I/O口都要用到, P3接步进电机驱动电路及工作状态显示模块,P0和P2分别接步数显示中对数码管的字段控制及数码管片选,P1接工作状态控制电路,,时钟用内部方式需外接晶体振荡器。硬件图如图4所示。
图4 单片机模块原理图
此设计中接的是12MHZ的晶振,故一个机器周期为1/12us。根据经验数据,与晶振一起的两个电容设为15PF。单片机的VCC和GROUD都隐藏了,已自动接好,VCC应设为+5V。
4.2.2按键选择工作状态模块
首先我们来考虑所有机械触点式按键在状态输出时的共性问题就是按键抖动问题,由于机械触点的弹性振动,按键在按下时不会马上稳定地接通而在弹起时也不能一下子完全地断开,因而在按键闭合和断开的瞬间均会出现一连串的抖动,这称为按键的抖动干扰。
这种抖动可能会造成按一次键产生的开关状态被CPU误读几次。为了使CPU能正确地读取按键状态,本次设计中我们采用并联电容消抖法,利用电容的放电延时来实现。
如图5所示,这是唯一的一块输入模块的设计。5个按键开关一端通过电阻接高电平,另一端全部接到地,其中接高电平的一端对应也接到单片机的P1口分别为P1.0~P1.4。当开关断开,就是输入到单片机对应端口高电平,而开关闭合,是使端口接地,输入低电平。所以这个设计中开关断开时才是有效的。各按键功能:
(1)K0-K2为工作模式控制开关,KO接电时,为步进电机单三拍工作模式;K1接电时,为步进电机双三拍工作模式;K2接电时,步进电机工作模式为三相六拍。
(2)K3为启/停控制开关,控制整个系统的开启和关闭。
(3)K4为正/反转控制开关,控制步进电机的转向。
图5 按键模块原理图
4.2.3步进电机工作模块
将三相步进电机三个端口直接接到单片机P3.0~P3.2即可,另三个端口接到+12V的高电平给步进电机供电。只需在软件编写上控制算法便可以调节这三个端口的高低电平来控制步进电机的开启与停止,正反转以及工作模式。步进电机硬件接线图如图6所示。
图6 步进电机模块原理图
4.2.4工作状态显示模块
LED发光二极管显示步进电机的工作状态,它们分别接到单片机的P3.3~P3.5。如图7,让单片机输出通过一个反相器再接到LED阴极,LED阳极接VCC。这样可以提高电流,有利于二极管的导通,我们可以通过控制P3口的数据,实现LED的亮灭。
图7 工作状态显示模块原理图
4.2.5 4位数码管显示步数模块
LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。通过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
P0口和P2口的前四个分别接步数显示中对数码管的字段控制及数码管片选,如图8所示,这里主要是由软件算法来实现单片机输出的控制。
图8 数码管显示模块原理图
5软件设计5.1系统总体设计
图9 系统总流程图
设计说明:首先是数码管显示清零,单片机再读入P1口输入的按键状态,先判断是否启动,如果没有启动则是绿灯亮并再判断,如果启动了,就接着判断所需的电机工作模式,再读入P1口状态判断电机的转向,输出控制信号为正转红灯亮,反转黄灯亮,由此可以让步进电机按照指定的方式运转,并且累计步数再显示到数码管上。最后检验P1口是否状态改变,如果改变则步数清零重新开始判断,不改变则继续转动。
5.2步进电机工作模块5.2.1步进电机的工作方式说明
(1)三相单三拍工作方式
在这种工作方式下,A、B、C三相轮流通电,电流切换三次,磁场旋转一周,转子向前转过一个齿距角。因此这种通电方式叫做三相单三拍工作方式。这时步距角(度)为:
式中:m──定子相数; z ──转子齿数
表1 单三拍的相位控制
步序
控制位
工作
状态
控制
模型
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
C相
P1.1
B相
P1.0
A相
1
0
0
0
0
0
0
0
1
A
01H
2
0
0
0
0
0
0
1
0
B
02H
3
0
0
0
0
0
1
0
0
C
04H
(2)三相双三拍工作方式
这种工作方式每次都是有两相导通,两相绕组处在相同电压之下,以AB─BC─CA─AB (或反之)方式通电,故称为双三拍工作方式。以这种方式通电,转子齿所处的位置相当于六拍控制方式中去掉单三拍后的三个位置。它的步距角计算公式与单三拍时的公式相同。
表2 双三拍的相位控制
步序
控制位
工作
状态
控制
模型
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
C相
P1.1
B相
P1.0
A相
1
0
0
0
0
0
0
1
1
AB
03H
2
0
0
0
0
0
1
1
0
BC
06H
3
0
0
0
0
0
1
0
1
CA
05H
(3)三相六拍工作方式
在这种工作方式下,绕组以A—AB—B—BC—C—CA—A时序(或反时序)转换6次,磁场旋转一周,转子前进一个齿距,每次切换均使转子转动1. 5°,故这种通电方式称为三相六柏工作方式。其步距角为:
表3 六拍的数学模型
步序
控制位
工作
状态
控制
模型
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
C相
P1.1
B相
P1.0
A相
1
0
0
0
0
0
0
0
1
A
01H
2
0
0
0
0
0
0
1
1
AB
03H
3
0
0
0
0
0
0
1
0
B
02H
4
0
0
0
0
0
1
1
0
BC
06H
5
0
0
0
0
0
1
0
0
C
04H
6
0
0
0
0
0
1
0
1
CA
05H
5.2.2设计说明及流程图
设计说明:在此设计中,采用的是三相步进电机,对于步进电机模块的程序设计采用循环程序设计方法。先把正反转向的控制模型存放在内存单元中,然后再逐一从单元中取出控制模块并输出。首先启动,通过P1口读入所需的工作方式,即选择步进电机的拍数,然后读入正反转的控制,再来输出对应的控制模型来驱动步进电机转动。
三相步进电机工作的流程图:
图10 三相步进电机工作流程图
5.3数码管步数显示模块
设计说明:步数显示模块是整个程序里的一个子程序。其是用4位八段数码管来显示工作步数。先将要显示的数化为10进制数,每位分别储存,从P0口输出显示码,P2口输入位选码,需要一定的延时,让此位数字显示闪烁出来。然后修改数组地址,求下一位位选码继续显示,直至输出四位数。这个扫描过程重复50次,保证人眼能观察到步数显示。
流程图如图11:
图11 数码管显示模块流程图
6仿真调试记录
如图12所示,当选择电机工作在单三拍,反转的模式下,K0断开,K1、K2、K4、闭合,系统启动,K3断开,电机开始转动。LED四位显示屏显示工作步数,LED指示灯黄灯亮显示电机反转的状态。
图12 仿真图
如图13所示,此种工作方式下步进电机的旋转角度:
图13 步进电机旋转角度
7心得体会
本次课设为期一周,所以时间比较紧张,给课设的顺利完成增加了难度。单片机原理是一门应用性很强综合性很强的学科,在这次课设中,我充分感受到了这一点,在老师给的课题之中,是来自于各个方面各个领域的应用,不得不说,计算机控制很强大,确实改变了我们的生活。
课设里最困难的部分就是编写程序和仿真调试,也许硬件连接没问题,程序运行没问题,但是,当把程序导入,发现电动机就是不转,灯就是不亮,数码管就是乱跳,这是很考验耐心的时候,一遍一遍地去调试程序,修改连接部分,有时真的看着很崩溃,但是当你不放弃地调试,才有仿真成功的可能,在这种反复中,对我们自身的能力是提高很多的。另一个收获就是关于软件的使用了。PROTEUS,KEIL51,以前好像也用过,但是平时较少接触,这次的课设让我比较熟练的掌握了这两个学习软件强大的功能,而且发现从PROTEUS里导出来的电路图特别漂亮和清晰。
单片机原理一直是自己比较喜欢的一门学科,拿到课程设计的题目也想着可以好好检验自己的学习成果,一直认为,期末考试是所谓的应试教育,而课程设计似乎更加地考验所学的知识,所谓实践与理论相结合就是这个道理吧。课程设计总能让我有一种我站在山面前的感觉,看上去比较陌生高大,但是攀登的技巧早已在平时的学习中习得,不断地去攀登,不断地在回味课堂上老师讲的东西,书本上的东西,这是一种奇妙的体验。
我明白遇到的电路或者课题并不一定在你的知识范围之内,而面对新的东西,我们要冷静地去寻求解决之道,去搜寻网络资源,图书馆资源以及和同学们的讨论之中,再结合自己所学过的知识来吃透理解那些未知的东西,扩宽知识面,这样就会觉得学到了远远超过课堂的东西,但是却源于课堂,想必这就是课设的意义吧,很有收获。
单片机源码:
#include
#include
void delay1(void);
void delay2(void);
void display(int);
int bs=0;
main()
{ char a,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=P1;
while(!(a&0x08)) //判断是否启动,若没启动则重新判断
{ P3=0x08;
delay1();
a=P1; }
//...............................................判断工作模式
if(a&0x01) //方式1模型
q=done1;
else if(a&0x02) //方式2模型
q=done2;
else if(a&0x04) //方式3模型
q=done3;
//...............................................判断电机转向
if(a&0x10) //判断电机是否要正转
{ P3=0x10; //P1.4口为1,电机正转,红灯亮
b=0;}
else
{ P3=0x20; //P1.4口为0,电机反转,黄灯亮