Драйвер шагового двигателя A3992 Allegro
- Войдите на сайт для отправки комментариев
Разобрал матричный принтер. В результате имеем драйвер шагового двигателя с БП и обвязкой. В нем шаговики управляются драйвером А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(" ");
}
Здравствуйте. Подскажите получилось у вас работать с этой микросхемой A3992? если да подскажите как ей управлять. Спасибо