Драйвер шагового двигателя A3992 Allegro

fid
Offline
Зарегистрирован: 20.12.2014

Разобрал матричный принтер. В результате имеем драйвер шагового двигателя с БП и обвязкой. В нем шаговики управляются драйвером А3992. Даташит http://www.allegromicro.com/en/Products/Motor-Driver-And-Interface-ICs/Bipolar-Stepper-Motor-Drivers/A3992.aspx. Драйвер управляется по SPI - 2 по 19 битовое слово на каждый шаг(или микрошаг). Регулируется куча параметров о которых я имею слабое представление. Гугло перевод тоже не особо помог. С моим кодом делает пару шагов и все до следующего выкл.- вкл. питания драйвера. Предполагаю с15 бита первого слово неправильные данные. Может кто нибуть сделал работоспособный скетч ? Мне кажется с помощью а3992 дв. будет плавно(менее шумно) крутится, так как имеет на борту ЦАП на 6 бит




# define clok 8
# define strob 7
# define data 9
# define sleep 10
 // первое слово
unsigned long d0=0; // 0 первое слово 1 - второе D0=0
unsigned long DAC1 = 1;  // уровень ЦАП 1 мост 6 бит
unsigned int DAC2 =0;  // уровень ЦАП2 мост 6 бит
unsigned long d13 =1 ; // управление 1 мост 0-  1а= LOW 1b=HIGH  1- наоборот
unsigned long d14 =1; // управление 2 мост 0-  1а= LOW 1b=HIGH  1- наоборот
unsigned long d15 =0; // мост 1  изменение режима спада 0 - автомат режим
unsigned long d16 =0 ; // мост 2  изменение режима спада 0 - автомат режим
unsigned long d17 =0; // источник опорного сигнала 0- внутренний
unsigned long d18 =1; // надо разобр. 1-так ток меньше
// второе слово
unsigned long w0=1; 
unsigned long w2 = 3; // 2 бита время гашения всплеска обрат тока 
unsigned long w3 = 10 ;// 5 бит  время выключения  для  внутренних схем управления  PWM
unsigned long w8 = 12; // 4 бит больше w3
unsigned long w13 = 0; // 2 бита 00 внутрениий генератор
unsigned long w15= 1 ;    //2 бита
unsigned long w16 = 0 ; // 2 бита не используется
unsigned long w18 = 1; // 0 спящий режим
int KolInt = 5;  // количество интераций
unsigned long DAC_a[5]= {0 , 19, 37, 51, 60 }; // синусоид. сигнал
unsigned long DAC_b[5]= {63, 60, 51, 37, 19 }; // косинус
int Dillau = 10; // пауза между шагами
void setup()
{
	
	pinMode(clok,OUTPUT);
	pinMode(strob,OUTPUT);
	pinMode(data,OUTPUT);
	pinMode(sleep,OUTPUT);
	digitalWrite(clok,LOW);
	Serial.begin(9600);
}

void loop()
{
	
	digitalWrite(sleep,HIGH)	;
	
// собираем второе слово
unsigned long w =0;   unsigned long a =0;

//			1,bit		2bit		2bit			2bit		4bit		5bit		2bit	  1bit
w |=  (w18 << 18) |( w16 << 16) |( w15 << 14) | (w13 << 12) |(w8 << 8) |(w3 <<3) |   (w2 <<1)    |  w0;

//	1,bit		   1bit		 1bit			1bit		1bit		1bit		6bit	    6bit	1bit
//a = (d18 <<18) | (d17<<17) | (d16 <<16) | (d15<<15) | (d14<<14) | (d13<<13) |(DAC2 <<7) |(DAC2 <<1) | d0 ;

// делать n шагов 
for (int n=0; n<5; n++)
{	// шаг 1	
	d13=1; d14=1; // 1010
	for (int i =0 ; i<KolInt; i++)
	{	
		a=0;
		DAC2 = DAC_a[i];
		DAC1 =  DAC_b[i];
		a = (d18 <<18) | (d17<<17) | (d16 <<16) | (d15<<15) | (d14<<14) | (d13<<13) |(DAC2 <<7) |(DAC1 <<1) | d0 ;
		//Serial.println(a,BIN);
		peredad( a);
		peredad(w);		
	}
	
	// шаг 2	
	d13=0; d14=1; // 0110
	for (int i =0 ; i<KolInt; i++)
	{	a=0;
		DAC1 = DAC_a[i];
		DAC2 = DAC_b[i];
		a = (d18 <<18) | (d17<<17) | (d16 <<16) | (d15<<15) | (d14<<14) | (d13<<13) |(DAC2 <<7) |(DAC1 <<1) | d0 ;
		//Serial.println(a,BIN);
		peredad( a);
		peredad(w);
	}

	// шаг 3
	d13=0; d14=0; // 0101
	for (int i =0 ; i<KolInt; i++)
	{	a=0;
		DAC1 = DAC_b[i];
		DAC2 = DAC_a[i];
		a = (d18 <<18) | (d17<<17) | (d16 <<16) | (d15<<15) | (d14<<14) | (d13<<13) |(DAC2 <<7) |(DAC1 <<1) | d0 ;
		//Serial.println(a,BIN);
		peredad( a);
		peredad(w);
	}

	// шаг 4
	d13=1; d14=0; // 0101
	for (int i =0 ; i<KolInt; i++)
	{	a=0;
		DAC1 = DAC_a[i];
		DAC2 = DAC_b[i];
		a = (d18 <<18) | (d17<<17) | (d16 <<16) | (d15<<15) | (d14<<14) | (d13<<13) |(DAC2 <<7) |(DAC1 <<1) | d0 ;
		//Serial.println(a,BIN);
		peredad( a);
		peredad(w);
	}	
	delay(Dillau);
}
	digitalWrite(sleep,LOW)	;
				
		
		delay(2000);
	}


	 
void peredad(unsigned long s)
{
	
digitalWrite(strob,LOW)	;
delayMicroseconds(50);

		for (int i=18; i>=0 ; i--)
		{
			unsigned long sdvig = 1;			
			//byte z =( s & (sdvig  >>  i) >> (18- i ) ) ;
			byte z =( (s & (sdvig << i)) >> i )  ;
				if(z)
				digitalWrite(data,HIGH);
				else
				digitalWrite(data,LOW);
			
			delayMicroseconds(1);
			digitalWrite(clok,HIGH);
			
			delayMicroseconds(1);
			digitalWrite(data,LOW);
			digitalWrite(clok,LOW);
			delayMicroseconds(1);
			Serial.print(z);
			delay(100);
			
		}
digitalWrite(strob,HIGH);
Serial.println(" ");
}
veteranton
Offline
Зарегистрирован: 25.05.2015

Здравствуйте. Подскажите получилось у вас работать с этой микросхемой A3992? если да подскажите как ей управлять. Спасибо