1、 目 录1. 课程设计目的32. 课程设计要求33. 课程设计报告内容44. 电路图及仿真设计105. 总结156. 程序源代码15基于单片机的步进电机驱动1. 课程设计目的近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。当步进驱动器接收到一个脉冲信号,它就驱动步进电机
2、按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 2. 课程设计要求 2.1 设计目的一、进一步熟悉和掌握单片机的结构和工作原理。二、掌握单片机的接口技术及相关外围芯片的外特性,控制方法。三、通过课程设计,掌握以单片机为核心的电路设计的基本方法和技术,了 解有关电路参数的计算方法。四、通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。五、通过完成一个包括电路设计和程序开发的完整过程,为以后的工作打下良好的基础。2
3、.2 设计要求一、能控制电机正反转,有正转和反转按钮二、在一定范围内可控制转速,有加速和加速按钮。三、可在不断电源的情况下暂停,有一个暂停按钮。四、在停止、正转、反转的时候,分别有指示灯指示工作状态。五、有状态观察指示灯,可观察电动机A、B、C、D相的状态以观察电动机的旋转状态。六、通过改变程序而改变电动机的驱动方式:单四拍、双四拍、单双八拍。3. 课程设计报告内容19 3.1 电机驱动方式本次试验采用的步进电机内部结构为:采用型号20BY-0型,它使用+5V直流电源,步距角为18度。电机线圈由四相组成,即A、B、C、D四相,驱动方式为二相激磁方式,引 脚颜色绿色:GND 黄色:A 红色:B
4、蓝色:C白色:D驱动方法:单四拍:ABCD双四拍:ABBCCDDA单双八拍:AABBBCCCDDDA双四拍驱动:相顺序从0到1称为一步,电机轴将转过18度,01 230则称为通电一周,转轴将转过72度,若循环进行这种通电一周的操作,电机便连续的转动起来,而进行相反的通电顺序如03210将使电机同速反转。通电一周的周期越短,即驱动频率越高,则电机转速越快,但步进电机的转速也不可能太快,因为它每走一步需要一定的时间,若信号频率过高,可能导致电机失步,甚至只在原步颤动。 3.2 按键控制P1口接六个按钮,包括正转,反转,停止,低速,中速,高速,分别实现对应的功能来控制电机。正转和反转按钮功能实现代码
5、:void mykey() if(K1=0)/判断K1键有无按下即正转按钮有无按下 DelayMS(5) ;/延时再次判断,消除抖动。 if(K1=0)motordirect=0; if(K2=0) /判断K2键有无按下即反转按钮有无按下DelayMS(5);/延时再次判断,消除抖动 if(K2=0) motordirect=1; 停止按钮功能实现代码: if(K3=0)/判断K3键有无按下即停止按钮有无按下 MOTER_flg=0;P2=0xFE;/P2.0停止指示else MOTER_flg=1;3.3 流程图1、控制流程图2、程序流程图3.4 数码管显示用数码管显示当前电机速度处于低、中
6、、高档哪一档。0代表速度为原始转速,1为低速档,2为中速档,3为高速档。void myshow() X=0; if(N=200) P0=LEDSHOW0; if(K4=0) P0=LEDSHOW1; if(K5=0) P0=LEDSHOW2; if(K6=0) P0=LEDSHOW3;3.5 芯片端口分配及原理图AT89C52接线原理图,如图3.5.1图3.5.1 AT89C52芯片接线原理图AT89C52端口分配表,如表1所示:表1 AT89C52芯片端口分配功能表端口功能P1.0K1,正转按键P1.1K2,反转按键P1.2K3,停止按键P1.3K4,低速按键P1.4K5,中速按键P1.5K
7、6,高速按键P1.6数码管选通位P2.0停止指示灯P2.1正转指示灯P2.2反转指示灯P3.1A相P3.3C相P3.5B相P3.7D相P0.0数码管aP0.1数码管bP0.2数码管cP0.3数码管dP0.4数码管eP0.5数码管fP0.6数码管gP0.7小数点DPP1.7K7,切换驱动方式步进电机驱动板实物图:驱动板与单片机连接图:4. 电路图及仿真设计4.1设计完成原理图如下1、在电路连接完成后,将写好的程序放入单片机,电机正转,正转灯亮,数码管显示0运行如图4.1所示。图4.1电机常速运行图 2、按下反转按钮,电机反转,反转灯亮,数码管显示0,如图4.2所示。 图4.2电机反转图3、按下停
8、止按钮,电机停转,数码管显示0,如图4.3所示。图4.3电机停转图4、按下低速档,数码管显示1,电机反转,反转灯亮,如图4.4所示。图4.4电机低速运转图5、按下中速档,数码管显示2,电机反转,反转灯亮,如图4.5所示。 图4.5电机中速运转图6、按下高速档,数码管显示3,电机反转,反转灯亮,如图4.6所示。图4.6电机高速运转图7、按下驱动切换K7,数码管显示,电机转,单四拍灯亮,如图4.7所示。图4.7电机驱动方式单双八拍运转图5.总结回顾起此次单片机课程设计,我仍感慨颇多,学到了很多的东西。同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。在实际设计中才发现,书
9、本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计中的问题,而程序设计是一个很灵活的东西。因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。6. 程序源代码 #include #define uchar unsigned char #define uint unsigned int uint MOTER_flg = 1 ; /0:电机控制禁止, 1:电机控制使能int motordir
10、ect = 0;uint T_Count= 0;sbit K1=P10;sbit K2=P11;sbit K3=P12;sbit K4=P13;sbit K5=P14;sbit K6=P15;sbit X=P16;sbit K7=P17;int N=200;int LEDSHOW10 = 0xC0,0xF9,0xA4,0xB0;uchar F0_Rotation4=0x02,0x20,0x08,0x80;/正转表格uchar B0_Rotation4=0x22,0x28,0x88,0x82;/反转表格/uchar F1_Rotation4=0x82,0x88,0x28,0x22;/双四拍正转表
11、格/uchar B1_Rotation4=0x82,0x88,0x28,0x22;/双四拍反转表格uchar F1_Rotation8=0x02,0x22,0x20,0x28,0x08,0x88,0x80,0x82;/单双八拍正转表格uchar B1_Rotation8=0x02,0x82,0x80,0x88,0x08,0x28,0x20,0x22;/单双八拍反转表格/#define LED P10 /延时 void DelayMS(uint x) uchar i; while(x-) for(i=0;i120;i+); /按键扫描void mykey() if(K1!=0) DelayMS(
12、5) ; if(K1=0) motordirect=0; if(K2=0) DelayMS(5); if(K2=0) motordirect=1; /显示控制void myshow() X=0; if(N=200) P0=LEDSHOW0; if(K4=0) P0=LEDSHOW1; if(K5=0) P0=LEDSHOW2; if(K6=0) P0=LEDSHOW3;/主程序 void main() int i; /开始循环 while(1) if(K7=0) if(K3=0) MOTER_flg=0;P2=0xF6;/P2.0停止指示灯else MOTER_flg=1; if (MOTER
13、_flg=1) / for(i=0 ; i8;i+) for (i =0; i4;i+) if (motordirect = 0 ) P3 = F0_Rotationi; P2=0xF5;/P2.1正转指示灯 else P3 = B0_Rotationi; P2=0xF3;/P2.2反转指示灯 if(K4=0) N=300; if(K5=0) N=150; if(K6=0) N=100; DelayMS(N); mykey(); myshow(); else if(K3=0) MOTER_flg=0;P2=0xEF;/P2.0停止指示灯else MOTER_flg=1; if (MOTER_flg=1) / for(i=0 ; i8;i+) for (i =0; i8;i+) if (motordirect = 0 ) P3 = F1_Rotationi; P2=0xED;/P2.1正转指示灯 else P3 = B1_Rotationi; P2=0xEB;/P2.2反转指示灯 if(K4=0) N=300; if(K5=0) N=150; if(K6=0) N=100; DelayMS(N); mykey(); myshow();