2022年基于单片机控制的步进电机的方案设计书.docx
精品学习资源电气综合设计题目 二级学院 专 业 班同学姓名级 _ 学号 同学姓名学号_ 同学姓名学号 指导老师 时间: 考核工程平常成果 20 分设计 50 分答辩 30 分得分总分考核等级老师签名欢迎下载精品学习资源摘要: 介绍了步进电机和直流电机原理及其驱动程序掌握掌握模块,通过AT89S52单片机及大电流驱动阵列 ULN2003 完成步进电机和直流电机各种运行方式的掌握;实现步进电机的正反转速度掌握并且显示数据;整个系统采纳模块化设计,结构简洁、牢靠 ,通过按键掌握,操作便利,节约成本;关键词: 步进电机; ULN2003 ; AT89S51;引言随着数字化技术进展,数字掌握技术得到了广泛而深化的应用;步进电机是一种将数字信号直接转换成角位移或线位移的掌握驱动元件, 具有快速起动和停止的特点;由于步进电动机组成的掌握系统结构简洁,价格低廉,性能上能满意工业掌握的基本要求,所以广泛地 应用于手工业自动掌握、数控机床、组合机床、机器人、运算机外围设备、照相机,投影仪、数码摄像机、大型望远镜、卫星天线定位系统、医疗器件以及各种可控机械工具等等; 直流电机广泛应用于运算机外围设备 如硬盘、软盘和光盘储备器 、家电产品、医疗器械和电动车上 , 无刷直流电机的转子都普遍使用永磁材料组成的磁钢, 并且在航空、航天、汽车、精密电子等行业也被广泛应用;在电工设备中的应用,除了直流电磁铁(直流继电器、 直流接触器等)外,最重要的就是应用在直流旋转电机中;在发电厂里,同步发电机的励磁 机、蓄电池的充电机等,都是直流发电机;锅炉给粉机的原动机是直流电动机;此外,在许 多工业部门,例如大型轧钢设备、大型精密机床、矿井卷扬机、市内电车、电缆设备要求严 格线速度一样的地方等,通常都采纳直流电动机作为原动机来拖动工作机械的;直流发电机 通常是作为直流电源,向负载输出电能;直流电动机就是作为原动机带动各种生产机械工作,向负载输出机械能;在掌握系统中,直流电机仍有其它的用途,例如测速电机、伺服电机等;他们都是利用电和磁的相互作用来实现向机械能能的转换;一、步进电机的工作原理步进电机本质上是一个数字角度转换器;以三相电机为例, 其结构原理见图 1;各相夹角为 120°的定子磁极上匀称分布了 5 个矩形小齿 , 没有绕组的转子圆周上也匀称的分布着40个小齿(相邻齿夹角为9°);利用电磁学的性质 , 在某相绕组通电时 , 相应的磁极产生磁场 ,与转子形成磁路如此时定子的小齿与转子的小齿没有对齐, 就在磁场作用下 , 转子就转动肯定角度, 达到齿的对齐;在单三拍掌握方式下 , 如 A 相通电, B、C 相不通电 , 在磁场作用下使转子齿和 A 相定子齿相对假设此时为初态并且令与A 相中心对齐的转子齿为0 号齿, 由于 B 相与 A 相相差 120°,可知 120°/9 °=13 3不.9为, 整数 , 即此时转子齿与 B 相不对齐 , 只是 13 号齿靠近相的中心 , 且相差 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,适用于 TTL COMS, 由达林顿管组成驱动电路; 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 是高压大电流达林顿晶体管阵列系列产品 ,具有电流增益高、工作电压高、温度范畴宽、带负载才能强等特点, 适应于各类要求高速大功率驱动的系统;ULN2003A 引脚图及功能 :欢迎下载精品学习资源ULN2003 是高耐压、大电流、内部由七个硅NPN 达林顿管组成的驱动芯片;常常在以下电路中使用,作为显示驱动、继电器驱动、照明灯驱动、电磁阀驱动、伺服电机、步进电机驱动等电路中; ULN2003 的每一对达林顿都串联一个 2.7K 的基极电阻 ,在5V 的工作电压下它能与 TTL 和 CMOS 电路直接相连,可以直接处理原先需要标准规律缓冲器来处理的数据; ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承担 50V的电压,输出仍可以在高负载电流并行运行;ULN2003 的封装采纳DIP 16或 SOP 16;ULN2003 可以驱动 7个继电器 ,具有高电压输出特性,并带有共阴极的续流二极管使器件可用于开关型感性负载;每对达林顿管的额定集电极电流是500mA,达林顿对管仍可并联使用以达到更高的输出电流能力;显示电路主要包括大型 LED 数码管 BSI20-1共阳极,数字净高 12 cm和高电压大电流驱动器 ULN2003,大型 LED 数码管的每段是由多个 LED 发光二极管串并联而成的,因此导通电流大、导通压降高; ULN2003 是高压大电流达林顿晶体管阵列电路,他具有7个独立的反相 驱 动 器 , 每 个 驱 动 器 的 输 出 灌 电 流 可 达 500mA , 导 通 时 输 出 电 压 约 1 V ,截止时输出电压可达 50V ;ULN2003 的17脚为信号输入脚,依次对应的输出端为16 10脚, 8脚为接地端;当驱动电源电压为+12V 时,如要求数码管每段导通电流为40mA ,就每段的限流电阻为 50;就一块 ULN2003 恰好驱动一个 LED 数码管的 7段;大数码管采纳共阳极接法,低电平有效;锁存器输出的电平经NPN 三极管 9014反相后,再由 ULN2003 放大后推动大数码管显示 . 3、AT89C51AT89C51 是一种带 4K 字节 FLASH 储备器( FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能 CMOS 8 位微处理器,俗称单片机; AT89C2051 是一种带 2K 字节闪存可编程可擦除只读储备器的单片机;单片机的可擦除只读储备器可以反复欢迎下载精品学习资源擦除 1000 次;该器件采纳 ATMEL 高密度非易失储备器制造技术制造,与工业标准的MCS- 51 指令集和输出管脚相兼容;由于将多功能8 位 CPU 和闪速储备器组合在单个芯片中, ATMEL 的 AT89C51 是一种高效微掌握器, AT89C2051 是它的一种精简版本; AT89C51 单片机为许多嵌入式掌握系统供应了一种敏捷性高且价廉的方案;形状及引脚排列如下列图;主要特性·与 MCS-51 兼容·4K 字节可编程 FLASH 储备器·寿命: 1000 写/擦循环·数据保留时间: 10 年·全静态工作: 0Hz-24MHz·三级程序储备器锁定·128×8 位内部 RAM·32 可编程 I/O 线·两个 16 位定时器 /计数器·5 个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路特性概述AT89C51 供应以下标准功能: 4k 字节 Flash 闪速储备器, 128 字节内部 RAM ,32 个 I/O 口线,两个 16 位定时/计数器,一个 5 向量两级中断结构,一个全双工串行通信口,片内振荡器准时钟电路;同时, AT89C51 可降至 0Hz 的静态规律操作,并支持两种软件可选的节电工作模式;闲暇方式停止CPU 的工作,但答应 RAM ,定时/计数器,串行通信口及中断系统连续工作;掉电方式储存RAM 中的内容,但振荡器停止工作并禁止其它全部部件工作欢迎下载精品学习资源直到下一个硬件复位;管脚说明VCC :供电电压;GND:接地;P0 口: P0 口为一个 8 位漏级开路双向 I/O 口,每脚可吸取 8TTL 门电流;当 P0 口的管脚第一次写 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.0 RXD (串行输入口) P3.1 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;因此它可用作对外部输出的脉冲或用于定时目 的;然而要留意的是:每当用作外部数据储备器时,将跳过一个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 :来自反向振荡器的输出;振荡器特性 :XTAL1 和 XTAL2 分别为反向放大器的输入和输出;该反向放大器可以配置为片内振荡器;石晶振荡和陶瓷振荡均可采纳;如采纳外部时钟源驱动器件,XTAL2 应不接;有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度;三、软件系统该系统采纳多个模块的方式来实现对步进电机的掌握;掌握模块采纳单片机AT89S51来掌握 ULN2003 驱动电机转动;1. main/* 实例名称:步进电机* 实例说明:实现步进电机的正反转以及加减速掌握,并在LCD 屏上实时显示步进电机的状态* 作者: hzd* 时间: 14.01.10欢迎下载精品学习资源*/ #include "target.h"#include "key.h"#define MOTER_SPEED_NORMAL 5/ 电机正常运行上限#define MOTER_SPEED_MIN15/ 电机低速运行下限uchar timer0Count;/timer0 中断溢出计数uchar moterStep;/电机步数0x000x07uint moterSpeed;/速度值变化量0moterSpeedMax uint moterSpeedMax;/速度最快值uchar moterState;/电机运行状态uchar moterDirect;/电机运转方向 ,静止/0x00;正转/0x01;反转/0x02 uchar moterAddReduce;/电机加速及减速量uchar speedDirec;t/0x01,电机加速; 0x02,电机减速bit display_is_ok;/显示屏是否需要更新/* MOTER_STOP,停止; MOTER_FRONT_ADD, 正转加速MOTER_FRONT_REDUCE, 正转减速; MOTER_FRONT_NORMAL, 正转正常MOTER_FRONT_LOWER, 正转低速; MOTER_QUEEN_ADD, 反转加速MOTER_QUEEN_REDUCE, 反转减速 ,MOTER_QUEEN_NOMAL, 反转正常MOTER_QUEEN_LOWER, 反转低速*/ void mainuchar keyValueRead; target_init;moterState=MOTER_STOP;timer0Count=0x00;moterAddReduce=0x00;moterStep=0x00;moterSpeed=0x00;moterSpeedMax=0x00; /默认停止欢迎下载精品学习资源moterDirect=0x00; /默认停止moter_state_displayMOTER_STOP;display_is_ok=1;sei;while1keyValueRead=get_key_value; switchkeyValueReadcase KEY_FRONT:/正转moterState=MOTER_FRONT_LOWER;moterDirect=0x01;moterSpeedMax=MOTER_SPEED_MIN;display_is_ok=0;/moter_state_displayMOTER_FRONT_LOWER ;break;case KEY_QUEEN:/ 反转moterState=MOTER_QUEEN_LOWER;moterDirect=0x02;moterSpeedMax=MOTER_SPEED_MIN;display_is_ok=0;/moter_state_displayMOTER_QUEEN_LOWER ;break;case KEY_ADD:/加速speedDirect=0x01;moterAddReduce=100;欢迎下载精品学习资源display_is_ok=0;ifmoterDirect=0x01 / 正转moter_state_displayMOTER_FRONT_ADD ;else ifmoterDirect=0x02moter_state_displayMOTER_QUEEN_ADD ;break;case KEY_REDUCE:/减速speedDirect=0x02;moterAddReduce=100;display_is_ok=0;ifmoterDirect=0x01 / 正转moter_state_displayMOTER_FRONT_REDUCE;else ifmoterDirect=0x02moter_state_displayMOTER_QUEEN_REDUCE;break;case KEY_STOP:/停止moterState=MOTER_STOP;moterSpeedMax=0x00; /默认停止moterDirect=0x00;/默认停止moter_state_displayMOTER_STOP;display_is_ok=1;break;default: break;ifdisplay_is_ok=0/ 判定 LCD 内容是否需要更新欢迎下载精品学习资源switchmoterSpeedMaxcase MOTER_SPEED_NORMAL:ifmoterDirect=0x01moter_state_displayMOTER_FRONT_NORMAL ;else ifmoterDirect=0x02 moter_state_displayMOTER_QUEEN_NOMAL ;display_is_ok=1;break;case MOTER_SPEED_MIN:ifmoterDirect=0x01moter_state_displayMOTER_FRONT_LOWER ;else ifmoterDirect=0x02moter_state_displayMOTER_QUEEN_LOWER ;display_is_ok=1;break;default: break;void timer0_overflowvoid interrupt 1 /timer0 定时 10ms欢迎下载精品学习资源TH0=-500/256;/定时 10msTL0=-500%256;timer0Count=0x00;ifspeedDirect=0x01/假如为加速ifmoterSpeedMax>MOTER_SPEED_NORMALmoterSpeedMax-;/最大加速到正常值elsemoterAddReduce=0x00;speedDirect=0x00;/已经加速到正常值,不再加速else ifspeedDirect=0x02ifmoterSpeedMax<MOTER_SPEED_MIN moterSpeedMax+;elsemoterAddReduce=0x00;speedDirect=0x00;ifmoterSpeed<moterSpeedMax moterSpeed+;else欢迎下载精品学习资源moterSpeed=0x00;ifmoterDirect=0x01 / 正转ifmoterStep>0x00 moterStep-; elsemoterStep=0x07;else ifmoterDirect=0x02/反转ifmoterStep<0x07 moterStep+;elsemoterStep=0x00;groundmoterStep;2. target#define TARGET_GLOBAL 1 #include "target.h"#include "dot.h"void timer0_initvoidTMOD|=0x01 ; /MODEL1,timer TH0=0xDC ;/ 定时 10ms TL0=0x00;ET0=1;/中断使能TR0=1;/ 关闭定时器 0欢迎下载精品学习资源void target_initvoidtimer0_init ;Lcd_Initial ;/* 函数名称: display_headvoid* 函数功能:显示 “步进电机运行状态 ”字样* 函数入口:无* 函数出口:无*/ void display_headvoiduchar i,temp;temp=0x00;fori=0 ;i<8 ;i+Lcd_Character_16X161,10,temp,MOTER_HEADi ;temp+=16;/* 函数名称: display_statestate* 函数功能:显示电机状态 “停止” ,正“转” ,反“转”* 函数入口: state,电机状态* 函数出口:无* 说明: state:0x01,停止; 0x02,正转; 0x03,反转*/ void display_statestate欢迎下载精品学习资源switchstate欢迎下载精品学习资源case 0x01:/显/示“停止”欢迎下载精品学习资源Lcd_Character_16X161,60,0,MOTER_STATE0; /停Lcd_Character_16X161,60,16,MOTER_STATE1;/止break;case 0x02:/ 显示“正转”Lcd_Character_16X161,60,0,MOTER_STATE2; /正break;case 0x03:/ 显示“反转”Lcd_Character_16X161,60,0,MOTER_STATE3; /反break;default: break;ifstate=0x02|state=0x03 Lcd_Character_16X161,60,16,MOTER_STATE4; /转/* 函数名称: display_speedspeed* 函数功能:显示电机速度状态欢迎下载精品学习资源* 函数入口: speed电,* 函数出口:无机速度状态欢迎下载精品学习资源* 说明: speed:0x01,正常;0x02,低速; 0x03,加速;欢迎下载精品学习资源0x04,减速*/ void display_speedspeedswitchspeedcase 0x01:欢迎下载精品学习资源Lcd_Character_16X161,60,32,SPEED_STATE4; Lcd_Character_16X161,60,48,SPEED_STATE5; break;/正/常欢迎下载精品学习资源case 0x02:欢迎下载精品学习资源Lcd_Character_16X161,60,32,SPEED_STATE2; break;/低欢迎下载精品学习资源case 0x03:欢迎下载精品学习资源Lcd_Character_16X161,60,32,SPEED_STATE0; break;/加欢迎下载精品学习资源case 0x04:欢迎下载精品学习资源Lcd_Character_16X161,60,32,SPEED_STATE1; break;/减欢迎下载精品学习资源default: break;ifspeed=0x02|speed=0x03|speed=0x04欢迎下载精品学习资源Lcd_Character_16X161,60,48,SPEED_STATE3;/速欢迎下载精品学习资源/* 函数名称: moter_state_displayuchar moterState* 函数功能:实现步进电机状态显示* 函数入口: moterState,电机运行状态* 函数出口:无* 说明: moterState:0x01,停止; 0x02,正转加速运行;0x03,正转减速运行; 0x04,正转正常运行;0x05,正转低速运行; 0x06,反转加速运行;0x07,反转减速运行; 0x08,反转正常运行;0x09,反转低速运行*/ void moter_state_displayuchar moterStateLcd_Clear;display_head;switchmoterStatecase MOTER_STOP: /停止display_state0x01;break;case MOTER_FRONT_ADD:/正转加速运行display_state0x02;display_speed0x03; break;case MOTER_FRONT_REDUCE: /正转减速运行欢迎下载精品学习资源display_state0x02;display_speed0x04; break;case MOTER_FRONT_NORMAL:/正转正常运行display_state0x02;display_speed0x01; break;case MOTER_FRONT_LOWER:/正转低速运行display_state0x02;display_speed0x02; break;case MOTER_QUEEN_ADD:/反转加速运行display_state0x03;display_speed0x03; break;case MOTER_QUEEN_REDUCE: /反转减速运行display_state0x03;display_speed0x04; break;case MOTER_QUEEN_NOMAL: / 反转正常运行欢迎下载精品学习资源display_state0x03;display_speed0x01; break;case MOTER_QUEEN_LOWER: / 反转低速运行display_state0x03;display_speed0x02; break;default: break;ifmoterState.=MOTER_STOPLcd_Character_16X161,60,64,SPEED_STATE6;/运Lcd_Character_16X161,60,80,SPEED_STATE7; /行/* 函数名称: groundstep* 函数功能:给电机的四个相极送信号* 函数入口: step,电机相位的第几步* 函数出口:无* 说明:步进电机转步数,分八步*/ void groundstepswitchstep欢迎下载精品学习资源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_M4= 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.h"static uchar keyValueBuff;/读取键值的缓冲区static uchar keyValueOld;/前一次的键值static uchar keyValueTemp;/键值中间交换变量 stat