单片机原理及系统课程设计1 引言步进电机又称为脉冲电动机或阶跃电动机,它是基于最基本的电磁感应作用,将电脉冲信号转变为角位移或线位移的开环控制元件。
单片机控制的步进电机广泛地应用于工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机,大型望远镜,卫星天线定位系统等等。
随着经济的发展,技术的进步和电子技术的发展,步进电机的应用领域更加广阔,同时也对步进电机的运行性能提出了更高的要求。
步进电机的原始模型起源于1830年至1860年,1870年前后开始以控制为目的的尝试,应用于氩弧灯的电极输送机构中,这被认为最早的步进电机。
1950年后期晶体管的发明也逐渐应用在步进电机上,对于数字化的控制变得更为容易。
到20世纪60年代后期,在步进电机本体方面随着永磁材料的发展,各种实用性步进电机应运而生。
步进电机往后经过不断改良,使得今日步进电机已广泛运用在需要高定位精度、高分解能、高响应性、信赖性等灵活控制性高的机械系统中。
在生产过程中要求自动化、省人力、效率高的机器中,我们很容易发现步进电机的踪迹,尤其以重视速度、位置控制、需要精确操作各项指令动作的灵活控制性场合步进电机用得最多。
2 设计方案与原理4.1 设计方案设计一个51单片机四相步进电机控制系统要求系统具有如下功能:(1)由I/O口产生的时序方波作为电机控制信号;(2)信号经过驱动芯片驱动电机的运转;(3)电机的状态通过键盘控制,包括正转,反转,加速,减速,停止和单步运行。
4.2 设计原理步进电机实际上是一个数字\角度转换器,也是一个串行的数\模转换器。
步进电机的基本控制包括启停控制、转向控制、速度控制、换向控制4个方面。
从结构上看,步进电机分为三相、四相、五相等类型,本次设计的是四相电机。
四相步进电机的工作方式有单四拍、双四拍和单双八拍三种。
在本次设计中,我们使用的是四相单八拍的工作方式。
通过P1口给A,B,C,D四相依次输出高电平即可实现步进电机的旋转,通过控制两次输出的间隔,即可实现对步进电机的速度控制。
图 2.1 步进电机内部结构截图根据步进电机的相关相序表我们可以正常的控制电机的步进运行。
3 硬件设计根据设计要求和设计原理,我们可以绘制出基本的功能方框图,以便之后我们连接实际电路时的方便和可靠。
用键盘控制具体的功能模块,这样更能直观方便的控制整体的系统,使其达到我们预期的操作效果。
图3.1中简单描述了整个单片机系统的控制模式和控制流程,包括通过时钟电路和键盘电路,来控制UNL2803驱动电机动作。
图 3.1 硬件电路功能方框图图3.2截图中是UNL2803中的细节电路,用前四个输入输出口连接步进电机的四个输入口。
图3.3截图是单片机的键盘控制电路,对系统的控制功能模块的选择和控制。
包括正转启动按钮、反转启动按钮、停止位按钮、加速按钮、减速按钮和单步运行按钮。
图 3.2 步进电机及其驱动电路截图图 3.3 按键设置及其连接引脚截图以上电路功能截图均出自于proteus仿真软件。
4 软件设计软件设计中,我们查询键盘按钮控制方式来选择步进电机运行的工作状态。
在程序里面对按钮分配的I/O地址分别为正转启动位是P3.0,反转启动为是P3.1,停止位是P3.4,加速位是P3.2,减速位是P3.3,单步执行位是P3.5。
通过外部中断INT0和INT1来实现加速减速的外部输入。
图4.1 主程序流程图程序里面加上了防止正常运行过程中电机的突然转向的阻断。
防止电机的意外损坏。
在转向之前,必须按下停止按钮,然后再发出电机的下一条控制命令。
当然,我们的加速减速通过外中断可以在电机正常运行过程中进行操作。
增加了我们系统的可操作性和高可控性。
总结在本次课程设计中,首次接触到单片机的应用,接到题目时,对步进电机一无所知,并对如何使用单片机也不甚了解,仅仅知道一些生硬的指令和符号,并不知道它们到底如何使用以及其意义,通过老师指导,然后自己在课后翻阅书籍和上网,搜集到了不少有关步进电动机的知识。
通过钻研这些知识,总算对步进电机有了认识,但是这离课程设计需要掌握的知识相差甚远,为了缩短这种差距,只能不断地查阅资料,仔细揣摩。
在这次课程设计中,通过用单片机控制步进电机的起动、停止,正、反转,加、减速,也对单片机的知识也进行了复习和巩固。
设计仿真电路的过程中,必须要有耐心,在整个电路的设计过程中,花费时间最多的是各个单元电路的连接及电路的细节设计上,如在多种方案的选择中,仔细比较分析其原理以及可行的原因。
这就要求对硬件系统中各组件部分有充分透彻的理解和研究,并能对之灵活应用。
同时在本次设计过程中,还学会了高效率的查阅资料、运用工具书、利用网络查找资料。
发现,在所使用的书籍上有一些知识在实际应用中其实并不是十分理想,各种参数都需要自己去调整,这就要求应更加注重实践环节。
那时候觉得学习单片机是那么的枯燥乏味,整天只是学习这个指令做什么,那个指令做什么,觉得学了一点用都没有。
现在知道,原来一些生硬的指令组合起来竟然可以实现如此多的实用功能。
俗话说的好,实践是检验真理的唯一标准,学习再多的理论也只能纸上谈兵,只有把理论应用到实践中,才能检验出理论的真伪。
所以,虽然一周的时间不长,时间过得也很快,但是在这一周过去后,明白了学习与实践相结合的重要性,指引我在以后的学习中应该把理论和实践联系起来。
参考文献[1] 李华,王思明,张金敏.单片机原理及应用[M].兰州:兰州大学出版社,2001.4(1):75-89.[2] 黄勤.单片机原理及应用[M].北京:清华大学出版社,2010.4(2):110-120.附录A 仿真界面截图图 3.4 Proteus仿真截图附录B 步进电机相序表表 2.2 四相八拍步进电机相序表A B C D0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 00 1 0 01 1 0 0 1 0 0 0 1 0 0 1附录C 主程序#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数_nop_();#define uchar unsigned char#define uint unsigned intuchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; sbit K1 = P3^0; //正转sbit K2 = P3^1; //反转sbit K3 = P3^2; //停止sbit K4 = P3^3; //正向单步运行sbit K5 = P3^4; //加速sbit K6 = P3^5; //减速int num=2000;void motor_ffw();void motor_rev();void motor_ffw2();/********************************************************/ /* 延时t毫秒/* 11.0592MHz时钟,延时约1ms/********************************************************/ void delay(int t){uint k;while(t--){for(k=0; k<20; k++){ }}}/********************************************************/ /*步进电机正转单步执行/********************************************************/ void motor_single(){uchar i;for (i=0; i<8; i++) //一个周期转45度{P1 = FFW[i]; //取数据delay(num); //调节转速}}/********************************************************/ /*步进电机正转/********************************************************/ void motor_ffw(){uchar i;for (i=0; i<8; i++) //一个周期转45度{P1 = FFW[i]; //取数据if(K5==0){break;} //退出此循环程序delay(num); //调节转速}}/********************************************************/ /*步进电机反转/********************************************************/ void motor_rev(){uchar i;for (i=0; i<8; i++) //一个周期转45度{P1 = REV[i]; //取数据if(K5==0){break;} //退出此循环程序delay(num); //调节转速}}/******************************************************** * 主程序*********************************************************/ void main(void){EA=1; //开放总中断EX0=1; //允许使用外中断0IT0=1; //选择负跳变来触发外中断EX1=1; //允许使用外中断1IT1=1; //选择负跳变来触发外中断while(1){if(K1==0){for(;;){motor_ffw(); //电机正转单片机原理及系统课程设计报告if(K5==0){break;} //退出此循环程序}}else if(K2==0){for(;;){motor_rev(); //电机反转if(K5==0){break;} //退出此循环程序}}else if(K6==0){motor_single(); //电机正转单步执行}elseP1 = 0xf0;}}/******************************************************/ void int0() interrupt 0 //外中断0的中断编号为0{num=num+100; //每产生一次中断请求,x+80。
}void int1() interrupt 2 //外中断0的中断编号为1{num=num-100; //每产生一次中断请求,x-80。