步进电机课程设计报告

湖南工程学院

课   程   设   计

课程名称      微机原理与应用        

课题名称    步进电机控制系统设计   

专    业     电子科学与技术         

班    级                                                

学    号       

姓    名                                               

指导教师              

20##年  6 月 27日

湖南工程学院

课 程 设 计 任 务 书

课程名称        微机原理与应用       

课    题      步进电机控制系统设计    

专业班级     电子科学与技术0802班               

学生姓名            ***                               

学    号          ************                    

指导老师            ***                                

审    批                              

任务书下达日期   20##年 6月 27日

任务完成日期  20##年7 月 8日

目录

第1章  概述. 1

1.1 单片机概述. 1

1.2 步进电机概述. 2

第2章  系统总体方案设计. 3

2.1 系统总体设计思路. 3

2.2 系统总体设计方案方框图. 3

第3章  硬件介绍与说明. 4

3.1 开发板按键硬件连接及实物说明. 4

3.2 开发板数码管硬件连接及实物说明... 5

3.3 开发板步进电机硬件连接及实物图. 6

第4章  软件设计流程. 7

4.1 系统整体流程概述. 7

4.2 系统整体流程图. 8

第5章  调试结果与说明. 9

5.1 系统调试. 9

5.2 调试说明. 9

5.3 调试结果. 10

第6章  总结. 12

参考文献. 13

附录. 14

附录A 系统原理图. 14

附录B 程序清单. 15

第1章  概述

1.1 单片机概述

 单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
  单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。AT89系列单片机。他不但具有一般MCS-51单片机的所有特性,而且还拥有一些独特的优点,此次设计中所用到的STC90C52RC就是其中典型的代表。

STC单片机是以51内核为主的单片机 : 

●高速:1个时钟/机器周期,增强型8051内核,速度比普通8051快8~12倍
●宽电压:5.5~4.1V/3.7V,3.6V~2.4V/2.1V(STC11/10L系列)
●低功耗设计:空闲模式(可由任意一个中断唤醒)
●低功耗设计:掉电模式(可由任意一个外部中断唤醒,可支持下降沿/低电平和远程唤醒,STC11xx系列还可通过内部专用掉电唤醒定时器唤醒)
●工作频率:0~35MHz,相当于普通8051:0~420MHz。

 1.2 步进电机概述

步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器

感应子式步进电机与传统的反应式步进电机相比,结构上转子加有永磁体,以提供软磁材料的工作点,而定子激磁只需提供变化的磁场而不必提供磁材料工作点的耗能,因此该电机效率高,电流小,发热低。因永磁体的存在,该电机具有较强的反电势,其自身阻尼作用比较好,使其在运转过程中比较平稳、噪音低、低频振动小。
    感应子式步进电机某种程度上可以看作是低速同步电机。一个四相电机可以作四相运行,也可以作二相运行。(必须采用双极电压驱动),而反应式电机则不能如此。例如:四相,八相运行(A-AB-B-BC-C-CD-D-DA-A)完全可以采用二相八拍运行方式。

    一个二相电机的内部绕组与四相电机完全一致,小功率电机一般直接接为二相,而功率大一点的电机,为了方便使用,灵活改变电机的动态特点,往往将其外部接线为八根引线(四相),这样使用时,既可以作四相电机使用,可以作二相电机绕组串联或并联使用。完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相拍运行方式即AB-BC-CD-DA-AB,四相八拍运动方式即A-AB-B-BC-C-CD-D-DA-A。

虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。

第2章  系统总体方案设计

2.1 系统总体设计思路

本系统,通过选取单片机的四个独立键盘作为信号控制的按键输入,并连接到单片机的P3口,通过单片机内部的处理将键盘的输入信号读入并执行相应的动作,并从P,0,P2口分别接数码管的段选端和位选端,从而使得四位数码管能按指定要求显示指点的档位加减,和步进电机运行状态的效果。同时利用程序对步进电机(本方案中采取四项四拍的方式)实施与数码管同步的相应运转状态,从而使得整个步进电机控制系统得以准确的实现。具体设计方框图如下。

2.2 系统总体设计方案方框图

 2.1  总体总体设计方案方框图

第3章  硬件介绍与说明

本系统采用自备的STC89C54RD+系列的单片机开发板进行硬件搭接与调试,并利用C语言编程来实现硬件的既定功能。下面就对此些列开发板的硬件电路原理图进行相应的说明。

3.1 开发板按键硬件连接及实物说明

图3.1 按键硬件连接及实物图

图中S1~S4可以配置成独立按键,即通过一个眺冒J11切换,在独立键盘配置中,应该把眺冒跳到左端,此时独立键盘才有效,由于,此个步进电机控制系统中所用的按键刚好四个即可满足要求,因此,系统中采用独立键盘。

本系统设计通过四个独立按键S1,S2,S3,S4接入单片机P3口前四位,当S1键按下时,步进电机正转,当S2键按下时,步进电机反转,当S3键按下时,步进电机通过按键的次数来增大步进电机的脉冲频率从而在原有的转速上进行加速,当S4键按下时,步进电机通过按键的次数来减小步进电机的脉冲频率从而在原有的转速上进行减速。由此,通过四个按键的控制即可实现步进电机的准确控制。 

3.2 开发板数码管硬件连接及实物说明

图3.2 数码管硬件连接及实物图

图中74HC573 11脚接VCC,锁存不起作用,相当于直通,相应的段赋值为1,A,B,C赋值0~7,则输出端分别是Y0~Y7置0,从而选通七个数码管,在此步进电机控制系统中仅使用三个数码管,一个用来显示电机运转状态,另外两个用来显示电机转速的不同档位。

本系统设计通过P0口控制数码管的段选,P2口控制数码管的八位数码管的位选,利用数码管的动态扫描选通数码管的1,4,5位数码管,其中第1位为电机的转动状态,4,5位显示一个十位数以用来表示电机转动速度及档位的显示。

3.3 开发板步进电机硬件连接及实物图

图3.3 步进电机硬件连接及实物图

图中ABCD为4相信号输入端,此端默认为悬空,需要用4根杜邦线连接至单片机I/O口,在此系统中,在软件中定义ABCD 4相分别为P1.0,P1.1, P1.2,P1.3,即可利用4根杜邦线将其连接即可。

本系统设计接的是四项的步进电机,每项分别接到P1.0,P1.1,P1.2,P1.3端口上,并通过程序来控制P1高低电平的循环输出。由于此电机利用的是四项四拍方式来驱动电机,因此,通过程序中的设置从而选择合适的脉冲输出频率从P1口的转换成高低电平信号输出,从而可以有效的驱动电机。

第4章  软件设计流程

4.1 系统整体流程概述

本系统通过C语言编程,其中包括数码管显示部分,键盘扫描部分,步进电机控制部分三个主要部分,

进入程序先给数码管初始化然后设置中断的工作状态同时开启总中断,然后进入键盘扫描程序部分,首先判断S1键的状态,并通过按键的去抖程序后,给档位进行初始设置,同时设置标志位为1。然后在保证S2键没有按下的前提下进入转速控制子模块并开始检测S3,S4键的状态,并分别在相应的键按下时对档位进行相应的加减,并同步修改电机的转速参数。之后,再对中断装入初值,S1键按下的程序中开启中断,从而程序进入中断并通过标志位的选择从而进入电机正反转的程序,并最后进入数码管的动态扫描。同理可以对S2键进行扫描,流程与上相似。

4.2 系统整体流程图

图4.1系统工作流程图

第5章  调试结果与说明

5.1 系统调试

本系统调试过程中采用直接硬件调试的方法,对整体的系统程序进行分解排故,首先对八段显像管进行数字显示测试,然后对键盘进行按键响应测试,当测试都得到正确结果时,将键盘与显示结合起来,并给予恰当的字型码,最后加入定时器中断程序,给出正确的脉冲信号和频率。

5.2 调试说明

在调试过程中出现了不少问题,通过不同方法得到了解决,在此逐一进行说明:

(1)显示管出现不停闪烁,不能清晰显示的问题,后查出由于延时程序过长没有小于眼镜分辨频率所致,缩短定时器定时后解决。

(2)按键出现按下一键响应多次的情况,后查出由于键位抬起子程序书写不当,造成键盘多次响应,并加上了松手去抖程序后问题得以顺利解决。

(3)在设计中断初值重装的时候,发现要适时的修改步进电机的脉冲频率,可以直接将控制电机转速参数的量直接赋到初值里面,这样的效果比通过固定初值再去计数的效果要好

5.3 调试结果

图5.1 电机正转显示效果图

图5.2 电机反转显示效果图

图5.3 电机最高档位显示效果图

图5.4 电机最低档位显示效果图

第6章  总结

这次单片机课程设计让我获益很多,由于先前我自己已经对单片机的基本功能都有个比较具体的了解,因此,对于这个课程设计我并不是很担心,因此,对于选题我也并不是很在意,那天老师给我们布置了课题后,我接到的是步进电机控制的课题,由于平时我对步进电机控制上并没有下太大的功夫,因此,对于这个课题还是比较陌生的,但是,我并不担心,接到课题后我就开始准备程序。

其实,我做的还是比较顺利,由于先前一些基本的程序我自己都有编过,因此很多基本的模块就可以直接调用,像键盘扫描模块就可以直接调用,由于先前我的程序都是用C语言编的,因此,我也就没有打算用汇编语言编程,将这些外面的控制模块都编好了后,我就开始查资料了解步进电机的工作原理及程序控制方法,了解完后,我也很顺利的编好了电机驱动程序,接下来就剩下了最后一个功能部分,也算是最关键的部分,那就是电机的加速减速,一开始,我是利用按键的按下次数来控制步进电机的延时程度,从而达到电机转速控制的效果。弄好了这个程序后,我后来就去拿给老师检查,但是老师说我的档位设置的不够,同时最好利用中断来控制步进电机的脉冲频率,要我回家继续修改,因此,我拿回程序后继续改进方案,最后,终于,按照老师的要求完成了目标同时也有了个比较好的硬件显示效果。至此,我的程序编译调试阶段算是结束了,剩下的就是报告的书写,我们老师对我们要求很严格,报告一定要按照老师指定的规范书写,因此,在报告的书写上我们也获益匪浅,也理解到了做事情一定要细致。

通过这次单片机课程设计,我不仅又重温了一下单片机的操作,同时也让我加深了对单片机的了解,尤其是对步进电机的工作原理及运转状态的控制有了个比较形象的认知,让我,在单片机上又有了更进一步的提升。最后,也得感谢我们的指导老师,由于她的严格要求让我们学到了更多。

  参考文献

1、王迎旭编.《单片机原理与应用》[M].机械工业出版社.                        

2、楼然苗编.《51系列单片机设计实例》[M].北京航空航天大学出版社.

3、黄勤编.《计算机硬件技术基础实验教程》[M].重庆大学出版社

4、刘乐善编.《微型计算机接口技术及应用》[M].华中科技大学出版社.

5、陈光东编.《单片微型计算机原理及接口技术》[M].华中科技大学出版社.

  附录

附录A 系统原理图

图A 系统整体原理图

     附录B 程序清单

#include<reg52.h>

sbit key1=P3^0;   //定义按键位置

sbit key2=P3^1;

sbit key3=P3^2;

sbit key4=P3^3;

unsigned int sudu,dang,flag,a,b,c,num,num1;

unsigned char i=0;

unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x71,0x7C,0x77,0x6d};

unsigned char code seg[]={0,1,2,3,4,5,6,7};

unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8};//正转表格

unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1};//反转表格

void delay(unsigned int cnt)   //延时子程序

{

 while(--cnt);

}

void add()

{

    if(!key3){

       delay(1000);

       if(!key3){

         dang++;

         if(dang>=19)

          dang=19;}

       while(!key3) ;}

    if(!key4){

   delay(1000);

   if(!key4){

     dang--;

     sudu=sudu+50;

     if(dang<=1)

       dang=1;}

    while(!key4);}

         switch(dang){

         case 1:sudu=1800;break;

          case 2:sudu=1700;break;

          case 3:sudu=1600;break;

          case 4:sudu=1500;break;

          case 5:sudu=1400;break;

          case 6:sudu=1300;break;

          case 7:sudu=1200;break;

          case 8:sudu=1100;break;

          case 9:sudu=900;break;

          case 11:sudu=800;break;

          case 12:sudu=700;break;

          case 13:sudu=600;break;

          case 14:sudu=500;break;

          case 15:sudu=400;break;

          case 16:sudu=300;break;

          case 17:sudu=200;break;

          case 18:sudu=100;break;

          case 19:sudu=10;break; }}

main()

{

TMOD=0X01;

EA=1;

ET0=1;                                         

sudu=500;

 while(1)

      {

      if(!key1)

         { 

         delay(1000);

        if(!key1)

           {

            dang=10;

            while(1)        

               {

                if(key2==1)                   {

                       add();

                       sub();

                       TH0 =(65536-sudu)/256;          

                       TH1 =(65536-sudu)%256;

                       a=10;//显示 F 标示正转

                       b=dang/10;

                       c=dang%10;

                       flag=1;

                       TR0=1;  }

                else break;

                }}}

      if(!key2)

         { 

            delay(1000);//去抖动

            if(!key2)

            {

               dang=10;

               while(1)

                   {

                  if(key1==1)

                     {

                       add();

                       sub();

                       TH0 =(65536-sudu)/256;          

                       TH1 =(65536-sudu)%256;

                       a=11;//显示 b 标示反转

                       b=dang/10;

                       c=dang%10;

                       flag=2;

                       TR0=1;

                     }

                  else break;

                    }}}}}

void time_T0() interrupt 1

{

    TH0 =(65536-sudu)/256;          

    TH1 =(65536-sudu)%256;

    num1++;

    num++;

    if(num1==1)

    {   num1=0;

        if(flag==1)

       {   P1=F_Rotation[i];

           i++;

           if(i>=4)

           i=0;}

       if(flag==2)

       {   P1=B_Rotation[i];

           i++;

           if(i>=4)

           i=0;}  }

    if(num==1)

    {  P2=seg[0];

       P0=tab[a];

        delay(80); 

       P2=seg[4];

       P0=tab[b];

        delay(80);

       P2=seg[5];

       P0=tab[c];

        delay(1);

       num=0;

       TR0=0;

}

    TR0=0;

}

电气信息学院课程设计评分表

                                  指导教师签名:________________

                              日        期:________________ 

注:①表中标*号项目是硬件制作或软件编程类课题必填内容;

②此表装订在课程设计说明书的最后一页。课程设计说明书装订顺序:封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。

相关推荐