I motori passo-passo

Benvenuti a un nuovo appuntamento con la Rubrica Firmware Reload di Elettronica Open Source. In questa Rubrica del blog EOS abbiamo raccolto gli articoli tecnici della vecchia rivista cartacea Firmware, che contengono argomenti e temi passati ancora di interesse per Professionisti, Makers, Hobbisti e Appassionati di elettronica. I motori passo-passo o motori “stepper”, per le loro caratteristiche di compattezza, affidabilità e costi relativamente contenuti, rappresentano una scelta piuttosto diffusa in gran parte delle realizzazioni nel campo dell'automazione industriale. In questo articolo vediamo nei dettagli quelli che sono i principi del loro funzionamento.

Introduzione

I motori passo-passo, conosciuti anche come motori stepper, sono una tipologia di motori sincroni in corrente continua senza spazzole capaci di suddividere un giro del proprio rotore in un numero n di passi. Quest’ultima caratteristica li differenzia ed appunto li caratterizza in quanto, rispetto alle altre tipologie di motori, è possibile controllarli in catena aperta. Infatti, a differenza delle altre tipologie di motori dove per il controllo della posizione normalmente è necessario un encoder, nei motori passo-passo basta conoscere la posizione iniziale e il numero di passi che compongono la rotazione completa, contando quindi il numero dei passi fatti si conoscerà la posizione corrente del motore. Questo motore rappresenta la soluzione ideale in quelle applicazioni che richiedono precisione nello spostamento angolare e nella velocità di rotazione, come ad esempio nelle applicazioni robotiche, in stampanti, scanner o nei servomeccanismi in generale. In questo articolo partiremo da una veloce descrizione meccanica dei motori passo-passo, per poi scendere più nel dettaglio delle equazioni matematiche, parlare delle tecniche di controllo comunemente usate, infine vedremo una implementazione pratica di controllo di un motore passo-passo mediante Arduino.

CARATTERISTICHE MECCANICHE DEI MOTORI PASSO-PASSO

Il principio di funzionamento del motore passo-passo si basa sul fatto che questo motore, a differenza degli altri, se alimentato riesce a mantenere fermo l’albero in un punto di equilibrio; quindi per farlo muovere ad un determinata velocità o per portare l’albero ad una posizione desiderata bisogna, mediante una sequenza opportuna di impulsi, spostare il punto d’equilibrio in modo tale che l’albero ruoti muovendosi verso la nuova posizione d’equilibrio. Le possibili posizioni d’equilibrio per il motore sono fissate meccanicamente, quindi per portare il motore ad una posizione desiderata basterà contare il numero di impulsi inviati al motore, mentre per controllare la velocità di rotazione basterà controllare la frequenza con cui si inviano gli impulsi al motore. La Figura 1 mostra il principio di funzionamento: nell’immagine a sinistra, l’elettromagnete 1 viene eccitato, il rotore quindi sotto l’azione attrattiva dell’elettromagnete ruoterà in modo tale da portare i propri denti in equilibrio rispetto all’elettromagnete.

Figura 1: Esempio di Funzionamento

Figura 1: Esempio di Funzionamento

Nell’immagine a destra (sempre in Figura 1) l’elettromagnete 1 viene spento e viene acceso l’elettromagnete 2, anche in questo caso il rotore sotto l’azione dell’elettromagnete ruoterà in modo da portare i propri denti in equilibrio, tra i due passaggi il rotore ha compiuto un “passo”. Eccitando via via gli altri elettromagneti si fa ruotare il motore, il numero di passi necessari per effettuare un giro è un parametro costruttivo del motore e determina la risoluzione nel posizionamento dell’albero. Come vedremo in seguito, alimentando i due elettromagneti contemporaneamente, il rotore sotto l’azione di questi ultimi tenterà di raggiungere la posizione d’equilibrio fermandosi però a metà strada, ottenendo in questo caso uno stato intermedio chiamato “mezzo passo”. I motori passo-passo si dividono tradizionalmente in 3 grandi gruppi: i motori a magnete permanente, quelli a riluttanza variabile e i motori ibridi, che sono quelli attualmente più usati. Come tutti i motori, sono composti da uno statore e da un rotore, come visibile in Figura 2 il rotore è composto da due ruote dentate permanentemente magnetizzate sfasate tra loro di mezzo passo. Sul rotore non sono presenti fili o contatti striscianti, questa è una delle caratteristiche che rende il motore più robusto e gli dona una vita più lunga rispetto ai motori con contatti striscianti. Lo statore invece è composto dai classici elettromagneti, il motore in figura ne ha 8, su ogni elettromagnete sono presenti dei denti, che sono sfalsati tra loro in modo da costringere il rotore a ruotare al fine di trovare la posizione di equilibrio.

Figura 2: Motore Passo-Passo

Figura 2: Motore Passo-Passo

 

Figura 3: Simbolo Elettrico

Figura 3: Simbolo Elettrico

TECNICHE DI PILOTAGGIO

Le tecniche di pilotaggio per i motori passo-passo dipendono dalla loro tipologia, questi ultimi, infatti, possono avere quattro fili o sei fili. I motori con sei fili sono spesso erroneamente chiamati motori a quattro fasi, in realtà, in tutti i motori passo-passo le fasi sono sempre e soltanto due. Un nome un pò più appropriato per questo genere di motori è quello di motori unipolari, in quanto vengono pilotati con un driver unipolare, anche se è possibile pilotarli con un driver bipolare. Per quanto riguarda invece i motori con quattro fili, che d’ora in poi chiameremo bipolari, questi possono essere pilotati soltanto da un driver bipolare. La Figura 4 mostra lo schema circuitale di un motore pilotato da un driver unipolare, le spine centrali delle due fasi del motore sono collegate alla tensione d’alimentazione, mentre ognuna delle due fasi è controllata da due transistor.

Figura 4: Driver Unipolare

Figura 4: Driver Unipolare

Nei motori a quattro fili il pilotaggio del motore avviene tramite un driver bipolare, ovvero tramite un H-Bridge, come quello mostrato nella Figura 5.

Figura 5: Driver Bipolare

Figura 5: Driver Bipolare

Il pilotaggio avviene accendendo due transistor complementari per volta, purché non siano sullo stesso braccio del ponte in quanto si manderebbe in corto l’alimentazione. I motori passo-passo possono essere pilotati in modalità full-step, ovvero si fa ruotare il rotore di un passo alla volta o in modalità half-step, ovvero mediante rotazioni di mezzo passo. Il pilotaggio full-step di un motore unipolare avviene accendendo coerentemente una coppia di transistor per volta, così ad esempio, riferendosi ai transistor del driver unipolare mostrato nella Figura 4, accendendo contemporaneamente i transistor Q2 e Q4, la corrente scorrerà sul morsetto negativo della fase A e sul morsetto negativo della fase B, facendo ruotare il rotore di un passo in senso antiorario. Nella Figura 6 viene riportata la tabella delle commutazioni dei transistor nel caso di pilotaggio unipolare full-step.

Per quanto riguarda invece la modalità half-step, gli stati attivi possibili per il driver sono otto, quindi considerando la tabella delle transizioni, mostrata nella Figura 7, questa contiene otto righe. Rispetto al caso precedente sono presenti quattro possibili stati in più corrispondenti ai casi in cui viene acceso soltanto un transistor, ovvero ai casi in cui viene alimentata soltanto una delle due fasi che costituiscono il motore, si fa notare che alimentando soltanto una fase del motore, su quest’ultimo scorrerà una corrente minore e di conseguenza si svilupperà una coppia minore. La logica per il controllo dei motori passo-passo bipolari è identica a quella dei motori unipolari, l’unica differenza sta nel numero di transistor accesi contemporaneamente, che rispetto al caso unipolare raddoppia, il numero delle transizioni quindi resta uguale. Nella Figura 8 viene, ad esempio, mostrata la tabella delle transizioni per il pilotaggio di un motore bipolare in half-step.

 

Tabella 6: Transizioni Full-Step

Figura 6: Transizioni Full-Step

 

Tabella 7: Transizioni Half-Step

Figura 7: Transizioni Half-Step

 

Tabella 8: Transizioni Half-Step

Figura 8: Transizioni Half-Step

EQUAZIONI DEL MOTORE

Il controllo dei motori passo-passo avviene inviando al driver un treno d’impulsi che indicano a quest’ultimo quali transistor accendere, la frequenza con cui vengono inviati gli impulsi, ovvero il tempo tra l’invio di un treno e il successivo, influisce sulla velocità e quindi sulla posizione dell’albero del motore. Per ottenere determinate prestazioni in termini di accelerazione o velocità dell’albero del motore è necessario calcolare il tempo tra una transizione e la successiva nelle tabelle fin qui viste, all’atto pratico questo tempo non sarà altro che il tempo di interrupt con il quale il microcontrollore invia il segnale di pilotaggio al driver del motore. Definendo il tempo di step come il tempo tra un passo di aggiornamento e il successivo:

Tn=tn+1- tn

dalle semplici equazioni fisiche che descrivono il moto dell’albero e ricordando che un motore passo-passo si comporta come un sistema discreto, si ricavano le espressioni della velocità:

ω = αtn

e della posizione dell’albero motore:

n=1/2* αtn2

dove con n si è indicata proprio la posizione n-esima dell’albero, riscrivendo quest’ultima in funzione del tempo si ottiene:

tn=√(2n/α)

che è l’espressione del tempo affinché il motore ruoti con un’accelerazione costante, a questo punto riconsiderando l’espressione del tempo di step si ottiene:

Tn=tn+1- tn=T0(√(n+1)-√n)

avendo definito:

T0=√(2/α)

per ottenere quindi valori di accelerazione costante per il motore basterà fissare quest’ultima al valore desiderato e calcolare di conseguenza T0, ovvero il tempo di aggiornamento delle transizioni sul driver. Fin qui si è parlato di profili ad accelerazione costante; spesso quando si parla di motori si fa confusione tra profili ad accelerazione costante e profili ad accelerazione lineare. Nella Figura 9 vengono, ad esempio, riportati gli andamenti della velocità, dell’accelerazione e della posizione per un motore passo-passo con un profilo di velocità lineare, ovvero ad accelerazione costante. Sono presenti tre fasi, la velocità ha un profilo lineare trapezoidale, l’accelerazione è un insieme di gradini mentre la posizione, che è l’integrale della velocità, ha un profilo quadratico. Come visto dalle precedenti equazioni, un profilo ad accelerazione costante, quindi con velocità lineare, richiede un semplice calcolo del tempo di aggiornamento degli impulsi da mandare al driver, variando l’accelerazione varierà quest’ultimo ma non la tabella delle transizioni che resterà sempre valida. Un profilo ad accelerazione lineare, invece, richiede uno sforzo computazionale maggiore in quanto, oltre al tempo, al variare dell’accelerazione bisogna ricalcolare la tabella delle transizioni. Questa maggiore complessità di calcolo, tuttavia, non viene ripagata dalle prestazioni dinamiche che, solo in rari casi, ad esempio nel caso in cui siano presenti elementi elastici sulla trasmissione del moto, si dimostrano migliori rispetto ad un profilo ad accelerazione costante.

Quindi, a fronte delle migliori prestazioni e della semplicità d’implementazione, il controllo con un profilo ad accelerazione costante (velocità lineare) è maggiormente usato. Tuttavia, nel dimensionamento della logica di funzionamento spesso si incorre in errori più o meno grossolani. Uno di questi consiste nel ridurre il tempo di step linearmente, ovvero il tempo tra un invio d’impulsi al driver e il successivo, all’aumentare del numero di step: una logica di questo tipo crea una curva per la velocità che cresce iperbolicamente al diminuire del tempo di step. Un altro errore comune è quello di ridurre il tempo di step dividendolo per l’inverso dello stesso numero di passi: una logica di questo tipo porta ad una curva di velocità lineare rispetto al numero di step ma cambia di volta in volta lo “step time” creando così una curva di velocità che non è lineare ma risulta invece del secondo ordine, dove la velocità aumenta in funzione del quadrato del tempo.

Figura 9: Profilo a Velocità Costante

Figura 9: Profilo a Velocità Costante

 

Figura 10: Schema Circuitale

Figura 10: Schema Circuitale

ESEMPIO DI CONTROLLO CON ARDUINO

In questo semplice esempio verrà utilizzato un Arduino Uno per gestire un motore passo-passo unipolare mediante il driver L293D, in figura viene mostrato lo schema circuitale. Chiunque abbia un pò di dimestichezza con Arduino sa che il modo più semplice per scrivere un programma (sketch) per questa scheda controllore è utilizzando l’apposito programma (scaricabile dal sito: www.arduino.cc). Nel nostro caso si è scritto un semplice sketch che si occupa di impostare i parametri del motore (il numero di passi), del circuito (di definire i pin del driver collegati ad Arduino) e di fissare la velocità di rotazione del motore in fase di inizializzazione. Durante l’esecuzione, invece, lo sketch non fa altro che far ruotare il motore tra due posizioni. Nel Listato 1 viene riportato lo sketch completo usato, come si vede dal codice Arduino è già provvisto di una apposita libreria per la gestione dei motori passo-passo (stepper.h) e nel nostro caso è stato usato l’oggetto Stepper, per la definizione del motore, dichiarando il numero di passi del motore e i pin di Arduino a cui è connesso il driver di pilotaggio. Per quanto riguarda invece il pilotaggio del motore sono state usate le funzioni:

  • setSpeed(int speed), dove la variabile speed rappresenta il valore di velocità desiderato come numero di giri al minuto;
  • step (int step), dove la variabile step rappresenta il numero di passi da fare.

Come si vede, Arduino riesce a rendere semplicissimo il controllo di un oggetto mediamente complesso come un motore passo-passo. Chiaramente le funzioni viste controllano soltanto la velocità e la posizione del motore, nel caso in cui si volesse implementare un controllore per i vari profili di accelerazione probabilmente sarà necessario creare delle funzioni ad-hoc.

// Programma di Gestione di un Motore Passo-Passo
#include <Stepper.h>
// Definizione del numero di step del motore
#define STEPS 200
// Definizione del motore (Numero di passi e pin collegati al Driver)
Stepper Motore(STEPS 4,5,6,7);
// Setup
void setup(){
// Fisso la velocità del motore (Numero di giri al minuto)
Motore.setSpeed(10);
}
// Loop
void loop(){
Motore.step(80);
delay(200);
Motore.step(-80);
delay(200);
}
Listato 1

 

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend