Motori passo passo

Gestire la curva di accelerazione


Non mi assumo nessuna responsabilita' per danneggiamenti, perdita di dati o danni personali come risultato diretto o indiretto dell'uso delle informazioni contenute in queste pagine. Questo materiale e' fornito cosi' com'e' senza nessuna garanzia implicita o esplicita.


Home
Hardware
Software

In giro per internet si trovano un sacco di schemi di circuiti di controllo per motori passo-passo, unitamente a schede e azionamenti gia' pronti per l'uso, quindi non mi dilunghero' sull'argomento: supponiamo di aver acquistato un driver per motori passo-passo e che questo funzioni perfettamente.

stepper motor driver
Driver per motori passo passo

Supponiamo inoltre di aver scelto uno schema di pilotaggio a passo intero, niente wave drive, niente micro stepping, anche se questi possono essere considerati come dettagli marginali. Il nocciolo della questione riguarda la frequenza degli impulsi, a che velocita' pilotiamo il nostro motore?

Per rispondere correttamente a questa domanda dobbiamo considerare la natura dei motori passo-passo: il motore e' caratterizzato, come tutti i motori, da una curva velocita'-coppia; come la maggior parte dei motori elettrici anche i motori passo-passo presentano una curva discendente: all'aumentare della velocita' la coppia erogata dal motore decresce fino ad esaurirsi completamente.

speed-torque relation
Grafico velocita'-coppia

Per complicare le cose il grafico del motore passo-passo e' doppio: presenta due curve, una chiamata pull-in torque e una chimata pull-out torque. La prima delle due racchiude un'area denominata start/stop region nel grafico sopra. Un motore passo-passo si avvia sempre se la frequenza degli impulsi e' all'interno della start/stop region.

La curva pull-in torque tocca l'asse orizzontale alla max starting speed, questa e' la massima velocita' alla quale e' possibile avviare il motore da fermo. Da notare che a questa velocita' la coppia e' nulla, quindi il motore potrebbe riuscire ad avviarsi, ma sicuramente non sotto sforzo.

Una volta avviato il motore puo' essere accelerato fino a toccare la curva di pull-out, questa e' la coppia massima erogabile dal motore, oltre il motore collassa, perde il sicronismo col campo magnetico rotante e si ferma ronzando alla frequenza degli impulsi di controllo.

Questa breve descrizione ci fa intuire che: mantenedosi al di sotto della curva di pull-in possiamo pilotare il motore a frequenza fissa senza problemi, non raggiungeremo grandi velocita' ma difficilmente finiremo col perdere dei passi. Inoltre se vogliamo raggiungere velocita' elevate (rimane pur sempre un motore passo-passo) dobbiamo accelerare correttamente il motore fino alla velocita' desiderata.

Un'ultima nota: una volta accelerato il motore va anche decelerato, fermare di colpo gli impulsi al di sopra della curva di pull-in potrebbe portare ad una perdita dei passi, il motore non riesce a fermarsi all'istante ma prosegue nel suo moto per un numero imprecisato di passi e disallineandosi dal sistema di controllo.

Accelerazione

Tralasciamo quindi il pilotaggio a frequenza costante e cerchiamo una tecnica per modificare la frequenza degli impulsi. Beninteso: il pilotaggio a frequenza costante non va cassato completamente, e' molto utile nel caso di movimenti lenti o molto piccoli in cui risulta inutile accelerare e decelerare.

Con una dose di fantasia notevole possiamo dire che la cosa piu' semplice che si possa immaginare consiste nell'accelerare costantemente fino a velocita' massima, quindi mantenere la velocita' costante fino all'approssimarsi della destinazione e decellerare costantemente fino a fermarsi con precisione micrometrica nel punto di arresto prescelto. Il grafico qui sotto chiarisce la situazione.

accelerazione e velocita'
Accelerazione e velocita' nel tempo

Fissiamo le regole del gioco: consideriamo di possedere un oscillatore che generi una frequenza di riferimento fck, questa frequenza base viene divisa per un valore intero c generando la frequenza dei passi. Quindi variando opportunamente il divisore c possiamo variare la frequenza dei passi, quindi la velocita' del motore.

I dati da cui partiamo sono: la frequenza base fck, l'ampiezza del passo del motore alfa e l'accelerazione angolare che vogliamo dare al motore a.

valori iniz.

Rifacciamo il grafico sopra riportando solo la velocita' angolare del motore e suddividendo l'asse temporale in opportuni intervalli Delta-t. Lo scopo del gioco e' proprio trovare la giusta sequenza degli intervalli Delta-t che fanno si che l'accelerazione angolare del motore sia costante e pari al valore desiderato.

accelerazione e velocita'
Suddivisione dell'asse temporale

Consideriamo ora un istante temporale generico t(n) che divide due passi del motore, il passo precedente (alla sinistra di t(n)) inizia all'istante t(n-1) e ha durata Delta-t(n-1). All'istante t(n) inizia un nuovo passo di durata Delta-t(n) che portera' fino all'istante t(n+1).

Delta-t

Nel grafico sopra ogni rettangolo ha area pari ad alfa, per cui la velocita' angolare (che viene ritenuta costante all'interno di tutto il passo) nel passo n-esimo vale:

Omega-n

Girando l'ultima otteniamo l'espressione di c(n):

c(n)

Ora dovremmo riuscire a sostituire omega(n) ed esprimerlo in funzione di omega(n-1), seguendo la definizione stessa di velocita' otteniamo:

Omega-n

Qui scatta il dubbio amletico: quale periodo scegliere come Delta-t in questa formula?

La mia prima scelta e' stata:

Delta-t

basata sulla distanza tra i punti medi degli impulsi riportati sul grafico sopra. Purtroppo con questa sostituzione non riesco a risolvere l'equazione.

Internet invece consiglia di considerare come intervallo di tempo l'intero impulso precedente: di fatto nel tempo Delta-t(n-1) si passa da velocita' omega(n-1) a velocita' omega(n), quindi sostituiamo:

Delta-t

ed otteniamo:

c(n)

In questa sostituiamo:

sostituzione

ed otteniamo:

c(n)

Da qui con un po' di giri si ottiene:

c(n)

Questa formula permette di calcolare il c n-esimo dinamicamente mentre il moto procede, conosciuto il precedente. Ora non resta altro che calcolare il primo coefficiente c0, per fare questo ricominciamo da:

Delta-t0

Facendo alcune considerazioni geometriche intorno al primo passo possiamo scrivere:

Step 0

da cui si ottiene:

c0

Riassumendo possiamo calcolare la sequenza dei divisori di frequenza come:

c0, cn

Dopo tutte queste elugubrazioni su accelerazioni, intervalli temporali e voli pindarici assortiti, direi di infilare questa formule in un calcolatore e verificare se funzionano veramente. La simulazione fatta con un programmino C produce questi risultati:

accelerazione passo-passo
Verifica accelerazione motore

Per quanto la curva risulti temporalmente sfalsata, l'inclinazione e' corretta, quindi abbiamo ottenuto il nostro scopo: ora siamo in grado di accelerare il motore passo-passo con accelerazione costante. Per decelerare lo stesso motore si una la stessa formula, e' sufficiente considerare l'accelerazione negativa.

Calcolo alternativo

Il discorso potrebbe essere finito qui, se non fosse per tutte quelle radici quadrate ed elevamenti a potenza. Il dubbio che mi viene e': "Esiste un modo piu' semplice per calcolare la sequenza dei c(n)?"

Ripartiamo dalle origini: l'equazione del moto uniformemente accelerato:

moto accelerato
Moto uniformemente accelerato

Istante per istante la posizione angolare del motore vale:

S(t)

Noi siamo interessati ai particolari istanti tn per cui lo spazio S risulta un multiplo intero di alfa.

S(t)

Nel nostro mondo dominato dall'indice n la riscriviamo in questo modo:

S(tn)

dopo di che sostituiamo la definizione di S(t) ed otteniamo gli istanti tn:

S(tn)

S(tn)

Questi sono gli istanti di tempo che ci interessano, ora basta ricordarsi che:

cn

sostituiendo tn si ottiene in fine:

cn

Questa vorrebbe essere la forma non ricorsiva che permette di calcolare i coefficienti cn partendo dall'indice n. Da notare che Kb e' una costante che dipende dalle caratteristiche del motore stesso e dall'accelerazione angolare alla quale vogliamo sottoporlo, mentre i coefficienti kn rappresentano una successione costante per qualunque motore. Se facciamo un bel grafico otteniamo questo andamento:

accelerazione passo-passo
Verifica accelerazione motore

PERFETTO!!!
Questa volta non c'e' nemmeno quel piccolo spostamento temporale che poteva lasciare qualche dubbio sull'affidabilita' del metodo.

Certo qualcuno potrebbe obiettare il fatto che le radici quadrate non sono scomparse, e' vero, ma adesso io gioco il jolly: come si vede sopra i coefficienti cn sono il prodotto di una parte costante Kb e di una sequenza kn. Il primo dipende solo dalle caratteristiche del motore e quindi puo' essere calcolato una volta per tutte all'inizio del movimento. Il secondo e' una sequenza di coefficienti che non dipende dal motore ne dal moto e che quindi potrebbe essere contenuta in una tabella.

Questo secondo metodo di calcolo apre la possibilita' di avere un metodo a tabella. Solitamente non smanio per i metodi a tabella perche' richiedono sempre una discreta quantita' di memoria che preferisco non sprecare, certo dall'altra parte semplificano e velocizzano notevolmente i calcoli, cose che in questa circostanza piena di radici quadrate potrei apprezzare molto.

Metodo a tabella

Prima di addentrarci nella questione facciamo un bel confronto dei risultati fin qui ottenuti, non tanto perche' serva veramente a qualcosa, ma perche' ho gia' preparato il grafico e quindi devo metterlo da qualche parte, mi sembra il momento buono.

compare
Confronto accelerazione motore

Ora che ci siamo divertiti riprendiamo l'espressione dei cn vista sopra:

cn

La costante Kb puo' essere calcolata una volta per tutte, o quantomeno solo quando cambia l'accelerazione angolare. Purtroppo il calcolo di Kb include una radice quadrata, almeno per il momento cerchiamo di non farne un dramma, ritorneremo poi su questa questione.

La successione dei kn e' sempre la stessa per ogni motore, quindi possiamo farne una tabella e non dovremo mai piu' calcolarli, solo prelevarli dalla tabella e con un solo prodotto ottenere il nostro cn. Fare una tabella di dimensione chiaramente finita pone pero' dei problemi: l'accelerazione del motore non potra' durare in eterno, prima o poi la tabella finira' e se il motore non avra' raggiunto la velocita' finale saremo nei pasticci.

In realta' la soluzione pacifica consiste nel dire che se la tabella finisce il motore cessa, per forza di cose, la rampa di accelerazione e prosegue a velocita' costante, qualunque velocita' abbia raggiunto. Se non ha raggiunto la velocita' desiderata se ne fa una ragione e se la mette via cosi'. Il problema comunque rimane: quanto facciamo lunga la tabella per non rischiare di dover segare tutte le rampe di accelerazione?

Rispondiamo prima ad un'altra domanda: "Che velocita' si raggiunge accelerando uniformemente per N passi?"
Inoltre: "Quanto tempo ci abbiamo messo?"

Ripartiamo dall'equazione del moto:

S(t)

Ora consideriamo gli istanti di tempo tN per cui l'integrale della velocita' e' multiplo intero di alfa:

S(t)

Sostituendo atteniamo:

t(N)

da cui risolvendo per t si ottiene:

t(N)

Questa sono rispettivamente: il tempo necessario per eseguire i primi N impulsi, la velocita' angolare e la frequenza degli impulsi raggiunta dopo N passi.

Ora prendiamo l'ultima ed eleviamo al quadrato entrambi i membri, si ottiene:

f(N)

in cui sostituiamo alfa con:

alpha

in cui pg rappresenta i passi giro, un po' piu' maneggevole dell'ampiezza del passo singolo. Riarrangiando i membri e risolvendo rispetto all'accelerazione angolare otteniamo:

a_lim

Chiameremo questa accelerazione limite.
L'accelerazione limite non costituisce un limite invalicabile, indica solo il valore di accelerazione al di sotto del quale il motore non e' piu' in grado di raggiungere la frequenza massima degli impulsi fmax. Questa limitazione e' chiaramente imposta dalla dimensione della tabella dei kn, indicata come Nmax nella formula di sopra.

Questo e' in buona sostanza il limite a cui si va incontro avendo una tabella di coefficienti finita. Ben'inteso che non e' un vincolo per il motore dover raggiungere sempre la frequenza massima degli impulsi, ora la domanda che tutti si fanno e': "Ma quanto vale questa accelerazione limite? E' tanto o e' poco?"

Per tentare di rispondere alla domanda ho fatto un paio di grafici ipotizzando due tabelle di coefficienti: una con 256 coefficienti ed una con 512.

a_lim
Accelerazione limite per il metodo a tabella

Consideriamo per semplicita' il grafico di destra, quello con N pari a 256, il grafico si legge nel seguente modo: consideriamo un motore da 100 passi/giro, individuiamo quindi il 100 sull'asse delle ascisse e saliamo fino ad incontrare la curva dei 10 rad al secondo quadrato, troviamo che corrisponde a circa 280 impulsi al secondo. Ora se avviassimo questo motore con un'accelerazione inferiore a 10 rad/s2 allora non riusciremmo piu' ad arrivare alla frequenza di 280 impulsi/s perche' la tabella dei coefficienti finirebbe prima. Secondo questi discorsi una tabella da 512 coefficienti rischierebbe di diventare corta solo per motori con molti impulsi/giro e accelerazioni veramente basse (pochi rad/s2); di fatto il grafico comprende la frequenza di 400 impulsi/s, una frequenza degli impulsi veramente alta per un motore passo-passo.

Alla fine di tutti questi discorsi costruiamo una tabella con 512 coefficienti (anche se la radice di 512 non e' un bel numero) e vediamo dove andiamo a sbattere, secondo i miei calcoli dovrebbe darci sufficiente spazio di manovra.

Virgola fissa

cn

Tutti i kn tranne il primo sono inferiori a 1 (ma sempre maggiori di 0), k0 vale 1. Al contrario, tutti i cn sono ben maggiori di 1: ricordo che questo e' il divisore della frequenza base generata da un timer, ed e' solitamente maggiore di 100; di conseguenza Kb deve essere un numero piuttosto grande, intorno al 1000. Tra l'altro ci tengo a farvi notare che c0=Kb, essendo k0=1.

Detto questo la domanda e': "Che formato scegliamo per Kb e kn?"
Per semplificare al massimo ho scelto un formato in virgola fissa 16.16 bit per rappresentare qualsiasi valore. Nel caso specifico la cosa risulta ulteriormente semplificata: Kb viene troncato alla sola parte intera e rappresentato con 16 bit senza segno; di kn viene tenuta la sola parte decimale, anche questa rappresentata con soli 16 bit. Il risultato e' un valore 16.0 bit moltiplicato per un valore 0.16 bit che da un risultato 16.16 bit. In realta' essendo questo il valore di cn si potrebbe evitare di calcolare la parte decimale, che andrebbe comunque troncata.

Questo metodo non ricorsivo sembra non soffrire della propagazione degli errori che sarebbe invece presente nel metodo ricorsivo: nel nostro caso l'errore dato dall'approssimazione affligge il singolo cn non estendendosi a tutti quelli successivi.

Il risultato di questo metodo di calcolo e' visibile nel grafico qui sotto.

accel
Confronto tra virgola mobile e virgola fissa

Come si vede il calcolo con virgola fissa ricalca abbastanza fedelmente il risultato ottenuto in virgola mobile.
Parafrasando il grande genio direi: "88 miglia all'ora!!!"

Un piccolo appunto sulla moltiplicazione di valori in virgola fissa: Kb viene rappresentato con la sola parte intera, e' quindi in un formato 16.0 bit; di kn viene invece tenuta la sola parte decimale, il suo formato e' 0.16 bit. In entrambi i casi abbiamo due valori a 16 bit senza segno che vengono moltiplicati tra loro. La moltiplicazione pura tra interi senza segno produce un risultato a 32 bit che nel nostro caso risulta gia' nel formato corretto 16.16 bit; quindi basta troncare la parte decimale per avere cn in formato intero a 16 bit.

Download

Se qualcuno fosse interessato agli script per la generazione dei grafici e delle formule matematiche viste sopra, trova tutto qui.

step_equ Script per la generazione delle formule matematiche, richiede LaTeX e l2p.
ramping-0.01.tar.gz Codice per la generazione delle tabelle e dei grafici di accelerazione, puo' generare il movimento completo del motore.

Questo sito e' stato realizzato interamente con vim.
Grazie a tutta la comunita' open source, alla free software foundation e chiunque scriva software libero.