Motoare pas cu pas unipolare: driver și cod sursă

 Autor:   Publicat pe:   Actualizat pe:  2017-11-20T11:22:07Z

Metode de acționare a motoarelor pas cu pas unipolare. Schemă driver cu tranzistoare și cod sursă Arduino.

Motoarele pas cu pas sunt dispozitive electromecanice care efectuează mișcări de rotație discrete în pași incrementali. Numărul de pași este predefinit de controller și unghiul unui pas este cunoscut. Astfel, motoarele pas cu pas realizează mișcări precise, necesare în diverse aplicații mecanice fine. Pentru rotirea în pași, motorul conține mai multe bobine care sunt activate secvențial de impulsuri generate de un controller. Rata de succesiune a impulsurilor determină viteza de rotație iar ordinea de succesiune determină sensul rotației.

Există două tipuri de motoare pas cu pas. Motoarele bipolare conțin două bobine separate și au 4 fire de conexiune. Pentru a roti un astfel de motor bobinele sunt alimentate una după alta, apoi polaritatea este inversată și bobinele sunt iarăși alimentate. În acest caz, driver-ul trebuie să fie mai complex. Se folosesc două punți H. Celelalte motoare pas cu pas sunt unipolare. Au tot două bobine, dar aceste bobine prezintă o priză mediană. Prizele mediane sunt conectate la sursa de alimentare și celelalte 4 terminale primesc impulsurile. Aceste motoare au 5 fire. Driver-ul se simplifică în acest caz, fiind necesari 4 tranzistori. Mai există și motoare pas cu pas ce pot fi folosite fie ca bipolare, fie ca unipolare. Acestea nu au prizele mediane de la bobine conectate între ele (motoare cu 6 fire). Astfel, dacă vreți un motor bipolar veți folosi doar terminalele celor 2 bobine. În caz contrar, veți conecta prizele mediane între ele și la sursa de alimentare și puteți folosi motorul ca unipolar.
Motoare pas cu pas unipolare: driver și cod sursă
Acest articol va prezenta metode de acționare a motoarelor unipolare. Impulsurile pot fi generate destul de ușor cu orice microcontroller. Problema este că microcontroller-ul nu poate fi conectat direct la o sarcină inductivă și de curent mare. Așadar, este nevoie de un driver. Există integrate specializate pentru acest lucru sau vă puteți construi un driver cu 4 tranzistori. Eu am folosit 4 tranzistoare N-FET. De obicei, aceste tranzistoare, mai ales cele care provin din surse de alimentare în comutație, conțin diode de protecție, simplificând schema driver-ului.

Puteți alimenta un motor pas cu pas de la o sursă de tensiune constantă. Dar, pentru performanțe maxime se recomandă o sursă de curent constant. Mai ales dacă nu cunoașteți specificațiile unui motor găsit prin vreun dispozitiv. Schema prezentată conține o sursă de curent constant construită cu integratul LM317, setată la 500mA.

Dacă nu cunoașteți curentul nominal pentru motor, încercați cu valori diferite, crescânde astfel încât, în regim normal de funcționare, motorul poate să se încălzească, dar nu atât de mult încât să nu puteți pune mâna pe el. Dacă se încălzește foarte tare, micșorați curentul.
Driver pentru motoare pas cu pas unipolare cu Arduino
Driver pentru motoare pas cu pas unipolare cu Arduino
Schema prezentată este una completă. Pentru majoritatea motoarelor, diodele de protecție pot fi diode redresoare uzuale de tipul 1N4004. Mai bune are fi diodele redresoare ultrarapide. Dacă folosiți tranzistori N-FET cu diode incluse (de exemplu, eu am folosit 2SK2382), diodele externe de protecție nu mai sunt necesare. De asmenea, în cazul tranzistoarelor FET, puteți conecta grila (gate) direct la pinii microcontroller-ului, fără rezistoare înseriate. Rezistoarele sunt necesare dacă veți folosi tranzistoare bipolare NPN. Și acestea pot fi utilizate în acest scop. Se recomandă tranzistoare Darlington. Verificați dacă tranzistoarele folosite suportă amperajul necesar motorului (curentul drenă-sursă, respectiv curentul colector-emitor) și dacă pot fi activate de microcontroller (tensiunea prag a grilei, respectiv factorul de amplificare mare).

Rezistorul conectat între pinul OUT și pinul ADJ al LM317 determină curentul maxim pentru motor, conform formulei 1,25/R. În cazul meu, 1,25/2,4 = 0,5A. Se va folosi un rezistor adecvat ca putere (2-3W). Tensiunea la intrarea LM317 nu poate depăși 35V. Nu vă temeți să alimentați cu tensiune mare un motor cu specificație de tensiune mult mai mică. Circuitul prezentat va micșora automat tensiunea astfel încât curentul prin bobină să nu depășească valoarea prestabilită.

Am construit driver-ul simplificat pe o placă de test.
Driver pentru motor pas cu pas unipolar pe placa test
Driver pentru motor pas cu pas unipolar pe placa test
Acum, mai este necesar un software. Am acționat motorul folosind o plăcuță Arduino. Pentru a simplifica codul, nu am folosit funcția digitalWrite. Am ales să setez direct portul. Prima dată, portul trebuie setat ca port de ieșire. Acest lucru se face în secțiunea setup() prin atribuirea DDRB = 0x3F;. Pinii digitali de la 8 la 11 sunt setați ca ieșiri acum. Consultați documentația Arduino referitoare la porturi.

Bobinele trebuie activate într-o ordine specifică: întâi jumătatea unei bobine (A), apoi jumătatea celeilalte bobine (B). Apoi vor fi activate pe rând, jumătățile rămase (jumătatea C a primei bobine, apoi D a celeilalte bobine). Ordinea determină direcția de rotație. De reținut că nu trebuie activate una după alta ambele jumătăți ale aceleiași bobine. Motorul va face un pas înainte și unul înapoi. Nu îl afectează în vreun fel, dar probabil nu asta vă doriți. A-B-C-D, respectiv A-D-C-B sunt secvențe valide, pe când A-C-B-D nu este.

Sunt 4 bobine de activat. Rezultă trei moduri de acționare. Primul mod se numește „wave drive”. Fiecare bobină este acționată secvențial, una câte una, astfel încât în orice moment doar o bobină este activă. Metoda oferă un consum mai mic de curent dar și cuplu redus. Iată cu arată secvența de impulsuri.
Modul „wave drive”
Modul „wave drive”
void waveDrive(unsigned int numSteps, unsigned int stepDelay = 5) {
  for (unsigned int i = 0; i < numSteps; i++) {
    PORTB = B00000001;
    delay(stepDelay);
    PORTB = B00000010;
    delay(stepDelay);
    PORTB = B00000100;
    delay(stepDelay);
    PORTB = B00001000;
    delay(stepDelay);
  }
}
Un alt mod de acționare este „half drive”. O bobină este acționată de un impuls, dar acest impuls este menținut când cea de-a doua este acționată. Jumătate din timp, motorul funcționează du două bobine acționate. Rezultatul este un cuplu mai bun, dar și o dublare aparentă a numărului de pași pe rotație. Așadar rotația este mai puțin sacadată.
Modul „half drive”
Modul „half drive”
void halfDrive(unsigned int numSteps, unsigned int stepDelay = 5) {
  for (unsigned int i = 0; i < numSteps; i++) {
    PORTB = B00000001;
    delay(stepDelay);
    PORTB = B00000011;
    delay(stepDelay);
    PORTB = B00000010;
    delay(stepDelay);
    PORTB = B00000110;
    delay(stepDelay);
    PORTB = B00000100;
    delay(stepDelay);
    PORTB = B00001100;
    delay(stepDelay);
    PORTB = B00001000;
    delay(stepDelay);
    PORTB = B00001001;
    delay(stepDelay);
  }
}
Cel de-al treilea mod se numește „full drive”. În orice moment, două bobine adiacente sunt acționate. Rezultă cuplu maxim.
Modul „full drive”
Modul „full drive”
void fullDrive(unsigned int numSteps, unsigned int stepDelay = 5) {
  for (unsigned int i = 0; i < numSteps; i++) {
    PORTB = B00000011;
    delay(stepDelay);
    PORTB = B00000110;
    delay(stepDelay);
    PORTB = B00001100;
    delay(stepDelay);
    PORTB = B00001001;
    delay(stepDelay);
  }
}
Funcțiile prezentate sunt simplificate și nu permit modificare sensului de rotație. Argumentul numSteps este de fapt un multiplu de 4 pași. Dacă numSteps = 1, motorul va face 4 pași. Dacă aveți un motor cu 200 de pași pe rotație, setați numSteps la 50 pentru o rotație completă. Argumentul stepDelay permite modificarea ratei de succesiune a impulsurilor. Cu cât mai mic, cu atât impulsurile vor fi mai rapide și motorul se va învârti mai rapid. Dacă sunt prea rapide, motorul va vibra fără a efectua rotații. Durata minimă a unui impuls este un parametru ce ține de tipul motorului și de sarcina acestuia.

Site-ul Melab prezintă câteva GIF-uri animate cu modul de acționare a bobinelor unui motor pas cu pas unipolar. Într-un articol viitor, voi îmbunătăți funcțiile prezentate aici.

Niciun comentariu :

Trimiteți un comentariu

Vă recomandăm să citiți regulamentul comentariilor înainte de a scrie un comentariu.