打印

请教 51单片机驱动步进电机失步原因

[复制链接]
2974|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
www888www|  楼主 | 2007-5-24 21:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请高手看下程序有那些漏洞,请赐教
#include <reg51.h>         //51芯片管脚定义头文件
#include <intrins.h>       //内部包含延时函数 _nop_() ;
#define uchar unsigned char
#define uint  unsigned int

uchar code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6} ;
uchar code REV[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe} ;
bit  bzhi1 ;//上升标志位
bit  bzhi2 ;//下降标志位
bit  bzhi3 ;//半旗升标志位
bit  bzhi4 ;//半旗降标志位
sbit  K1  = P3^0 ; //正转
sbit  K2  = P3^1 ; //反转
sbit  K3  = P3^2 ; //停止
sbit  K4  = P3^3 ; //半旗升
sbit  K5  = P3^4;  //半旗降
sbit  BEEP = P2^0 ; //蜂鸣器   
sbit  dian=P2^1;
uint  LL=0;
uchar v=1;
uint r,g,m,N=40; //N 步进电机运转圈数
/********************************************************/
// 11.0592MHz时钟,延时约1ms                                     
/********************************************************/
void delay(uint t)
{                           
   uint k;
   while(t--)
   {
     for(k=0;k<125;k++)
     {};
   }
}
/**********************************************************/
void delayB(uchar x)             //x*0.14MS
 {
   uchar i;
   while(x--)
   {
     for(i=0;i<13;i++)
     {}; 
   }
 }
/**********************************************************/
void beep()
 {
   uchar i ;
   for (i=0 ;i<100 ;i++)
    { 
     delayB(4) ;
     BEEP=!BEEP ;                 //BEEP取反
    } 
     BEEP=1 ;                        //关闭蜂鸣器
 }

/********************************************************/
/*步进电机正转
/********************************************************/
void  motor_ffw(v)
 { 
   uchar i;
   uint j;
   for(j=0;j<12;j++)           //转1*n圈 
    {   if(j==3)
          {
          LL=LL+6;}
        if(j==7)
          {
          LL=LL+6;}
        if(K3==0)
        {break;}                //退出此循环程序
      for(i=0;i<8;i++)         //一个周期转30度
        {
          P1=FFW;            //取数据
          delay(3);            //调节转速
        }
        if(j==11)
          {
          LL=LL+6;}
    }
 }
/********************************************************/
/*步进电机反转
/********************************************************/
void  motor_rev(v)
{
  uchar i;
  uint j;
  for(j=0;j<12;j++)          //转1×n圈
      {if(j==3)
         LL=LL-6;
       if(j==7)
         LL=LL-6;
    if(K3==0)
       {break;}               //退出此循环程序
      for(i=0;i<8;i++)        //一个周期转30度
       {
         P1=REV;           //取数据
         delay(3);           //调节转速
       }
       if(j==11)
         LL=LL-6;
   }
 }
/************提一位数显示*********************************/
 gewei(g)
  { uchar y,h0,h1;
      y=g&0x0f;
      P0=y;
      dian=1;
      delay(2);
       
 
      h0=0&0x0f;
      h0=h0|0x10;
      P0=h0;
      dian=0;
     delay(2);
 
      h1=0&0x0f;
      h1=h1|0x20;
      P0=h1;
      dian=1;
     delay(2);
   }
/************提两位数显示*********************************/
 shiwei(g)
   {  uchar k,M,h;
      k=g%10;
      k=k&0x0f;
      P0=k;
      dian=1;
      delay(2);
    
      M=g/10;
      M=M&0x0f;//屏蔽高四位
      M=M|0x10;//0x10选中十位
      P0=M;
      dian=0;
     delay(2);
   
      h=0&0x0f;
      h=h|0x20;
      P0=h;
      dian=1;
     delay(2);
    }
/************提三位数显示*********************************/
 baiwei(g)
   {  uint k1,M1,M0;
      k1=g%10;
      k1=k1&0x0f;
      P0=k1;
      dian=1;
      delay(2);
    
      M1=g/10;
      M1=M1%10;
      M1=M1&0x0f;//屏蔽高四位
      M1=M1|0x10;//0x10选中十位
      P0=M1;
      dian=0;
     delay(2);
    
      M0=g/100;
      M0=M0&0x0f;
      M0=M0|0x20;
      P0=M0;
      dian=1;
     delay(2);
    }
/************************************************/
void display(m)
     {if(m<10)
       gewei(m);
       else if(m>=10&&m<100)
       shiwei(m);
       else if(m>=100&&m<1000)
       baiwei(m);
     }
/************************************************/
//   主程序                                            
/**************************************************/
main()
{  
   TMOD=0x01;
    TH0=0xb8;
    TL0=0x00;
     EA=1;
    ET0=1;
    TR0=1;
while(1)
 { 
//**************正转*************
  if(K1==0)
    {   
//         hh=0;
         LL=0;
         bzhi2=0;
         bzhi3=0;
         bzhi4=0; 
      for(r=0;r<=N;r++)
        {
          if(bzhi1==1)
            {break;}
          else
             
              beep();
              motor_ffw(v);        //电机正转          
              if(r==40)
                { bzhi1=1;
                 break; }    }
        }
//**************反转*************************
   else if(K2==0)
   {    LL=738; 
        bzhi1=0;
        bzhi3=0;
        bzhi4=0;
    for(r=N;r>=0;r--)
       { if(bzhi2==1)
          {break;}
         else
           BEEP=1;
          motor_rev(v);         //电机反转
         if(r==0)
           {bzhi2=1;
            break;
           }
        }
   }
//*****************半旗升************************
    else if(K4==0)
     {    LL=0;
          bzhi1=0;
          bzhi2=0;
          bzhi4=0;
      for(r=0;r<=N;r++)
         {if(bzhi3==1)
            {break;}
          else
            { beep();
              motor_ffw(v);          //电机正转
              if(r==40)
                {for(r=N;r>=2*N/3;r--)
                   {    BEEP=1;                
                    motor_rev(v); //电机反转    
                    if(r==2*N/3)
                      {bzhi3=1; 
                       break;}               
                    }  
                 }            
             }
          }
       }
//*****************半旗降************************
    else if(K5==0) 
     {     LL=468;
           bzhi1=0;
           bzhi2=0;
           bzhi3=0;
      for(r=2*N/3;r<=N;r++)    
        {
          if(bzhi4==1)
            {break;}
          else
          {
           motor_ffw(v);        //电机正转
          if(r==40)
            { 
              for(r=40;r>=0;r--)
                 {   
                    if(bzhi4==1)
                     break;
                     BEEP=1;
                    motor_rev(v);      //电机反转
                    if(r==0)
                    {bzhi4=1;
                    break;}
                 }
             }     
           }
        }
     }
 }
}
timer0() interrupt 1
{
  TH0=0xb8;
 TL0=0x00;
display(LL);
}




相关帖子

沙发
zbmzy| | 2007-6-1 17:11 | 只看该作者

你用的什么驱动电路

使用特权

评论回复
板凳
conwh| | 2007-6-1 17:12 | 只看该作者

估计没有几个能够认真看下去,你的范围也忒大了

使用特权

评论回复
地板
5880527| | 2007-6-1 18:04 | 只看该作者

没细看LZ的程序

脉冲要均匀,加速度要合理,没那么容易丢步的

使用特权

评论回复
5
gyt| | 2007-6-1 18:15 | 只看该作者

一般不会

要弄清楚到底是没发出脉冲还是什么原因

使用特权

评论回复
6
理想飞扬| | 2007-6-1 20:06 | 只看该作者

用什么驱动电路!或许你的线序有错!

用什么驱动电路!或许你的线序有错! 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

70

帖子

0

粉丝