Controllo di motori ACIM con ST7MC

I microcontrollori della serie ST7MC sono dei dispositivi, appartenenti alla famiglia di micro ad 8 bit ST7, specializzati in applicazioni di controllo motore. Possiedono, infatti, un modulo MTC (Motor Control) comprendente 6 canali PWM, ingressi analogici per sensori di velocità e posizione, ingressi di sicurezza per lo stop del motore, un coprocessore che semplifica il controllo di motori a magnete permanente PMAC/PMDC.

ST ha sviluppato un insieme di librerie C che semplificano l’uso di varie tipologie di motori, tra cui i motori AC ad induzione (ACIM),  i motori Brushless DC (BLDC) ed altri. L’uso della libreria semplifica lo sviluppo poiché, nascondendo i dettagli implementativi relativi all’hardware (come la generazione dei segnali PWM), ci permette di focalizzarci sugli aspetti applicativi. In questo articolo ci focalizzeremo sulla libreria per il controllo di motori ACIM trifasi (nel seguito ‘libreria ACIM’) e su una serie di tool software ed hardware adatti allo sviluppo di applicazioni di questo tipo.

La libreria ACIM  per ST7MC

Setup  della  libreria

Per poter utilizzare la libreria trifase sono necessari diversi strumenti software ed hardware. L’ambiente di sviluppo software è così costituito:

➤ IDE: ST7VD (Visual Developer), scariST7VD. Il microcontrollore  ST7MC può essere programmato tramite il  software ST7VP, installato insieme all’IDE ST7VD, ed un programmatore ST. È possibile utilizzare un debugger in-circuit o un emulatore per semplificare lo sviluppo dell’applicazione: uno strumento economico è il debugger in-circuit INDART-STX. Questo strumento, come quasi tutti i debugger, è utilizzabile anche come programmatore. Per iniziare a sviluppare applicazioni di controllo motore, può essere utile usare uno starter kit appositamente realizzato: il  kit AK-ST7FMC di Softec. Questo kit è equipaggiato con un micro ST7FMC2 e comprende il debugger INDART-STX. È dotato inoltre di uno stadio inverter da 10A per l’alimentazione trifase del motore. La libreria ACIM è stata testata proprio con questo kit. Un altro tool fornito con esso è l’AK-ST7FMC Control Panel, molto utile per poter configurare la libreria in funzione delle caratteristiche del motore. Questo tool, insieme alla libreria ACIM più aggiornata, può essere scaricato dal sito di Softec.

Controllo dei motori ACIM trifasi

Com’è noto, i  motori AC ad induzione trifase sono costituiti da uno statore provvisto di tre avvolgimenti con un termina le in comune e da un rotore, provvisto di un altro avvolgimento chiuso su se stesso. Gli avvolgimenti dello statore sono alimentati da tre correnti sinusoidali sfasate tra loro di 120°. Queste tre correnti sono fornite da un circuito inverter pilotato dal generatore PWM del controller. In figura 1 è raffigurato uno schema di principio dell’inverter, costituito da tre halfbridge, uno per ciascuna fase, dove per semplicità sono stati omessi i  diodi di protezione.

Figura 1: schema di principo di un inverter per motori ACIM.

Figura 1: schema di principo di un inverter per motori ACIM.

Brevemente, possiamo dire che ogni avvolgimento è alimentato tramite una coppia di transistor pilotati in complementare, generalmente MOSFET o IGBT (Insulated  Gate Bipolar Transistor). Ad esempio, quando l’interruttore SWA1 sarà ON ed SWA2 OFF, l’avvolgimento della fase 1 dello statore sarà alimentato con la tensione VDC+, mentre quando sarà ON l’interruttore SWA2 ed SWA1 sarà OFF, l’avvolgimento  riceverà la tensione VDC-. Mediante la modulazione PWM è possibile variare sia la frequenza che l’ampiezza della corrente che alimenta gli avvolgimenti. La forma d’onda sinusoidale della corrente viene ottenuta variando il duty cycle del segnale PWM: osserviamo innanzitutto che questo segnale ha una frequenza molto maggiore (da 15 a 30 volte o più) del segnale sinusoidale (che chiameremo “di riferimento”) che vogliamo ottenere. La corrente che scorre nella bobina verrà integrata nel tempo, dato che la reattanza della stessa aumenta all’aumentare della frequenza, e sarà quindi praticamente una sinusoide con la frequenza di riferimento voluta. In teoria il rotore ruoterà alla stessa frequenza delle fasi dello statore, in pratica però la frequenza di rotazione sarà leggermente inferiore: la differenza tra le due frequenze è detta scorrimento (slip) ed è necessaria affinché il motore presenti una coppia non nulla. Più avanti vedremo che esiste una frequenza di scorrimento ottimale del motore a seconda delle condizioni di funzionamento. La libreria è costituita dai seguenti moduli:

➤ MTC (mtc.c): generazione del segnale PWM;

➤ ACMotor (acmotor.c): controllo del motore;

➤ PWMART (pwmart.c): gestione del modulo hardware PWM;

➤ ADC (adc.c): conversione A/D di vari segnali;

➤ PORTS (ports.c): gestione delle porte di I/O;

➤ SCI (sci.c): comunicazione tramite seriale, utile per testare l’applicazione ad esempio usando hyperterminal.

Il modulo MTC si occupa di fornire le funzionalità di controllo del motore gestite tramite l’hardware della periferica MTC (Motor Controller) del micro ST7. Si interfaccia perciò con le routine di più basso livello che gestiscono direttamente  i generatori PWM, il convertitore A/D ed altri segnali di input. Tale modulo inoltre è configurabile modificando l’header MTCparam.h, in modo da adattarsi ai vari tipi di motori ed inverter. Tra le funzionalità configurabili menzioniamo le seguenti: Frequenza PWM: è possibile scegliere la frequenza del generatore tra 15.66, 12.5, 7.8, 3.9 e 1.95 KHz. Si noti che poiché lo cycle del 50% del segnale PWM (center aligned) il segnale  di 15.66 e 12.5 KHz risulta non udibile. L’array SINE3RDHARM[256], definito anch’esso nel file mtc.c, è la tabella di look-up usata per la corrispondenza tra il duty cycle del segnale PWM e l’ampiezza della sinusoide, compresa tra 0 e 255. Questi valori tengono già conto dell’aggiunta di una modulazione di terza armonica: questa tecnica permette di raggiungere una tensione massima di alimentazione del motore più alta del 15% rispetto all’uso della sola fondamentale, consentendo quindi di ottenere velocità di funzionamento maggiori e più potenza meccanica. Si noti che lo sfasamento di 120° tra le fasi corrisponde ad uno sfasamento di 360° per le terze armoniche che quindi si annullano tra due fasi, cosicché la corrente negli avvolgimenti rimane sinusoidale. La risoluzione della frequenza dello statore deriva dalla formula seguente:

dove il tasso di refresh indica ogni quanti cicli del segnale PWM avviene un update del duty cycle. Un valore maggiore del tasso di refresh permette di diminuire  il carico della CPU. Con i valori di default (fPWM=12.5 KHz, tasso di refresh=2) si ha:

Gamma di frequenze dello statore: La frequenza massima della sinusoide che alimenta lo statore è come già detto legata alla fPWM dato che, per evitare l’esistenza di sottoarmoniche, la fPWM deve essere da 15 a 30 volte maggiore. Possiamo scrivere quindi che:

ad esempio, con i valori di default precedenti, otteniamo:

 

Dead-time: dato che i switch dell’inverter sono pilotati in complementare, è necessario considerare il fatto che il tempo di spegnimento tOFF dei transistor è generalmente maggiore del tempo di accensione tON. Per tale motivo è sempre necessario prevedere un intervallo di tempo, detto deadtime, prima di attivare il transistor della coppia che va accesa. Il dead-time può essere configurato per valori maggiori di 625 ns, a passi di 125 ns, in modo da adattarsi ai vari tipi di transistor. Il modulo ACMotor contiene le funzioni di controllo del motore AC. Queste funzioni sono richiamate dall’applicazione utente ed usano le funzioni del layer inferiore fornite da mtc.c, in modo da separare le funzioni legate alla gestione dell’hardware del micro. Le funzioni fornite da ACMotor si occupano in particolare di

➤ controllo scalare V/f del motore (vedi oltre);

➤ gestione dello start-up;

➤ regolazione di velocità, se vengono usati dei sensori adatti.

In generale, è possibile usare due sistemi di controllo del motore:

➤ ad anello aperto (open loop): in questo velocità del motore attraverso la gestione della frequenza di statore;

➤ ad anello chiuso (closed loop), qualora sia richiesto un controllo più accurato della velocità, tramite il  controllo della frequenza di scorrimento.

Vediamo più in profondità come sono realizzati questi due tipi di controllo.

Controllo  V/F

Come detto in precedenza, gli avvolgimenti dello statore presentano una reattanza che aumenta all’aumentare della frequenza della sinusoide: poiché a sua volta la coppia è funzione della corrente che scorre negli avvolgimenti, ciò signifistante è necessario variare la tensione di alimentazione proporzionalmente alla frequenza. Questo è il cosiddetto controllo V/f, un controllo di tipo scalare ampiamente utilizzato per pilotare  i motori AC. In pratica si ottiene una curva di controllo del tipo raffigurato in figura 2: oltre alla zona centrale di controllo V/f si distingue una zona al di sotto di una frequenza limite inferiore VF_LOWFREQ_LIMIT nella quale è necessario mantenere una tensione minima V_MIN per compensare le perdite degli avvolgimenti e mantenere un flusso magnetico minimo; un’altra zona, al di sopra di una frequenza limite superiore VF_HIGHFREQ_LIMIT, è determinata dalla tensione massima V_MAX. Al di sopra di questa frequenza chiaramente non sarà possibile ottenere la coppia massima.

Figura 2: curva di controllo V/f di un motore ACIM.

Figura 2: curva di controllo V/f di un motore ACIM.

È possibile determinare tali punti con  l’ausilio dell’AK-ST7FMC Control Panel. La formula con cui viene calcolata la tensione di alimentazione di una fase è la seguente

si noti che il primo fattore non è altro che la pendenza del segmento di retta nel tratto centrale.

Slip ottimale

La coppia massima e l’efficienza dei motori AC dipendono dalla frequenza di scorrimento: se da un lato quando tale frequenza si avvicina a zero la coppia si riduce, dall’altro, se la frequenza è troppo elevata l’efficienza diminuisce. Aumentando ancora la frequenza di scorrimento, anche la coppia inizia a diminuire. Esiste quindi una frequenza ottimale che dovrebbe essere mantenuta (ricordiamo che la frequenza di scorrimento aumenta all’aumentare del carico del motore). Un controllo di tale frequenza ha naturalmente senso solo nel caso di un controllo ad anello chiuso del motore. La frequenza ottimale è funzione della frequenza delle fasi dello statore, cosicché ne deriva anche in questo caso un diagramma simile a quello di figura 2. È possibile  utilizzare il kit AK-ST7FMC per rilevare tali caratteristiche del motore. Generalmente per la maggior parte dei motori AC la frequenza di scorrimento è pari a circa il 5% della frequenza di statore per velocità medio-alte.

Controllo ad anello chiuso

Il controllo ad anello chiuso usato dalla libreria ACIM implementa un regolatore di tipo PI (Proporzionale-Integrale), ampiamente discusso nella letteratura riguardante i controlli automatici. Il regolatore  si occupa di variare la tensione delle fasi in funzione dell’errore ESlip  della frequenza di scorrimento rispetto al valore ottimale:

dove KP  è il termine proporzionale e KI  il termine integrale, da determinare. Chiaramente operando nel tempo discreto, l’integrale è sostituito da una sommatoria: a questo riguardo è necessario stabilire un tempo di campionamento dell’errore da cui discenderanno  i valori delle costanti KP e KI. Il valore  di default usato nella libreria ACIM è di 10 ms, adeguato nella maggior parte dei casi. La tensione VStart è quella di partenza alla fine della procedura di soft start implementata nel modulo ACmotor. Il termine  KP determina l’errore al variare della grandezza di ingresso (la frequenza di scorrimento voluta). Maggiore è il valore di KP  e minore sarà l’errore, tuttavia oltre un certo valore il sistema diventa instabile. Il  termine KI determina invece l’errore in regime permanente, quando la grandezza d’ingresso è costante. Anche in questo caso è necessario stabilire un valore opportuno per evitare l’instabilità del sistema. Esistono svariate tecniche sperimentali, più o meno complesse, adatte a stabilire i valori delle costanti KP  e KI   in funzione delle caratteristiche del motore e del carico. È possibile utilizzare a questo scopo l’AK-ST7FMC Control Panel, come vedremo più avanti.

Uso della libreria ACIM

In figura 3 è rappresentata l’IDE di ST7VD mediante  il quale possiamo compilare la libreria ACIM ed iniziare a realizzare una semplice applicazione d’esempio. Se avete scaricato il software dal sito di Softec, basterà aprire il workspace denominato AC_3PH_SR.stw. Nella figura possiamo vedere l’IDE con il progetto per il compilatore Cosmic.

Figura 3: workspace della libreria ACIM in ST7VD.

Figura 3: workspace della libreria ACIM in ST7VD.

ST7FMC Control Panel

Il modo più semplice per iniziare ad usare la libreria ACIM è quello di avvalersi dell’AK-ST7FMC Control Panel per configurare i  vari parametri del sistema di controllo. Come possiamo vedere in figura 4, nel pannello si distinguono  i gruppi di controlli seguenti

Main Motor Settings: qui si può selezionare il tipo di motore, se il controllo deve essere open loop o closed loop, le frequenze minima e massima dello statore.

V/F Curve: presenta un pannello grafico in cui è possibile settare i punti notevoli della curva V/f che sono stati descritti in precedenza.

Start-Up Settings: la maggior parte di questi parametri riguardano la procedura di start-up del motore usata nel controllo closed loop.

➤ Real-Time Settings: nel sottogruppo Settings vanno immessi  i valori dei coefficienti KP e KI  visti per il controllo PI (ovviamente solo nel caso di un controllo closed  loop),  altri parametri permettono di cambiare in real-time la velocità di statore nel caso open loop, o in alternativa, la velocità di rotore per il controllo closed loop. Nel sottogruppo Feedback si potranno leggere la velocità rilevata del rotore, la tensione in uscita dal regolatore PI, la frequenza di scorrimento e alcuni segnali di stato della scheda AK-ST7FMC. Cliccando su   Advanced Settings possiamo variare alcuni parametri generali tra cui la frequenza del PWM, il dead-time ed i parametri di frenata. Osserviamo che nella figura 4 sono raffigurati i valori di default dei parametri nel caso si usi il motore AC ad induzione di riferimento Selni. Se possediamo la scheda di controllo motore di Softec collegata al programmatore Indart-STX, premendo il pulsante Start la memoria Flash del micro ST7 presente sulla scheda verrà programmata tenendo conto dei parametri che abbiamo scelto.
Sarà allora possibile testare il parametro del gruppo Real-Time Settings, per ricavare i valori di KP e KI  con degli esperimenti. Ad esempio, per ricavare KP possiamo settare una certa velocità del rotore e, con un dato carico, provare ad aumentare, partendo da zero, il valore di KP finché il sistema non diventa instabile (il  motore oscilla). Potremo allora scegliere un valore di KP  pari alla metà di questo, allo scopo di garantirci un certo margine di fase e di guadagno. Per inciso, il valore limite di KP è legato al diagramma di Nyquist della funzione di trasferimento del processo.Generalmente, è necessario fare più esperimenti con diversi carichi e diverse velocità di rotore in condizioni dinamiche, in modo da ricavare più valori di KP con cui riempire una tabella di look-up. Con una metodologia simile è possibile ricavare anche il valore di KI.
Si tratta comunque di tecniche empiriche che richiedono un buon numero di tentativi per portare a dei risultati soddisfacenti. Una volta settati i vari parametri in funzione delle nostre esigenze, possiamo cliccare su Generate Source Files per generare i file header personalizzati della libreria:

➤ MTCparam.h e ACMparam.h, descritti in precedenza;

➤ Mainparam.h,  riguardante i parametri di start-up e di frenata;

➤ config.h,  riguardante  i settaggi di tipo più generale, come il  tipo di controllo open/closed loop, la frequenza del PWM, ed altri.

Copiamo allora gli header generati nella directory che contiene i sorgenti della libreria ACIM inclusi nel nostro progetto e, tramite l’IDE ST7VD, ricompiliamo. Si tenga presente comunque che non tutti i parametri possono essere determinati con il solo uso di questa utility: in alcuni casi sarà necessario modificare  manualmente  i file di header di cui abbiamo discusso. Se ad esempio vogliamo tener conto del fatto che i parametri  del regolatore PI possono variare con la frequenza di statore con delle curve simili a quella del controllo V/f, sarà necessario  modificare  i set point nell’header ACMparam.h oppure usare una tabella di look-up, come detto prima.

Figura 4: AK-ST7FMC Control Panel.

Figura 4: AK-ST7FMC Control Panel.

Il programma d’esempio

Il programma d’esempio può essere usato per controllare il motore in modalità open loop o closed loop. Il listato 1 riporta un esempio di uso della funzione MotorControl() in modalità open loop.

void MotorControl( void )
{
        u8 NewVoltage, VoltCmd, VMax;
        u16 NewFreq, SlipFreq, FreqCmd;
        u32 FTemp;
        
        if (ART_Is_TimeInMsElapsed())
        {
               // legge RV1 (frequenza)
               FTemp = (u8)(ADC_GetRV1());
               FTemp *= (u32)(HIGHEST_FREQ-LOWEST_FREQ);
               FTemp >>= 8;
               FTemp += LOWEST_FREQ;
               FreqCmd = (u16)(FTemp);
               // legge RV2 (tensione)
               VoltCmd = ADC_GetRV2();
              // ricava i valori attuali di V ed f
              NewVoltage = MTC_GetVoltage();
              NewFreq = MTC_GetStatorFreq();
              // legge la freq. di scorrimento
              SlipFreq = MTC_GetSlip();
              // limite superiore di tensione
             VMax = ACM_VoltageMaxAllowed(NewFreq);
             if ( VoltCmd > VMax )
            {
                  VoltCmd = VMax;
            }
           // varia la tensione progressivamente
           if (VoltCmd > NewVoltage) NewVoltage++;
           if (VoltCmd < NewVoltage) NewVoltage—;
           // varia la frequenza progressivamente
           if (FreqCmd > NewFreq) NewFreq++;
           // per evitare un effetto rigenerativo!
           if ((SlipFreq != 0)&&(FreqCmd < NewFreq))
                  NewFreq—;
           // aggiorna le fasi
           MTC_UpdateSine(NewVoltage, NewFreq);
     }
}
Listato 1

Dopo le inizializzazioni della MCU il programma entra nello stato di IDLE, viene quindi iniziata la procedura di start del motore StartMotor(). Questa procedura legge il valore del trimmer RV1 della scheda STFMC mediante il quale si regola la frequenza di statore: una volta raggiunto il limite di tensione determinato dalla curva V/f, la procedura termina attivando lo stato di START. Viene quindi attivata la funzione MotorControl() il cui codice è riportato nel listato 1. Possiamo vedere che in questa funzione la frequenza di statore viene regolata, tramite il trimmer RV1, fra gli estremi LOWEST_FREQ ed HIGHEST_FREQ, mentre la tensione di statore può essere regolata tramite il trimmer RV2. Si noti che il valore 255 corrisponde al 100% della tensione.  Il controllo vero e proprio del motore viene eseguito tramite diverse funzioni del modulo mtc.c: le chiamate delle funzioni MTC_GetVoltage() ed MTC_GetStatorFreq() ritornano rispettivamente la tensione e la frequenza di statore attuali. Entrambe le grandezze sono aggior nate dalla funzione MTC_UpdateSine() che si occupa di generare la sinusoide tramite il gestore dell’interrupt del modulo PWM. La funzione MTC_GetSlip() ritorna la differenza tra la frequenza di statore e di rotore: ha senso solo se viene usata una dinamo tachimetrica (di default se si utilizza il motore Selni di riferimento), o dei sensori di Hall, altrimenti ritornerà il valore 0. Si noti che la funzione MotorControl() varia la tensione e la frequenza di alimentazione dello statore lentamente, con una velocità massima di 5 Hz/s e di 50V/s rispettivamente. Il  listato 2 riporta l’uso della funzione MotorControl() in modalità closed loop.

void MotorControl( void )
{
       u16 FreqCmd, StatorFreq;
       u8 SlipCmd, NewVoltage;
       u32 FTemp;

      // se il rotore e’ fermo: FAULT
      if (MTC_GetRotorFreq() == 0)
     {
           State = FAULT;
     }
    // deve essere trascorso il periodo
    // di campionamento dell’errore (default 10 ms)
   if ( ART_IsRegPeriodElapsed() )
{
         // ricava la frequenza di statore
         StatorFreq = MTC_GetStatorFreq();
        // legge RV1: frequenza
        FTemp = (u8)(ADC_GetRV1());
        FTemp *= (u32)(HIGHEST_FREQ-LOWEST_FREQ);
        FTemp >>= 8;
        FTemp += LOWEST_FREQ;
        FreqCmd = (u16)(FTemp);
       // solo se vogliamo variare
       // Kp e Ki on-the-fly
       #ifdef PI_PARAM_TUNING
            Ki = ADC_GetRV2();
            Kp = ADC_GetRV3();
        #endif

        // ricava la freq. di slip ottimale
        SlipCmd = ACM_GetOptimumSlip(StatorFreq);

       // esegue la regolazione PI
       NewVoltage = ACM_SlipRegulation(SlipCmd);

      // accelera il motore
      if (( (FreqCmd+SlipCmd) > StatorFreq) &&
                (MTC_GetSlip() < ACCEL_SLIP_LIMIT))
      {
               StatorFreq++;
      }
      // oppure decelera il motore
      if (( (FreqCmd+SlipCmd) < StatorFreq) &&
                 (MTC_GetSlip() > DECEL_SLIP_LIMIT))
      {
              StatorFreq—;
      }
      // aggiorna le fasi
      MTC_UpdateSine(NewVoltage, StatorFreq);
   }
}
Listato 2

Anche nel caso del controllo closed loop, il valore del trimmer RV1 della scheda STFMC viene usato per impostare la frequenza di statore. I trimmer RV2 ed RV3 possono essere usati per impostare le costanti del regolatore PI, KP e KI, al volo: per fare ciò è necessario  togliere il commento alla linea

#define PI_PARAM_TUNING

nell’header config.h. In questo modo è possibile usare il programma per determinare i valori ottimali di queste costanti. La regolazione di velocità è effettuata controllando la frequenza di scorrimento:
in pratica la tensione di statore viene regolata in modo da mantenere una frequenza di slip costante. Oltre a ciò la frequenza di slip viene mantenuta tra due limiti superiori, detto maximum slip, ed inferiore, minimum slip. Il limite inferiore è necessario per evitare fenomeni rigenerativi nel motore (il motore funziona come generatore elettrico anziché come attuatore).  Il limite di slip massimo evita che il motore lavori in regime instabile in caso che sia richiesta una coppia troppo elevata. Ciò può avvenire nel caso di un carico eccessivo oppure se viene richiesta una accelerazione troppo elevata. Tra l’altro questo tipo di controllo permette di mantenere un controllo della coppia durante l’accelerazione del motore: come si può vedere in figura 5 infatti, lo slip ottimale rimane pressocchè costante al variare della frequenza di statore.

Figura 5: relazione coppia-slip per diverse frequenze di statore.

Figura 5: relazione coppia-slip per diverse frequenze di statore.

La funzione ACM_GetOptimumSlip() ritorna il valore ottimale della frequenza di scorrimento per una data frequenza di statore, secondo la curva discussa nel paragrafo sullo slip ottimale. La regolazione PI viene eseguita dalla funzione ACM_SlipRegulation() che accetta in ingresso il valore dello slip ottimale da mantenere.

 

 

Scrivi un commento

EOS-Academy
Abbonati ora!