《基于单片机控制的步进电机的设计说明.doc》由会员分享,可在线阅读,更多相关《基于单片机控制的步进电机的设计说明.doc(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、电气综合设计题目 _二级学院 _ 专 业 _ 班 级 _ _ 学生 _ 学号 _ 学生 _ 学号 _ _ _ 学生 _ 学号 _ _ 指导教师 _ 时间: _ 考核项目平时成绩20分设计50分答辩30分得分总分考核等级教师签名35 / 36摘要: 介绍了步进电机和直流电机原理与其驱动程序控制控制模块,通过AT89S52单片机与大电流驱动阵列ULN2003完成步进电机和直流电机各种运行方式的控制。实现步进电机的正反转速度控制并且显示数据。整个系统采用模块化设计,结构简单、可靠,通过按键控制,操作方便,节省成本。关键词: 步进电机;ULN2003; AT89S51; 引言随着数字化技术发展,数字控
2、制技术得到了广泛而深入的应用。步进电机是一种将数字信号直接转换成角位移或线位移的控制驱动元件, 具有快速起动和停止的特点。因为步进电动机组成的控制系统结构简单,价格低廉,性能上能满足工业控制的基本要求,所以广泛地应用于手工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机,投影仪、数码摄像机、大型望远镜、卫星天线定位系统、医疗器件以与各种可控机械工具等等。直流电机广泛应用于计算机外围设备( 如硬盘、软盘和光盘存储器) 、家电产品、医疗器械和电动车上, 无刷直流电机的转子都普遍使用永磁材料组成的磁钢, 并且在航空、航天、汽车、精密电子等行业也被广泛应用。在电工设备中的应用,除了直流电
3、磁铁(直流继电器、直流接触器等)外,最重要的就是应用在直流旋转电机中。在发电厂里,同步发电机的励磁机、蓄电池的充电机等,都是直流发电机;锅炉给粉机的原动机是直流电动机。此外,在许多工业部门,例如大型轧钢设备、大型精密机床、矿井卷扬机、市电车、电缆设备要求严格线速度一致的地方等,通常都采用直流电动机作为原动机来拖动工作机械的。直流发电机通常是作为直流电源,向负载输出电能;直流电动机则是作为原动机带动各种生产机械工作,向负载输出机械能。在控制系统中,直流电机还有其它的用途,例如测速电机、伺服电机等。他们都是利用电和磁的相互作用来实现向机械能能的转换。一、步进电机的工作原理步进电机本质上是一个数字角
4、度转换器。以三相电机为例, 其结构原理见图1。各相夹角为120的定子磁极上均匀分布了5个矩形小齿, 没有绕组的转子圆周上也均匀的分布着40个小齿(相邻齿夹角为9)。利用电磁学的性质, 在某相绕组通电时, 相应的磁极产生磁场, 与转子形成磁路如此时定子的小齿与转子的小齿没有对齐, 则在磁场作用下, 转子就转动一定角度, 达到齿的对齐。在单三拍控制方式下, 若A相通电, B、C相不通电, 在磁场作用下使转子齿和A相定子齿相对假设此时为初态并且令与A相中心对齐的转子齿为0号齿, 因为B相与A相相差120,可知120/9=13 39, 不为整数, 即此时转子齿与B相不对齐, 只是13号齿靠近相的中心,
5、 且相差3。如果此时突然变为B相通电, 而A、C相都不通电, 那么, 13号齿会在磁场的作用下转到与相中心对齐的位置, 这就是常说的走一步, 此时,转子转了。这样, 按照A-B-C-A顺序通电次, 可以使转子转动9。那么步进电机的步距角Q=(360/NZ)(式中N=MC为运行拍数;M为控制绕组相数;C为状态系数, 单三拍或双三拍时C=1, 单六拍或双六拍时C=2为转子齿数)。二、硬件系统1、电路图2、ULN2003ULN是集成达林顿管IC,部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于
6、TTL COMS,由达林顿管组成驱动电路。ULN是集成达林顿管IC,部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。ULN2003是一个非门电路,包含7个单元,但独每个单元驱动电流最大可达350mA.资料的最后有引用电路,9脚可以悬空。 比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚
7、。ULN2003的作用:ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。ULN2003是高耐压、大电流达林顿列,由七个硅NPN达林顿管组成。ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器。ULN2003是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。ULN2003A引脚图与功能:ULN2003是高耐压
8、、大电流、部由七个硅NPN 达林顿管组成的驱动芯片。 经常在以下电路中使用,作为显示驱动、继电器驱动、照明灯驱动、电磁阀驱动、伺服电机、步进电机驱动等电路中。ULN2003 的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还可以在高负载电流并行运行。ULN2003的封装采用DIP16或SOP16。ULN2003可以驱动7个继电器,具有高电压输出特性,并带有共阴极的续流二极管使器件可用于开关型感性负载
9、。每对达林顿管的额定集电极电流是500mA,达林顿对管还可并联使用以达到更高的输出电流能力。 显示电路主要包括大型LED数码管BSI20-1(共阳极,数字净高12 cm)和高电压大电流驱动器ULN2003,大型LED数码管的每段是由多个LED发光二极管串并联而成的,因此导通电流大、导通压降高。ULN2003是高压大电流达林顿晶体管阵列电路,他具有7个独立的反相驱动器,每个驱动器的输出灌电流可达500mA,导通时输出电压约1V,截止时输出电压可达50V。ULN2003的17脚为信号输入脚,依次对应的输出端为1610脚,8脚为接地端。当驱动电源电压为+12V时,若要求数码管每段导通电流为40mA,
10、则每段的限流电阻为50。则一块ULN2003恰好驱动一个LED数码管的7段。大数码管采用共阳极接法,低电平有效。锁存器输出的电平经NPN三极管9014反相后,再由ULN2003放大后推动大数码管显示.3、AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与
11、工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形与引脚排列如图所示。主要特性与MCS-51 兼容4K字节可编程FLASH存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:0Hz-24MHz三级程序存储器锁定1288位部RAM32可编程I/O线两个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片振荡器和时钟电路特性概述AT89C51 提供以下标准功能:4k字
12、节Flash闪速存储器,128字节部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片振荡器与时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口与中断系统继续工作。掉电方式保存RAM中的容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。管脚说明VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可
13、以被定义为数据/地址的低八位。在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口的管脚被外部拉低,将输出电流。这是
14、由于部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD(串行输入口)P3.1
15、 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(计时器0外部输入)P3.5 T1(计时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或
16、用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有部程序存储器。注意加密方式1时,/EA将部锁定为RESET;当/EA端保持高电
17、平时,此间部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入与部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片振荡器。石晶振荡和瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。三、软件系统该系统采用多个模块的方式来实现对步进电机的控制。控制模块采用单片机AT89S51来控制ULN2003驱动电机转动。1. main
18、/*实例名称:步进电机*实例说明:实现步进电机的正反转以与加减速控制,并在LCD屏上实时显示步进电机的状态* hzd*时间:14.01.10*/#include target.h#include key.h#define MOTER_SPEED_NORMAL 5 /电机正常运行上限#define MOTER_SPEED_MIN 15 /电机低速运行下限uchar timer0Count; /timer0中断溢出计数 uchar moterStep; /电机步数 (0x000x07)uint moterSpeed; /速度值变化量 (0moterSpeedMax)uint moterSpeedM
19、ax; /速度最快值uchar moterState; /电机运行状态uchar moterDirect; /电机运转方向,静止/0x00;正转/0x01;反转/0x02uchar moterAddReduce; /电机加速与减速量uchar speedDirect; /0x01,电机加速;0x02,电机减速bit display_is_ok; /显示屏是否需要更新/*MOTER_STOP,停止;MOTER_FRONT_ADD,正转加速MOTER_FRONT_REDUCE,正转减速;MOTER_FRONT_NORMAL,正转正常MOTER_FRONT_LOWER,正转低速;MOTER_QUEE
20、N_ADD,反转加速MOTER_QUEEN_REDUCE,反转减速,MOTER_QUEEN_NOMAL,反转正常MOTER_QUEEN_LOWER,反转低速*/void main() uchar keyValueRead; target_init(); moterState=MOTER_STOP; timer0Count=0x00; moterAddReduce=0x00; moterStep=0x00; moterSpeed=0x00; moterSpeedMax=0x00; /默认停止 moterDirect=0x00; /默认停止 moter_state_display(MOTER_ST
21、OP); display_is_ok=1; sei(); while(1) keyValueRead=get_key_value();switch(keyValueRead) case KEY_FRONT: /正转 moterState=MOTER_FRONT_LOWER;moterDirect=0x01;moterSpeedMax=MOTER_SPEED_MIN;display_is_ok=0;/moter_state_display(MOTER_FRONT_LOWER);break; case KEY_QUEEN: /反转 moterState=MOTER_QUEEN_LOWER;mote
22、rDirect=0x02;moterSpeedMax=MOTER_SPEED_MIN;display_is_ok=0;/moter_state_display(MOTER_QUEEN_LOWER);break; case KEY_ADD: /加速 speedDirect=0x01; moterAddReduce=100;display_is_ok=0;if(moterDirect=0x01) /正转 moter_state_display(MOTER_FRONT_ADD);else if(moterDirect=0x02) moter_state_display(MOTER_QUEEN_ADD
23、);break; case KEY_REDUCE: /减速 speedDirect=0x02; moterAddReduce=100;display_is_ok=0;if(moterDirect=0x01) /正转 moter_state_display(MOTER_FRONT_REDUCE);else if(moterDirect=0x02) moter_state_display(MOTER_QUEEN_REDUCE);break; case KEY_STOP: /停止 moterState=MOTER_STOP; moterSpeedMax=0x00; /默认停止 moterDirect
24、=0x00; /默认停止moter_state_display(MOTER_STOP);display_is_ok=1;break; default: break;if(display_is_ok=0) /判断LCD容是否需要更新 switch(moterSpeedMax) case MOTER_SPEED_NORMAL: if(moterDirect=0x01) moter_state_display(MOTER_FRONT_NORMAL); else if(moterDirect=0x02) moter_state_display(MOTER_QUEEN_NOMAL); display_i
25、s_ok=1; break; case MOTER_SPEED_MIN: if(moterDirect=0x01) moter_state_display(MOTER_FRONT_LOWER); else if(moterDirect=0x02) moter_state_display(MOTER_QUEEN_LOWER); display_is_ok=1; break; default: break; void timer0_overflow(void) interrupt 1 /timer0定时10ms TH0=-500/256; /定时10ms TL0=-500%256; timer0C
26、ount=0x00; if(speedDirect=0x01) /如果为加速 if(moterSpeedMaxMOTER_SPEED_NORMAL) moterSpeedMax-;/最大加速到正常值 else moterAddReduce=0x00; speedDirect=0x00; /已经加速到正常值,不再加速 else if(speedDirect=0x02) if(moterSpeedMaxMOTER_SPEED_MIN) moterSpeedMax+; else moterAddReduce=0x00; speedDirect=0x00; if(moterSpeed0x00) mot
27、erStep-; else moterStep=0x07; else if(moterDirect=0x02)/反转 if(moterStep0x07) moterStep+; else moterStep=0x00; ground(moterStep); 2. target#define TARGET_GLOBAL 1#include target.h#include dot.hvoid timer0_init(void) TMOD|=0x01; /MODEL1,timer TH0=0xDC; /定时10ms TL0=0x00; ET0=1; /中断使能 TR0=1; /关闭定时器0void
28、 target_init(void) timer0_init(); Lcd_Initial();/*函数名称:display_head(void)*函数功能:显示“步进电机运行状态”字样*函数入口:无*函数出口:无*/void display_head(void) uchar i,temp; temp=0x00; for(i=0;i8;i+) Lcd_Character_16X16(1,10,temp,MOTER_HEADi);temp+=16; /*函数名称:display_state(state)*函数功能:显示电机状态“停止”,“正转”,“反转”*函数入口:state,电机状态*函数出口
29、:无*说明:state:0x01,停止;0x02,正转;0x03,反转*/void display_state(state) switch(state) case 0x01: /显示“停止” Lcd_Character_16X16(1,60,0,MOTER_STATE0); /停 Lcd_Character_16X16(1,60,16,MOTER_STATE1);/止 break;case 0x02: /显示“正转” Lcd_Character_16X16(1,60,0,MOTER_STATE2); /正 break;case 0x03: /显示“反转” Lcd_Character_16X16
30、(1,60,0,MOTER_STATE3); /反 break;default: break; if(state=0x02)|(state=0x03) Lcd_Character_16X16(1,60,16,MOTER_STATE4); /转/*函数名称:display_speed(speed)*函数功能:显示电机速度状态*函数入口:speed,电机速度状态*函数出口:无*说明:speed:0x01,正常;0x02,低速;0x03,加速; 0x04,减速*/void display_speed(speed) switch(speed) case 0x01: Lcd_Character_16X1
31、6(1,60,32,SPEED_STATE4); /正 Lcd_Character_16X16(1,60,48,SPEED_STATE5); /常 break; case 0x02: Lcd_Character_16X16(1,60,32,SPEED_STATE2); /低 break; case 0x03: Lcd_Character_16X16(1,60,32,SPEED_STATE0); /加 break; case 0x04: Lcd_Character_16X16(1,60,32,SPEED_STATE1); /减 break; default: break; if(speed=0x
32、02)|(speed=0x03)|(speed=0x04) Lcd_Character_16X16(1,60,48,SPEED_STATE3); /速 /*函数名称:moter_state_display(uchar moterState)*函数功能:实现步进电机状态显示*函数入口:moterState,电机运行状态*函数出口:无*说明:moterState:0x01,停止;0x02,正转加速运行;0x03,正转减速运行;0x04,正转正常运行;0x05,正转低速运行;0x06,反转加速运行;0x07,反转减速运行;0x08,反转正常运行;0x09,反转低速运行*/void moter_sta
33、te_display(uchar moterState) Lcd_Clear(); display_head(); switch(moterState) case MOTER_STOP: /停止 display_state(0x01); break;case MOTER_FRONT_ADD:/正转加速运行 display_state(0x02); display_speed(0x03); break;case MOTER_FRONT_REDUCE: /正转减速运行 display_state(0x02); display_speed(0x04); break;case MOTER_FRONT_
34、NORMAL:/正转正常运行 display_state(0x02); display_speed(0x01); break;case MOTER_FRONT_LOWER:/正转低速运行 display_state(0x02); display_speed(0x02); break;case MOTER_QUEEN_ADD:/反转加速运行 display_state(0x03); display_speed(0x03); break;case MOTER_QUEEN_REDUCE: /反转减速运行 display_state(0x03); display_speed(0x04); break;
35、case MOTER_QUEEN_NOMAL: /反转正常运行 display_state(0x03); display_speed(0x01); break;case MOTER_QUEEN_LOWER: /反转低速运行 display_state(0x03); display_speed(0x02); break;default: break; if(moterState!=MOTER_STOP) Lcd_Character_16X16(1,60,64,SPEED_STATE6); /运Lcd_Character_16X16(1,60,80,SPEED_STATE7); /行 /*函数名称
36、:ground(step)*函数功能:给电机的四个相极送信号*函数入口:step,电机相位的第几步*函数出口:无*说明:步进电机转步数,分八步*/void ground(step) switch(step) case 0x00: MOTER_M1= 1; MOTER_M2= 0; MOTER_M3= 0; MOTER_M4= 0; break;case 0x01: MOTER_M1= 1; MOTER_M2= 1; MOTER_M3= 0; MOTER_M4= 0; break; case 0x02: MOTER_M1= 0; MOTER_M2= 1; MOTER_M3= 0; MOTER_M
37、4= 0; break;case 0x03: MOTER_M1= 0; MOTER_M2= 1; MOTER_M3= 1; MOTER_M4= 0; break;case 0x04: MOTER_M1= 0; MOTER_M2= 0; MOTER_M3= 1; MOTER_M4= 0; break; case 0x05: MOTER_M1= 0; MOTER_M2= 0; MOTER_M3= 1; MOTER_M4= 1; break;case 0x06: MOTER_M1= 0; MOTER_M2= 0; MOTER_M3= 0; MOTER_M4= 1; break;case 0x07: MOTER_M1= 0; MOTER_M2= 0; MOTER_M3= 0; MOTER_M4= 1; break;default: break; 3. key#define KEY_GLOBAL 1#include Key.hstatic uchar keyValueBuff; /读取键值的缓冲区 static uchar keyValueOld; /前一次的键值 static uchar keyValueTemp; /键值中间交换变量 static uint stillTimes; /键按下保持次数static uint stillTi
限制150内