peinsc 发表于 2012-9-8 12:14:43

关于用A3992驱动两相四线电机问题

各位大牛好!
我最近在做A3992驱动电机,现在反转的时候很顺畅,但正转的时候,电机会转的很慢,当变相加快就会卡死(正转按反转程序写的,带负载大),谢谢回复!!老板催了!!!
#include<12c2051.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int
sbitDA= P1^0;
sbitCLK = P1^1;
sbitSTROBE = P3^7;
sbitOUTPUT0 = P3^3;
sbitOUTPUT1 = P3^4;

uchar del; //10
uchar dela;
uchar cnt=0;
uchar aa=1;
void delay( uchar time );
void senddata( long int buf )
{
uchar i;
STROBE=0;
for( i=0; i<19; i++ )       //先送最高18位,最后送低位
   {
          
           if(buf&0x00040000)
                  DA=1;
           else
              DA=0;          
          
       buf<<=1;
           CLK=0;
           _nop_( );
           CLK=1;
       }
STROBE=1;

}
void init_A3992(void)           //使用内部RC振荡器,频率在5.65-5.95M        Pose=176ns
{
       senddata( 0x78000 );        //word0: RANG=4,DAC=63,VREF=0.6
       delay(1);
       senddata( 0x40a8b );   //word1: 0x40211


}
void delay( uchar time )
{
uint b,c;
for(c=0;c<time;c++)
    {
           for(b=0;b<2;b++)
                        ;
        }
}

void delay_fast( uchar time )
{
uint b,c;
for(c=0;c<time;c++)
    {
           for(b=0;b<0x1;b++)
                        ;
        }
}
void z_begin(void)       //正转
{
               senddata( 0x7a03e );       //A置1
               delay(del);
               senddata( 0x7afbe );       //2b置1 da
               delay(del);
               senddata( 0x78f80 );       //2b置1 d
               delay(del);
               senddata( 0x78fbe );       //2b置1 cd
               delay(del);       
               senddata( 0x7803e );       //1b置1 c                               
               delay(del);
               senddata( 0x7cfbe );       //bc置1
               delay(del);       
               senddata( 0x7ef80 );       //b置1
               delay(del);
               senddata( 0x7efbe );       //ab置1
               delay(del);
               cnt++;
               if( aa!=0 )
                   {
                     if( cnt >6 )
                      {cnt=0;
                         del--;
                             if(del <30 )
                             aa=0;
                      }
                        }
}


void f_begin(void)        //反转                  快速               用于压墨
{
/*        
               senddata( 0x7a03e );       //A置1
               delay_fast(del);
               senddata( 0x7efbe );       //ab置1
               delay_fast(del);
               senddata( 0x7ef80 );       //b置1
               delay_fast(del);          
               senddata( 0x7cfbe );       //bc置1
               delay_fast(del);
               senddata( 0x7803e );       //1b置1 c
               delay_fast(del);       
               senddata( 0x78fbe );       //2b置1 cd
               delay_fast(del);
               senddata( 0x78f80 );       //2b置1 d
               delay_fast(del);
               senddata( 0x7afbe );       //2b置1 da       
               delay_fast(del);
*/

               senddata( 0x7e38e );       //ab置1
               delay_fast(dela);
               senddata( 0x7e380 );       //b置1
               delay_fast(dela);          
               senddata( 0x7c38e );       //bc置1
               delay_fast(dela);
               senddata( 0x7800e );       //1b置1 c
               delay_fast(dela);       
               senddata( 0x7838e );       //2b置1 cd
               delay_fast(dela);
               senddata( 0x78380 );       //2b置1 d
               delay_fast(dela);
               senddata( 0x7a38e );       //2b置1 da       
               delay_fast(dela);
               senddata( 0x7a00e );       //A置1
               delay_fast(dela);

               cnt++;
               if( aa!=0 )
                   {
                     if( cnt >6 )
                      {cnt=0;
                         dela--;
                             if(dela <10 )
                             aa=0;
                      }
                        }


}

void f_begin_slow(void)        //反转          慢速
{
                      
       
               senddata( 0x7efbe );       //ab置1
               delay(del);
               senddata( 0x7ef80 );       //b置1
               delay(del);          
               senddata( 0x7cfbe );       //bc置1
               delay(del);
               senddata( 0x7803e );       //1b置1 c
               delay(del);       
               senddata( 0x78fbe );       //2b置1 cd
               delay(del);
               senddata( 0x78f80 );       //2b置1 d
               delay(del);
               senddata( 0x7afbe );       //2b置1 da       
               delay(del);
               senddata( 0x7a03e );       //A置1
               delay(del);
               cnt++;
               if( aa!=0 )
                   {
                     if( cnt >10 )
                      {cnt=0;
                         del--;
                             if(del <30 )                //速度延时
                             aa=0;
                      }
                        }

}
void main (void)
{       
       
       
        uchar aa=1;
        uchar flag;
        P3M0 = 0;       //初始化IO口为双向口
        P3M1 = 0;
        P1M0 = 0;
        P1M0 = 0;
        init_A3992( );        //初始化A3992
    CLK=0;
    while( 1 )
          {       
               flag=0;
               flag=OUTPUT1;
               flag<<=1;
               flag=flag|OUTPUT0;
               switch ( flag )
                  {
                  case 0 ://stop
                           {
                                senddata( 0x78000 );
                                del=50;
                              dela=100;
                                cnt=0;
                                aa=1;
                           }
                        break;
                        case 1:          //正转
                           {
                               z_begin( );

                           }
                        break;
                        case 2://反转                速度很快       用于压墨
                           {
                               f_begin( );

                           }

                  case 3:                                //反转,很慢
                          {
                                  f_begin_slow( );

                          }
       
                        break;//
                        default:break;
                   }


          }
}

253789174zjm 发表于 2012-11-16 12:12:37

项目完成,64细分,效果很好,联系Q:253789174
同时做过A4982,A3979,A3988
页: [1]
查看完整版本: 关于用A3992驱动两相四线电机问题