Politecnico di Torino
Laurea magistrale in Ingegneria Elettrica Controllo digitale di convertitori e azionamenti
Controllo Controllo di velocit` velocit` a in anello anello chiuso di un sincrono SPM Andrea Griffone - s238549 Ornella Stiscia - s237119 Prof. G.M. Pellegrino A.A. 2017/2018
1
Indice 1
Abstract
2 Compone Component ntii util utilizza izzati ti 2.1 Componen Componenti ti utiliz utilizzati zati . . . 2.1. 2.1.11 Nu Nucl cleo eo - F303RE F303RE . 2.1.2 2.1.2 Inve Inverter rter trifase trifase . . 2.1.3 2.1.3 Macchin Macchinaa elettric elettricaa 2.1. 2.1.44 En Encod coder er . . . . . . 2.1. 2.1.55 STM32 STM32Cube CubeMX MX . . 2.1. 2.1.66 KEIL KEIL uV uVis isio ion5 n5 . .
1 . . . . . . .
2 2 3 5 6 7 8 8
. . . . . . .
9 9 9 12 13 15 15 16
4 Codice Codice di con contr trol ollo lo 4.1 4.1 Impl Implem emen entaz tazio ione ne del codic codicee . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 4.1.1 Struttur Strutturaa del del codice codice di control controllo lo . . . . . . . . . . . . . . . . . . 4.1.2 4.1.2 Implem Implement entazi azione one del del codice codice di di control controllo lo . . . . . . . . . . . . . .
18 18 18 22
5
28 28
3
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
Teoria eoria del del contro controllo llo e confi configur gurazi azione one del del MCU MCU 3.1 Teoria eoria del control controllo lo e configuraz configurazion ionee del MCU . . . 3.1. 3.1.11 An Anel ello lo di veloci elocit` t` a . . . . . . . . . . . . . . . 3.1. 3.1.22 Gener Generazi azion onee del del codice codice . . . . . . . . . . . . 3.1.3 3.1.3 Confi Configura gurazio zione ne timer timer av avanzato anzato TIM1 TIM1 . . . . 3.1.4 3.1.4 Confi Configura gurazio zione ne genera generall purpose purpose timer timer TIM2 TIM2 3.1. 3.1.55 Watchd atchdog og . . . . . . . . . . . . . . . . . . . 3.1.6 3.1.6 Confi Configura gurazio zione ne dell dellaa periferi periferica ca ADC1 ADC1 . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
Prestazioni Prestazioni dell’ane dell’anello llo di velocit` velocit` a: a: risultati risultati ottenu ottenuti ti 5.1 Prestazi Prestazioni oni dell’a dell’anel nello lo di veloci velocit` t` a: a: risultati ottenuti . . . . . . . . . . .
6 Algorit Algoritmo mo di di cont control rollo lo
37
7 Conc Conclu lusi sion onii 7.1 7.1 Con Concl clus usio ioni ni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50 50
8 Appe Append ndic ice e 8.0. 8.0.11 Da Datas tashee heett . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.0. 8.0.22 Link Link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51 51 51
9
52
Bibl Biblio iogr grafi afia a 2
Elenco delle figure 2.1 2.2 2.2 2.3 2.4 2.5 2.6 2.6
Schemat Schematico ico set-up set-up sperim sperimen ental tale. e. . . . . . Nucl Nu cleo eo - F303R F303RE. E. . . . . . . . . . . . . . Pinout Pinout della della scheda scheda NUCLEO NUCLEO F303R F303RE. E. . Inverter Inverter trifase X-NUCLEO-IH X-NUCLEO-IHM08M1. M08M1. . Brushle Brushless ss SPM S140-2B S140-2B353. 353. . . . . . . . STM32C STM32Cube ubeMX MX.. . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
3 4 4 5 6 8
3.1 Schema Schema di con control trollo lo di di veloci velocit` t` a. a. . . . . . . . . . . . . . . . . . . . . . . 3.2 Schema Schema di contr controll olloo di correnta correnta a frequen frequenza za imposta: imposta: I con Hz . . . . . .
9 12
4.1 Diagram Diagramma ma a blocchi: blocchi: stati operativ operativi. i. . . . . . . . . . . . . . . . . . . . 4.2 Schema Schema a blocchi: blocchi: controll controlloo di veloci velocit` t` a in anello chiuso. . . . . . . . . .
22 23
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15
29 29 30 30 31 31 32 32 33 33 34 34 35 35 36
Effetti Effetti del filtro: filtro: FFT dei dati dati grezzi grezzi (sinist (sinistra), ra), confro confront ntoo (destra). (destra). . . . Risposta Risposta ad un un gradin gradinoo di veloci velocit` t` a: a: +300rpm. . . . . . . . . . . . . . . Risposta Risposta ad un un gradin gradinoo di veloci velocit` t` a: a: +300rpm. . . . . . . . . . . . . . . Risposta Risposta ad un un gradin gradinoo di veloci velocit` t` a: a: -300rpm. -300rpm. . . . . . . . . . . . . . . . Risposta Risposta ad un un gradin gradinoo di veloci velocit` t` a: a: -300rpm. -300rpm. . . . . . . . . . . . . . . . Performance Performance feed-forw feed-forward: ard: storia temporale (sinist (sinistra); ra); dettaglio dettaglio (destra). Risposta Risposta ad un un gradin gradinoo di veloci velocit` t` a: a: +1000rpm. . . . . . . . . . . . . . . Risposta Risposta ad un un gradin gradinoo di veloci velocit` t` a: a: +1000rpm. . . . . . . . . . . . . . . Risposta Risposta ad un un gradin gradinoo di veloci velocit` t` a: a: -1000rpm. . . . . . . . . . . . . . . Risposta Risposta ad un gradino gradino di velocit` velocit` a: a: -1000rpm. . . . . . . . . . . . . . . Risposta Risposta ad un gradino gradino di velocit` velocit` a: a: +2000rpm. . . . . . . . . . . . . . . Risposta Risposta ad un gradino gradino di velocit` velocit` a: a: +2000rpm. . . . . . . . . . . . . . . Risposta Risposta ad un gradino gradino di velocit` velocit` a: a: -2000rpm. . . . . . . . . . . . . . . Risposta Risposta ad un gradino gradino di velocit` velocit` a: a: -2000rpm. . . . . . . . . . . . . . . Risposta ad una inversione di velocit`a: a: ±2000rpm. . . . . . . . . . . . .
8.1 Brushle Brushless ss SPM SPM S140-2 S140-2B353 B353 - Datash Datasheet. eet. . . . . . . . . . . . . . . . . .
51
Capitolo 1 Abstract In questo report si sviluppa il controllo controllo di un motore sincrono a magneti permanenti permanenti superficiali SPM . Esso si basa sull’ implementazione di un anello chiuso di velocit`a. a. La preliminare individuazione del sistema di riferimento rotante (d,q) e la compensazione dell’offset dell’encoder incrementale installato su rotore della macchina elettrica, fatte in fase di COMMISSIONING , sono step necessari allo scopo di controllare la velocit` a rotorica. L’esercitazione fornita dal corso di ”Controllo digitale di convertitori e azionamenti” ha dimostrato la fattibilit` a del controllo vettoriale I-Hz , eseguita azionando il motore mediante mediante un inverter inverter trifase. Il convertitore convertitore trifase riceve riceve i segnali di comando da un microcontrollor microcontrolloree (MCU) in cui `e riversato riversato l’algoritmo l’algoritmo di controllo controllo sviluppato sviluppato in linguaggio C . In questo progetto si intende estendere ulteriormente il controllo I-Hz , implementando un ulteriore anello di velocit` a, esterno all’anello di corrente. I risultati mostrano che la a, risposta dinamica del motore SPM `e soddisfacente so ddisfacente in termini di d i prontezza ed oscillaosc illazioni. Inoltre si mostra che l’implement l’implementazione azione di un ulteriore controllo predittivo predittivo non migliora le prestazioni della macchina in esame.
1
Capitolo 2 Componenti utilizzati 2.1 2.1
Compo Compone nen nti util utiliz izza zati ti
In questo capitalo si presentano le parti hardware (HW) e software (SW) utilizzate per l’implementazione del progetto. Nell’ordine si affrontano: 1. Microcontrollore (MCU/ µC): dispositivo digitale dedicato al controllo in anello chiuso di un processo, alimentato da PC (3.3V); 2. Inverter trifase : conve convertit rtitore ore pilotat pilotatoo dal suddetto suddetto MCU, MCU, alimen alimenta ta un motore motore Brushless Brushless sinusoidal sinusoidalee isotropo; 3. Macchina elettrica : motore sincrono Surface Permanent Magnet (SPM); 4. Encoder incrementale con tacca di zero: ruota ruota ottica ottica calibrata calibrata dotata di index che permette comunque di ottenere la posizione angolare assoluta del motore; 5. STM32CubeMX : software che fornisce interfaccia grafica che agevola la configurazione del MCU STM32; 6. KEIL uVision5 : software che fornisce ambiente di sviluppo che permette la gestione stione del progetto progetto,, il debug debug real-ti real-time, me, l’edit l’editing ing e la compila compilazio zione ne del codice sorgente; 7. Oscilloscopio virtuale SimpleP 36 SimpleP 36 w64: interfaccia grafica che permette di visualizzare l’andamento nel tempo di segnali elettrici. Lo schematico rappresentativo del circuito utilizzato in laboratorio di Enertronica del Politecnico di Torino `e riporta rip ortato to in Fig. 2.1. 2
Politecnico di Torino
Figura 2.1: Schematico set-up sperimentale.
2.1.1
Nucleo - F303RE
Il cuore del sistema di controllo realizzato `e un MCU appartenente alla famiglia STM32 , basata su processori a 32 bit ARMCORTEX-M . Il MCU `e un dispositivo digitale embedded a singolo chip, detto anche ”one board on a single chip” dal momento che integra al suo interno tutte le periferiche che erano in precedenza distribuite sulla scheda di controllo esterna al chip del processore. Il MCU riceve in input riferimenti, feedback e segnali di diagnostica, e produce in output comandi di controllo calcolati sulla base della differenza tra i riferimenti e i feedback. La prestazione di un controllore embedded `e valutata attraverso due indici di benchmark: -Frequenza di clock : definisce la velocit`a con cui la CPU esegue i calcoli; -MIPS (Milion Instructions Per Second): definisce il numero di istruzioni eseguibili in un secondo. Per l’implementazione e lo sviluppo del controllo si utilizza l’evaluation kit NUCLEOF303RE, dotato di una memoria Flash di 512Kbytes. A bordo di tale scheda `e montato il debugger/programmer ST-Link, che evita l’utilizzo di adattatori USB esterni. Si riporta in Fig. 2.2 la scheda appena presentata. La documentazione e il datasheet sono visualizzabili sul sito del produttore, il cui link `e presente in Appendice 8.0.1.
3
Politecnico di Torino
Figura 2.2: Nucleo - F303RE. In Fig.2.3 si riporta il pinout della scheda nucleo dedicata al controllo in anello chiuso.
Figura 2.3: Pinout della scheda NUCLEO F303RE. Essa presenta 64 pin, numerati da 1 a 64 in ordine antiorario a partire dall’angolo alto sinistro, con un nome identificativo. Nella maggior parte dei casi i nomi sono generici, es. PA0 o PA1 rispettivamente pin/bit 0 o 1 del gruppo A dei GPIO , in quanto non vi ´e corrispondenza biunivoca tra pin e periferiche. Queste ultime sono infatti molto di pi`u dei pin realmente a disposizione del MCU. Di conseguenza si deve configurare ciascun pin via software, utilizzando le sue alternate functions, per attribuirlo in modo mutuamente esclusivo alle periferiche desiderate. In alcuni casi invece i pin sono associati univocamente ad una funzionalit`a , ed hanno un nome ben preciso. Ad esempio V ss , V dd per l’alimentazione, NRST per il reset, ecc.. In Tabella 2.1 si riporta il collegamento eseguito tra i cavi dell’encoder ai relativi pin della scheda NUCLEO F303RE. 4
Politecnico di Torino Connettore encoder Rosso Grigio Nero Verde Bianco Marrone
Pin nucleo scheda +5V GND GND PA11 PA7 PB2
Tabella 2.1: Encoder - Nucleo
2.1.2
Inverter trifase
Si utilizza l’inverter X-NUCLEO-IHM08R1, riportato in Fig. 2.4, il cui Datasheet `e riportato in Appendice 8.0.1
Figura 2.4: Inverter trifase X-NUCLEO-IHM08M1.
Questo risulta compatibile con il connettore ST morpho della scheda Nucleo, ha una corrente di fase di uscita massima di 15 Arms , e accetta sul DC-link un’alimentazione compresa tra 8 V e 48 V. In questo progetto in particolare il DC-link `e alimentato mediante un alimentatore da banco, PS 2042-20B , in grado di fornire una tensione continua massima di 42V. Quest’ultima caratteristica risulta largamente accettabile, rispetto ai 24V effettivamente impostati nel progetto a livello del DC-link. L’inverter utilizzato prevede inoltre una protezione hardware da sovracorrente di fase, che interviene a 30 A pk , e una protezione da sovratemperatura. I sei interruttori comandati presenti sui tre power module dell’inverter sono Mosfet STL220N6F7 da 60V, pilotati da gate driver L6398 , posizionati uno per gamba. Le correnti di fase in uscita dall’inverter, in ingresso al motore, sono misurate da tre resistenze di Shunt poste in serie al Mosfet basso di ciascuna fase. 5
Politecnico di Torino
2.1.3
Macchina elettrica
Il motore utilizzato `e un brushless sinusoidale isotropo (SPM) dotato di quattro coppie polari, prodotto dalla Microphase e riportato in Fig. 2.5. Datasheet dettagliato di suddetto motore `e reperibile in Appendice 8.0.1.
Figura 2.5: Brushless SPM S140-2B353. Questa categoria di motori non presenta contributo di coppia di riluttanza, ma l’effetto utile deriva unicamente dall’interazione tra il flusso prodotto dai magneti permanenti di rotore e la corrente circolante negli avvolgimenti statorici. Data la natura isotropa della macchina elettrica elettrica in questione, l’induttanza in asse d, (Ld ) coincide con l’induttanza in asse q, (Lq ). E’ quindi possibile definire un’indutanza equivalente Leq nota come induttanza sincrona Ls e pari a Lq e Ld . La filosofia di controllo dell’SPM `e iniettare corrente in asse q , su un sistema di riferimento (d,q) rotante e solidale attraverso l’asse d al flusso prodotto dai magneti permanenti di rotore λm . La coppia T `e infatti direttamente proporzionale alla corrente iq (Eq. 2.3). Il modello magnetoelettrico di suddetto motore `e composto da una equazione elettrica e una magnetica descritto in assi rotanti (d,q) riportato in Eq. 2.1 . d λs¯(t) v¯s = R s ∗ i¯s + + j ∗ ω ∗ λ¯s dt Ls 0 λ¯m ¯ ¯ = + ∗ λs is 0 Ls 0
(2.1)
dove: -Rs [ Ω]: resisteza di statore; -Ls [H]: l’induttanza sincrona di statore; - λm [Vs]: flusso concatenato con gli avvolgimenti di statore prodotto dai magneti permanenti superficiali presenti a rotore. Da suddetta espressione, ´e possibile osservare come effettivamente la coppia sia prodotta in questo motore con la corrente in asse q . Di conseguenza per il motore SPM il 6
Politecnico di Torino vettore corrente utile al controllo di coppia risulta essere:
0 i¯s = = 0 + j ∗ iq isq
(2.2)
Il riferimento di corrente in asse d rimane quindi costantemente nullo, almeno rimanendo nel tratto a coppia massima costante. Viceversa infatti, entrando nel tratto a potenza massima costante, il deflussaggio richiederebbe l’iniezione di corrente in asse -d e quindi quest’ultima non sarebbe pi` u nulla. Ma questo luogo di funzionamento, con velocit` a superiori alla velocit`a base, non viene considerato in questo progetto. Con semplici passaggi matematici ´e possibile ricavare l’espressione di coppia utile al controllo, riportata in Eq. 2.3. T =
3 ∗ p ∗ λm ∗ isq = k t ∗ isq 2
(2.3)
dove: -p: il numero di coppie polari; -λm [Vs]: il flusso concatenato con gli avvolgimenti di statore, prodotto dai magneti permanenti superficiali presenti a rotore; -isq [A]: unica componente di corrente statorica utile con lo scopo di ottenere coppia; -kt [Nm/A]: il fattore di coppia (kt =3/2*p* λm ) che risulta essere costante almeno entro la coppia nominale. In sovraccarico questo coefficiente si riduce a causa della saturazione.
2.1.4
Encoder
Il motore appena presentato `e dotato di un encoder incrementale con tacca di zero e 2048 divisioni. Di conseguenza la risoluzione angolare dell’encoder `e riportata in Eq. 2.4. Si ottiene la risoluzione angolare su 4*ndiv grazie allo sfasamento di un quarto di periodo tra i due sensori (canali A e B) presenti nella ruota ottica calibrata in oggetto. Si definisce periodo d’onda la distanza tra due divisioni. Risoluzione angolare =
2∗π = 7.67 ∗ 10 4 ∗ ndiv
4 rad
−
div
(2.4)
Essendo gi` a integrato all’interno della scatola chiusa contenente il motore, non risulta possibile riportare l’immagine dell’encoder appena presentato. L’index/tacca di zero caratterizzante l’encoder incrementale, permette di ottenere un’informazione assoluta della posizione rotorica. Si riporta una breve descrizione del principio di funzionamento del trasduttore di posizione: l’encoder unit del MCU costruisce il position clock , fatto di impulsi in corrispondenza di ogni fronte di salita dei due canali A e B. Il position counter del MCU conta gli impulsi del position clock , tracciando cos`ı la distanza angolare coperta dalla posizione iniziale zero.Nel counter del timer generico adibito all’acquisizione del segnale dall’encoder si trova quindi la posizione angolare del rotore, espressa per` o in numero di impulsi del position clock. Di conseguenza, per avere la posizione angolare in radianti, occorre ancora applicare una riscalatura, data dalla suddetta risoluzione angolare dell’encoder. 7
Politecnico di Torino
2.1.5
STM32CubeMX
Software grafico di ausilio alla configurazione del MCU utilizzato. Esso permette la generazione di un codice C di inizializzazione, classificabile come Initialization Code Generator utilizzando una procedura guidata di tipo grafico. Il primo step consiste nel selezionare la board utilizzata nel progetto. Fatto ci` o appare una pagina contenente il pinout del MCU, che permette di configurarne facilmente i pin e le periferiche come riportato in Fig. 2.6.Il link utile `e riportato in Appendice 8.0.2. Il principale vantaggio nell’utilizzo di questo strumento risiede nella conoscenza, da parte del software stesso, dei pin del MCU utilizzato e le loro possibili alternate functions. In questo modo si pu`o configurare il MCU senza dover intervenire manualmente sui singoli bit dei suoi registri di configurazione. Operazione che richiederebbe la consultazione del reference manual, sicuramente pi` u complicata del suddetto tool grafico di configurazione.
Figura 2.6: STM32CubeMX.
2.1.6
KEIL uVision5
E’ un ambiente di sviluppo prodotto da KEIL che combina possibilit` a di gestione del progetto, debug real-time, editing e compilazione del codice sorgente in unico strumento. uVision `e innanzitutto un editor di codice, con un compilatore ed un linker per generare codice eseguibile sul MCU. Questo `e in grado di collegarsi alla target board STM32 tramite interfaccia ST-Link (in-circuit debugger and programmer per le famiglie di microcontrollori STM8 e STM32). Dopo la scrittura e la compilazione del codice, quest’ultimo viene caricato sulla memoria Flash del MCU (512Kbyte, non volatile). E in seguito pu`o essere eseguito in modalit` a stand-alone (ST-Link staccato) o debug (mantenendo il collegamento con il PC). Il link utile `e riportato in Appendice 8.0.2.
8
Capitolo 3 Teoria del controllo e configurazione del MCU 3.1
Teoria del controllo e configurazione del MCU
In questo capitolo si presenta brevemente la legge di controllo in anello chiuso, realizzato con l’ausilio del MCU, e la configurazione delle periferiche appartenenti a quest’ultimo.
3.1.1
Anello di velocit` a
Nel sottocapitolo corrente si presentano le basi teoriche di un controllo in anello chiuso di velocit`a , obiettivo di questo progetto. Si riporta lo schema a blocchi del controllo implementato in Fig. 3.1.
Figura 3.1: Schema di controllo di velocit` a. Come si evince dallo schema a blocchi appena riportato, ingresso del sistema di controllo `e una velocit` a di riferimento richiesta dall’utente. Quest’ultima `e confrontata con l’effettiva velocit`a del motore, retroazionata sull’ingresso. Dal confronto di queste due velocit` a emerge un errore di controllo. Questo viene condizionato attraverso un 9
Politecnico di Torino regolatore PI, che produce in uscita una coppia di riferimento finalizzata all’annullamento l’errore in ingresso. La coppia di riferimento appena ottenuta `e quindi riscalata, attraverso un coefficiente caratteristico della macchina, al fine di ottenere un riferimento di corrente. Quest’ultimo `e dato in ingresso ad un anello di corrente, pi` u interno a quello di velocit`a suddetto, e confrontato con la corrente effettivamente circolante nella fasi del motore produce un secondo errore di controllo. Questo `e condizionato da un secondo regolatore PI, che produce in uscita una tensione di riferimento richiesta all’inverter che alimenta il motore. Ai fini della stabilit` a del sistema di controllo le bande passanti dei due anelli, rispettivamente di velocit` a e di corrente, devono essere opportunamente distanziate. In particolare si consiglia che l’anello pi` u interno (quello di corrente) presenti una banda passante di almeno una decade superiore rispetto alla banda passante dell’anello pi` u esterno (quello di velocit` a). Cos`ı che l’anello pi` u interno sia visto come un guadagno unitario dell’anello pi` u esterno. Inoltre, sempre ai fini della stabilit`a del controllo, l’anello di corrente deve avere una banda passante di almeno una decade inferiore rispetto alla pulsazione di commutazione dell’inverter (coincidente con la pulsazione della portante triangolare isoscele dei modulatori PWM costituita dal contatore del timer avanzato TIM1). La relazione che collega le frequenze sopracitate `e riportata in Eq. 3.1 (3.1) < f current loop < f bandwidth ω f = [Hz ] (3.2) 2∗π Si implementa il controllo vettoriale di velocit`a in anello chiuso utilizzando un sistema di riferimento rotante (d,q) sincrono alla posizione del rotore, attraverso la coincidenza dell’asse d con il vettore λ¯m , esprimente la direzione di emissione di flusso da parte dei magneti permanenti su rotore. Si comprende quindi come sia indispensabile individuare la corretta posizione del suddetto vettore λ¯m al fine dell’implementazione del controllo. L’algoritmo del controllo in anello chiuso di velocit` a appena presentato, `e implementato all’interno di un microcontrollore. Questo a sua volta pilota un inverter trifase che alimenta un motore SPM, oggetto del controllo. La posizione angolare rotorica del motore in esame `e rilevata mediante un encoder incrementale. Ma ai fini del controllo ´e necessario disporre della posizione angolare del vettore λ¯m , cos`ı da riuscire effettivamente a portarsi nel sistema di riferimento (d, q ) del controllo. E, dal momento che in sede di montaggio dell’encoder sull’albero del motore non si tiene tipicamente in conto della posizione dei magneti sul rotore, ´e inevitabile che si crei un offset tra la posizione angolare del rotore, espressa dell’encoder, e l’effettiva posizione del vettore λ¯m , nostro obiettivo. Dunque si definisce offset angolare θ of f la differenza tra la posizione meccanica di uno degli assi d del sistema di riferimento rotante (d,q) (si ricordi che ad ogni coppia polare corrisponde un asse d ) e lo zero (index) dell’encoder incrementale. Si riporta la relazione che lega questi angoli in Eq. 3.3. f speed
loop
−
−
θof f = θ r − θenc
(3.3)
La posizione del motore `e coincidente all’offset quando il valore campionato dall’encoder risulta nullo; viceversa in posizione θr = 0 l’encoder indica −θof f . Individuare l’offset tra la direzione del flusso principale prodotto dai magneti permanenti e l’index dell’encoder poich´e, come accennato sopra, durante l’unione di un 10
Politecnico di Torino motore e un encoder il trasduttore ed il rotore non sono allineati. Per conoscere la posizione degli assi (d,q) `e necessario quindi determinare l’offset e compensarlo ad ogni istante di campionamento. L’offset viene identificato una volta e usato come costante dell’algoritmo di controllo, secondo l’ Eq. 3.4. θk = p ∗ (θk + θof f ) [radelettrici ]
(3.4)
Noto dunque l’offset angolare questo `e utilizzato insieme a θenc fornito da encoed per determinare la posizione angolare del vettore flusso generato dai magneti permanenti λ¯m (coincidente con l’asse d del motore) rispetto l’asse αs . Solidale allo statore del motore e punto di partenza per effettuare la rotazione dal sistema di riferimento fisso al sistema di riferimento rotante: (α, β )→ (d, q ). La posizione angolare θenc risiede nel registro position counter (PC) (questo registro `e spiegaro in sottocapitolo 3.1.2). Ma risulta necessario applicare un fattore di scala KENC al segnale in uscita dall’encoder, affinch`e questo risulti essere la posizione angolare meccanica del rotore espressa in radianti. In Eq. 3.5 si riporta la posizione degli assi (d,q) da usare per il controllo vettoriale di corrente: θk = p ∗ (KENC ∗ P C (k) + OF F )
(3.5)
dove: -p : il numero di coppie polari; 2∗π -KENC= : risoluzione angolare dell’encoder; 4 ∗ ndiv -PC : numero compreso tra [0 : 4 ∗ ndiv − 1] adibito al conteggio degli impulsi del position clock . In modo da tracciare la distanza angolare coperta dalla posizione iniziale zero, espressa in numero di impulsi n . Al fine di effettuare un allineamento corretto, ci sono diversi metodi. Se ne riportano tre: 1. Allineamento dei coseni direttori alla f.e.m. a vuoto; 2. Parking (allineamento del rotore ad un vettore corrente imposto); 3. Ispezione della salienza della macchina con segnale ad alta frequenza. In questo progetto si `e utilizzato il metodo Parking , brevemente riportato di seguito. Per realizzarlo occorre prima di tutto individuare la tacca di zero (index). Pertanto si pone il motore in rotazione fornendo unicamente corrente in asse d e utilizzando lo schema di controllo I con Hz per un tempo ampiamente sufficiente rispetto al tempo richiesto per effettuare un giro meccanico. Questa operazione assicura di aver incontrato la tacca di zero Da questo momento la posizione angolare di rotore fornita dall’encoder ´e assoluta. Perch´e riferita alla tacca di zero appena incontrata: punto univoco di rotore. Il secondo passo consiste nell’ alimentare il motore con una corrente continua in asse 11
Politecnico di Torino α, in modo che il rotore si allinei in posizione zero. Difatti suddetta componente di corrente attrae i magneti permanenti presenti a rotore lungo l’asse di alimentazione. Estinti i transitori e ammesso che gli attriti, intrinsecamente presenti nei motori siano bassi tale da non ostacolare l’avvicinamento, la macchina si allinea quindi in posizione zero (d≡α). Una volta parcheggiato il motore in posizione zero, se si `e inizialmente impostato OFF = 0, `e facile rilevare l’offset angolare direttamente dalla lettura dell’encoder: θenc = −θof f (3.6) In questo progetto si effetua il parking utilizzando l’inverter X-NUCLEO-IHM08R1 (sottosezione 2.4), usando lo schema di controllo I-Hz , con riferimento di velocit` a nullo, direttamente passato come θref = 0 per evitare l’integrazione di uno zero, e corrente di riferimento in asse d di quattro Ampere. Nel controllo vettoriale I-Hz infatti si controllano in generale l’ampiezza e la frequenza del vettore corrente in modo da ottenere un vettore rotante a cui la macchina tende ad agganciarsi. Dalla frequenza si ottiene l’angolo di orientamento, integrando la frequenza angolare di riferimento, secondo l’Eq. 3.7. Si osservi l’assenza di un anello chiuso di velocit`a. (3.7) θ = ω dt ∗
∗
Controllando in anello chiuso la corrente, si ottiene un vettore corrente rotante alla frequenza di riferimento. Il vettore `e sincrono col riferimento angolare, ed `e allineato secondo la direzione θ . Si riporta lo schema del controllo appena descritto in Fig.3.2. ∗
Figura 3.2: Schema di controllo di correnta a frequenza imposta: I con Hz .
3.1.2
Generazione del codice
Con riferimento a quanto detto nel precedente capitolo 3.1.1 contenente la ”Teoria del controllo”, il MCU deve svolgere le seguenti funzioni: 1. Misura e conversione A/D delle correnti di fase del motore, necessarie per la retroazione sull’anello di corrente; 2. Elaborazione dei segnali provenienti dall’encoder incrementale con tacca di zero, necessari per la retroazione sull’anello di velocit`a; 12
Politecnico di Torino 3. Generazione dei segnali di comando per gli interruttori comandati dell’inverter (MOSFET); 4. Misura e conversione A/D della tensione sul DC-link dell’inverter, sempre consigliabile per migliorare le prestazioni del sistema di controllo. Di conseguenza si riportano i passaggi fondamentali per la configurazione delle periferiche del MCU necessarie per l’implementazione dell’algoritmo di controllo.
3.1.3
Configurazione timer avanzato TIM1
Si utilizza il TIM1 per la produzione della portante triangolare isoscele dei modulatori PWM. Questo `e un timer Advanced che, a differenza dei Timer General Purpose , permette di: produrre in uscita segnali complementari con dead time impostabile (utile per evitare cortocirtuiti di gamba) e disporre di un segnale di emergenza per il blocco del controllo. I registri di configurazione da manipolare per la configurazione di questa periferica sono: 1. Counter register (T IM 1 CNT ): `e il cuore della periferica di timer, parola a 32 bit [31:0] di cui 16 sono attribuiti al contatore automatico della periferica azionato con frequenza di clock a meno di pre-scaler; 2. Prescaler register (T IM 1 P SC ): definisce se usare tutti gli impulsi di clock per il contatore oppure utilizzarne un sottomultiplo. E’ una parola a 16 bit [15:0] in cui `e possibile settare il valore di pre-scaler desiderato; 3. Auto-reload register (T IM 1 ARR): definisce il fondo scala del contatore CNT della periferica di timer. E’ una parola a 16 bit [15:0] in cui `e possibile settare il valore di fine corsa desiderato per il conteggio utile a creare la triangola unipolare isoscele; 4. Repetition counter register (T IM 1 RCR): definisce se utilizzare tutti o meno i vertici della portante triangolare isoscele, creata dal suddetto contatore, come segnali di interrupt. E’ una parola a 16 bit [15:0] in cui `e possibile settare il numero di update event non utilizzati come interrupt; 5. Control register (T IM 1 CR1): attiva l’autoreload del registro ARR, attiva il contatore CNT e ne sceglie la modalit` a di conteggio. E’ una parola a 16 bit [15:0] in cui `e possibile settare le caratteristiche appena citate; 6. Capture/compare enable register T IM 1 CCER. E’ una parola a 32 bit [31:0] in cui `e possibile attivare la modalit`a di produzione di output complementari con dead-time programmabile manipolando i bit CCxE e CCxNE (entrambi ad uno). Inoltre utilizzando questo registro `e possibile impostare a zero i bit di polarit` a 13
Politecnico di Torino
CCxP e CCxNP . In logica classica “attivo alto” questi due bit sono entrambi pari a zero, e gli interruttori comandati sono chiusi quando il loro segnale di comando ´e unitario. Ma potrebbe essere necessario, per logica invertita nei gate driver pilotanti gli interruttori comandati dell’inverter, invertire la suddetta logica chiudendo gli interruttori comandati con un segnale di comando pari a 0. Allora in questo caso si agisce su questi due bit per invertire la polarit` a dei segnali di comando in questione; 7. Break dead-time register T IM 1 BDTR. E’ una parola a 32 bit [31:0] in cui `e possibile settare il “tempo morto” inserito sui fronti di chiusura degli interruttori comandati. Avente lo scopo di evitare cortocircuiti di gamba sui tre power module dell’inverter. Utilizzando la finestra Configuration del software STM32CubeMX `e possibile manipolare i suddetti registri di configurazione. Senza intervenire manualmente sui singoli bit dei registri di configurazione, ma usufruendo di un’interfaccia grafica semplificata. Con lo scopo in particolare di ottenere una frequenza di commutazione di 4 kHz (→ T P W M = T sw = 250µ), occorre impostare al loro interno i valori calcolati come riportato in Eq. 3.8. f P OST PRE SCALER 64 ∗ 106Hz ARR = = = 8000 2 ∗ f P W M 2 ∗ 4 ∗ 103 Hz −
dove: -f P OSTPRE
SCALER
−
(3.8)
`e pari alla frequenza di clock del MCU, siccome PSC=0;
-f P W M `e la frequenza della portante triangolare isoscele. Pari alla frequenza di commutazione dell’inverter e, in questo contesto di tecnica di campionamento 1S1R, anche pari alla frequenza di campionamento. Avendo creato a questo punto la portante triangolare isoscele dei modulatori PWM, l’obiettivo finale `e la creazione dei segnali di comando degli interruttori comandati delle tre gambe di inverter. Per fare questo `e necessario agire sul registro CR1 di configurazione della periferica di timer avanzato qui presentata (T IM 1 CR1), e in particolare si imposta: -Bit 6:5 CMS[1:0]=11 : modalit`a di conteggio del contatore in cui si ha il confronto tra portante e modulante su entrambi i fronti della triangola isoscele, costituita dal contatore; -Bit 7 ARPE=1 : attiva l’auto-reload dell’ARR, indispensabile per ottenere infiniti fronti della triangola; -Bit 0 CEN=1 : attiva il contatore CNT della periferica di timer avanzato. Si ricorda che questa operazione deve essere forzata manualmente nel codice, in quanto non eseguita automaticamente da STMCubeMX. 14
Politecnico di Torino
3.1.4
Configurazione general purpose timer TIM2
Si utilizza il TIM2 per la lettura dell’encoder incrementale con tacca di zero. Questo `e un timer non avanzato ma General Purpose Timer , che differisce da un timer Advanced per l’impossibilit`a di produrre segnali in uscita complementari con impostazione di Dead Time e inoltre non dispone di un segnale di una break function. Si utilizza suddetto timer come input capture del segnale. Si utilizzano i due canali dell’encoder incrementale, rispettivamente in ingresso da TIM2 CH1 e TIM2 CH2 (i primi due canali del timer appena presentato). Si processano i due segnali al fine di ottenere il clock di posizione: un clock che associ ogni suo impulso ad un evento di aggiornamento del canale A (CHA) o canale B (CHB ) in modo da poter effettuare il conteggio di posizione. I registri di configurazione da manipolare per la configurazione di questa periferica sono: 1. Counter register (T IM 1 CN T ): `e il cuore della periferica di timer. Gli impulsi di posizione diventano il clock del contatore. Dunque questo registro contiene l’informazione rappresentante la posizione angolare del rotore espressa in numero di impulsi di posizione. Bisogna quindi applicare un fattore di scala al fine di ottenere la posizione angolare in radianti. 2. Slave mode control register (TIM2 SMCR ): attiva la modalit`a encoder utilizzando i bit SMS=011 ; 3. Control register (TIM2 CR1 ): settando il bit CEN=1 il contatore reagisce alle transazioni di livello dei due canali. Ogni transazione produce un impulso di posizione, mentre settando il bit DIR viene generato il bit direzione, ricalcolato ad ogni transizione di uno qualunque dei due canali. E’ fondamentale settare il bit DIR per effettuare correttamente il conteggio di posizione(0 → velocit`a positiva, incremento del conteggio; 1 → velocit`a negativa, decremento del conteggio); 4. Auto-reload register (T IM 1 ARR): definisce il fondo scala del contatore CNT della periferica di timer 2. E’ una parola a 16 bit [15:0] in cui `e possibile settare il valore di fine corsa desiderato pari a ARR = 4 ∗ ndiv − 1; 5. Capture/compare enable register T IM 1 CCMR: `e una parola a 31 bit [31:0] in cui `e possibile, settando i bit CC1S e CC2S, configurare il CH1 e CH2 come input mode. Il contatore `e resettato mediante un segnale proveniente dall’esterno legato alla tacca di zero.
3.1.5
Watchdog
Il watchdog `e un timer free-running di tipo downcounter che lancia un segnale di reset al MCU. Si hanno condizioni di funzionamento anomale se il tempo di esecuzione di un task `e superiore ad un tempo impostato mediante il registro WWDG CFR. Se il task di controllo richiede un tempo magiore per qualsiasi anomalia, il timer del 15
Politecnico di Torino watchdog arriva a zero. E di conseguenza questa periferica lancia un segnale di reset al MCU per arrestare il controllo, conseguenza inevitabile avendo perso il paradigma di funzionamento real-time. In condizioni normali (real-time del controllo) il timer `e reimpostato al valore iniziale e pertanto non `e inviato alcun segnale di reset al MCU. I registri di memoria adibiti alla configurazione della periferica di WatchDog sono: 1. Control register CR. E’ una parola di 32 bit [31:0] in cui il bit WDGA abilita il timer free-running del Watchdog mentre nei successivi 7 bit T [6:0] `e possibile settare il valore del conteggio watchdog; 2. Control free running register CFR . E’ una parola di 32 bit [31:0] in cui gli ultimi sette bit W [6:0] sono settati al valore utile al confronto con il downcounter.
3.1.6
Configurazione della periferica ADC1
Si utilizza la periferica ADC1 per campionare le correnti di fase del motore e la tensione di alimentazione sul DC-link dell’inverter trifase. Il campionamento delle correnti di fase `e indispensabile al fine di generare un errore di corrente, dato dal confronto tra i riferimenti e le correnti campionate. Inoltre, data la disponibilit` a di convertire quattro segnali, si campiona anche la tensione di alimentazione sul DC-link. Al fine di compensare direttamente dei disturbi parametrici che potrebbero interessare la grandezza elettrica in questione. Si osservi che sarebbe sufficiente il campionamento di due delle tre correnti di fase del motore. Perch` e quest’ultimo `e un sistema a neutro isolato e quindi, utilizzando la relazione ia +ib +ic = 0, sarebbe possibile ricavare il terzzo valore di corrente. Inoltre il campionamento della V dc `e migliorativo, ma non indispensabile. ADC1 `e uno dei quattro convertitori analogico/digitale ad approssimazioni successive SAR di cui dispone il MCU STM32F303RE . L’alimentazione del blocco ADC `e pari a 3.3 V ed `e fornita mediante i pin V DD e V SS . I pin dedicati all’alimentazione sono presenti su ogni lato del MCU poich`e deve essere garantita la stabilit` a dell’alimentazione, usata poi come scala della conversione analogico/digitale. Suddetta periferica dispone di un convertitore A/D a 12 bit ad approssimazioni successive. La ADC unit `e collegata al controller DMA (Direct Access Memory) per disaccoppiare la conversione A/D dalla CPU, poich`e non si effettuano operazioni aritmetiche sui valori campionati. Il risultato della conversione `e poi memorizzato in registri a 16 bit. Le modalit`a di conversione A/D e risoluzione sono svariate. I principali settaggi da manipolare per la configurazione di questa periferica sono: 1. Resolution=12 bit : determina la risoluzione con cui si eseguono le conversioni A/D; 2. Number of convertion=4 : definisce la modalit`a di conversione injected . Si convertono le correnti di fase che fluiscono negli avvolgimenti statorici e l’alimentazione sul DC-link, con sequenza di quattro conversioni su 4 pin diversi; 3. Injected sequence register : Contiene la dichiarazione dei canali campionati e il loro ordine di campionamento, nel registro ADC1 JSQR. 16
Politecnico di Torino La procedura di acquisizione e conversione da parte della periferica ADC1 `e eseguita tutte quelle volte in cui il timer TIM1 (presentato in 3.1.3) lancia un interrupt, cio`e tutte quelle volte che la CPU interrompe eventuali operazioni non pioritarie ed inizia l’esecuzione di una routine a pi` u alta priorit`a, in questo caso Control routine . Dato che il campionamento delle tre correnti del motore avviene in istanti temporali differenti, questo comporta un errore nella retrazione di corrente. In realt` a il succitato errore di campionamento non compromette le prestazioni del controllo in anello chiuso data la velocit`a di esecuzione delle conversioni. Per osservare ci` o e’ sufficiente considerare che la velocit`a di conversione a 12 bit `e pari a 0.19 µs, trascurabili rispetto al tempo necessario ad eseguire la routine di controllo (f s =4 kHz → T s = 250µs ). Realizzati tutti i settaggi delle periferiche su Cube , `e possibile procedere alla generazione del codice con l’ausilio di KEIL uVision .
17
Capitolo 4 Codice di controllo 4.1
Implementazione del codice
In questo capitolo si analizza la struttura del codice di controllo e i vari step necessari per la sua implementazione.
4.1.1
Struttura del codice di controllo
La Interrupt Service Routine (ISR) che si utilizza per il controllo in anello chiuso di velocit`a che si va realizzando, `e organizzata attraverso cinque stati operativi mutuamente esclusivi determinati dal valore della variabile State . -ERROR → 0; -WAKE UP → 1; -COMMISSIONING → 2; -READY → 3; -START0 → 4. -START1→ 5. -START2 → 6. Si riporta lo schema rappresentativo degli stati operativi in Fig.4.1. Si ricorda che l’utilizzo di stati operativi all’interno del controllo `e indispensabile. Perch´ e risulta essere l’unico modo per rendere l’utente effettivamente padrone del funzionamento del motore, indipendentemente dall’alimentazione del MCU . Se infatti non esistessero stati operativi, all’accensione del MCU verrebbe subito eseguita la routine di controllo e sarebbe quindi alimentato il motore. Viceversa, implementando la suddetta sequenza di stati operativi, `e l’utente che deve manualmente intervenire dall’esterno per consentire l’avviamento del motore. Permettendo cos`ı un funzionamento pi`u consapevole e responsabile. All’accensione di questo azionamento, il MCU si trova nello stato di ERROR. In quest’ultimo, righe 97/107 User MotorControl.c , si eseguono le seguenti operazioni: •
La PWM `e spenta. Quindi non vengono azionati gli interruttori comandati delle tre gambe di inverter, e di conseguenza non si porta tensione sulle tre fasi del motore;
• Si
azzera un contatore. Successivamente utilizzato nei prossimi stati operativi; 18
Politecnico di Torino esegue una funzione InitVarCtrl(). Dove si inizializzano diverse variabili, per rimuovere eventuali memorie di controlli precedenti, si impostano i guadagni dei regolatori PI degli anelli del controllo vettoriale di corrente e si imposta il parametro accel , definente la massima accelerazione ammissibile sul riferimento di velocit`a successivamente utilizzata all’interno della funzione ramp();
• Si
• Si
azzerano i riferimenti dei duty cycle per le tre gambe di inverter. Per rimuovere eventuali memorie di controlli precedenti.
Il suddetto stato di ERROR `e stabile, cio`e non `e possibile uscire da esso senza un comando esterno premuto dall’utente. Nel momento che quest’ultimo preme il tasto di GO , tasto blu, il MCU fa ancora un passaggio nello stato di ERROR, necessario a cambiare la variabile State da ERROR in WAKE UP attraverso un apposito if . Cos`ı facendo al successivo interrupt il MCU si porta nello stato di WAKE UP , dove utilizza il contatore sopra menzionato che, incrementato di un’unit` a ad ogni passaggio, permette di svolgere le seguenti operazioni: i primi 500 passaggi, pari a 0.125 s commutando a 4 kHz in 1S1R, accumula offset sulle tre variabili adibite all’acquisizione delle tre correnti di fase del motore;
• Per
• Per
200 passaggi calcola gli offset medi sui tre canali delle correnti di fase del motore ed esegue un bootstrap;
• Per • Al
300 passaggi attende senza fare nulla;
1001 passaggio riazzera il contatore, che verr` a successivamente utilizzato nello stato di COMMISSIONING , e cambia appunto la variabile State da WAKE UP a COMMISSIONING . ◦
Il suddetto stato operativo di WAKE UP `e quindi finalizzato al calcolo degli offset sulle correnti, poi sottratti alle rispettive misure in sede di acquisizione, ed inoltre non `e uno stato stabile, in quanto il MCU passa automaticamente al successivo stato di COMMISSIONING senza alcun comando esterno premuto dall’utente. Nello stato di COMMISSIONING appena citato si effettua il calcolo dell’offset dell’encoder incrementale con tacca di zero, mediante la tecnica del parking. Per fare questo si utilizza nuovamente il contatore precedente, azzerato in coda alle operazioni di WAKE UP, grazie al quale: • Per
i primi 15000 passaggi, pari a 3.75 s commutando a 4 kHZ in 1S1R, si fa ¯ di ampiezza girare il motore in I-Hz a 100 rpm con un vettore di corrente is,dq 4 A. Il riferimento di velocit`a passa inoltre attraverso un blocco ramp(), cos`ı da limitare l’accelerazione del vettore rotante e permettere al rotore di agganciarsi correttamente. Questa prima operazione, che fa percorrere al motore almeno un giro completo, d`a la certezza di aver incontrato almeno una volta la tacca di zero dell’encoder incrementale. In questo modo, l’informazione di posizione angolare da lui ottenuta, si trasforma da relativa ad assoluta. Operazione indispensabile per dare un senso al calcolo dell’offset dell’encoder incrementale, che ci si appresta a fare; 19
Politecnico di Torino •
Per i successivi 13000 cicli, pari a 3.25 s, si fissa un vettore di corrente di ampiezza 4 A lungo l’asse alpha del sistema di riferimento bifase (α, β ) fisso a statore. Cos`ı facendo agisce una coppia di allineamento sul rotore, che lo porta ad orientare il suo asse d sul vettore corrente. In altri termini questa configurazione porta ad avere la direzione di emissione di flusso da parte dei magneti permanenti di rotore, appunto denominata asse d nella convenzione degli SPM, coincidente con l’asse α del sistema di riferimento bifase fisso a statore su cui si produce il suddetto vettore di corrente;
• Per
i successivi 4000 passaggi, pari a 1s si rimuove corrente dallo statore della macchina;
• Al
32001 passaggio si azzera il contatore utilizzato, si cambia la variabile State da COMMISSIONING a READY e infine si acquisisce l’offset dell’encoder incrementale. Quest’ultimo pari alla lettura dell’encoder in corrispondenza della configurazione precedentemente creata, di allineamento dell’asse d con l’asse α, cambiata di segno. ◦
Lo stato di COMMISSIONING non `e quindi uno stato stabile, in quanto il MCU ne esce automaticamente dopo aver conseguito le operazioni per il calcolo dell’offset angolare dell’encoder. Il successivo stato operativo, READY , `e invece uno stato stabile in cui: • Si
imposta il riferimento di velocit`a che si vorr` a ottenere dal controllo del motore, espresso in rpm;
• Si
azzera il riferimento di velocit` a espresso in rad/sec e prodotto in uscita dal blocco ramp(), per rimuovere eventuali memorie di controlli precedenti;
• Si
impostano i duty cycles di riferimento delle tre gambe di inverter a 0.5, cos`ı da modulare tre tensioni nulle sulle tre fasi del motore.
Essendo quindi uno stato stabile, per uscire dal suddetto stato operativo di READY e dare il via al controllo deve intervenire manualmente l’utente dall’esterno premendo il tasto GO (tasto blu). Una volta fatto ci` o, attraverso un apposito if agente sulla variabile State, al successivo interrupt il MCU si porta in uno dei seguenti stati operativi tra START0, START1 e START2 . Di questi ultimi, i primi due sono controlli provvisori utilizzati in sede di sviluppo del codice. In particolare: 1. START0 contiene un controllo I-Hz . Che `e stato utilizzato per tarare gli anelli di corrente e controllare che il MCU eseguisse correttamente la sequenza di stati operativi; 2. START1 contiene un controllo vettoriale ad anello chiuso di corrente, gi` a realizzato sul sistema di riferimento (d,q) bifase e rotante solidalmente al vettore λ¯m attraverso la coincidenza dell’asse d , che assegna corrente esclusivamente in asse q . Quest’ultima `e l’unica che produce coppia in questo motore, essendo un SPM, e di conseguenza `e un controllo rischioso in quanto capace di mandare in fuga il motore. A tal proposito `e stata inserita una protezione di sovravelocit` a, che manda il controllo in ERROR qualora si superi in modulo la velocit`a massima di 20
Politecnico di Torino 1000 rpm. Consapevoli che il motore ha una velocit` a massima dichiarata di 5000 rpm, ma per sicurezza si preferisce interrompere la fuga del motore gi` a a 2000 rpm. Questo controllo `e stato utilizzato per verificare la correttezza del sistema di riferimento (d,q ) su cui si svolge il controllo in anello chiuso di corrente, individuato a seguito della determinazione dell’offset angolare dell’encoder conseguita con il precedente COMMISSIONING .
3. START2 contiene il controllo che ci si era inizialmente posti come obiettivo per questo motore: un anello di velocit`a, ovviamente comprendente al suo interno un anello di corrente realizzato sul suddetto sistema di riferimento (d,q ).
Una volta avviato il controllo del motore, premendo per la seconda volta il tasto di GO, `e possibile interromperlo premendo l’altro tasto presente sul MCU: il tasto di RESET (tasto nero). Cos`ı facendo il MCU torna in ERROR, e di conseguenza il motore si ferma perch´e non pi` u alimentato. Si sottolinea infine che possibile determinare l’offset angolare dell’encoder “una tantum”, ma si `e preferito automatizzare la sua procedura di calcolo in un apposito COMMISSIONING eseguito ad ogni accensione del controllo. Questo `e stato fatto per tre motivi:
1. Per rendere il controllo in questione utilizzabile su qualsiasi motore SPM. Dal momento che ognuno di loro avr` a un suo offset angolare dell’encoder, che viene quindi calcolato volta per volta all’avvio del MCU;
2. Per rendere la misura dell’offset angolare dell’encoder pi` u precisa. Perch´e, se per qualsiasi motivo dovesse cambiare l’offset angolare dell’encoder nel corso della vita del motore, il controllo sar` a sempre pronto ad utilizzare il vero offset angolare di quello specifico funzionamento. Migliorando le performance del controllo ;
3. Perch´ e il motore SPM utilizzato possiede quattro coppie polari, associate ad altrettanti assi d . Di conseguenza, non essendo possibile stabilire a priori quale sar`a l’asse d che verr`a utilizzato dal controllo in quanto funzione del punto di partenza del motore, ´e necessario automatizzare la ricerca dell’asse d . Cos`ı da rendere sempre funzionante il controllo, indipendentemente dalla posizione di partenza del rotore.
Si riporta la sequenza degli stati operativi nel diagramma a blocchi di Fig. 4.1. 21
Politecnico di Torino
Figura 4.1: Diagramma a blocchi: stati operativi.
4.1.2
Implementazione del codice di controllo
In questo sottocapitolo si presenta l’implementazione del codice del controllo ad anello chiuso di velocit`a, realizzato per il motore SPM descritto nel paragrafo 2.1.3. Punto di partenza ´e lo schema a blocchi dell’anello di velocit` a, sotto riportato in Fig.4.2 e descritto dal punto di vista teorico nel precedente paragrafo 3.1.1. Nelle pagine successive si analizzano i blocchi principali del suddetto schema di controllo, soffermandosi sulle tarature impostate nel progetto specifico. 22
Politecnico di Torino
Figura 4.2: Schema a blocchi: controllo di velocit`a in anello chiuso.
Acquisizione del riferimento di velocit` a In ingresso al controllo in anello chiuso di velocit`a `e presente una velocit` a di riferimento in nr [rpm]. La quale `e convertita in un riferimento di velocit` a ωr [rad/s], denominata in scrittura codice come ω ref in, utilizzando la relazione riportata in Eq. 4.1. . π ωr = n r ∗ (4.1) 30 Il riferimento di velocit`a ottenuto `e dapprima saturato tra ±5000rad/s, utilizzando la funzione sat, e infine ´e limitato in derivata massima dal blocco ramp(). Operazione indispensabile per evitare l’applicazione di gradini di tensione al motore, che farebbero scappare le correnti facendo verosimilmente intervenire la protezione da sovracorrente qui impostata a 5 A. Che mandando in ERROR il MCU impedirebbe lo spunto del motore e quindi il funzionamento dell’intero controllo. Ad ogni interrupt (ogni T s = 250µs) `e possibile incrementare il riferimento di velocit` a in ingresso di un gradino delta . Nel controllo implementato si utilizza delta=0.005 , settato nella funzione InitVarCtrl() . Lanciata durante lo stato di ERROR. Si osservi che per valutare le prestazioni dell’anello di controllo realizzato, si `e reputato opportuno valutare le prestazioni del controllo a seguito dell’applicazione di un gradino di velocit` a in ingresso. E’ stato necessario bypssare la funzione appena presentata ramp(), con l’accortezza di conseguenza di imporre mediante una riga di codice aggiuntiva il riferimento di velocit` a desiderato. ∗
∗
∗
Regolatore PI di velocit` a Si implementa il regolatore proporzionale-integrale PI di velocit`a utilizzando la funzione PIReg(). Questo blocco nel codice `e necessario al fine di annullare l’errore tra il riferimento di velocit` a, analizzato in 4.1.2, e la retroazione di velocit`a derivante dall’integrazione dalla misura della posizione rotorica del motore . Quest’ultima operazione ´e svolta dalla la funzione speed compute(), che utilizza funzioni trigoonometriche della posizione angolare per il calcolo della velocit`a. Cos`ı da non risentire della discontinuit` a di al pi` u 2π in corrispondenza dell’annullamento del contatore del timer accogliente i canali dell’encoder, in corrispondenza della tacca di zero del trasduttore di posizione 23
Politecnico di Torino in questione. Che viceversa causerebbe uno spike nel segnale di velocit` a, disturbando quest’ultimo. Gli argomenti della funzione PIReg() sono due strutture dati chiamate sp var e sp par , e sono passate alla funzione in forma di puntatori. Prima di richiamare la funzione in questione, `e necessario scrivere i campi sp par.kp, sp par.ki , sp par.lim , sp var.fbk e sp var.ref per assegnare i valori del regolatore e il limite massimo consentito in uscita al PI per il condizionamento dell’errore. I valori k p e ki utilizzati nell’implementazione del codice sono calcolati come riportato in Eq.4.2 e Eq.4.3 rispettivamente, mentre il valore limite `e impostato pari alla coppia nominale del motore SPM letta da Datasheet (T N = 0.32Nm). K p,ω = J eq ∗ ωbw,ω
K p,ω =
1 4
∗
K p,ω ∗ ωbw,ω
∗
Ts
(4.2)
(4.3)
dove: - ωbw,ω `e la banda passante dell’anello di velocit` a pari a 62.83 rad/s (f bw,ω =10 Hz). Il valore della banda passante dell’anello di velocit`a si `e ottenuto considerando che questa, al fine della stabilit`a del controllo, `e posizionata ad almeno una decade prima rispetto alla banda passante dell’anello di corrente ω wb,i =942.47 rad/s →f wb,i =150 Hz ; -J eq `e l’inerzia equivalemte del motore in esame e del carico. Si osservi infatti che il controllo del motore `e stato implementato in condizione di carico e pertanto si assume l’inerzia del carico pari alll’inerzia del motore in esame. Avanzando questa ipotesi: J eq = 0.06 ∗ 10( 4) ∗ 2 = 0.12 ∗ 10( 4)kgm2 . Si utilizza quindi: -sp par.lim = 0.32; -sp par.kp = 0.000754; -sp par.ki = 0.0059 ∗ T s ; -sp var.fbk = omega ref filt; -sp var.ref = omega ref ramp. Si osservi che il valore ki,ω `e inferiore rispetto allo stesso calcolato con la formula riportata. Il motivo che ha condotto a tale scelta risiede nel tentativo di diminuire l’overshoot. Si impostano i valori k p,ω e ki,ω solo dopo un’analisi graduale del corretto funzionamento delle parti software e hardware del controllo implementato. Difatti la proceduta seguita per il dimensionamento dell’anello di velocit` a si `e articolata come segue: -utilizzo del solo regolatore proporzionale k p,ω (ki,ω =0) con valori di k p,ω gradualmente crescenti sino al valore finale kp = 0.000754; - si `e osservato che con riferimento di velocit` a nullo e k p,ω inferiore a quello scelto, imponendo nref = 0rpm il rotore stava fermo. Sempre con un riferimento di velocit` a nullo si `e verificata la resistenza imposta dal rotore a seguito dell’applicazione manuale di una coppia e ci` o ha consentito di verificare il corretto funzionamento dell’anello di velocit`a; -incremento graduale di k i,w mantenendo costante k p,w affinch`e si osservi una adeguata risposta del motore, compromesso tra dinamica veloce e assenza di overshoot. −
−
24
Politecnico di Torino
Uscita PI di velocit`a Come precedentemente menzionato, si `e limitata l’uscita del regolatore PI di velocit`a alla coppia nominale del motore (0.32 Nm) presente sul datasheet (8.0.1). Al fine per`o di costruire il riferimento di corrente, necessario per l’implemenazione dell’anello di corrente interno all’anello di velocit` a, `e necessario riscalare la coppia di riferimento in uscita dal PI di velocit` a in corrente di riferimento in ingresso all’anello di corrente, secondo l’Eq. 4.4. 0.32N m T I = = = 6.4ARMS (4.4) kT 0.05Nm/A ∗
∗
dove: -kT rappresenta la costante di coppia, il cui valore `e presente in Datasheet (8.0.1). Consapevoli che in un motore SPM solo la corrente in asse q produce coppia, il suddetto riferimento di corrente ottenuto dalla riscalatura della coppia di riferimento richiesta in uscita dal PI di velocit`a diventa completamente corrente di riferimento in asse q. Mentre la corrente di riferimento in asse d ´e fissata a zero, siccome produrrebbe solo inutile calore e non un effetto utile di contributo di coppia, e cos`ı sar` a sempre non utilizzando il deflussaggio della macchina.
Regolatore PI di corrente Si implementa il regolatore proporzionale-integrale PI di corrente utilizzando la funzione PIReg(). Questo blocco nel codice `e necessario al fine di annullare l’errore tra il riferimento di corrente, ottenuto mediante la riscalatura di coppia presentata, e la retroazione di corrente derivante dalla misura delle stesse alle quali si somma l’offset precedentemente calcolato nello stato di WAKE-UP. Differentemente dall’anello di velocit`a, gli argomenti della funzione PIReg() sono quattro strutture dati chiamate id var , id par , iq var e iq par , e sono passate alla funzione in forma di puntatori. Prima di richiamare la funzione in questione, `e quindi necessario scrivere i campi di queste strutture: id par.kp, id par.ki , iq par.kp, iq par.ki , id var.lim , iq var.lim , id var.fbk , iq var.fbk , iq var.ref e id var.ref . Di questi campi il primo gruppo di trova definito in InitVarCtrl() , dentro lo stato di ERROR, mentre il secondo ´e definito in CurrentLoop(), prima della chiamata dei PIReg() dell’anello vettoriale di corrente. Tali settaggi sono necessari per assegnare i valori del regolatore PI e il limite massimo consentito in uscita al regolatore. I valori k p e ki utilizzati nell’implementazione del codice sono calcolati come riportato in Eq.4.5 e Eq.4.6 rispettivamente, mentre il valore limite `e impostato pari alla tensione di alimentazione del DC-link riscalata (V dc / (3)). K p,i = L s ∗ ωbw,i K p,i =
1 4
∗
K p,ia ∗ ωbw,i ∗ T s
(4.5)
(4.6)
dove: - ωbw,i `e la banda passante dell’anello di corrente pari a 942.47 rad/s (→ f bw,ω =150 Hz). Il valore della banda passante dell’anello di corrente si `e ottenuto considerando che questa, ai fine della stabilit` a del controllo, `e posizionata ad almeno una decade prima rispetto alla frequenza di campionamento (4 kHz). Si osservi che il valore utilizzato risulta essere inferiore rispetto al valore ottenibile dall’ Eq.4.5; 25
Politecnico di Torino -Leq = Ls `e l’induttanza sincrona del motore isotropo (Ld = Lq = Ls ) in esame. Il valore del parametro in questione `e stato ricavato da Datasheet ( 8.0.1) in cui per` o `e ( 3) riportata l’induttanza di linea: Ls = 0.53 ∗ 10 H/2 = 0.265mH . Si utilizza quindi: -id par.lim = V dc / (3) = 24V / (3); -id par.kp = 0.25; -id par.ki = 60 ∗ T s ; -iq par.kp = 0.25; -iq par.ki = 60 ∗ T s ; -id var.fbk = isdq.d; -id var.ref = isdq ref.d; -iq var.fbk = isdq.q ; -iq var.ref = isdq ref.q . In uscita dal regolatore PI del sopra descritto anello vettoriale di corrente, si ha una tensione di riferimento. Anch’essa riferita al sistema di riferimento (d,q) su cui si svolge il suddetto controllo di corrente. Di conseguenza questo riferimento di tensione subisce due trasformazioni, di rotazione e bifase/trifase, prima di poter essere dato in ingresso al blocco successivamente descritto: PWMduty() −
PWMduty() ¯ richiesti Il blocco PWMduty() riceve in ingresso i riferimenti di tensione di fase vabc dal controllo, e produce in uscita i duty-cycle di riferimento per le tre gambe di inverter. Nel fare questo definisce anche la tecnica di modulazione utilizzata. Perch´e l’inverter pu`o s`ı regolare i valori medi delle tensioni portate sulle fasi del motore, ma in modo indiretto. Infatti i tre power module costituenti l’inverter trifase regolano direttamente i valori medi delle tensioni fase/medio, che differiscono con i valori medi delle tensioni portate sulle fasi del motore per la tensione di modo comune. Quest’ultima `e definibile come la componente omopolare della terna di tensioni fase/medio, direttamente controllata dall’inverter, che non pu` o esistere nella terna di tensioni portate sulle fasi ¯ `e ottenuta da una trasformazione bifase/trifase, e del motore. Dal momento che vabc ¯ appartenente al mondo bifase dove non esiste compodi conseguenza deriva da vα,β nente omopolare per definizione. Pertanto la suddetta reiezione di modo comune, tra tensioni fase/medio regolate dall’inverter e tensioni effettivamente portate sulle fasi del motore, fornisce un grado di libert`a in eccesso all’inverter. Che definisce la tecnica di modulazione da lui utilizzata per ottenere una certa terna di tensioni richiesta dal controllo per le fasi del motore. In questo specifico caso si `e deciso di adottare la tecnica di modulazione a bilanciamento degli inviluppi (BEM), tecnica di modulazione corretta per gli inverter trifase. In quanto associata ad un’estensione del 15% del campo di regolazione indistorto delle tensioni regolabili sulle fasi del motore, rispetto alle tensioni fase/medio direttamente controllate dalle tre gambe di inverter regolabili in ±V dc /2. Per utilizzare questa tecnica di modulazione occorre per` o calcolare in ogni periodo di commutazione il giusto modo comune. Da sommare alla terna di tensioni di riferimento per le fasi del motore, richieste dal controllo, per arrivare alla terna di tensioni di riferimento fase/medio, effettivamente controllabili dall’inverter. Esistono due tecniche per costruire questo giusto modo comune, indicato nel codice come vzs (zero sequence o modo comune): ∗
∗
∗
∗
26
Politecnico di Torino 1. come semisomma cambiata di segno degli inviluppi minimo e massimo delle tre tensioni di riferimento; 2. come met` a della tensione di riferimento intermedia tra le tre. Nella funzione utilizzata in questo codice si `e scelto di adottare questo secondo metodo. Ma si ricorda che, oltre ad essere del tutto equivalenti, questi due metodi differiscono per modifiche minime. Pertanto il passaggio da una tecnica all’altra non costituisce una particolare complicazione.
27
Capitolo 5 Prestazioni dell’anello di velocit` a: risultati ottenuti 5.1
Prestazioni dell’anello di velocit` a: risultati ottenuti
In questo capitolo si riportano i grafici rappresentativi, in termini di velocit` a e correnti, della risposta al controllo di velocit`a in anello chiuso. Si impostano dei gradini di velocit`a per valutare le prestazioni dinamiche del controllo implementato. Infine si impone un’inversione di velocit`a durante il funzionamento del motore. Si osservi che, al fine di imporre un gradino di velocit` a, il riferimento della stessa non `e modificata mediante la funzione ramp(), ma si impone una velocit`a di riferimento. Si implementa in codice quanto appena detto mediante due step: commentare la funzione ramp() e sovrascrivere la variabile omega ref ramp. //ramp(&omega ref ramp, accel, n ref ∗ rpm2rad); omega ref ramp = n ref ∗ rpm2rad. Come `e possibile osservare dai grafici sottoriportati, il sistema di controllo realizzato dimostra prestazioni dinamiche accettabili e si rivela in grado di centrare con precisione il riferimento di velocit`a richiestogli. Questo risultato `e stato ottenuto tarando accuratamente le bande degli anelli di controllo, di corrente e velocit` a, affinch´e non interagissero tra loro e con la frequenza di commutazione. Ma a tal proposito si sottolinea come la teoria degli azionamenti, che parla di una decade tra frequenza di commutazione e frequenza di banda passante dell’anello di corrente o anche tra quest’ultima e la frequenza di banda passante dell’anello di velocit` a pi` u esterno, sia in realt` a una sovrastima di quanto poi effettivamente realizzabile. Si precisa che le storie temporali riportati di seguito sono frutto di un filtraggio dei dati grezzi, acquisiti con l’ausilio dell’oscilloscopo virtuale SimpleP 36 w64. I dati grezzi sono stati processati in Matlab, utilizzanfo un file.txt generato dall’oscilloscopio virtuale. In particolare si `e utilizzato un filtro passabasso ottenuto mediante la funzione filtfilt in Matlab. Questo filtro esegue un filtraggio digitale a fase zero, in direzione diretta e inversa, con lo scopo di non introdurre ritardi. Inoltre la funzione utilizzata minimizza i transitori iniziali e finali, rispettando le condizioni iniziali. La frequenza di taglio, pari a 35 Hz, `e settata nel filtro per rimuovere i disturbi a pi` u alta frequenza dovuti 28
Politecnico di Torino all’acquisizione. Il valore di frequenza di taglio `e stato scelto osservando la Fast Fourier Transform (FFT) delle storie temporali grezze. In Fig. 5.1 si mostra un esempio inerente alla corrente a seguito di un gradiono di velocit`a di 2000rpm.
Figura 5.1: Effetti del filtro: FFT dei dati grezzi (sinistra), confronto (destra).
Risposta ad un gradino di velocit` a
±300rpm
Figura 5.2: Risposta ad un gradino di velocit`a: +300rpm. 29
Politecnico di Torino
Figura 5.3: Risposta ad un gradino di velocit`a: +300rpm.
Figura 5.4: Risposta ad un gradino di velocit`a: -300rpm. Analizzando le acquisizioni realizzate si pu` o osservare che: dalla prova a ±300rpm l’anello di corrente sembra essere particolarmente nervoso, come dimostrato dagli andamenti oscillatori delle correnti in asse (d,q ). In sede di progetto si `e cercato di ovviare a questo problema diminuendo la banda passante dell’anello, per allontanarla dalla frequenza di commutazione dell’inverter impostata a 4 kHz, e diminuendo il ki,i del regolatore PI di corrente. Tuttavia, anche agendo in questo modo, le correnti hanno conservato un po’ di andamenti oscillatori, non totalmente attribuibili alla natura intrinsecamente disturbata delle misure digitali. Consapevoli quindi dell’esistenza di un’interazione tra gli anelli di corrente in asse d e q del motore SPM, causa di un disturbo incrociato tra le correnti nei due assi, si `e cercato di impostare un feed-forward di forza elettromotrice. Per fare ci` o si `e dovuto calcolare il λ¯m rappresentante il flusso 30
Politecnico di Torino
Figura 5.5: Risposta ad un gradino di velocit`a: -300rpm. dei magneti, operazione portata a termine partendo dal kT fornito sul datasheet del motore e noto che esso `e pari a 3/2 ∗ p ∗ λ¯m . Il feed-forward cos`ı realizzato, secondo nozioni derivanti dal corso di Azionamenti Elettrici , avrebbe dovuto rimuovere il suddetto disturbo incrociato. Questo `e possibile osservalo in Fig. 5.6, riferito ad un gradino di velocit` a pari a 1000rpm. Ma, contrariamente a quanto ci si sarebbe aspettato, ha comportato un incremento delle oscillazioni delle correnti invece che attenuarle. Rivelatosi quindi controproducente, si `e deciso di rimuovere il feed-forward, lasciato commentato nel codice, e si `e accettato il suddetto disturbo sulle correnti. Anche forti del fatto che questo diminuisce marcatamente all’aumentare della velocit` a, come dimostrato dalle prove a ±1000 e ±2000rpm, come si pu`o osservare nelle prossime figure. Le equazioni utilizzate nel tentativo di implementare il feedforword sono riportate in
Figura 5.6: Performance feed-forward: storia temporale (sinistra); dettaglio (destra). Eq.5.1 e Eq.5.2. In Eq.5.1 si riporta l’implementazione del feedforward statico che non tiene conto del contributo di tensione sull’induttanza sincrona, mentre in Eq.5.2 si tiene conto di questo ulteriore caduta di tensione. vs,q = R s ∗ iq + λm ∗ ωr,filt vs,q = R s ∗ is,q + λm ∗ ωr,filt + Ls 31
dis,q dt
(5.1)
(5.2)
Politecnico di Torino dove: -iq : componente della corrente statorica in asse q ; -λm : flusso prodotto dai magneti permanenti presenti a rotore.
Figura 5.7: Risposta ad un gradino di velocit`a: +1000rpm.
Figura 5.8: Risposta ad un gradino di velocit`a: +1000rpm. 32
Politecnico di Torino
Figura 5.9: Risposta ad un gradino di velocit`a: -1000rpm.
Figura 5.10: Risposta ad un gradino di velocit`a: -1000rpm.
Le Fig. 5.7 e 5.9, rispetto alle Fig. 5.2 e 5.4, presentano una natura meno oscillatoria in termini di velocit`a. Lo stesso pu` o essere osservato sulle componenti delle correnti. Le prestazioni del controllo a pi` u alta velocit`a risultano migliorate. 33
Politecnico di Torino
Risposta ad un gradino di velocit` a
±2000rpm
Figura 5.11: Risposta ad un gradino di velocit`a: +2000rpm.
Figura 5.12: Risposta ad un gradino di velocit`a: +2000rpm. 34
Politecnico di Torino
Figura 5.13: Risposta ad un gradino di velocit`a: -2000rpm.
Figura 5.14: Risposta ad un gradino di velocit`a: -2000rpm.
Si osservi come il disturbo presente sulle correnti `e sempre meno ininfluente. Inoltre una piccola componente di overshoot `e presente anche alle alte velocit` a, indice di un lieve comportamento sottosmorzato. 35
Politecnico di Torino
Risposta ad una inversione di velocit` a
±2000rpm
Figura 5.15: Risposta ad una inversione di velocit` a:
±2000rpm.
In generale si osserva che l’anello di velocit`a risponde ad un gradino di riferimento con un leggero overshoot, rappresentativo della natura sottosmorzata del sistema di controllo. Onde evitare di perdere eccessivamente prestazioni dinamiche, si `e deciso di accettare questo comportamento. Tuttavia, se le specifiche di progetto imponessero l’assenza di qualsiasi sovraelongazione, diminuendo ulteriormente il ki del regolatore PI dell’anello di velocit`a il sistema vedrebbe aumentare lo smorzamento e perderebbe cos`ı il suddetto overshoot di velocit` a. Ma sarebbe peggiorato in termini di prestazioni dinamiche. Senza contare che il suddetto ki di velocit`a, teoricamente ottimale a 1/4ki , `e gi`a molto basso in quanto `e stato impostato a circa 1/8ki seguendo la taratura sperimentale. Consistente nel mettere ki a zero e tenere solo k p (definito in funzione della banda passante desiderata), analizzare la risposta a gradino del sistema del sistema di controllo, aumentare ki finch` e la risposta non risulta soddisfacente. L’asse d del motore, coincidente con la direzione di emissione di flusso da parte dei magneti su rotore per convenzione utilizzata su questi motori, risulta correttamente individuato. Come testimoniato dalla simmetria tra le correnti in asse q , per velocit`a uguali in modulo e opposte in segno, e dall’andamento a zero delle correnti in asse d , incapaci di produrre coppia nei motori SPM. In Fig. 5.15 si osserva un’inversione di velocit`a, realizzata in modo automatico attraverso una parte di codice commentata nella parte iniziale di START2 contenente l’anello di velocit`a. In questo grafico, nonostante sia comunque possibile intravedere l’andamento a regime della velocit` a, purtroppo non `e stato possibile acquisire la parte finale del transitorio. Questo perch´e l’oscilloscopio digitale utilizzato per le acquisizioni permette di salvare dati solo in una finestra di 1.25 secondi, non sufficiente a contenere l’intero fenomeno sopra descritto. 36
Capitolo 6 Algoritmo di controllo Si riporta la stesura del condice in linguaggio C che ha permesso di centrare l’biettivo del progetto, quale controllo in anello chiuso di velocit`a di un SPM. //-------------------------------------------------------------------// File: User_MotorControl.c // Author: gp // Modifed by: ag&os // Date: 2018 Jule 06 // Description: Contains all the functions for the motor control //-------------------------------------------------------------------#include "math.h" #include "User_data_types.h" #include "User_Variables.h" #include "User_Constants.h" #include "User_MotorData.h" #include "User_Macros.h" #include "User_MotorControl.h" #include "VS_SimpleP36.h" #include "stm32f303xe.h" // valid for F303 MCU void InitVarCtrl(void); void CurrentProtection(void); void PIReg(XPIRegPars *, XPIRegVars *); void ramp(float *, float, float); float speed_compute_sc(Xsc, Xsc *); void Current_loop(void); void PWMduty(void); void Init_var(void); void Gen_theta_ref(void); float fausto=0;
37
Politecnico di Torino
void MotorControlRoutine(void) { GPIOA->ODR |=(1<<5); //wait for end of conversion while(((ADC1->ISR)&(1<<6))==0){ }; //clean JEOS flag ADC1->ISR&=(~(1<<5)); //clean JEOC flag ADC1->ISR&=(~(1<<6)); //feedback currents sampling input.ch0=(ADC1->JDR1); input.ch1=(ADC1->JDR2); input.ch2=(ADC1->JDR3); //voltage DC-link sampling vdc = (ADC1->JDR4)*scala_voltage; //avoid division per 0 if(vdc>0) vdc_inv = (float)(1.0f/vdc); //remove current offsets isabc.a=-(input.ch0-offset_current_a)*scala_current; isabc.b=-(input.ch1-offset_current_b)*scala_current; isabc.c=-(input.ch2-offset_current_c)*scala_current; //clarke feedback currents transformation _clarke(isabc,isab) //Go Button if(((GPIOC->IDR)& (1<<13))==0) Go = 1.0f; else Go = 0.0f; //encoder acquisition thetaEnc = (TIM2 ->CNT)*ENC_FAC; //encoder offset theta_r=thetaEnc + thetaEnc_OFF; //angle position saturation between 0 and 2PI if(theta_r>=TWOPI) theta_r-=TWOPI; if(theta_r<0) theta_r+=TWOPI; //SinCos from encoder SinCos_r.sin = sinf(theta_r); SinCos_r.cos = cosf(theta_r);
// mech rad
SinCos_r_elt.sin = sinf(p*theta_r); // elt rad SinCos_r_elt.cos = cosf(p*theta_r); //rotor speed [rad/s] omega_r = speed_compute_sc(SinCos_r, &SinCos_r_old); //filter for the speed - low pass filter Filter(omega_r, omega_r_filt, (TWOPI*75.0f*Ts));
38
Politecnico di Torino
//DC-link voltage filter Filter(vdc, vdc_filt, (TWOPI*400.0f*Ts)); // 400 Hz //overcurrent protection CurrentProtection(); // // // //
------------------------------------------------------Operating states: (start-up buttons: Reset - Err - Go) ERROR: error state (default) WAKE_UP: preliminary operations, after RESTART (offset comp, bootstrap) // COMMISSIONING: encoder angle offset computation // READY: everything ok, modulation ON, reference speed acquisition // START0: I-Hz motor control // START1: current on q axis motor control // START2: speed loop motor control switch(State){ case ERROR: //PWM off pwm_stop = 1; //counter reset counter = 0; //variable initialization InitVarCtrl(); //Go button check if(Go) State = WAKE_UP; //duty cycles reset duty_abc.a=0.0f; duty_abc.b=0.0f; duty_abc.c=0.0f; break; case WAKE_UP: //current offsets computation if (counter>500) { //current offset accumulation offset_in.ch0+=input.ch0; offset_in.ch1+=input.ch1; offset_in.ch2+=input.ch2; } if (counter==(500+200)) { //average offset computation offset_in.ch0 = (float)(offset_in.ch0/200);
39
Politecnico di Torino
offset_in.ch1 = (float)(offset_in.ch1/200); offset_in.ch2 = (float)(offset_in.ch2/200); offset_current_a=offset_in.ch0; offset_current_b=offset_in.ch1; offset_current_c=offset_in.ch2; //bootstrap duty_abc.a duty_abc.b duty_abc.c pwm_stop =
= 0.05f; = 0.05f; = 0.05f; 0;
} if (counter > 1000) { //switch to COMMISSIONING state //counter reset counter=0; //State change State=COMMISSIONING; } //counter increase for the WAKE_UP state counter++; break; case COMMISSIONING: //encoder angle offset computation //counter increase for the COMMISSIONING state counter++; if (counter<=15000) { //I-Hz first loop to find index //I-Hz speed reference [rpm mecc] n_ref=100; //speed reference ramp, to enable rotor following of the current vector ramp(&omega_ref_ramp,accel,n_ref*rpm2rad); //elt angle ref position computation, as integral of the ref speed. Output: SinCos_ref [elt] Gen_theta_ref(); //feedback currents rotation _rot(isab,SinCos_ref,isdq); //reference currents set isdq_ref.d=4.0f; isdq_ref.q=0.0f; //current vector loop Current_loop(); //reference voltages inverse rotation _invrot(vsdq_ref,SinCos_ref,vsab_ref);
40
Politecnico di Torino
//reference voltages inverse clarke transformation _invclarke(vsab_ref,vsabc_ref); //duty cycles computation through BEM modulation PWMduty(); } if ((counter>15000)&&(counter<=28000)) { //DC current vector on alpha axis SinCos_ref.cos=1.0f; SinCos_ref.sin=0.0f; //feedback currents rotation _rot(isab,SinCos_ref,isdq); //reference currents set isdq_ref.d=4.0f; isdq_ref.q=0.0f; //current vector loop Current_loop(); //reference voltages inverse rotation _invrot(vsdq_ref,SinCos_ref,vsab_ref); //reference voltages inverse clarke transformation _invclarke(vsab_ref,vsabc_ref); //duty cycles computation through BEM modulation PWMduty(); } if ((counter>28000)&&(counter<=32000)) { //currents reset isdq_ref.d=0.0f; isdq_ref.q=0.0f; //feedback currents rotation _rot(isab, SinCos_ref, isdq); //current vector loop Current_loop(); //reference voltages inverse rotation _invrot(vsdq_ref, SinCos_ref, vsab_ref); //reference voltages inverse clarke transformation _invclarke(vsab_ref, vsabc_ref); //duty cycles computation through BEM modulation PWMduty(); } if (counter>32000) { //switch to READY State //counter reset counter=0.0f;
41
Politecnico di Torino
//State change State=READY; //encoder angle offset thetaEnc_OFF = - thetaEnc; } break; case READY: //reference speed acquisition //reference speed [rpm mecc] n_ref=2000; //filtered reference speed reset omega_ref_ramp=0.0f; //duty cycles set to 0.5, in order to bring 0 voltage on motor phases duty_abc.a=0.5f; duty_abc.b=0.5f; duty_abc.c=0.5f; //Go button check to start motor control if (Go) State=START2; break; case START0: //I-Hz motor control //generate reference speed with ramp limiter ramp(&omega_ref_ramp, accel, n_ref*rpm2rad); //generate open loop reference angle Gen_theta_ref(); //reference currents set isdq_ref.d=3.0f; isdq_ref.q = 0.; //feedback currents rotation _rot(isab, SinCos_ref, isdq); //current vector loop Current_loop(); //reference voltages inverse rotation _invrot(vsdq_ref, SinCos_ref, vsab_ref); //reference voltages inverse clarke transformation _invclarke(vsab_ref, vsabc_ref); //duty cycles computation through BEM modulation PWMduty(); break; case START1: //current on q axis motor control //reference currents set isdq_ref.d=0.0f;
42
Politecnico di Torino
isdq_ref.q=1.0f; //feedback currents rotation _rot(isab, SinCos_r_elt, isdq); //current vector loop Current_loop(); //reference voltages inverse rotation _invrot(vsdq_ref, SinCos_r_elt, vsab_ref); //reference voltages inverse clarke transformation _invclarke(vsab_ref, vsabc_ref); //duty cycles computation through BEM modulation PWMduty(); //speed protection to avoid motor runaway if(fabs(omega_r_filt)>(2000*rpm2rad)) State=ERROR; break; case START2: //speed loop ////////SPEED INVERSION - START // counter++; // if((counter>0)&&(counter<=2800)) { // n_ref=2000; // } // if(counter>2800) { // n_ref=-2000; // } ////////SPEED INVERSION - END //speed protection if(fabs(omega_r_filt)>(rpm2rad*5000)) State=ERROR; //reference speed saturation _sat(n_ref,5000,-5000); //reference speed generation with ramp limiter ramp(&omega_ref_ramp, accel, n_ref*rpm2rad); //omega_ref_ramp=n_ref*rpm2rad; //speed PI parameters sp_par.lim=0.32f; sp_par.kp=0.000754; //Kp_sp=Wbw_sp*Jeq @fbw=10Hz sp_par.ki=0.0059*Ts; //Ki_sp=Kp_sp*1/8*Wbw_sp*Ts //speed PI variables sp_var.fbk=omega_r_filt; sp_var.ref=omega_ref_ramp; //sp_par.ki=0; //speed PI regulator PIReg(&sp_par,&sp_var); //speed PI output Tref=sp_var.out; //Tref saturation kt=0.05f; inv_kt=1/kt;
43
Politecnico di Torino
_sat(Tref,kt*5,-kt*5); //Tref scaling into q reference current isdq_ref.q=Tref*inv_kt; isdq_ref.d=0; //q reference current saturation _sat(isdq_ref.q,5,-5); //feedback currents rotation _rot(isab,SinCos_r_elt,isdq); //current vector loop Current_loop(); ////////feedforward test, to remove q axis current noise - START //Filter(isdq.q, isdq_filt_q,(TWOPI*4000*Ts)); //vsdq_ref.q=lambda_m*omega_r_filt+RS*isdq_filt_q; ////////feedforward test, to remove q axis current noise - END //reference voltages inverse rotation _invrot(vsdq_ref, SinCos_r_elt, vsab_ref); //reference voltages inverse clarke transformation _invclarke(vsab_ref, vsabc_ref); //duty cycles computation through BEM modulation PWMduty(); break; } if(pwm_stop) { TIM1->CCR1=0; TIM1->CCR2=0; TIM1->CCR3=0; } else { // duty -> compare register TIM1->CCR1=TIM1_cycle*duty_abc.a; TIM1->CCR2=TIM1_cycle*duty_abc.b; TIM1->CCR3=TIM1_cycle*duty_abc.c; } //VS_simpleP36_1f(isdq_ref.q); //VS_simpleP36_1f(theta_ref); //VS_simpleP36_2f(theta_ref,thetaEnc); VS_simpleP36_4f(omega_ref_ramp,omega_r_filt,isdq_ref.q,isdq.q); //VS_simpleP36_2f(thetaEnc,isabc.a); // Procedura per uscire dallo stato di interrupt
44
Politecnico di Torino
TIM1->SR&=~(1); //pulisco il flag relativo all’interrupt NVIC_ClearPendingIRQ(TIM1_UP_TIM16_IRQn); IWDG->KR = 0xAAAA; // reload watchdog (IDWG RLR)
GPIOA->ODR &=(~(1<<5)); } void InitVarCtrl(void){ accel=0.005; n_ref = 100; // rpm isdq_ref.d = 3.; // A iq_par.kp=0.25; iq_par.ki=60*Ts; //iq_par.ki=0; id_par.kp=0.25; id_par.ki=60*Ts; //id_par.ki=0;
//Wbw_i=150Hz vs fsw=4kHz //1/4*Kp*Wbw_i
theta_ref = 0.0f; tmp1=0.0f; tmp2=0.0f; tmp3=0.0f; omega_r = 0.0f; omega_r_filt = 0.0f; omega_ref_ramp= 0.0f; isdq.d = 0.0f; isdq.q = 0.0f; isab.alpha = 0.0f; isab.beta = 0.0f; id_var.fbk = 0.0f; id_var.ref = 0.0f; id_var.out = 0.0f; id_var.intg = 0.0f; iq_var.fbk = 0.0f; iq_var.ref = 0.0f; iq_var.out = 0.0f; iq_var.intg = 0.0f; //isdq_ref.d = 0.0f;
45
Politecnico di Torino
isdq_ref.q = 0.0f; vsdq_ref.d = 0.0f; vsdq_ref.q = 0.0f; offset_current_a = 2120; offset_current_b = 2120; offset_current_c = 2120; } void PWMduty(void) { float tmp1, tmp2, tmp3; float pwm_zero_seq; //if (vdc>0) vdc_inv = 1/vdc; // avoid division by zero // algorithm for zero-sequence injection: // tmp1 = max (positive envelope) // tmp2 = min (negative envelope) // tmp3 is the phase in between the two: tmp3 = -(max + min) if (vsabc_ref.a > vsabc_ref.b) { tmp1 = vsabc_ref.a; tmp2 = vsabc_ref.b; } else { tmp1 = vsabc_ref.b; tmp2 = vsabc_ref.a; } if (tmp1vsabc_ref.c) tmp3 = tmp2; else tmp3 = vsabc_ref.c; } pwm_zero_seq=(float)(tmp3*0.5f); // Duty-cycles duty_abc.a = 0.5f + (vsabc_ref.a + pwm_zero_seq)*vdc_inv; duty_abc.b = 0.5f + (vsabc_ref.b + pwm_zero_seq)*vdc_inv; duty_abc.c = 0.5f + (vsabc_ref.c + pwm_zero_seq)*vdc_inv; if (duty_abc.a>1) duty_abc.a = 1.0f; if (duty_abc.b>1) duty_abc.b = 1.0f; if (duty_abc.c>1) duty_abc.c = 1.0f; if (duty_abc.a<0) duty_abc.a = 0.0f; if (duty_abc.b<0) duty_abc.b = 0.0f;
46
Politecnico di Torino
if (duty_abc.c<0) duty_abc.c = 0.0f; } float speed_compute_sc(Xsc sincos, Xsc *sincos_old) { float omega; tmp1 = sincos.sin * sincos_old -> cos; tmp2 = sincos.cos * sincos_old -> sin; tmp1 = tmp1-tmp2; omega = fs * tmp1; sincos_old -> sin = sincos.sin; sincos_old -> cos = sincos.cos; return omega; } void ramp(float *fbk_value, float delta, float target) { if (*fbk_value <= target) { *fbk_value = (*fbk_value + delta); if (*fbk_value>target) *fbk_value=target; } else { *fbk_value = (*fbk_value - delta); if (*fbk_value= TWOPI) theta_ref-=TWOPI; if (theta_ref< 0.0f) theta_ref+=TWOPI; SinCos_ref.sin = sinf(theta_ref); SinCos_ref.cos = cosf(theta_ref); } void CurrentProtection(void) { if (fabs(isabc.a)>CRT_PROT) {
47
Politecnico di Torino
pwm_stop = 1; State=ERROR; } if (fabs(isabc.b)>CRT_PROT) { pwm_stop = 1; State=ERROR; } if (fabs(isabc.c)>CRT_PROT) { pwm_stop = 1; State=ERROR; } } void Current_loop(void) { //d-axis control loop vs_max= vdc * SQRT1OVER3; id_par.lim =vs_max; id_var.ref =isdq_ref.d; id_var.fbk =isdq.d; PIReg(&id_par, &id_var); vsdq_ref.d=id_var.out; //q-axis control loop, with saturation to Imax tmp1 = sqrt(Imax*Imax-isdq_ref.d*isdq_ref.d); if (isdq_ref.q>tmp1) isdq_ref.q=tmp1; if (isdq_ref.q<-tmp1) isdq_ref.q=-tmp1; iq_par.lim =vs_max; iq_var.ref =isdq_ref.q; iq_var.fbk =isdq.q;
PIReg(&iq_par, &iq_var); vsdq_ref.q=iq_var.out; } void PIReg(XPIRegPars *par,XPIRegVars *var){ float int_lim; //Error computation var->err = var->ref-var->fbk; //Proportional regulator var->prop = par->kp*var->err; //Saturation of the proportional part to lim if (var->prop>par->lim) var->prop=par->lim; if (var->prop<(-par->lim)) var->prop=-par->lim;
48
Politecnico di Torino
//Limit of the intg part int_lim = par->lim-fabs(var->prop); //Integral part var->intg+=par->ki*var->err; //Saturation of the intg part if (var->intg > int_lim) var->intg = int_lim; if (var->intg < (-int_lim)) var->intg = -int_lim; //Output computation var->out=var->prop+var->intg; } }
49
Capitolo 7 Conclusioni 7.1
Conclusioni
L’esperienza di laboratorio qui presentata ha avuto come scopo la creazione di un controllo in anello chiuso di velocit`a di un sincrono SPM . I risultati ottenuti testimoniano il raggiungimento dell’obiettivo. Tuttavia si vuole proporre questo progetto come un primo approccio al problema, sicuramente migliorabile. Si riportano i possibili sviluppi del progetto: -implementazione durante la fase di commissioning di un differente metodo per la determinazione dell’offset angolare. Ad esempio un metodo basato sull’ispezione della salienza della macchina con segnale ad alta frequenza. Questo sarebbe un metodo sensorless, normalmente funzionante su macchine anisotrope, ma tipicamente adatto ad individuare l’asse d anche su macchine isotrope SPM. Nonostante la quota irrilevante di anisotropia presente in un SPM, grazie ad una leggera saturazione che presentano questi motori su quell’asse d , sarebbe possibile individuare correttamente l’asse di interesse; -indagare ulteriormente l’effetto controproducente della compensazione feedforward , comportamento anomalo su un motore SPM come quello utilizzato; -anello di posizione esterno all’anello di velocit`a. Per questi motivi si desidera essenzialmente presentare al lettore questo progetto come punto di partenza, certamente estendibile. Testimonianza dell’efficacia della procedura per passi presentata durante il corso di Controllo digitale dei convertitori e azionamenti e proposta nell’esecuzione del progetto. Questa procedura ha infatti permesso di implementare step by step il controllo, individuando errori e malfunzionamenti prima che venissero annegati nella complessit` a del codice.
50
Capitolo 8 Appendice 8.0.1
Datasheet
-Microcontrollore: https://goo.gl/XkUV36 https://goo.gl/647KlA -Inverter trifase: https://goo.gl/mvm2m8 -Macchina elettrica: http://www.microphase.eu/prodotto/servomotori-brushless-serie-s/ Si riporta il Datasheet del motore SPM: cerchiati i parametri utilizzati.
Figura 8.1: Brushless SPM S140-2B353 - Datasheet.
8.0.2
Link
-KEIL uVision:http://www2.keil.com/mdk5/uvision/ -STM32CubeMX: http://www.st.com/en/development-tools/stm32cubemx.html
51