Драйвер шагового двигателя 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? если да подскажите как ей управлять. Спасибо