Una logica di controllo basata su microcontrollori PIC consente di aumentare la potenzialità e la flessibilità degli attuatori elettrici nei sistemi di automazione. Ecco in che modo. Un azionamento elettrico è generalmente costituito da un attuatore (motore) e dal relativo sistema elettronico di alimentazione e gestione, coadiuvato da eventuali sensori di feedback; esso può essere fisicamente realizzato in una grande varietà di tipologie, a seconda dell’impiego e delle specifiche del progetto cui è destinato. La vasta diffusione di questi dispositivi è motivata dal fatto che essi consentono un’ottimizzazione dei processi con incremento di produzione e miglior rendimento degli impianti: spesso, infatti, è possibile ottenere un risparmio energetico considerevole dosando in modo opportuno la potenza fornita a certi tipi di carichi come pompe e ventilatori.
Introduzione
Le motivazioni economiche non sono le sole: si pensi, infatti, a quelle applicazioni in cui posizione o velocità di rotazione del motore elettrico devono essere controllate con grande precisione, come in un braccio robotizzato in una catena di montaggio o nei servomeccanismi ormai onnipresenti anche negli oggetti di uso quotidiano (si immagini l’accuratezza richiesta nel pilotare gli attuatori che controllano la posizione del fascio laser in un comunissimo lettore cd). In questo articolo prenderemo in considerazione un tipico utilizzatore, un motore trifase a induzione, il cui controllo viene affidato a un microcontrollore della famiglia 18Fxx31; si vedranno brevemente i principi di funzionamento di questo tipo di motori, le due principali tecniche di controllo dello stesso (open loop e closed loop) e più in dettaglio le periferiche hardware implementate nei PIC 18Fxx31 e specializzate per questo tipo di applicazioni, il Power Control PWM, il Fault Inputs e il Motion Feedback Module.
MOTORE A INDUZIONE AC
A grandi linee e senza entrare nei dettagli che si possono trovare in testi specifici, si può schematizzare un motore elettrico trifase come mostrato nella figura 1; una terna equilibrata di correnti (a somma vettoriale nulla) circola negli avvolgimenti del rotore (tre fasi equispaziate angolarmente di 120 gradi) e crea nella macchina un campo magnetico statorico, rotante con una velocità detta di sincronismo (praticamente la velocità a vuoto); tale campo induce delle correnti negli avvolgimenti di rotore (legge di Lenz), le quali producono a loro volta un campo rotorico che ruota con la stessa velocità angolare del campo statorico.
L’interazione tra le correnti di rotore e la somma dei due campi magnetici rotanti, genera una coppia elettromagnetica che pone in rotazione il rotore con una velocità minore di quella di sincronismo: la differenza tra le due velocità, chiamata scorrimento è necessaria perché se fossero uguali la coppia del motore sarebbe nulla. Per modificare la velocità di rotazione si può dunque intervenire sui due fattori che creano la coppia motrice: sul campo magnetico risultante (modificando tensioni e correnti statoriche) oppure sulle correnti di rotore o entrambi. Nel caso particolare di motori asincroni le cose sono rese più complicate in quanto non si ha accesso diretto alla corrente di rotore; si può agire solo sugli avvolgimenti di statore, variandone tensione e/o frequenza di alimentazione in funzione della coppia motrice che si vuole ottenere e del regime di funzionamento in cui si vuole portare ad operare la macchina. Nella prossima sezione si vedrà un particolare tipo di controllo sulle correnti statoriche realizzato tramite inverter, dispositivo che fa da stadio pilota e interfaccia fra il motore e il microcontrollore.
CONTROLLO AD INVERTER
La figura 2 riporta lo schema di un inverter trifase: in esso sono rappresentati due buses posti ad alta tensione (VDC+ e VDC-), sei interruttori elettronici che possono essere per esempio mosfet di alta potenza come gli IGBTs e le tre fasi del motore; i sei switches sono connessi in modo da creare tre coppie di “half-bridges”, i quali servono per collegare ciascuna fase alle alte tensioni.
Esaminiamo più in dettaglio il funzionamento del dispositivo aiutandoci con lo schema e prendendo in considerazione la fase A: assumiamo che l’interruttore H1 sia chiuso e L1 aperto, in tal caso la fase sarà percorsa da una corrente con verso opposto a quella che scorre quando L1 è chiuso e H1 aperto; la stessa cosa vale per la fase B considerando questa volta gli interruttori H2 e L2 e ovviamente per la fase C con H3 e L3. Le tre coppie (half bridges) di interruttori considerati pilotano dunque in modo indipendente le fasi del motore: i due interruttori di ciascuna coppia non devono mai trovarsi simultaneamente nello stesso stato, pena il cortocircuito delle alimentazioni e vanno dunque gestiti come coppia complementare. Va inoltre tenuto conto della complicazione tecnica dovuta al fatto che in genere switches elettronici di questo tipo richiedono per spegnersi un tempo maggiore di quello richiesto per accendersi, per cui andrà impostato un dead-time o tempo di latenza tra lo spegnimento di un interruttore e l’accensione del suo complementare. La logica di controllo a monte dell’inverter dovrà essere programmata in modo da ottenere, per le fasi, un diagramma di tensioni e correnti come mostrato nella figura 3: tre correnti sinusoidali, uguali in ampiezza e in pulsazione e sfasate opportunamente di 120 gradi, creano il già citato campo magnetico di statore, il quale ruota con la stessa frequenza delle sinusoidi e induce le correnti rotoriche da cui nasce poi la coppia motrice.
Il principio sembra essere chiaro, ma il lettore più attento si sarà forse domandato com’è possibile ottenere una forma d’onda sinusoidale per una certa fase, quando ai suoi estremi viene posta una serie ripetuta di tensioni alternativamente alte e basse, cioè che variano a scatti. Il fatto è che l’andamento effettivo delle correnti che scorrono in esse, non dipende solamente dal segnale di input loro applicato (a gradini), ma anche dalla loro risposta intrinseca ; questo è un fatto generale e si esprime dicendo che la risposta del sistema-fase del motore è data dalla convoluzione tra il segnale d’ingresso e la risposta impulsiva caratteristica del sistema: nel nostro caso, le fasi possono essere modellizzate come un filtro passa basso, per cui un treno di impulsi di corrente al loro ingresso sarà opportunamente integrato dando la forma sinusoidale voluta. Questo è il motivo per cui è possibile impiegare la risorsa hardware presente all’interno dei microcontrollori, il PCPWM (Power Control PWM), per generare forme d’onda complesse: il microcontrollore crea un treno di impulsi rettangolari con un duty-cycle e una frequenza variabile in funzione dell’ampiezza e della frequenza delle sinusoidi che si vogliono inviare alle tre fasi del motore. Compito del programmatore sarà utilizzare l’hardware specializzato integrato nel PIC o gestire la creazione degli impulsi via software. Esistono molte e diverse tecniche per il controllo delle correnti statoriche: nel seguito prenderemo in considerazione l’open loop control e successivamente il closed-loop, con feedback di corrente o velocità.
OPEN LOOP V/F CONTROL
I motori a induzione AC sono spesso pilotati in open loop senza alcun tipo di feedback, tenendo conto dei due principi seguenti:
- La velocità di rotazione è direttamente proporzionale alla frequenza della corrente alternata applicata allo statore e al numero di poli del motore.
- Il momento o coppia motrice è direttamente proporzionale al rapporto tra ampiezza e frequenza della corrente AC inviata alle fasi.
Il rapporto tra l’ampiezza e la frequenza (V/f) delle sinusoidi generate viene mantenuto costante per avere una coppia motrice elevata e il più possibile costante nel range operativo del motore: si tratta di una forma di controllo poco costosa e facile da implementare. Non viene utilizzato nessun feedback da parte del rotore, la cui velocità di rotazione segue il flusso indotto dagli avvolgimenti rotorici e può essere modificata variando la frequenza della sinusoide. La figura 4 illustra un possibile collegamento tra il microcontrollore e l’inverter; come si può notare dalla figura, sei pin del modulo PCPWM del PIC sono destinati a pilotare le tre coppie complementari dell’inverter.
Il PCPWM integrato nel 18F4431 dispone fino ad un massimo di otto canali, con possibilità di avere uscite complementari, risoluzione del Pwm che può arrivare a 14 bit e tempi di latenza (dead-time) facilmente gestibili e generati in hardware; inoltre si può variare simultaneamente il duty-cycle e il periodo dell’onda rettangolare. Si può monitorare l’assorbimento complessivo di corrente dei due buses tramite una resistenza di shunt, la cui tensione viene inviata ad un comparatore connesso al pin FLTA del PIC: in caso di extracorrente (evento di Fault) sarà possibile spegnere le uscite del Pwm e settare un flag di controllo per apportare le dovute modifiche al firmware, per esempio ridurre la velocità. Quest’ultima viene impostata col potenziometro collegato all’ingresso analogico AN0: il valore presente in esso, una volta convertito in forma digitale, è elaborato secondo una formula implementata in software, dalla quale si ricava la frequenza corrispondente delle sinusoidi d’alimentazione.
CLOSED LOOP V/F CONTROL CON FEEDBACK DI VELOCITÀ
Per rendere più accurato il controllo della velocità si può utilizzare una forma di feedback il cui schema è riportato nella figura 5: la velocità viene ancora impostata tramite un potenziometro, ma questo non pilota più direttamente la frequenza del segnale PWM, ma genera un segnale di riferimento da confrontarsi con l’effettiva velocità del rotore: il segnale errore ottenuto dal confronto viene successivamente elaborato secondo il tipo di algoritmo più opportuno, a seconda dell’applicazione e del tipo di risposta che si desidera ottenere dal circuito di retroazione quando, per effetti legati al carico, la velocità si allontana da quella impostata.
Per il lettore interessato si rimanda ai testi di elettronica oppure al seguente link di approfodimento, qui si ricorda che i tipi di algoritmi più usati per questo genere di elaborazione sono il controllo proporzionale, integrale, differenziale o una loro combinazione (controller PID ): si tratta di modi diversi di elaborare il segnale differenza o errore per trovare il nuovo valore di frequenza (e di ampiezza, visto che le due grandezze devono essere proporzionali) del segnale PWM. Il tipo più semplice possibile è il controllo proporzionale, in base al quale la frequenza viene variata in modo lineare con l’errore: essa sarà incrementata se la velocità effettiva è minore di quella voluta e diminuita in caso contrario. Il calcolo effettivo della velocità di rotazione sfrutta il Motion Feedback Module integrato nel microcontrollore; tale periferica comprende un QEI (Quadrature encoder interface) e un modulo Input Capture (IC): si tratta di hardware specializzato per la decodifica di segnali provenienti da encoder usati per il controllo di velocità e angoli di rotazione.
CONSIDERAZIONI SUL FIRMWARE
Il nucleo principale del codice è destinato alla generazione dei segnali PWMs: il compito del programmatore è, in questo caso, almeno in parte semplificato dal fatto che il 18F4431 dispone di una periferica specializzata (il PCPWM), per cui andranno caricati gli appositi registri (PDCxH:PDCxL) che controllano il duty-cycle con i valori corretti per ottenere la forma d’onda sinusoidale voluta. Vediamo più in dettaglio i punti salienti da prendere in considerazione:
- La frequenza del segnale PWM è quattro ordini di grandezza più elevata di quella dell’onda che voglio generare (decine di khz contro decine di hz): per questo motivo è come se il PIC vedesse la sinusoide composta da un grande numero di tratti costanti negli intervalli di tempo confrontabili con il periodo del PWM; la sinusoide viene dunque campionata in una serie di valori (sine-table) da caricare, in fase di inizializzazione, nella memoria dati per un più rapido accesso ad esso. La CPU legge un valore presente nella tabella, lo carica nei registri specifici del duty cycle del PCPWM, genera il treno di impulsi corrispondente e in uscita (sulle fasi) avrò la tensione relativa a quel valore; ripetendo lo stesso in sequenza per tutti i campi della tabella il microcontrollore genera l’intera sinusoide.
- Per creare tre sinusoidi sfasate di 120 gradi si utilizzano tre variabili puntatore alla sinetable, composte ciascuna di una base variabile e di un offset fisso opportuno che crea lo sfasamento voluto: così, mentre uno dei tre canali del PCPWM sta gestendo un particolare valore della tabella, gli altri due si occupano dei valori descritti dai due puntatori che indirizzano ai valori sfasa ti di 120 e 240 gradi rispetto al primo.
- Dovrebbe a questo punto risultare chiaro che il rate di modifica dei valori del duty-cycle determina la frequenza della tensione generata; quanto più velocemente si cambiano questi valori, maggiore sarà la pulsazione ottenuta. Più in dettaglio si può sfruttare l’overflow del Timer0 per generare un interrupt la cui routine associata provvede a caricare un nuovo valore dalla sine-table: quindi il reload-value con cui viene caricato il timer determina la frequenza desiderata.
- Scalando il valore massimo del duty-cycle si modifica l’ampiezza dell’onda, in modo da mantenere il rapporto V/f costante (figura 6).
In sintesi l’interrupt service routine di modifica del duty-cycle agisce in questo modo: interviene un interrupt del timer0; a questo punto la CPU calcola la nuova frequenza del motore (dalla lettura del potenziometro se sono in modalità open-loop o dall’algoritmo PID se utilizzo una forma di controllo closed-loop); si legge un nuovo valore dalla sine-table usando gli appositi puntatori; si calcola il valore del duty-cycle moltiplicando il dato della tabella per la frequenza precedentemente determinata; si salva il valore a 16 bit così ottenuto nei registri PDC relativi a ciascuna delle tre fasi; si trova il nuovo reload-value (legato alla frequenza) con cui caricare il timer0, il cui overflow farà ripartire il ciclo (vedi in proposito l’equazione riportata nella figura 7).
Il listato 1 riporta un breve esempio di codice con cui si mostra come leggere i valori dalla tabella e si aggiorna il valore del duty-cycle: si tratta di un tipico esempio di indirizzamento indiretto in cui il valore viene letto nella locazione di memoria indicata dai valori caricati in W (TABLE_OFFSET1,2,3) sommati all’indirizzo di base della tabella.
Update_Pwm_Dutycycles movf TABLE_OFFSET1,W movf PLUSW0,W bz PWM1_IS_0 mulwf FREQUENCY movff PRODH,CCPR1L_TEMP bra UPDATE_PWM2 PWM_1_IS_0 clrf CCPR1L_TEMP Update_Pwm2 movf TABLE_OFFSET2,W movf PLUSW0,W bz PWM2_IS_0 mulwf FREQUENCY movff PRODH,CCPR2L_TEMP bra UPDATE_PWM3 PWM_2_IS_0 clrf CCPR2L_TEMP Update_Pwm3 movf TABLE_OFFSET3,W movf PLUSW0,W bz PWM3_IS_0 mulwf FREQUENCY comf PRODH,PWM3_DUTYCYCLE bra SET_PWM12 PWM_3_IS_0 clrf PWM3_DUTYCLE
Listato 1 |
Non è facile il controllo motori anche per appliciazioni forse più semplici che coinvolgono i motori passo passo o DC. In tutti i casi è conveniente identificare bene la corrente assorbita e le tensioni in gioco.
Non so se abbiate avuto la mia stessa esperienza, ma i PIC li ho trovati molto sensibili al rumore elettronico, in ambienti “ostili”. Mi chiedevo quindi se fosse indicato qualche altro tipo di micro per questo tipo di controlli, secondo la vostra esperienza.
C’è Toshiba che ha una buona reputazione con i suoi MCU per il controllo motori. Sul sito trovi molti data sheet 🙂
Grazie Maurizio, daro’ un’occhiata (anche solo a livello informativo).