单片机课程设计-步进电机驱动器_第1页
单片机课程设计-步进电机驱动器_第2页
单片机课程设计-步进电机驱动器_第3页
单片机课程设计-步进电机驱动器_第4页
单片机课程设计-步进电机驱动器_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE17单片机原理实训说明书题目:步进电机控制器学院:专业:学生姓名:学号:指导教师:2011年12月桂林电子科技大学实训说明书用纸摘要步进电动机是一种将电脉冲信号转换成角位移或线位移的精密执行元件,具有快速起动和停止的特点。其驱动速度和指令脉冲能严格同步,具有较高的重复定位精度,并能实现正反转和平滑速度调节。它的运行速度和步距不受电源电压波动及负载的影响,因而被广泛应用于数模转换、速度控制和位置控制系统。本文在分析了步进电机的驱动特性、斩波恒流细分驱动原理和混合式步进电机驱动芯片ULN2003AN的性能、结构的基础上,结合AT89C52单片机,设计出了混合式步进电机驱动电路。关键词:步进电机;AT89C52单片机;ULN2003AN驱动。AbstractSteppingmotorsisakindofwillconvertangulardisplacementorelectricalimpulsessignallinedisplacementofprecisionactuator,havefaststartandstopcharacteristics.Thedrivingspeedandinstructionspulsecanstrictlysynchronization,whichhashighrepositioningprecision,andcanrealizethepositive&negativeandsmoothadjustablespeed.Itsoperationspeedandstepdistancefromsupplyvoltagefluctuationandloadeffect,whichhavebeenwidelyappliedinanalog-to-digitalconversion,speedcontrolandthepositioncontrolsystem.Basedontheanalysisofthesteppermotordrivingcharacteristics,achopperconstant-currentsubdivideddrivingprincipleandhybridsteppingmotordrivechipULN2003ANtheperformance,structureinthefoundation,theunionAT89C52singlechipcomputer,designedahybridsteppingmotordrivercircuit.Keywords:Steppingmotor;AT89C52singlechipcomputer;ULN2003ANdriver.目录第1章步进电机的原理介绍 22.1步进电机的工作原理 32.2步进电机24BYJ48的相关电气参数 32.3步进电机的基本术语 42.3.1相数 42.3.2拍数 42.3.3步距角 42.3.4信号分配 4第2章总体设计思路 53.1方案与设计思路 53.2总框图 5第3章程序设计 54.1主程序 54.2LCD及档位显示程序 64.3正反转流程图 74.4启动与停止流程图 8第4章硬件设计 95.1硬件的设计与选取 95.1.1步进电机的驱动 95.1.2单片机的选取 105.1.3液晶LCD1602显示模块 105.1.4按键电路设计 115.1.5时针产生电路 115.2硬件的总体电路连接 12第5章调试与故障分析 136.1软件编写及调试 136.2调试过程及相关显示结果 146.3故障分析及解决方法 15第6章心得体会 15第7章参考文献 17附件 18系统原理图 19开发板实物图: 19元器件清单 19源程序清单 28第1章步进电机的原理介绍2.1步进电机的工作原理步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。本次设计是采用步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)其相序分配表如下:2.2步进电机24BYJ48的相关电气参数1.额定电压:12VDC(另有电压:5V、6V、24V)2.相数:43.减速比:1/64(另有减速比:1/16、1/32)4.步距角:5.625°/645.驱动方式:4相8拍6.直流电阻:200Ω±7%(25℃7.空载牵入频率:≥600Hz8.空载牵出频率:≥1000Hz9.牵入转矩:≥34.3mN.m(120Hz)10.自定位转矩:≥34.3mN.m11.绝缘电阻:>10MΩ(500V)12.绝缘介电强度:600VAC/1mA/1S13.绝缘等级:A14.温升:<50K(120Hz)15.噪音:<40dB(120Hz)16.重量:大约40g17.未注公差按:GB1804-m18.转向:CCW2.3步进电机的基本术语2.3.1相数产生不同对极N、S磁场的激磁线圈对数,常用m表示。2.3.2拍数完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,比如说本次设计中使用的24BYJ48有单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)2.3.3步距角对应一个脉冲信号,电机转子转过的角位移用θ表示。θ=360度(转子齿数J*运行拍数),以常规二相,转子齿为50齿电机为例。四拍运行时步距角为θ=360度/(50*4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50*8)=0.9度(俗称半步)。2.3.4信号分配四相步进电机按照其通电方式的不同,可以分为单四拍,双四拍和双八拍三种工作方式。单四拍与双四拍的步距角相等,均为11.25度,而八拍的步距角则是单四拍与双四拍的一半,5.625度。单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)。这里选取的是双相八拍的工作方式。第3章总体设计思路3.1方案与设计思路因为步进电机的控制是通过脉冲信号来控制的,将电脉冲信号转变为角位移或线位移的开环控制元件。所以怎样产生这个脉冲信号和产生怎样的信号是电机控制的关键。用单片机来产生这个脉冲信号,通过单片机的P1口输出脉冲信号,因为所选电机是四相的,所以只需要P1口的低四位P1.0~P1.3分别接到电机的四根电线上。定时器定时来调整电机的转速,通过键盘的按钮,就可以改变定时初值从而改变了电机的转速,单片机上P3.2~P3.5连的是按键,这里键盘上的K1键为启动与停止键,K2键为减速键,K3键为加速键,K4键为方向转换键。P0以及P2.0~P2.2口接LCD1602,可以显示当前的电机转速、运行状态、运行方向和档位。具体结构见3-1框图。3.2总框图图3-1总体设计方框图第4章程序设计4.1主程序进入主程序,首先是对LCD进行初始化,然后依次进行键盘扫描,调用步进电机相关数据显示子函数,若检测到有键按下,则进去相应的处理。流程图如下图4-1:4-1图主程序流程图4.2LCD及档位显示程序此次设计使用1602液晶显示步进电机运行状态,其效果比用数码管显示要更加明了,也更容易读取相关状态和数据。液晶上显示有电机运行的状态(RUNNING或STOP)、当前档位(DW)、运行方向("<<"或">>")以及其运转速度(r/min)。其显示原理如下图4-2:图4-2液晶显示流程图4.3正反转流程图步进电机的正反转用K4控制,初始化电机为顺时针转,即“》”,每当按下K4键,电机转向改变,具体流程图如下图4-3:4.4启动与停止流程图启动与停止是用K1键来控制的,初始化标志位on_off==0,档按下K1,即将on_off置1,每当按下k1,都将在启动与停止间切换,具体流程图如下图4-4:图4-4启动与停止流程图第5章硬件设计5.1硬件的设计与选取5.1.1步进电机的驱动步进电机的驱动采用ULN2003,接到单片机的P1.0~P1.3,具体如图5-1:图5-1步进电机驱动及其接口图5.1.2单片机的选取目前市面上的通用型单片机种类很多,且适合不同应用场合的新产品不断出现,但目前的应用状况,以8位中档MCS-51系列单片机的应用最为普遍。基于这次课程设计的要求不高,我们可以选用51系列或52系列单片机,其有可靠性高,易于扩展以及实用性好等特点,完全可以满足我们的控制要求。其图如下5-2:图5-2AT89C52单片机5.1.3液晶LCD1602显示模块P0接液晶的数据传送口,P2.0~P2.2接液晶的控制端口。其接线图如下图5-3:图5-3液晶与单片机接口原理图5.1.4按键电路设计键盘接口按不同标准有不同分类方法,按键盘排布,可以分为独立方式(一组相互独立的键盘)和矩阵(一行列组成矩阵)方式。此次设计只用到了四个按键,故可采用独立按键,P3.2~P3.5分别接到K1~K4。其原理图如下图5-4:图5-4按键与单片机接口原理图5.1.5时针产生电路时针电路部分晶振为11.0592MHz,其原理图如下:图5-4时针电路5.2硬件的总体电路连接图5-5总体原理图第6章调试与故障分析6.1软件编写及调试此次编程及调试是用keil软件进行的,程序的编写及调试步骤如下:根据步进电机24BYJ48的相序,编好正反转相序表,这个是关键,不能编错。2.定义各个变量及相关液晶显示符:ucharcodecdis0[]={"WELCOMETO"};ucharcodecdis1[]={"STEPPINGMOTOR"};ucharcodecdis2[]={"CONTROLSYSTEM"};ucharcodecdis3[]={"STOP"};ucharcodecdis4[]={"DW:"};ucharcodecdis5[]={"RUNNING"};ucharcodecdis6[]={"r/min"};定义各个按键:sbitK1=P3^2;//运行与停止sbitK2=P3^3;//加速sbitK3=P3^4;//减速sbitK4=P3^5;//方向转换sbitBEEP=P3^6;//蜂鸣器编写各个子程序。编写主程序,进入主程序即开始进行键盘扫描及调用液晶显示。定时器T0的中断服务程序,进入中断,若满足条件,即向步进电机送8个脉冲。6.2调试过程及相关显示结果将程序下载到单片机中,LCD初始化显示如下:之后进入步进电机初始化的画面显示,电机运行状态显示为STOP,档位为5档,开机转速为2.66r/min,如下:实物图如下:按下启动键K1后,转向显示出显示"》",即电机顺时针转,显示如下:按K2键一次,档位加一,高位档为10档,此时对应电机转速为最慢,为1.33r/min,如下图:实物图显示如下:按下K3键一次,档位减一,低位档为1档,也是电机转速最快的档,为13.32r/min,显示效果如下图:实物图显示如下:6.3故障分析及解决方法故障一:首先在设计总体方案时,思路上出现了一些问题,我首先是想在中断里完成许多应在中断之外完成的事,经过老师的指点,后来想清楚了。只在中断中给电机送相序码,并设定了一个参数对电机的转速进行调控。故障二:由于编写程序的经验不多,在计算电机转速,并将其显示在液晶时,遇到了一些问题,速度转换公式是找出来了,但怎样将其小数点表示出来,困惑了好久,最后还是请教了同学,才搞定。故障三:在仿真时首先液晶没有接上拉电阻,液晶上显示不出来,我以为是程序方面出了问题,后来尝试接了上拉电阻,就能够正常显示了。第7章心得体会为期两周的单片机课程设计在忙碌中已接近尾声,经过这么多天的努力,终于完成了这次课程设计基本设计要求,在充实中也学到了很多知识,是真正将所学知识运用于实践中的一次很好的体验,使人受益匪浅。由于此次控制要求不是很高,选用51系列或52系列完全能够满足设计需求,最后选用的STC89C52。接下来就是硬件接口分配问题和如何去驱动电机。对于步进电机之前没有什么接触,所以我上网查了许多关于步进电机的资料,知道了其基本工作原理以及怎么去实现其控制运转和驱动。接下来的主要问题就是如何编程去实现控制它了,这次程序的编写和调试对我来说是个不小的挑战,因为之前只编写过一些简短的小程序,对较大的程序总体性方面还不能很好的把握。经过反复的尝试和调试,用发现一个问题,解决一个问题的方法,还参考了一些别人的经验方法,完成了程序的编写。这对我以后编写程序是一次很好的经验积累。仿真时也出了一些小问题,首先LCD完全没有显示,我就尝试接上拉电阻,结果就能正常工作了。然后是电机也不转,最后我把送进去的脉冲频率减小,才使得电机运转起来,这个仿真过程又使我更加熟练了Proteus软件的用法。这次课程设计使我认识到,刚学好书上的知识还是不够的,更重要的是我们要能将所学的知识运用到实践中来,这才是我们学习知识的最基本的要求,所以在以后的学习生活中,我们应该更加注意将学习与实践相结合,在实践中去运用好所学知识,更进一步深化和理解所学知识,达到学以致用。通过这次课程设计,我也了解到了自己的不足,以前自己学习单片机的时候,往往只去看懂别人写的程序,以为看懂了自己就知道写了,但事实并不是这样,虽然这次课程设计程序是完成了,但棘手的地方很多,编程并不像以前认为的简单。所以在以后的学习中,不能手高眼低,一定要脚踏实地,一步步地走,自己动手去做,这样才能将知识真正学到手。这次课程设计能得以顺利完成,还要感谢符强老师的指导和同学们的帮助,在老师指导和同学的帮助下,很多问题问题都很好地解决了。总之,虽然只是短短两周的时间,但也学到了很多,感受很深,是一次很好的经验积累和设计经历。第8章参考文献[1]王迎旭.《单片机原理及及应用》.北京:机械工业出版社[2]张迎新.《单片微型计算机原理、应用及接口技术》.北京:国防工业出版社[3]郭天祥.《新概念51单片机C语言教程》.北京:电子工业出版社[4]蔡明文冯先成编著.《单片机课程设计》.北京:华中科技大学出版社[5]王晓明.《电动机的单片机控制》.北京航空航天大学出版社附件系统原理图元器件清单单片机开发板1块STC89C521片LCD16021块ULN20031个步进电机1个源程序清单#include<reg51.h>//51芯片管脚定义头文件#include<intrins.h>//内部包含延时函数_nop_();#defineucharunsignedchar#defineuintunsignedint#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};ucharcodeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};//正转相序编码表ucharcodeREV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};//反转相序编码表sbitK1=P3^2;//运行与停止sbitK2=P3^3;//加速sbitK3=P3^4;//减速sbitK4=P3^5;//方向转换sbitBEEP=P3^6;//蜂鸣器sbitLCD_RS=P2^0;sbitLCD_RW=P2^1;sbitLCD_EN=P2^2;biton_off=0;//运行与停止标志bitdirection=1;//方向标志ucharcodecdis0[]={"WELCOMETO"};ucharcodecdis1[]={"STEPPINGMOTOR"};ucharcodecdis2[]={"CONTROLSYSTEM"};ucharcodecdis3[]={"STOP"};ucharcodecdis4[]={"DW:"};ucharcodecdis5[]={"RUNNING"};ucharcodecdis6[]={"r/min"};ucharcodecdis7[]={"RATE:"};ucharm,v=0,q=0,j;ucharrate=5;//预设定速度档uchardata_temP1,data_temp2,data_temp3,data_temp4;uintzs,data_temp;/*****************************************************/voiddelay(uintt)//延时t毫秒函数{uchark;while(t--){for(k=0;k<125;k++){}}}/********************************************************/voiddelayB(ucharx)//x*0.14MS{uchari;while(x--){for(i=0;i<13;i++){}}}/********************************************************/voidbeep() //蜂鸣器{ucharj;for(j=0;j<100;j++){delayB(4);BEEP=!BEEP;//BEEP取反}BEEP=1;//关闭蜂鸣器delay(170);}/********************************************************/bitlcd_busy()//检查LCD是否为忙状态,lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。{bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();result=(bit)(P0&0x80);LCD_EN=0;return(result);}/********************************************************/voidlcd_wcmd(ucharcmd)//写指令数据到LCD,*RS=L,RW=L,E=高脉冲,D0-D7=指令码。{while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/********************************************************/voidlcd_wdat(uchardat)//写显示数据到LCD,RS=H,RW=L,E=高脉冲,D0-D7=数据。{while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/********************************************************/voidlcd_init()//LCD初始化设定{delay(30);lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x0c);//显示开,关光标delay(5);lcd_wcmd(0x06);//移动光标delay(5);lcd_wcmd(0x01);//清除LCD的显示内容delay(5);}/********************************************************/voidlcd_pos(ucharpos)//设定显示位置{lcd_wcmd(pos|0x80);//数据指针=80+地址变量}/********************************************************/voidLCD_init_DIS()//LCD1602初始显示子程序{delay(10);//延时lcd_init();//初始化LCD lcd_pos(0);//设置显示位置为第一行的第1个字符m=0;while(cdis0[m]!='\0'){//显示字符WELCOMElcd_wdat(cdis0[m]);m++;} delay(2000); lcd_wcmd(0x01); //清屏 delay(5); //清屏以后的这个延时不能少,给LCD一定的缓冲,否则下一条指令不一定被执行lcd_pos(0x10);//设置显示位置为第一行的第17个地址m=0;while(cdis1[m]!='\0'){//显示字符lcd_wdat(cdis1[m]);m++;}lcd_pos(0x50);//设置显示位置为第二行第1个字符m=0;while(cdis2[m]!='\0'){lcd_wdat(cdis2[m]);//显示字符m++;} for(j=0;j<16;j++) { lcd_wcmd(0x18); delay(300); }delay(3000);//延时lcd_wcmd(0x01); //清屏 lcd_pos(0x00);//设置显示位置为第一行的第1个字符m=0;while(cdis3[m]!='\0'){//显示字符STOPlcd_wdat(cdis3[m]);m++;}lcd_pos(0x08);//设置显示位置为第一行第9个字符m=0;while(cdis4[m]!='\0'){lcd_wdat(cdis4[m]);//显示字符DWm++;}for(m=0;m<2;m++){lcd_pos(0x0e+m);//显示方向符号lcd_wdat(0x2d);} lcd_pos(0x47); //显示小数点lcd_wdat(0x2e);m=0; lcd_pos(0x4a); //显示字符r/minwhile(cdis6[m]!='\0'){lcd_wdat(cdis6[m]);m++;} m=0; lcd_pos(0x40); //显示字符RATE:while(cdis7[m]!='\0'){lcd_wdat(cdis7[m]);m++;}}/********************************************************/voiddata_conv()//档位数据转换子程序{data_temP1=data_temp/10;//高位if(data_temP1==0){ data_temP1=0x20; //高位为0不显示 }else{data_temP1=data_temP1+0x30; }data_temp2=data_temp%10;//低位data_temp2=data_temp2+0x30;}/********************************************************/voiddata_conv1()//转速数据转换子程序{data_temP1=data_temp/1000; //整数位第一位 if(data_temP1==0){ data_temP1=0x20; //高位为0不显示 }else{data_temP1=data_temP1+0x30; }data_temp2=data_temp%1000/100;//整数位第2位data_temp2=data_temp2+0x30;data_temp3=data_temp%100/10; //小数位第一位 data_temp3=data_temp3+0x30; data_temp4=data_temp%10; //小数位第二位 data_temp4=data_temp4+0x30;}/********************************************************/voiddata_dis()//数据显示子程序{data_temp=rate;//显示档位data_conv();lcd_pos(0x0b);lcd_wdat(data_temP1);lcd_pos(0x0c);lcd_wdat(data_temp2); zs=1332/rate; //转速换算公式:zs=13.32/rate; data_temp=zs; //显示转速 data_conv1(); lcd_pos(0x45);lcd_wdat(data_temP1); lcd_pos(0x46);lcd_wdat(data_temp2); lcd_pos(0x48);lcd_wdat(data_temp3); lcd_pos(0x49);lcd_wdat(data_temp4);}/********************************************************/voidmotor_DR()//显示运行方向符号{if(direction==1)//正转方向标志{for(m=0;m<2;m++){lcd_pos(0x0e+m);//显示方向符号lcd_wdat(0x3e); //显示>>号}}else{for(m=0;m<2;m++)//反转方向标志{lcd_pos(0x0e+m);//显示方向符号lcd_wdat(0x3c);//显示<<号}}}/********************************************************/voidmotor_RUN()//显示运行状态{if(on_off==1){TR0=1;lcd_pos(0);//设置显示位置为第一行的第1个字符m=0;while(cdis5[m]!='\0'){lcd_wdat(cdis5[m]);//RUNNINGm++;}motor_DR();}else{TR0=0;P1=0x0f;lcd_pos(0);//设置显示位

温馨提示

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

评论

0/150

提交评论