学 号 1207050224
天津城建大学
嵌入式系统及应用课程
设计说明书
正反转可控的步进电机
起止日期: 2015 年 11月 日 至 2015 年 11月 日
学生姓名
班级
成绩
指导教师(签字)
计算机与信息工程学院
2015年 11 月 日
目录
第1章 课程设计目的、要求、
1
1.1设计目的 1
1.2设计要求 1
1.3
1
1.3.1控制方式的确定 1
1.3.2驱动方式的确定 1
1.3.3驱动电路的选择 2
1.3.4基本方案的确定 2
第2章 系统硬件设计 3
2.1 硬件设计思路 3
2.2 总体设计思路 3
2.3 单片机的选择 4
2.4 ULN2003A芯片 4
2.5步进电机 4
2.5.1 步进电机特性 5
2.5.2 步进电机种类 5
第3章 外围电路分析 6
3.1 键盘控制模块 6
3.2 LED发光模块 7
3.3 步进驱动模块 7
第4章 软件设计 8
4.1 程序设计思路 8
4.2 程序流程图 8
4.2.1 主程序流程图 8
4.2.2电机控制中断程序流程图 9
参考文献 10
附录 11
1.仿真电路图 11
2.参考程序 12
第1章 课程设计目的、要求、方案
1.1设计目的
(1)设计并实现给定步进电机的控制;
(2)进一步掌握步进电机的控制方法;
(3)进一步掌握单片机硬件和软件的综合设计方法。
1.2设计要求
(1)电机工作方式为三相双三拍,初始转速100r/min ;
(2)能够实现电机的启/停功能;
(3)能够实现电机的正/反转功能;
(4)能够实现电机的加/减速功能。
1.3 设计方案
1.3.1控制方式的确定
步进电机控制是一个比较精确的控制,步进电机开环控制系统具有成本低、简单、控制方便等优点,在采用单片机的步进电机开环系统中,控制系统的CP脉冲的频率或者换向周期实际上就是控制步进电机的运行速度。系统可用两种
实现步进电机的速度控制。一种是延时,一种是定时。延时方法是在每次换向之后调用一个延时子程序,待延时结束后再次执行换向,这样周而复始就可发出一定频率的CP脉冲或换向周期。延时子程序的延时时间与换向程序所用的时间和,就是CP脉冲的周期,该方法简单,占用资源少,全部由软件实现,调用不同的子程序可以实现不同速度的运行。但占用CPU时间长,不能在运行时处理其他工作。因此只适合较简单的控制过程。定时方法是利用单片机系统中的定时器定时功能产生任意周期的定时信号,从而可方便的控制系统输出CP脉冲的周期。
1.3.2驱动方式的确定
步进电机的驱动一般有两种方法,一种是通过CPU直接来驱动,这种方法一般不宜采用,因为CPU的输出电流脉冲是特别小的它不能足以让步进电机的转动;别一种是通过CPU来间接驱动,就是把从CPU输出的信号进行放大,然后直接驱动或是再通过光电隔离间接来驱动步进电机,这种方法比较安全可靠。固本次设计应采用CPU间接驱动步进电机。用编码器的测速发电机作为转速测量工具,因为选择了闭环控制,就必须有反
馈元件,反馈元件一般有两种,一种是采用同轴的测速发电机,把步进电机的转速反馈回来,然后通过显示器显示出来并对步进电机进行调节;别一种是通过光同轴的电编码器把步进电机的转速反馈回来对步进电机进行调节;两者相比,后者的设计比较简单,价格便宜,安全可靠,污染少。固一般采用后者,用光电骗码器作为反馈元件。
1.3.3驱动电路的选择
步进电机的驱动电路有多种,但最为常用的就是单电压驱动、双电压驱动、斩波驱动、细分控制驱动等。但因本次设计对步进电机的精度要求比较高转速的调节范围比较广,固应选用驱动芯片ULN2003A来驱动,并通过软件来实现步进电机的调速。
1.3.4基本方案的确定
因本次设计的要求,选用三相双三拍步进电机,单片机选用89C51作为控制器。选用8279来驱动显示和键盘。选用ULN2003A作为步进电机的驱动芯片并通过光电耦合来驱动步进电机。然后用与步进电机同轴的光电编码器作为反馈元件,并把反馈回的信号经CPU处理后再由显示器显示出来。
第2章 系统硬件设计
2.1 硬件设计思路
步进电机控制系统共分为四个模块:单片机最小系统模块、键盘控制模块、发光模块、步进电机驱动模块。
单片机最小系统主要由复位电路和时钟电路组成。复位电路为单片机系统提供可靠复位,使单片机能正常启动。时钟电路采用外部时钟方式,保证单片机个功能部件都是以时钟频率为基准,有条不紊地一拍一拍地工作。
键盘控制模块包括启停键、方向控制键、加速键和减速键,分别与单片机的P3.0、p3.1、p3.2和P3.3相连。实现对步进电机的控制。并且键盘上连接有发光二极管,以指示键盘状态。
步进电机驱动模块选用ULN2003A为步进电机提供脉冲信号,驱动步进电机转动。该模块与单片机的P1.0—P1.6相连。
2.2 总体设计思路
总体设计思路见图2-1
发光模块
图2-1
说明如下:
1.单片机接受键盘信息,改变系统内部变量值。
2.单片机输出脉冲信号,控制步进电机转动。
3.单片机根据步进电机实际转动值,控制发光显示。
2.3 单片机的选择
本次设计选用我们最熟悉的51单片机作为步进电机的控制芯片。89C51的结构简单并可以在编程器上实现闪烁式的电擦写达几万次以上.使用方便等优点,而且完全兼容MCS5l系列单片机的所有功能。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器。
2.4 ULN2003A芯片
经常在以下电路中使用,作为显示驱动,继电器驱动,照明灯驱动,电磁阀驱动,伺服电机、步进电机驱动等电路中。ULN2003A(如图:2-2)是一个7路反向器电路,即当输入端为高电平时ULN2003A输出端为低电平,当输入端为低电平时ULN2003A输出端为高电平。也可以作为一些器件,如步进电机的驱动电路。
图 2-2 ULN2003A
2.5步进电机
步进电机是一种能够将电脉冲信号转换成角位移或线位移的机电元件,它实际上是一种单相或多相同步电动机。单相步进电动机有单路电脉冲驱动,输出功率一般很小,其用途为微小功率驱动。多相步进电动机有多相方波脉冲驱动,用途很广。
使用多相步进电动机时,单路电脉冲信号可先通过脉冲分配器转换为多相脉冲信号,在经功率放大后分别送入步进电动机各相绕组。每输入一个脉冲到脉冲分配器,电动机各相的通电状态就发生变化,转子会转过一定的角度(称为步距角)。
正常情况下,步进电机转过的总角度和输入的脉冲数成正比;连续输入一定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。由于步进电动机能直接接收数字量的输入,所以特别适合于微机控制。
2.5.1 步进电机特性
步进电机转动使用的是脉冲信号,而脉冲是数字信号,这恰是计算机所擅长处理的数据类型。从20世纪80年代开始开发出了专用的IC驱动电路,今天,在打印机、磁盘器等的OA装置的位置控制中,步进电机都是不可缺少的组成部分之一。总体上说,步进电机有如下优点:
1.不需要反馈,控制简单。
2.与微机的连接、速度控制(启动、停止和反转)及驱动电路的设计比较简单。
3.没有角累积误差。
4.停止时也可保持转距。
5.没有转向器等机械部分,不需要保养,故造价较低。
6.即使没有传感器,也能精确定位。
7.根椐给定的脉冲周期,能够以任意速度转动。但是,这种电机也有自身的缺点。
8.难以获得较大的转矩
9、不宜用作高速转动
10.在体积重量方面没有优势,能源利用率低。
11.超过负载时会破坏同步,高速工作时会发出振动和噪声。
2.5.2 步进电机种类
目前常用的步进电机有三类:
1、反应式步进电动机(VR)。
采用高导磁材料构成齿状转子和定子,其结构简单,生产成本低,步距角可以做的相当小,但动态性能相对较差。
2、永磁式步进电动机(PM)。
转子采用多磁极的圆筒形的永磁铁,在其外侧配置齿状定子。用转子和定子之间的吸引和排斥力产生转动,转动步的角度一般是7.50。它的出力大,动态性能好;但步距角一般比较大。
3、混合步进电动机(HB)。
这是PM和VR的复合产品,其转子采用齿状的稀土永磁材料,定子则为齿状的突起结构。此类电机综合了反应式和永磁式两者的优点,步距角小,出力大,动态性能好,是性能较好的一类步进电动机,在计算机相关的设备中多用此类电机。
第3章 外围电路分析
3.1 键盘控制模块
键盘在单片机应用系统中能实现向单片机输入数据、传送命令等功能,是人工干预单片机的主要手段。键盘实质是一组按键开关的集合。键盘所用开关为机械弹性开关,利用了机械触点的合、断作用。
一个电压信号在机械触点的断开、闭合过程中,都会产生抖动,一般为5—10ms;两次抖动之间为稳定的闭合状态,时间由按键动作所决定;第一次抖动前和第二次抖动后为断开状态。
按键的闭合与否,反映在输出电压上就是呈现出高电平或低电平。通过对输出电平的高低状态的检测,便可确认按键按下与否。在本设计中,高电平表示按键断开,低电平表示按键闭合状体。并且,为了能直观形象的表示按键闭合与否,还为每个按键相应增加了发光二极管,按K1键时,发光二极管D1亮,按K2键时,D2发光二极管变亮,按K3键时D3发光二极管亮。
为了确保单片机对一次按键动作只确认一次按键,必须消除抖动的影响。消除按键抖动通常采用硬件、软件两种方法。由于硬件消抖电路设计复杂,本设计中没有采用,在此不再详细叙述;软件消抖适合按键较多的情况,方便简单。其原理是在第一次检测到有键按下时,执行一段延时10ms的子程序后在确认该键电平是否仍保持闭合状态电平,如果保持闭合状态电平则确认为真正有键按下,从而消除了抖动的影响。如图3-1所示:
图3-1键盘控制电路
3.2 LED发光模块
发光二极管LED是一种通电后能发光的半导体器件,其导电性质与普通二极管类似。LED数码显示器就是由发光二极管组合而成的1种新型显示器件。在单片机系统中应用非常普遍,。本次设计中选用了3个发光二极管,D1,D2,D3,分别在电机正转、反转、停止时发光。电路图如图3-2。
图 3-2 发光二极管连接图
3.3 步进驱动模块
本系统的设计目的为了高效控制步进电机的转动,因此需要将脉冲转化为步进角度,才能控制步进电机转动,我们在这里采用ULN2003A为步进电机提供脉冲信号。
ULN2003A是低逻辑电平数字电路和大电流高电压要求的灯、继电器、打印机锤和其他类似负载间的接口的理想器件。所有器件有集电极开路输出和用于瞬变抑制的续流箝位二极管。ULN2003A的设计与
TTL系列兼容。它的管脚连接图如图3-3所示:
图3-3 步进驱动电路
第4章 软件设计
4.1 程序设计思路
步进电机控制系统的软件需要同时完成读取键盘、处理键盘、控制步进电机转动、控制二极管发光等任务,这就必须通过中断技术来实现。
在本设计中,主程序采用查询方式扫描键盘端口,检测按键动作是否发生,若有按键动作则处理键盘,根据按键值修改相应参数值,实现键盘的实时处理功能。定时器0中断服务程序控制步进电机的转动:根据当前速度进行计算并查表得到T0定时时间常数,设置TH0和TL0的值,达到对转速精确控制的目的;根据转动方向控制位的值,控制脉冲信号循环移动的方向,达到对转动方向控制的目的。
4.2 程序流程图
4.2.1 主程序流程图
步进电机控制系统的主程序在对整个系统初始化后主要完成读键盘和处理键盘的功能,如图4-1所示:
图4-1 步进电机控制系统主程序流程图
系统上电复位后,先调用初始化子程序,对步进电机各端口,相关参数进行初始化,设置T0、T1工作方式控制字和时间常数。初始化完成后,步进电机处于停止状态,T0、T1定时器处于关闭状态。然后循环调用读键盘子程序和键盘处理子程序,等待中断,以
便实现步进电机转动控制和转速的动态显示。
4.2.2电机控制中断程序流程图
定时器中断0服务程序流程图如图4-2所示:
图4-2定时器中断0服务程序流程图
定时器中断0服务程序的中断时间由当前的转速决定。进入中断程序后,首先要保护现场,再根据当前速度进行计算并查表得到T0定时时间常数,设置TH0和TL0的值。然后判断转动方向控制位的值,如果是0则控制脉冲信号循环左移并输出,如果是1则控制脉冲信号循环右移并输出。最后恢复现场,返回,等待下次中断。
参考文献
[1] 张洪润,蓝清华. 单片机应用技术教程[M] . 北京:清华大学出版社,1997.
[2] 秦曾煌. 电工学[M] . 北京:高等教育出版社,1999.
[3] 常斗南,等. 可编程序控制器原理、应用、实验[M] . 北京:机械工业出版社,1998.
[4] 于海生,等. 微型计算机控制技术[M] . 北京:清华大学出版社,1999.
[5] 王福瑞,等. 单片机微机测控系统设计大全[M] . 北京:北京航空航天大学出版社,1998.
[6] 陈理壁. 步进电机及其应用[M] . 上海: 上海科学技术出版社,1989.
[7] 刘保延,等. 步进电机及其驱动控制系统[M] . 哈尔滨:哈尔滨工业大学出版 社,1997.
[8] 季维发,过润秋,严武升等. 机电一体化技术[M] .北京:电子工业出版社,1995.
[9] 郭敬枢,庄继东,孔峰. 微机控制技术[M] . 重庆:重庆大学出版社,1994.
[10] 刘国荣. 单片微型计算机技术[M] . 北京:机械工业出版社,1996.
[11] 王福瑞. 单片微机测控系统设计大全[M] . 北京:北京航空航天大学出版社,1998.
[12] 何立民. 单片机应用技术选编[M] . 北京:北京航空航天大学出版社,1993.
[13] 潘新民等: 单片微型计算机实用系统设计1 北京: 人民邮电出版社, 1992.
[14] 王润孝,秦现生编著1 机床数控原理与系统1 西北工业大学出版社,1997.
[15] 李伯成,侯伯李等编1IBM - PC 微机应用系统设计1西安电子科技大学,1996.
[16] 黄义源主编1 机械设备电气与数字控制1 中共广播电视大学出版社,1992.
附录
1.仿真电路图
2.参考程序
#include
sbit led_n=P0^0;
sbit led_r=P0^1;
sbit led_s=P0^2;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
unsigned char key;
unsigned char t,s,speed=50;
unsigned int lev;
bit turun,m_on=0;
void delaylev()
{
unsigned int i;
unsigned char j;
for(i=lev;i>0;i--)
for(j=110;j>0;j--);
}
void delayms(unsigned char xms)
{
unsigned char i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()
{
unsigned char temp;
if(P3!=0xff)
delayms(10);
if(P3!=0xff)
{
temp=P3;
switch(temp)
{
case 0xfe:
P0=0xff;
led_n=0;
m_on=1;
turun=0;
break;
case 0xfd:
P0=0xff;
led_r=0;
m_on=1;
turun=1;
break;
case 0xfb:
P0=0xff;
m_on=0;
led_s=0;
break;
case 0xf7:
P0=0xff;
speed=speed-10;
if(speed<10)
speed=2;
break;
case 0xef:
P0=0xff;
speed=speed+10;
if(speed>240)
speed=255;
break; } }
while(P3!=0xff); }
void gorun(unsigned char step)
{
switch(step)
{
case 1: //0
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 2:
P1_0 = 0;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
break;
case 3:
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 1;
break;
case 4:
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
break;
case 5:
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 6:
P1_0 = 0;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
break;
case 7:
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 1;
break;
case 8:
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
break;
} }
void main()
{
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{ if(m_on==0)
{ P1=0x00;}
else
gorun(s);
delaylev();
keyscan(); } }
void timeint(void) interrupt 1
{
TR0=0;
TH0 = 254;
TL0 = 255-speed;
t++;
if(t==10)
{ if(turun==0)
{ s++;
led_s=~led_s;
if(s>8)
s=1; }
else
{
s--;
led_s=~led_s;
if(s==0)
s=8;
}
}
P2=speed;
TR0=1;
}