关于用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;
}
}
}
项目完成,64细分,效果很好,联系Q:253789174
同时做过A4982,A3979,A3988
页:
[1]