毕业设计毕业论文:基于单片机的步进电机升降频控制内容摘要:

1. AT89C51 单片机的时钟 电路: AT89C51 单片机的时钟信通常用两种电路形式得到:内部振荡方式和外部振荡方式。 本设计由内部振荡方式产生。 如图 22 中所示,在引脚 XTAL1和 XTAL2 外接晶体振荡器 (简称晶振 ),就构成了内部振荡方式。 由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。 两个电容器起稳定振荡频率、快速起振的作用,其电容值一般在 530pF。 当晶振频率的值为 12MHZ 时内部振荡方式所得的时钟信号比较稳定,实用电路中应用较多。 2. 单片机复位电路: 当 MCS5l系列单片机的复位引脚 RST(全称 RESET)出现 2 个机器周期以 上的高电平时,单片机就执行复位操作。 根据应用的要求,复位操作通常有两种基本形式:上电复位和上电或开关复位。 上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。 上电后,由于电容的充电作用,使 RST 持续一段时间的高电平。 当单片机已在运行当中时,按下复位键后松开,也能使 RST 保持 一段时间的高电平,从而实现 通电时的自动复位操作,系统运行过程中的 开关复位操作。 167。 控制键电路 键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。 按键是一种常开型按钮开关。 由于按钮是机械触点,当机械触点断开、闭合时,会有抖动 , 这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的, 因为计算机处理的速度是在微秒级,而机械抖动的时间至 少是毫秒级 , 对计算机而言,这已是一个 “ 漫长 ” 的时间了。 毕业设计(论文) 12 为使 CPU 能正确地读出 输入口 的状态,对 每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。 单片机 系统 中常用软件法。 就是在单片机获得 P0 口为低的信息后,不是立即认定 按键 已被按下,而是延时 10 毫秒或更长一些时间后再次检测 P0 口,如果仍为低,说明 按键 的确按下了,这实际上是避开了按钮按下时的抖动时间。 按键 与控制系统 P0 口键连接,其连接如下表: 表 21 P0 口与控制键连接 控制键电路图如 图 23 所示: 图 23 控制键电 路图 167。 步进电机驱动电路 AT89C51 控制电机运行的各种工作状态。 但不能直接驱动步进电机,这需要由功率电路来扩展输出电流以满足被控元件的电流、电压。 ULN2020 达林顿晶体管阵列系列产品就属于这类可控大功率器件。 ULN2020 是高耐压、大电流、内部由七个硅 NPN 达林顿管成的驱动芯片。 它是一个 7 路反向器电路,即当输入端为高电平时, ULN2020 输出端为低电平,当输入端为低电平时 ULN2020 输出端为高电平。 ULN2020 的每一对达林顿都启动 升频 降频 停止 KW1 KW2 KW3 KW4 毕业设计(论文) 13 串联一个 的基极电阻,在 5V 的工作电压下它 能与 TTL 和 CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来 处理的数据。 ULN2020 芯片如 图 24 所示: 图 24 ULN2020 芯片 ULN2020 芯片输入端 与控制系统 P1口连接,其连接方式如 表 22 所示 : 表 22 ULN2020 芯片输入端 与控制系统 P1 口键连接 1B 2B 3B 4B ULN2020 芯片输出端 与步进电机连接,其连接如 表 23 所示 : 表 23 ULN2020 芯片输出端 与步进电机连 接 1C 2C 3C 4C A+ A B+ B 167。 步进电机控制系统硬件电路图 (见附录 1) 毕业设计(论文) 14 第 3 章 步进电机控制系统软件设计 167。 步进电机控制系统应用流程图 167。 主流程图(见附录 2) 167。 升频流程图 图 31 升频流程图 毕业设计(论文) 15 167。 降频流程图 图 32 降频流程图 本文以 35BY48S03 步进电机为例,首先根据步进电机的特性设计一个数据区,再编写程序对此数据的的数据进行调试。 设计的最小启动频率为100HZ,在升频过程中每按一次升频键,步进 电机升频后匀速运行,这样易于发现因数据区的数据不合理而导致电机出现失步的状况。 降频阶段可采用 毕业设计(论文) 16 升频区的数据进行反指数降频。 167。 走一步子程序流程图 图 33 走一步子程序流程图 167。 步进电机数据区设计 步进电机带负载时的运行频率低于起动频率时,步进电机能以运行频率直接起动,并以该频率连续运行。 需要停止的时候,可以从运行频率直接降到零速。 而当步进电机的运行频率为负载启动频率或负载过大时,易出现丢步或堵转的现象;停止时频率过高, 又 易出现过冲的现象,造成位置精度降低。 因此,需要对步进电机采用 升降频控制,以使电机从启动频率 中 或者低于启动频率的某个合适的值(此值与负载和步进驱动有关)开始 启动 ,逐渐加速升到运行频率然后进入匀速运行。 最后的降频可以看作是升频的逆过程。 采用 51 系列单片机进行升降频控制时,设单片机的晶振频率 12MHZ, 经过 升 频达到目标频率,在升频 的 第 n 个台阶 的频率为 F(n)。 设定 定时器工作设置 在方式 1。 为了达到精确定位的目的, 在 编程时,将频率 F(n)的保持时 毕业设计(论文) 17 间换算为步数,并对步数 Z(n)进行计数。 每次计满时,定时器重装下一频率的初值。 开始下一次升降频。 以 AT89C51 单片机,频率 100HZ 为例,进行数据区设计。 如图 34 所示,我们设频率最高升至 1000HZ,用时为 5S,依此确定纵坐标每一小格所对应的频率,横坐标每一小格对应的时间。 图 34 升频曲线 当频率为 100HZ 时,对应横坐标时间为: T=(10/60)*5= 两步之间定时时间 t0 (μ s)为: t0=f1=1001 =( s) =10000( μ s) 步数为: BC=T/ t0 =以此方法可以得到如表 31 所示的 升频数据区: 毕业设计(论文) 18 表 31 升频数据区 频率 步数 频率 步数 100 83 420 140 130 108 520 130 180 120 650 150 230 115 850 200 290 145 1000 100 350 145 以升频曲线的反指数曲线可以得到如表 32 所示的 降频数据区 表 32 降频数据区 频率 步数 频率 步数 1000 750 680 230 970 725 580 150 920 700 450 140 870 435 250 60 810 405 100 10 750 310 AT89C51 有两个定时 /计数器,本系统选用 T1 作为定时器使用。 T1 的模式存放在模式控制寄存器 TMOD 中( T1 作为 16 位定时器,为模式 1) 方式字为: 10H 模式 1中,定时器寄存器 TH1 和 TL1是以全 16 位参与操作,作为计数器使用,计数输入信号内部时钟脉冲,每个机器周期使寄存器值增 1,当计数值由全 1 再增 1 变为全 0 时,便 TF1 置 1 请求中断。 定时常数为: 计数器 方式 定时器方式 选通位 工作模式 控制位 毕业设计(论文) 19 t0(H)=65536[ t0/(t’ 0*C)]=60536 167。 程序源代码 系统详细设 计程序如下: 文件: include include define uint unsigned int define uchar unsigned char //引脚定义 sbit Start=P0^0。 sbit SpeedUp=P0^1。 sbit SpeedDown=P0^2。 sbit Stop=P0^3。 sbit AP=P1^0。 sbit AN=P1^1。 sbit BP=P1^2。 sbit BN=P1^3。 //定时器 T1 溢出延时 void T1_Delay(uint temp)。 //以指定频率运行 void MotRun(uint F)。 //停止电机 void MotStop(void)。 //_stepmot_h_ // 文件 //定时器 T1 溢出延时函数 void T1_delay(uint temp) { 毕业设计(论文) 20 uint t。 t=65536temp。 TMOD=0X20。 TH1=(uchar)(t8)。 TL1=tamp。 0xff。 TR1=1。 while(TF1!=1)。 TF1=0。 TR1=0。 return。 } //以指定频率运行函数 void MotRun(uint F) {uint t。 t=500000/F。 AP=1。 AN=0。 BP=0。 BN=0。 T1_delay(t)。 AP=0。 AN=1。 BP=0。 BN=0。 T1_delay(t)。 AP=0。 AN=0。 BP=1。 毕业设计(论文) 21 BN=0。 T1_delay(t)。 AP=0。 AN=0。 BP=0。 BN=1。 T1_delay(t)。 AP=0。 AN=0。 BP=0。 BN=0。 Return。 } //停止电机函数 void Motstop(void) { AP=0。 AN=0。 BP=0。 BN=0。 return。 } // 文件 uint F。 void InitIO() { Start=1。 SpeedUp=1。 毕业设计(论文) 22 SpeedDown=1。 Stop=1。 AP=0。 AN=0。 BP=0。 BN=0。 } void main() { InitIO()。 F=100。 while(1) { while(Start!=0amp。 Stop=0)。 MotRun(F)。 //升频 if((!SpeedUp)amp。 (F1000)) { uint i, j, bc, a[]={100, 130, 180, 230, 290, 350, 420, 520, 650, 850, 1000}, b[]={83, 108, 120, 115, 145, 145, 140, 130, 150, 200, 100}。 for(i=0。 i12。 i++) { F=a[i]。 bc=b[i]。 for(j=bc。 j0。 j) MotRun(F)。 } 毕业设计(论文) 23 } //降频 if((!SpeedDown)amp。 (F0)) { uint c[]={1000, 970, 920, 870, 810, 750, 680, 580, 450, 250, 100}, d[]={750, 725, 700, 425, 405, 310, 230, 150, 140, 60, 10}。 uint i, j, bc。 for(i=0。 i12。 i++) { F=c[i]。 bc=d[i]。 for(j=bc。 j0。 j) MotRun(F)。 } } //停止 if(!Stop) { while(F10) { F=100。 MotRun(F)。 } MotStop()。 } } } 毕业设计(论文) 24 结 论 本文主要论述了如何使用单片机实现步进电机的升降频控制。 硬件设计由于每个电机及负载的机械特性不同,所以它不能很好的与所有电机适配。 而且随着系统使用时间越来越长,元器件会发生变值。 本文采用程序的方法来实现升降频控制,克服了硬件设计那些不能灵活变动和元器件容易变值的缺点。 在系统设计中我们采用了 AT89C51 现在工业控制系统中广泛使用的芯片,整个控制电路设计简单易行,运行可靠,改动也很方便,而且可以降低运行成本。 在程序设计上,本文采用了指数曲线的控制方式控制电机的升降频。 程序可用于调试步进电机升降频的数据 区,在步进电机的性能检测、机械特性检测上都有一定的用途,也可为数控系统提供一些数据。 实践证明,在大功率步进电机控制中,采用指数曲线控制方法能有效的减少电机启动所用的时间,且能保证力矩最大,在很大程度提高了电机的工作效率。 由于本人经验尚浅,各方面的知识还不是。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。