求基于51单片机的4相步进电机细分驱动硬件电路图,有软件编程更好

如题所述

单片机最小系统图就不用细说了吧。。。步进电机模块,驱动小的步进电机就用ULN2003芯片。连线图给出了。软件编程嘛,你这没有细说功能要求,我就给你发个典型应用案例,自己看懂了修改下应该能用。基本功能就是正转反转,加速减速,启动停止动作。

ZHENG EQU 30H      

   FAN EQU 31H

    NO EQU 32H

    AS EQU 33H

    SS EQU 34H

       ORG 00H 

       AJMP MAIN

       ORG  03H

       AJMP SUB_INT0

       ORG  30H

MAIN:  MOV 10H,#01H

       MOV 11H,#03H

       MOV 12H,#02H

       MOV 13H,#06H

       MOV 14H,#04H

       MOV 15H,#0CH

       MOV 16H,#08H

       MOV 17H,#09H

       MOV 20H,#50

       MOV 21H,#25

       MOV 22H,#10

       MOV 23H,#05

       CLR ZHENG

       CLR FAN

       CLR NO

       CLR AS

       CLR SS

       MOV R1,#20H

       MOV A,@R1

       MOV R5,A

       MOV IE,#10000001B

       SETB IT0

       MOV R0,#0FH

LOOP:  JNB ZHENG,LP

       CALL GO

  LP:  JNB FAN,LOOP

       CALL BACK

       AJMP LOOP

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(中断)

SUB_INT0:

SCAN:  MOV A,P0

       CPL A

       ANL A,#00011111B

       JNZ SCAN1

       AJMP SCAN

       

SCAN1: CALL DELAY1

       MOV A,P0

       CPL A

       ANL A,#00011111B

       JZ SCAN

       CALL RDKEY     

       RETI

RDKEY: MOV A,P0

       JNB ACC.0,STOP

       JNB ACC.2,REV

       JNB ACC.1,FOR

       JNB ACC.3,ADDSPEED

       JNB ACC.4,SUBSPEED

       

       

     

STOP:  SETB  NO

       RET

FOR:   SETB ZHENG

       RET

REV:   SETB FAN

       RET

ADDSPEED:SETB AS

         RET

SUBSPEED:SETB SS

         RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(正转)

GO:    CLR ZHENG

       CLR FAN

       CLR NO

       CLR AS

       CLR SS

       INC R0

       MOV A,R0

       CJNE A,#18H,GO2

       MOV R0,#10H

GO2:   MOV P2,@R0

       MOV A,@R1

       MOV R5,A 

       CALL DELAY

       JB NO,RETURN

       JB ZHENG,RETURN

       JB FAN,RETURN 

       JNB SS,GO3

       CALL JIAN

GO3:   JNB AS,GO4

       CALL JIA

GO4:   AJMP GO

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(反转)

BACK:  CLR ZHENG

       CLR FAN

       CLR NO 

       CLR AS

       CLR SS   

       DEC R0

       MOV A,R0

       CJNE A,#0EH,TT

       MOV R0,#17H

       SJMP BACK2

  TT:  CJNE A,#0FH,BACK2

       MOV R0,#17H

BACK2: MOV P2,@R0

       MOV A,@R1

       MOV R5,A

       CALL DELAY

       JB NO,RETURN

       JB ZHENG,RETURN

       JB FAN,RETURN 

       JNB AS,BACK3

       CALL JIA

BACK3: JNB SS,BACK4

       CALL JIAN

BACK4: AJMP BACK

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(加速)

JIA:   MOV A,R1

       CJNE A,#23H,JIA1

       RET

JIA1:  INC R1

       RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(减速)

JIAN:  MOV A,R1

       CJNE A,#20H,JIAN1

       RET

JIAN1: DEC R1 

       RET

    

RETURN:RET

DELAY: 

  D1:  MOV R6,#50

  D2:  MOV R7,#150

  D3:  DJNZ R7,$

       DJNZ R6,D2 

       DJNZ R5,D1       

       RET 

DELAY1: MOV R6,#60

   D4:  MOV R7,#100

        DJNZ R7,$

        DJNZ R6,D4

        RET

END

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-18

这个图有点不清楚把邮箱给我把论文发给你

第1章 步进电机概述

1.1步进电机的特点:

1) 一般步进电机的精度为步进角的3-5%,且不累积。

2)  步进电机外表允许的温度高。步进电机温度过高首先会使电机的磁性材料退磁,从而导致力矩下降乃至于失步,因此电机外表允许的最高温度应取决于不同电机磁性材料的退磁点;一般来讲,磁性材料的退磁点都在摄氏130度以上,有的甚至高达摄氏200度以上,所以步进电机外表温度在摄氏80-90度完全正常。

3)步进电机的力矩会随转速的升高而下降。当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。

4)步进电机低速时可以正常运转,但若高于一定速度就无法启动,并伴有啸叫声。步进电机有一个技术参数:空载启动频率,即步进电机在空载情况下能够正常启动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转。在有负载的情况下,启动频率应更低。如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。 

1.2步进电机的工作原理:

    步进电机是一种用电脉冲进行控制 ,将电脉冲信号转换成相位移的电机 ,其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比 ,每一个脉冲信号可使步进电机旋转一个固定的角度.脉冲的数量决定了旋转的总角度 ,脉冲的频率决定了电机运转的速度.当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

1.3  步进电机的技术参数:

1.3.1  步进电机型号

本次设计所采用的电机型号:28bjy-48四相五线微型步进电机

实物如右图

1.3.2步进电机的基本参数

 

 

第2章 方案的论证 

2.1  控制方式的确定

步进电机控制虽然是一个比较精确的,步进电机开环控制系统具有成本低、简单、控制方便等优点,在采用单片机的步进电机开环系统中,控制系统送控制字的间隔和送控制字的顺序实际上就是控制步进电机的运行速度。系统可用两种办法实现步进电机的速度控制。一种是延时,一种是定时。延时方法是在每次按键之后调用一个延时子程序,待延时结束后再次送控制字,这样周而复始就可发出一定频率的CP脉冲。该方法简单,占用资源少,全部由软件实现,调用不同的子程序可以实现不同速度和不同方向的运行。但占用CPU时间长,不能在运行时处理其他工作。因此只适合较简单的控制过程。定时方法是利用单片机系统中的定时器定时功能产生任意周期的定时信号,从而可方便的控制系统输出CP脉冲的周期。当定时器启动后,定时器从装载的初值开始对系统及其周期进行加计数,当定时器溢出时,定时器产生中断,系统转去执行定时中断子程序将电机换向子程序放在定时中断服务程序中,定时中断一次,电机换向一次,从而实现电机的速度控制。

2.1.1  脉冲序列的生成

 

图4.2  脉冲的生成

脉冲幅值:由数字元件电平决定。                                                 

     TTL   0 ~ 5V                                                                                     

     CMOS  0 ~ 10V

 接通和断开时间可用延时的办法控制。要求:确保步进到位。

2.1.2  方向控制

步进电机旋转方向与内部绕组的通电顺序相关。 四相八拍,通电顺序为:  

正转:    A®AB®B®BC®C®CD®D®DA  

反转:      A®AD®D®DC®C®CB®B®BA   

改变通电顺序可以改变步进电机的转向 

2.2  脉冲分配 

实现脉冲分配(也就是通电换相控制)的方法有两种:软件法和硬件法。本次设计采用软件法。

2.2.1  通过软件实现脉冲分配

软件法是完全用软件的方式,按照给定的通电换相顺序,通过单片机的IO向驱动电路发出控制脉冲,下面以四相八拍为例

上面提到了三相六拍工作方式通电换相得正序为A-AB-B-BC-C-CD-D-DA-A,,反序为A-AD-D-DC-C-CB-B-BA-A

 

图4.3  用软件实现脉冲分配的接口示意图

注:P2.0:A相驱动

P2.1:B相驱动

P2.2:C相驱动

P2.3:D相驱动

三相六拍控制字如下表所示:

表4.1  三相六拍工作方式的控制字

通电状态 P2.3 P2.2 P2.1 2.0 控制字

A 0 0 0 1 01H

AB 0 0 1 1 03H

B 0 0 1 0 02H

BC 0 1 1 0 06H

C 0 1 0 0 04H

CD 1 1 0 0 0CH

D 1 0 0 0 08H

DA 1 0 0 1 09H

注:0代表使绕组断电,1代表使绕组通电

在程序中,只要依次将这8个控制字送到P2口,步进电机就会转动一个齿距角,每送一个控制字,就完成一拍,步进电机转过一个步距角。

2.3  驱动方式的确定

     用于步进电机的驱动一般有两种方法,一种是通过CPU直接来驱动,这种方法一般不宜采用,因为CPU的输出电流脉冲是特别小的它不能足以让步进电机的转动;别一种是通过CPU来间接驱动,就是把从CPU输出的信号进行放大,然后直接驱动或是再通过光电隔离间接来驱动步进电机,这种方法比较安全可靠。固本次设计应采用CPU间接驱动步进电机。

2.4  驱动电路的选择

    由于单片机接口信号不够大需要通过ULN2803放大再连接到相应的电机接口,ULN2803属于高电压大电流8达林顿晶体管系列,该阵列系列中的八NPN达林顿连接晶体管是低逻辑电平数字电路(如TTL,CMOS或PMOS/NMOS)和大电流高电压要求的灯、继电器、打印机锤和其他类似负载间的接口的理想器件。广泛用于计算机,工业消费类产品中。所用器件有集电极开路输出和用于瞬变抑制的续流钳位二极管。它与单片机和步进电机连接如下:

 

2.5  基本方案的确定

因本次设计的要求,选用四相八拍步进电机,单片机选用89C51作为控制器。选取用4511来驱动LED段选,7406作为LED位选驱动以显示电机转速。选用2803作为步进电机的驱动芯片。系统原理框图如下所示:

 

第3章 硬件电路的设计

3.1  单片机的选择

本次设计以CPU选用89C5l作为步进电机的控制芯片.89C51的结构简单并可以在编程器上实现闪烁式的电擦写达几万次以上.使用方便等优点,而且完全兼容MCS5l系列单片机的所有功能。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FAlsh ProgrAmmABle And ErAsABle ReAd Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案

3.2  LED显示电路设计

LED使用4511驱动,CD4511是一个用于驱动共阴极 LED(数码管)显示器的 BCD码—七段码译码器,特点如下:

具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。可直接驱动LED显示器。CD4511 是一片 CMOS BCD—锁存/7 段译码/驱动器,引脚排列如图3—2 所示。其中a b c d 为 BCD 码输入,a为最低位。LT为灯测试端,加高电平时,显示器正常显示,加低电平时,显示器一直显示数码“8”,各笔段都被点亮,以检查显示器是否有故障。BI为消隐功能端,低电平时使所有笔段均消隐,正常显示时, B1端应加高电平。另外 CD4511有拒绝伪码的特点,当输入数据越过十进制数9(1001)时,显示字形也自行消隐。LE是锁存控制端,高电平时锁存,低电平时传输数据。a~g是 7 段输出,可驱动共阴LED数码管。另外,CD4511显示数“6”时,a段消隐;显示数“9”时,d段消隐,所以显示6、9这两个数时,字形不太美观 图3-1是 CD4511和AT89C51配合而成一位计数显示电路,若要多位计数,只需将计数器级联,每级输出接一只 CD4511 和 LED 数码管即可。所谓共阴 LED 数码管是指 7 段 LED 的阴极是连在一起的,在应用中应接地。限流电阻要根据电源电压来选取,电源电压5V时可使用300Ω的限流电阻。                                    

 

图3-1

 

图3-2

8421 BCD 码对应的显示见下图 :

 

3.3  步进电机与微型机的接口电路                           电路原理图如下:                                             1. 图中 自上而下K1、K2、K3、K4按钮和S1、S2开关分别控制步进电机停止、一档、二挡、三档、正转反转。 2. P1.0-P1.5 接控制按钮和开关,P0.0-P0.3送BCD码、P3.0-P3.3送LED段选,P2.0-P2.3送不及电机控制字。                                 

第4章 程序设计

4.1  程序框图

 

4.2 C程序

#include <AT89X51.H>

Unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0x00};

unsigned char temp,temp_old;

unsigned char key;

unsigned char i,j,k,m,s;

#include <stdio.h>

#define uchar unsigned char

uchar code tab[][3]={0x02,0x07,0x03,0x08,0x08,0x01,0x08,0x02,0x01};

void d10ms()

{

    int p,q;

 for(p=2;p>0;p--)

  for(q=40;q>0;q--);

}

void delay(int i)

  { int a;

    a=i-1;

   for(m=i;m>0;m--)

   {

    P0=tab[a][0];    

    P3=0x01;

 d10ms();

 P3=0x00;

 P0=tab[a][1];

    P3=0x02;

 d10ms();

 P3=0x00;

 P0=tab[a][2];

    P3=0x04;

 d10ms();

 P3=0x00;

 }

  }

void saomiao()

{

 P1=0xff;

 if(P1_4==0)

 {

  temp=P1;

  temp=temp&0x0f;

  if(temp!=0x0f)

   {

    for(i=3;i>0;i--)

    for(j=80;j>0;j--);

    temp=P1;

    temp=temp&0x0f;

    if(temp!=0x0f)

     {

      temp=P1;

      temp=temp&0x0f;

      switch(temp)

       {

        case 0x0e:

        key=1;

         break;

        case 0x0d:

        key=2;

        break;

        case 0x0b:

        key=3;

        break;

        case 0x07:

        key=4;

        break;

       }

        temp=P1;

        temp=temp&0x0f;

        while(temp!=0x0f)

        {

         temp=P1;

         temp=temp&0x0f;

        }

     }

   }

}

  P1=0xff;

  if(P1_5==0)

  {

  temp=P1;

  temp=temp&0x0f;

  if(temp!=0x0f)

   {

    for(i=3;i>0;i--)

    for(j=80;j>0;j--);

    temp=P1;

    temp=temp&0x0f;

    if(temp!=0x0f)

     { 

      temp=P1;

      temp=temp&0x0f;

      switch(temp)

       {

     case 0x0e:

  key=8;

  break;

     case 0x0d:

        key=5;

        break;

        case 0x0b:

        key=6;

        break;

        case 0x07:

        key=7;

        break;

       }

        temp=P1;

        temp=temp&0x0f;

        while(temp!=0x0f)

        {

         temp=P1;

         temp=temp&0x0f;

        }

     

     }

   }

}

}

void main(void)

while(1)

{    

    saomiao();

    if(key==1)

     { P1=0;

      P2=0;

      saomiao();   

     }

    if(key==2)

     { 

      temp_old=key;

      for(s=0;s<8;s++)

           {  P2=table[s];

      

        delay(3);

  }

        saomiao();

        

     }

    if(key==3)

     {

      temp_old=key;  

      for(s=0;s<8;s++)

           {  P2=table[s];

        

        delay(2);

 

  }

        saomiao(); 

 

        

     }

    if(key==4)

     {

         temp_old=key;

      for(s=0;s<8;s++)

           {  P2=table[s];

        delay(1);

  }

        saomiao(); 

   

     }

    if(key==5)

     {

        temp_old=key;

      for(s=9;s<17;s++)

           {  P2=table[s];

        

        delay(3);

  }

        saomiao(); 

         

     }

    if(key==6)

     {

        temp_old=key;

      for(s=9;s<17;s++)

           {  P2=table[s];

        

        delay(2);

   }

        saomiao();

        

     }

    if(key==7)

     {

               temp_old=key;

      for(s=9;s<17;s++)

           {  P2=table[s];

        

  

        delay(1);

  }

        saomiao(); 

         

     }

   if(key==8)

     { P1=0;

       P2=0;

    saomiao();

   }

}

}

实物图

  

参考文献

[1]  李朝青. 单片机原理及接口技术 . 北京航空航天大学出版社.  2006

[2]  胡占齐、杨莉.  机床数控技术 . 机械工业出版社 .  2010

[3]  于晓东. 51系列单片机丛书 80C51单片机原理、开发与应用实例. 中国电力                             出版社. 2008

[4]   郑锋.  51单片机应用系统典型模块开发大全 .中国铁道出版社. 2010

追问

谢谢,能有论文参考就不错了,邮箱是[email protected]
我现在已经确定用L297和L298来进行细分驱动,电路图也连好了,但是程序不会编,这篇论文貌似是用ULN2803芯片驱动的,程序可以借鉴吗?如果能有L297和L298控制步进电机的参考程序就更好嘞

本回答被提问者采纳
相似回答