还剩13页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
电子赛培训课作品设计报告题目单片机控制步进电机姓名班别学号序号完成时间2012-5-17华南理工大学广州学院电子信息工程学院目录引言……………………………………………………………………1系统方案的选择和论证…………………………………………1总体设计…………………………………………………………2单元电路设计……………………………………………………3整体测试…………………………………………………………4结论………………………………………………………………5总结………………………………………………………………6参考文献…………………………………………………………6单片机控制步进电机摘要本设计采用一块AT89C52单片机对一个四相步进电机进行控制,使步进电机在安全温度内按输入的步数和转动的方向进行运行控制电机转动的方法采用四相八拍控制法本设计采用矩阵键盘实现步进电机不同转动步数的输入以及转向的控制,还有对键盘实现锁键和开锁的作用用DS18B20代替电机的测温系统,实现超温报警和停机的功能引言随着数字化技术发展,数字控制技术得到了广泛而深入的应用步进电机是一种将数字信号直接转换成角位移或线位移的控制驱动元件具有快速起动和停止的特点因为步进电动机组成的控制系统结构简单,价格低廉,性能上能满足工业控制的基本要求,所以广泛地应用于手工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机投影仪、数码摄像机、大型望远镜、卫星天线定位系统、医疗器件以及各种可控机械工具等等设计内容采用单片机控制一个三相单三拍的步进电机工作要实现的功能
一、步进电机的旋转方向由正反转控制信号控制;
二、步进电机的步数由键盘输入,可输入的步数分别为
3、
6、
9、
12、
15、
18、
21、24和27步,且键盘具有键盘锁功能,当键盘上锁时,步进电机不接受输入步数,也不会运转只有当键盘锁打开并输入步数时,步进电机才开始工作;
三、电机运转的时候有正转和反转指示灯指示;
四、电机在运转过程中,如果过热,则电机停止运转,同时红色指示灯亮,同时警报响本次设计的意义1了解51系列单片机及外围相关芯片、电路的工作原理和接口技术,学会进行控制系统软件程序设计2编制程序完成步进电机速度、方向、及旋转角度的控制3设计相关的硬件电路,软硬调试实现步进电机速度、方向、及旋转角度的控制,分析结果4学会运用“自动控制原理”、“现代控制理论”和“计算机控制技术”所学理论知识进行控制器的设计和计算机控制的算法实现为今后毕业设计、将来工作做必要的知识储备
一、系统方案选择和论证本设计由于需要实现9个不同步数的输入以及其它功能的输入,所以可以采用独立键盘和矩阵键盘,实现步进电机的步数由键盘输入且键盘具有键盘锁功能考虑到单片机的端口数量有限和编程和方便性,最后决定采用矩阵键盘在步进电机方面由于此次设计的软件采用proteus,在此软件中只有一个四相步进电机的模型,然后考虑到步进电机控制方法的难易度最后决定采用四相八拍控制法,由于单片机不能直接驱动步进电机,所以P2口在输出后接入ULN2803,ULN2803输出后接电机,通过此芯片放大控制电压在测温方面一开始打算用一个温度传感器开关去实时监测电机的温度,当温度过高的时候就断开开关;但考虑到系统的可操作性、准确性、编程的难易度及仿真软件的限制,最后决定采用DS18B20代替电机的测温系统,实现电机在运转过程中,如果过热,则电机停止运转,同时红色指示灯亮,同时警报响在转向方面用不同颜色的LED灯指示正转和反转当电机温度超过安全温度时,报警灯会闪烁和报警铃会鸣响,并让电机停止运转同时锁住键盘基于单片机和proteus的步进电机控制电路的基本组成如图2-1所示AT89C52单片机状态模块由P0口控制,负责报警和转向的指示步进电机模块,由P2口控制,控制电机的运行与停止工作测温模块,由P
3.3口进行控制,对电机的温度监测,使电机在安全温度内工作矩阵键盘模块,由P1口进行控制,输入想要的功能图2-1
二、总体设计否否开始DS18B20开始工作扫描键盘是否有键按下是实现相应的功能是否超出安全温度是报警灯闪,报警器响图2-2
三、单元电路设计
1、电机工作状态指示模块如图3-1所示图3-1功能指示单片机目前的工作状态,当电机的温度超出安全温度的时候,报警灯闪的同时,报警器也会响
2、单片机驱动电机模块(如图3-2)图3-2功能单片机输出的程序通过ULN2803电机驱动器给步进电机一个脉冲信号,使步进电机实现按输入步数正转与反转
3、电机温度监测模块(如图3-3)图3-3功能实时监测电机的温度,当电机超过安全温度时,单片机会发出警报并停止电机工作
4、键盘输入模块(如图3-4)图3-4功能通过预设使每一个键盘具有一个特定的功能,从而实现按设计要求控制电机的需求
四、整体测试
1、安全温度下电机正转(如图4-1)图4-1此时电机正转,正转指示灯亮,功能正常实现
2、安全温度下电机反转(如图4-2)图4-2此时电机反转,反转指示灯亮,功能正常实现
3、超出安全温度时电机停止工作并报警(如图5-1)图5-1此电机温度超出安全温度50,报警灯闪烁,报警器鸣响,键盘锁住禁止输入同时指示停机前电机转动的方向功能正常
4、当键盘锁住时键盘无法使用刚开机时,为防止出现事故,整个功能键盘是锁住的,只有解锁后才能对电机进行控制,在运行过程当中,当键盘锁住后,将保持停机前的状态,并禁止对电机进行操作其它功能还是正常运行结论是正常
五、结论经测试,整体电路工作正常,实现了要求的所有功能由于延时的原因,有些功能会出现一定的误差,比如有时按下键去的时候电机会没有反应,因为程序还没有执行到这里本设计有多个不足之处,比如电机在没有走完输入的步数之前是不能对电机进行其它的控制,就算此时电机已经超出了安全温度也不能及时的报警和停机由于延时的效果,使得电机在执行输入的相应的步数的时候会出现一点偏差,但是走的总步数是没有错的对此,我提出改进方案为,用定时器中断方式,每隔一断时间去检查,看电机是否已超出安全温度,这样就能及时的停机我还会增加一个紧急停机按钮,使得现场出现紧急情况的时候能实现紧急停机我还会再增加一个加速控制钮和一个减速控制钮,使电机在连续转动时能平稳的运行以及起步和停机对电路进行调整后,如果可以的话,还可以加上可视功能,显示电机现在走了几步,目前的温度如何
六、总结在此次设计中,由于是第一次接触步进电机,出于对步进电机的不了解,就在用多少拍控制电机方面我参考了网上不少资料以及不少相关的书籍,最后确定用八拍控制法最合适,四相八拍控制法被普遍认为是比较好用的一种控制方法刚开始不知道电机在转动的时候会有惯性效应,即如果在上一个脉冲控制下没有完全走完,但是下个脉冲已经过来了,这就会产生堵转和失步现象所以在执行程序的时候要增加一点延时在做足了所有的准备后,电机还是不能正确的转动,我曾经一步把注意力放在程序上,但是后来在参考一本资料的时候偶然发现其电机的接线图有所不同,这让我开始注意到,也许硬件电路的设计出了问题,果然在后来对硬件电路进行调整后,实现了预定的功能在实现了电机能合理的转动的情况下,我就把温度监测部分加进来但这不是简简单单的增加一个子函数的问题,它关系到整个程序的运行,使得整个程序都要做出相应的调整,这真的是牵一发而动全身同样一个变量我放在主函数里比较大小与放在子函数里比较都会有不一样的效果,一个能正确实现相应的功能,而另一个却不会这也让我在编程方面积累了一点经验当测温这一块加进来后,由于程序增加了不少,而且里面还有相当一部分的延时语句,所以,单片机对键盘的扫描就不再那么及时了,这就出现了有时按下键去却没反应的现象这是我以后要改进的地方
七、参考文献【图书文献】作者高洪志,《MCS-51单片机原理及应用技术教程》,北京,人民邮电出版社,2009年4月出版,第314~316页作者丁向荣,《STC系列增强型8051单片机》,北京,电子工业出版社,2011年1月出版,第289~290页作者周润景,《单片机电路设计、分析与制作》,北京,机械工业出版社,210年8月出版,第16~25页【网络文献】http://wenku.baidu.com/view/c5f8513331126edb6f1a10f
4.html2010-12-15基于单片机的步进电机控制系统汇编及C语言程序各一个http://wenku.baidu.com/view/5a3aa642a8956bec0975e3c
1.html2010-10-07基于单片机控制的步进电机___毕业论文附程序#includereg
52.h#includeintrins.h//包含_nop_函数定义的头文件#defineucharunsignedchar#defineuintunsignedintucharbeheavecount[]={0x000x010x030x020x060x040x0c0x080x09};ucharopbeheavecount[]={0x000x090x080x0c0x040x060x020x030x01};//ucharbeheavecount[]={0x000x010x030x020x060x040x0c0x080x09};ucharsteptemplocklock2iotimeflag;sbitDQ=P3^3;sbitwrong=P0^3;sbitwarning=P0^2;voidkeyscan;voiddelayuintz;voidbeheaveucharx;voidWriteuchardat;ucharRead;voidInit;voiddelaymsuinti;voidtempereture;voidmain{step=lock=lock2=0;i=1;o=0x00;P0=0x00;P2=0xff;P0=0x02;wrong=0;while1{warning=0;tempereture;ifflag==1{warning=0;keyscan;ifstep==30//锁键{step=0;lock=0;}ifstep==31//解锁{lock=1;step=0;}ifstep==32o==0x00//换正向{step=0;P0=0x02;lock=0;i=9-i;i++;ifi8i=1;i++;ifi8i=1;}ifstep==32o==0xff//换反向{step=0;P0=0x01;lock=0;i=9-i;i++;ifi8i=1;i++;ifi8i=1;}}ifflag==0{warning=1;delay200;wrong=~wrong;lock=0;}iflockstep0beheavestep;}}voidkeyscan//键盘处理函数{P1=0xfe;temp=P1;temp=temp0xf0;whiletemp!=0xf0//消除抖动{delay5;temp=P1;temp=temp0xf0;whiletemp!=0xf0{temp=P1;switchtemp//判断按下哪个键{case0xee:step=3;break;case0xde:step=6;break;case0xbe:step=9;break;case0x7e:step=12;break;}whiletemp!=0xf0//判断键是否已回位{temp=P1;temp=temp0xf0;}//lock=1;}}P1=0xfd;temp=P1;temp=temp0xf0;whiletemp!=0xf0{delay5;temp=P1;temp=temp0xf0;whiletemp!=0xf0{temp=P1;switchtemp{case0xed:step=15;break;case0xdd:step=18;break;case0xbd:step=21;break;case0x7d:step=24;break;}whiletemp!=0xf0//判断键是否已回位{temp=P1;temp=temp0xf0;}//lock=1;}}P1=0xfb;temp=P1;temp=temp0xf0;whiletemp!=0xf0{delay5;temp=P1;temp=temp0xf0;whiletemp!=0xf0{temp=P1;switchtemp{case0xeb:step=27;break;case0xdb:step=30;lock2=0;break;case0xbb:step=0;lock2=1;break;case0x7b:step=32;o=~o;break;}whiletemp!=0xf0//判断键是否已回位{temp=P1;temp=temp0xf0;}//lock=1;}}iflock2==0lock=0;elseiflock2==1lock=1;}voidbeheaveucharx//电机转动处理函数{uinty=0;//定义一个记录赋值次数的变量ifo==0xff{do{P2=opbeheavecount[i];ifi==8i=1;elsei++;y++;delay600;}whileyx;}ifo==0x00{do{P2=beheavecount[i];ifi==8i=1;elsei++;y++;delay600;}whileyx;}lock=0;step=0;}voidInitvoid//初始化{//unsignedcharflag=0;DQ=0;//单片机将DQ拉低delayms100;//精确延时大于480us小于960usDQ=1;//拉高总线delayms30;//flag=DQ;//稍做延时后如果flag=0则初始化成功flag=1则初始化失败//delay20;}ucharReadvoid//读字节{uchara=0;uchardat=0;fora=8;a0;a--{DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号ifDQdat|=0x80;delayms5;}returndat;}voidWriteuchardat//写字节{uchara=0;fora=8;a0;a--{DQ=0;DQ=dat0x01;delayms5;DQ=1;dat=1;}}voidtempereture{unsignedchartl=0th=0;unsignedcharTNTD;Init;Write0xCC;//跳过读序号列号的操作Write0x44;//启动温度转换delay100;Init;Write0xCC;//跳过读序号列号的操作Write0xBE;//读取温度寄存器等delay100;tl=Read;//读取温度值低位th=Read;//读取温度值高位ifth0xf8!=0x00//判断高五位得到温度正负标志{tl=~tl;//取反th=~th;//取反time=tl+1;//低位加1tl=time;iftime255th++;//如果低8位大于255,向高8位进1TN=th*16+tl/16;//实际温度值=TH*256+TL/16即TH*16+TL/16//这样得出的是温度的整数部分小数部分被丢弃了TD=tl%16*10/16;//计算温度的小数部分将余数乘以10再除以16取整,}TN=th*16+tl/16;//实际温度值=TH*256+TL/16即TH*16+TL/16//这样得出的是温度的整数部分小数部分被丢弃了TD=tl%16*10/16;time=TN+TD;iftime=50{warning=1;flag=0;}else{warning=0;flag=1;}}voiddelayuintz{uintxy;forx=z;x0;x--fory=110;y0;y--;}voiddelaymsuinta//如果i是unsigendchar类型,则会出现错误结果{whilea--;}6。