搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2012-9-8 12:14:43 | 显示全部楼层 |阅读模式
各位大牛好!
我最近在做A3992驱动电机,现在反转的时候很顺畅,但正转的时候,电机会转的很慢,当变相加快就会卡死(正转按反转程序写的,带负载大),谢谢回复!!老板催了!!!
#include<12c2051.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit  DA  = P1^0;
sbit  CLK = P1^1;
sbit  STROBE = P3^7;
sbit  OUTPUT0 = P3^3;
sbit  OUTPUT1 = 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;
                   }


          }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-11-16 12:12:37 | 显示全部楼层
项目完成,64细分,效果很好,联系Q:253789174
同时做过A4982,A3979,A3988
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表