步进电机实验报告.doc_第1页
步进电机实验报告.doc_第2页
步进电机实验报告.doc_第3页
步进电机实验报告.doc_第4页
步进电机实验报告.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机实验 课程名称:步进电机表实验授课班级:2010级自动化三班任课教师:文远熔计划学时:32学时实验组员:张藤耀 赵福亮 王聪慧 秦菱蔚 梁钦 郑欢 目 录摘要第一章 概述.1.1实验目的 1.2实验要求1.3步进电机的介绍1.4 研究思路第二章 硬件设计. 2.1 51单片机介绍 2.2 UIN2003A2.3 ZLG7290 2.3.1 7290工作原理 2.3.2 7290引脚图第三章 相关图像. 3.1 总电路图 3.2 7290控制数码管 3.3 程序流程图 3.3.1 控制框图 3.3.2 流程图第四章 调试第五章 心得体会 附录【一】 系统程序附录【二】 参考文献.【摘要】:步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。本课程设计的内容是利用51单片机,达到控制步进电机的启动、停止、正转、反转、点动和状态显示的目的,使步进电机控制更加灵活。步进电机驱动芯片采用UIN2003,具有大电流、高电压,外电路简单等优点。利用四位数码管(ZLG7290)增设电机状态显示功能,各项数据更直观。实测结果表明,该控制系统达到了设计的要求。【关键词】:单片机 步进电机 UIN2003 ZLG7290 数码管第一章 概述1.1实验目的1、单片机对步进电机控制可以熟悉步进电机的原理和应用。2、单片机对步进电机控制可以熟悉单哦就功能已经原理、构造。3、通过这次实验能运用所学基本理论知识、专业技能来对问题进行分析,思考,解决,提高对专业知识的掌握以及锻炼逻辑思维能力。1.2实验要求实现步进电机按规定的速度正转、反转,转过指定的角度,要有点动功能。所有命令通过键盘输入,步进电机在运行过程中要有状态和数据指示。1.3步进电机的介绍步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器虽然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机,交流电机 在常规下使用。它必须由双环形脉冲信号、功率 驱动电路等组成控制系统方可使用。因此用好步进 电机 却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。步进电机作为 执行元件 ,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的 目的 ;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。图1 步进电机剖面图1.4研究思路1、了解单片机本身内部应有的资源,如:中断、定时器、计数器、IO的使用。2、了解步进电机的工作原理和作用。3、根据步进电机的原理,分析并分配单片机内部资源,并根据单片机的资源,来实现硬件电路的设计以及软件程序的编写。4、对于自己不熟悉的东西,查阅资料。5、在设计好单片机步进电机时,要学会分析电路中出现的问题,并好好总结。第二章 硬件设计2.1 单片机的简介单片机是续计算机出现之后,并随着电器时代大到来,人们借助电气技术想实现了自动控制机械,自动生 产线甚至自动工厂,但依靠计算机去完成每一个自动的过程,反而有些复杂以及资源的乱费;所以用更方便,更微小,更智能的微型处理器来处理工业现场的测控领域,控制领域,有着重大意义;更何况目前,彩电,冰箱,空调,录像机,VCD,遥 控器,游戏机,电饭煲等无处不见单片机的影子,所以单片机将会更满足我们的生活,会更取代大型的计算机。现在单片机主要按用途,大体上可分为两大类: 1-通用型单片机 2-专用型单片机 专用型单片机是指用途比较专一,出厂时程序已经一次性固化好, 不能再修该的单片机。例如电子表里的单片机就是其中的一种。 其生产成本很低。 通用型单片机的用途很广泛,使用不同的接口电路及编制不同的应 用程序就可完成不同的功能。小到家用电器仪器仪表,大到机器设 备和整套生产线都可用单片机来实现自动化控制。 2.2 UIN2003本文选用ULN2003构成步进电机的驱动电路,下面但见介绍下ULN2003的结构和特点:ULN2003 是高耐压、大电流达林顿陈列,由七个硅NPN 达林顿管组成。该电路的特点如下:ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。ULN2003方框图如图2所示。图2 ULN2003内部方框图利用ULN2003以及AT89C54RD设计的步进电机驱动电路如图3所示。2.3 ZLG72902.3.1 7290工作原理ZLG7290的核心是一块ZLG7290B芯片,它采用I2C接口,能直接驱动8位共阴式数码管,同时可扫描管理多达64只按键,实现人机对话的功能资源十分丰富。除具有自动消除抖动功能外,它还具有段闪烁、段点亮、段熄灭、功能键、连击键计数等强大功能,并可提供10种数字和21种字母的译码显示功能,用户可以直接向显示缓存写入显示数据,而且无需外接元件即可直接驱动数码管,还可扩展驱动电压和电流。此外,ZLG7290B的电路简单,使用也很方便。用户按下某个键时,ZLG7290的INT引脚会产生一个低电平的中断请求信号,读取键值后,中断信号就会自动撤销。正常情况下,微控制器只需要判断INT引脚就可以得到键盘输入的信息。微控制器可通过两种方式得到用户的键盘输入信息。其一是中断方式,该方式的优点是抗干扰能力强,缺点是要占用微控制器的一个外部中断源。其二是查询方式,即通过不断查询INT引脚来判断是否有键按下,该方式可以节省微控制器的一根IO口线,但是代价是I2C总线处于频繁的活动状态,消耗电流多并且不利于抗干扰。2.3.2 7290引脚图 图3 7290引脚图第三章 相关图像3.1 总体电路图3.2 7290控制数码管3.3 程序流程图3.3.1控制框图按键控制单片机80C51ZLG7290驱动芯片ULN2003A驱动芯片共阴极数码管步进电机3.3.2 流程图Key_step_subKey_step_add否是否是否是Key_Con_SetKey_speed_addKey_StepKey_stopKey_RunZLG7290库函数读取键值键值KeyDispDir();显示方向run=1启动电机增加speed_num减小speed_numstep_num减少step_num增加OneStep()run=0显示正转FKey_dirKey_speed_subdirection = 0?显示反转BOnContinue();电机停转显示Pcontinuous=0?连续速度运行指定步数运行step_num=0run=0停转否step_num-DispStepNum(step_num);更新显示步数Key_stop有效是speed_num调速DispSpeed();显示速度OneStep()OneStep()单步,点动DispStepNum()显示运行步数开始系统初始化循环检测按键有键按下按键中断服务程序第四章 调试 1、 按照实验原理图连接好电路图。2、 根据原理图编写程序。 3、 电路上电,调试程序,观察并控制电机使其按照预期的行为工作。 4、 当电机可以通过按键控制其正转加减速、反转加减速程序、点动后,调试结束。5、 优化程序,整理实验结果。 总的来说,过程比较顺利,只是粗心之下,连线出现了错误,对于此,我进行了深刻的自我检讨和批评。在经过老师的知道后,我们终于实现了实验要求的功能,能实现正反转,快慢变化及点动等。第五章 收获体会首先是关于课题的选择,开始是准备做一个万年历,经过查看资料后发现计算机的过程实现比较的复杂,而这次的课程设计时间比较短,故放弃了这个想法。经过各种筛选,最后决定做步进电机的相关设计,起初看着指导书上的内容觉得实现步进电机是比较的简单的,但当我真正开始设计之后才发现并没有想像中那么的简单。这学期的微机课和单片机课没怎么学好,故感觉在做这个设计时有点困难,比如汇编程序。后来决定用c来编写程序,这样稍微轻松点,在设计程序中涉及到了中断程序的编写,发现已学的理论知识完全用不上来,也许这就是理论脱离时间的结果,在期间恶补了单片机的中断知识及其相应的程序编写。通过这次课程设计实验,我对步进电机调速控制系统有了实际的了解和认识,提高了动手能力。本次实验把书本上、课堂上学到的知识灵活地运用到实际的实物上,感觉是对学以致用的一种锻炼和考验提高了用所学知识解决实际问题的能力,加深和巩固的对知识的理解和掌握。控制电路、驱动电路、测速反馈电路、步进电机几个模块的整合,也实际中提高了自己对系统的认识,有了些整体的概念和思维观。 实验是团队合作完成的,从设计电路到设计软件,然后仿真到做硬件做出符合要求的控制系统,不仅从实际中锻炼了动手能力而且学会了团队合作,互相学习,提高自己。这次的课程设计总的感觉就是很累,但在不断的学习机实践当中学到了很多东西,知识的提高那是最基础的,中断,电路工作及相关的知识都是得到了提升;然后就是个人处理问题能力的提高,虽然说这次的设计不算一个大的项目,但也算是小的雏形,课题的选择,前期的准备,理论的实践,知识的提高,处理实际问题及后期的总结归纳。付出去收获往往是成正比的,这次的课程设计中得到了充分的体现。总的来说,这次设计的步进电机控制电路还是比较成功的在设计中遇到了很多问题,最后在自己的思考下,宿舍大家一起经过激烈的探讨下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识。同时,对未来有了更多的信心。最后,对文老师表示忠心的感谢,老师,你辛苦了。附录【一】 系统程序主程序:/* 基于51单片机的异步电机控制程序*/#include#include VIIC_C51.H#include ZLG7290.h#define uchar unsigned char#define uint unsigned int/*四相步进电动机单、双八拍运行状态表111111100FEHA111111000FCHAB111111010FDHB111110010F9HBC111110110FBHC111100110F3HCD111101110F7HD111101100F6HDA*/sbit PA=P10; /P1控制电机sbit PB=P11;sbit PC=P12;sbit PD=P13;sbit RST=P14;sbit KEY_INT=P32; /看是否更改为P32sbit SCL=P16;sbit SDA=P17;uchar code step_tab9=0xff,0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6;uint code delaytime4 = 60,40,20,10;/延时时间列表/变量的定义uchar direction;/状态变量0正向,1反向uchar continuous; /状态变量0指定步数运行,1连续速度运行uchar run; /状态变量0电机未运行,1电机运行中uchar speed_num; /连续速度运行标号1-4uchar cur_step; /八拍运行状态uchar step_num; /指定运行的步数,范围0-99/键值定义#define Key_dir1 /方向键#define Key_Run2 /启动键#define Key_stop 3 /停止键#define Ket_Step 4 /单步运行键#define Key_step_add 5/步数加键#define Key_step_sub 6/步数减键#define Key_speed_add 7/速度加键#define Key_speed_sub 8/速度减键#define Key_Con_Set9/连续运行与指定步数运行切换键。/定义键盘中断标志,FlagINT0=1 表示有键按下volatile bit FlagINT0 = 0;void KeyProsess( uchar key );/*函数:INT0_SVC()功能:ZLG7290 键盘中断服务程序说明:中断触发方式选择负边沿触发,因此不必等待中断请求信号恢复为高电平*/void INT0_SVC() interrupt 0unsigned char KeyValue;/读取键值KeyValue=ZLG7290_GetKey();/处理键值KeyProsess(KeyValue);/*函数:Delay()功能:定时器实现延时tms*/void Delay(unsigned int t)do/TH64536TH1 = 0xFC;TL1 = 0x18;TR1 = 1; /启动定时器T1并等待中断while ( !TF1 );TF1 = 0; /中断请求标致清零TR1 = 0; /停止T1定时器 while (-t);/*函数:DispDir()功能:显示方向子程序说明:dat 0 正向,1反向*/void DispDir(uchar dat)if(dat = 0)ZLG7290_SendCmd(0x60+7,0x0f); /F 表示正转elseZLG7290_SendCmd(0x60+7,0x0b); /B表示反转/*函数:DispSpeed()功能:显示速度号子程序说明:dat 14 代表四种不同的速度*/void DispSpeed(uchar dat)ZLG7290_SendCmd(0x60+5,dat);/*函数:DispStepNum()功能:显示运行步数号程序说明:间接实现转过指定角度=步距角*步数 */void DispStepNum(uchar dat)unsigned char d;d = dat / 10;ZLG7290_SendCmd(0x60+1,d);d = dat - d * 10;ZLG7290_SendCmd(0x60+0,d);/*函数:DispContinuous()功能:显示运行状态,连续还是指定步数说明:0指定步数运行,1连续速度运行*/void DispContinuous(uchar dat)if(dat = 0)ZLG7290_SendCmd(0x60+3,0x0d); /d表示指定步数运行状态elseZLG7290_SendCmd(0x60+3,0x0c); /C表示连续速度运行/*函数:OnStep()功能:实现单步运行*/void OneStep()if(direction = 0)/正向if(cur_step = 8)cur_step = 1;elsecur_step +;P1 = step_tabcur_step; /输出elseif(cur_step = 1)cur_step = 8;elsecur_step -;P1 = step_tabcur_step; /输出/*函数:OnContinue()功能:连续运行*/void OnContinue()if(continuous != 0)/连续运行while(run!=0)OneStep();Delay(delaytimespeed_num-1);/延迟 目的改变转速else/指定步数运行if(step_num != 0)OneStep();Delay(50); /50ms 延迟step_num-;DispStepNum(step_num); /更新显示步数 即显示剩下没有执行的步数if(run = 0) return; /若停止键按下,则停止elserun = 0;/停止return;/*函数:KeyProsess()功能:键值处理程序*/void KeyProsess( uchar key )switch(key)case Key_dir:/方向键if(run=0)if(direction = 0)direction =1;elsedirection = 0;DispDir(direction);break;case Key_Run:/启动键if(run =0)run =1;break;case Key_stop:/停止键if(run !=0)run =0;break;case Ket_Step:/单步运行键 实现点动功能if(run =0)run =1;OneStep();run =0;break;case Key_step_add:/步数加键 n=(步距角*60)/(360*t*0.001) 单位r/minif(run =0)if(step_num = 99)step_num = 0;elsestep_num +;DispStepNum(step_num);break;case Key_step_sub:/步数减键if(run =0)if(step_num = 0)step_num = 99;elsestep_num -;DispStepNum(step_num);break;case Key_speed_add:/速度加键if(run =0)if(speed_num = 4)speed_num = 1;elsespeed_num +;DispSpeed(speed_num);break;case Key_speed_sub:/速度减键if(run =0)if(speed_num = 1)speed_num = 4;elsespeed_num -;DispSpeed(speed_num);break;case Key_Con_Set:/连续运行与指定步数运行切换键。if(run =0)if(continuous = 0)continuous = 1;elsecontinuous = 0;DispContinuous(continuous);break;default:break;/*函数:SystemInit()功能:系统初始化*/void SystemInit()/初始化单片机TMOD = 0x11;/定时器设置,T0,T1方式1:16位定时器Delay(300); /延时300ms等待ZLG7290 复位完毕EA = 0;IT0 = 1; /INT0,负边沿触发中断EX0 = 1; /允许外部中断INT0FlagINT0 =0;EA = 1;/初始化步进电机控制器direction = 0;/状态变量0正向,1反向continuous =0;/状态变量0指定步数运行,1连续速度运行run = 1;/状态变量0电机未运行,1电机运行中speed_num =1;/连续速度运行标号1-4cur_step =0;/八拍运行状态step_num = 0;/指定运行的步数,范围0-99DispContinuous(continuous);DispStepNum( step_num);DispSpeed(speed_num );DispDir(direction );P1 = step_tabcur_step; /输出/* 主函数main()*/void main(void)SystemInit(); /系统初始化while(1) /循环检测按键状态if(run =1)OnContinue();库函数程序:/* VIIC_C51.C 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的与用户程序连接并扩展. 注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改.(本例是1us机器周期,即晶振频率要小于12MHZ)*/ #include /*头文件的包含*/#include #define uchar unsigned char /*宏定义*/#define uint unsigned int#define _Nop() _nop_() /*定义空指令*/* 常,变量定义区 */ /*端口位定义*/sbit SDA=P17; /*模拟I2C数据传送位*/sbit SCL=P16; /*模拟I2C时钟控制位*/ /*状态标志*/bit ack; /*应答标志位*/ /* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. */void Start_I2c() SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop();/* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. */void Stop_I2c() SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop();/* 字节数据传送函数 函数原型: void SendByte(uchar c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。*/void SendByte(uchar c) uchar BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /*要传送的数据长度为8位*/ if(cBitCnt)&0x80)SDA=1; /*判断发送位*/ else SDA=0; _Nop(); SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop(); _Nop(); /*保证时钟高电平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop();/* 字节数据传送函数 函数原型: uchar RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数。 */uchar RcvByte() uchar retc; uchar BitCnt; retc=0; SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop(); _Nop(); /*时钟低电平周期大于4.7s*/ _Nop(); _Nop(); _Nop(); SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc1; if(SDA=1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); return(retc);/* 应答子函数原型: void Ack_I2c(bit a); 功能:主控器进行应答信号,(可以是应答或非应答信号)*/void Ack_I2c(bit a) if(a=0)SDA=0; /*在此发出应答或非应答信号 */ else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /*时钟低电平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop(); /* 向无子地址器件发送字节数据函数 函数原型: bit ISendByte(uchar sla,ucahr c); 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla. 如果返回1表示操作成功,否则操作有误。注意: 使用前必须已结束总线。*/bit ISendByte(uchar sla,uchar c) Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack=0)return(0); SendByte(c); /*发送数据*/ if(ack=0)return(0); Stop_I2c(); /*结束总线*/ return(1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论