Stepper motor controller nell’MB91460

La nuova linea di microprocessori Fujitsu a 32 bit nata per applicazioni automotive e industriali, grazie alla ricca dotazione di periferiche, consente il facile raggiungimento di prestazioni straordinarie.

In questo articolo vedremo una delle applicazioni perfettamente efficaci con la potenza di calcolo e la dotazione di periferiche abbinate ai nuovi processori Fujitsu della serie MB91460. Questa nuova serie, basata su tecnologia flash da 0.18 um, consente operazioni fino a 100 MHz e dispone di capacità di memoria di programma da 288 kb a 2 Mb. L’equipaggiamento interno va dal CAN bus all’I2C bus, vari canali DMA, RTC, UART, ADC, sound generator, timer ricaricabili, cache memory, stepper motor controller, insomma, di tutto e di più. Con packages che vanno dal QFLP64 al QFLP100 e al QFLP208, per finire al BGA 320 nel modello ammiraglio della famiglia MB91469, equipaggiato con ben 2 Mb di flash. Con una macchina tanto potente è facile realizzare funzioni matematiche ad alta velocità e quindi controllare in real time l’evoluzione di sofisticati algoritmi di controllo. Quando si parla di velocità di calcolo viene spontaneo pensare a quello che avviene ad esempio in una macchina a CNC, dove un banale motore a step viene utilizzato per compiere evoluzioni geometriche con precisione e velocità inimitabili. Vediamo, dunque, come è possibile migliorare la risposta di uno di questi motori grazie alla potenza e velocità di calcolo di un processore a 32 bit del tipo sopra descritto. In particolare, la serie MB91F467x dispone fino ad un massimo di 6 canali (ciascuno con 4 linee di potenza) dedicate al controllo dei motori stepping. Ciascun canale include due generatori sincroni di PWM. Le uscite del micro possono pilotare direttamente motori di piccola potenza (40 mA max su ogni linea).

LA FISICA DI UN MOTORE A STEP

Fisicamente un motore stepping si può immaginare rappresentato da un magnete bipolare libero di ruotare attorno a un asse, e due bobine ortogonali tra loro che formano lo statore (Figura 1).

Figura 1: rappresentazione grafica di un motore stepping.

Figura 1: rappresentazione grafica di un motore stepping

Normalmente il movimento del rotore si ottiene inviando corrente nelle due bobine con una opportuna tempistica e fase in modo progressivo per raggiungere il numero di giri desiderato. La sequenza degli impulsi di corrente è tale da far commutare continuamente il rotore dalla sua posizione di start a una successiva posizione di stop. Tipicamente questi movimenti, per quanto progressivi e veloci, sono sempre causa di discontinuità del valore della coppia rotante e pertanto causa di ripple sul valore della velocità istantanea. Questo comportamento del motore si traduce a sua volta in vibrazioni e rumorosità, e quindi influisce sulla precisione del controllo. Per ottenere una velocità uniforme è necessario che il momento rotante della coppia sia costante in ogni istante della rotazione del motore tra due successive posizioni di start e stop. Questa condizione si può ottenere immaginando la composizione vettoriale del campo magnetico ottenuto come la risultante di un sistema di due forze tra loro ortogonali (regola del parallelogramma, Figura 2).

Figura 2: momento rotante della coppia di un motore a step.

Figura 2: momento rotante della coppia di un motore a step

Ora, se facciamo variare la corrente in ciascuna delle due bobine con gradualità, possiamo spostare il rotore in una qualsiasi posizione intermedia senza movimenti bruschi. Questo si può ottenere grazie a una tecnica di PWM, ad esempio inviando corrente sinusoidale in quadratura nelle due bobine. Tuttavia, anche in questo modo il distacco dalla condizione di start e l’arrivo nella posizione finale determina una non gradualità del movimento (Figura 3).

Figura 3: senza filtro, con filtro passa-basso del primo ordine, con filtro passa-basso del secondo ordine.

Figura 3: senza filtro, con filtro passa-basso del primo ordine, con filtro passa-basso del secondo ordine

Il problema si può attenuare significativamente introducendo un filtro passa-basso. Un filtro del primo ordine risolve il problema nella posizione di stop ma non ancora quello della condizione di start. Un filtro passa-basso del secondo ordine risolve il problema in entrambe le posizioni, anche se questo compromesso limita la frequenza di lavoro e quindi la velocità massima del controllo. Ma necessariamente ogni motore ha un limite nel numero di giri imposto dalla sua costruzione. Pertanto, per essere sicuri di non eccedere i valori di accelerazione e velocità massima consentita dal motore, imporremo un limite a essi (clipping), integrandoli nel calcolo del filtro passa-basso. L’algoritmo descritto in questo articolo è tratto da una application note di Fujitsu AN300077, (integrata da considerazioni personali) e consente di pilotare la posizione di un cursore motorizzato tramite un potenziometro con controllo di velocità assistito dal microprocessore.

TEORIA DEL CONTROLLO

La realizzazione di un filtro di secondo ordine può essere facilmente immaginata come risultante di due filtri in cascata del primo ordine. In pratica, l’operazione di filtro viene realizzata nel software semplicemente effettuando due operazioni di shift e due sottrazioni. Nell’esempio riportato nel nostro testo, il termine Xin rappresenta il valore nativo della grandezza su cui si vuole agisca l’azione di filtro, mentre n è il fattore di smorzamento del filtro. Y1st_old è il valore precedente della grandezza all’uscita del primo stadio del filtro e Y1st_new è il valore attuale della grandezza all’uscita del primo stadio del filtro. Le stesse considerazioni valgono per la simbologia utilizzata per i termini del secondo stadio del filtro. Si perviene, quindi, alla generica formula qui riportata per la rappresentazione dell’algoritmo di filtro:

Y1st_new= (((Y1st_old<<n)-
Y1st_old)+Xin_new)>>n
Y2nd_new= (((Y2nd _old<<n)- Y2nd
_old)+ Y1st _new)>>n

Ripetendo questa operazione molte volte in un dato periodo di tempo, si otterrà la velocità come differenza tra la lettura attuale e quella all’inizio dell’intervallo di osservazione. Se memorizziamo questo valore in una locazione di memoria, ripetiamo il calcolo della velocità, dalla differenza delle due letture possiamo risalire all'accelerazione. In termini analitici si può esprimere come:

PT1i=(Xin+(PT1i-1*n))/n+1
PT2i=(Pt1i+(PT2i-1*n))/n+1

Per evitare che il valore della nostra grandezza (in questo caso la velocità del cursore azionato dal motore) possa superare i valori massimi di targa ammessi per costruzione, dobbiamo inserire nell’algoritmo una funzione di comparazione dei valori rilevati rispetto ai limiti desiderati.

Velo_new =Y2nd_new –Y2nd_old

Campionando il valore dell’espressione di volta in volta con il valore limite della funzione, l’algoritmo sostituirà il valore attuale con quello precedente solo se esso non supera il livello definito come clipping. E questo criterio si può applicare sia alla velocità sia all’accelerazione:

velo_new=Y2nd_new-Y2nd_old
If (velo_new –velo_old)> max .acceleration.
costant then
max.velo.actual=velo_old+max.acc.costant
else
max.velo.actual=max.velo.costant
endif
if velo_new > max.velo.actual then
Y2nd-new=Y2nd_old+max.velo.
actual
endif

Utilizzando queste equazioni alcune centinaia di volte a secondo (il periodo di osservazione è quindi limitato ad alcuni millisecondi), riusciremo a movimentare in modo graduale il nostro cursore. Nell’impiego pratico il valore di smorzamento n dovrebbe essere nel range da 3 a 6 a causa della caratteristica del filtro passa-basso del secondo ordine. Come esempio possiamo utilizzare una look-up table per generare i valori di seno e coseno corrispondenti alle correnti da inviare sulle due bobine dello statore. Possiamo utilizzare una risoluzione di 128 micro step per quadrante oppure utilizzare il valore di default di 256 micro step per quadrante. In ogni caso il passaggio da 0 a 7 bit per quadrante è possibile semplicemente normalizzando il valore di seno/coseno in fase di prelievo dalla tabella:

CPU_PIN:PWM2Mx->+Coil_B (-cos)
CPU_PIN:PWM2Px->+Coil_B (+cos)
CPU_PIN:PWM1Px->+Coil_B (-sin)
CPU_PIN:PWM1Mx->+Coil_B (+sin)

IL CODICE DEL PROGRAMMA

Il programma realizzato per questa applicazione impiega una routine di interrupt per generare i tempi di campionamento del filtro di secondo ordine e per inviare sulle uscite del micro le correnti in formato PWM per l’alimentazione del motore. Esso provvede, inoltre, alla verifica dei valori di clipping di velocità e accelerazione. Nell’esempio riportato nel testo è stato utilizzato un potenziometro collegato all’ingresso del convertitore ADC per comandare lo spostamento del cursore avanti e indietro. Motori di piccola potenza possono essere alimentati direttamente dalle linee del micro. Motori di potenza maggiore richiedono almeno un driver di potenza tra il micro e le linee del motore.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend