MODELLISTICA E PROGETTO DI REGOLATORI PI E PID ORIENTATI ALLO SVILUPPO SU

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "MODELLISTICA E PROGETTO DI REGOLATORI PI E PID ORIENTATI ALLO SVILUPPO SU"

Transcript

1 MODELLISTICA E PROGETTO DI REGOLATORI PI E PID ORIENTATI ALLO SVILUPPO SU MICRO-CONTROLLORE Calzoni Pietro Francesco Castelli Dezza 17 gennaio 2007

2 2 Questa dispensa cercherà di modellizzare un regolatore PI e, successivamente, PID per il controllo di un sistema stabile e instabile. L obiettivo è realizzare i modelli di simulazione tempo-continui, discreti e, infine, digitali. Questi ultimi in particolare verranno anche simulati in modo che si possa studiare il comportamento di un regolatore digitale all interno della catena di regolazione e il codice scritto sarà in linea di massima quello riportabile all interno del micro-controllore. Per quanto riguarda la modellistica tutto verrà fatto con SIMULINK 6 fornito nel pacchetto MATLAB 7 SP1 sotto sistema GNU/Linux Slackware Si noti comunque che esistono tools molto simili (gratuiti e opensource) come SHILAB che eseguono esattamente le stesse funzioni. La scelta di MATLAB è ricaduta sul fatto che è presente nella stragrande maggioranza dei laboratori informatizzati del Politecnico di Milano e che attualmente è lo stato dell arte per la modellistica dei sistemi. Tutta la trattazione è orientata alla realizzazione vera e propria del controllore prendendo come riferimento i micro-controllori di MICROCHIP T M ; la scelta di questi prodotti non è dettata da particolari motivazioni tecniche, bensì da motivi pratici. Questi processori infatti cono distribuiti con package di tipo DIP ossia possono essere montati e saldati agevolmente anche su millefori in modo da dare la possibilità a chiunque di effettuare sperimentazioni a basso costo. Inoltre tutti i tools di sviluppo e compilazione sono forniti gratuitamente insieme all ambiente di sviluppo direttamente da MICROCHIP T M comune a tutti i processori.

3 Indice 1 Problematiche di calcolo digitale Basi Operazioni tra numeri Velocizzare le operazioni Flusso del programma Scrivere un programma C orientato al micro controllore Integrazione Progetto di un regolatore PI Regolatore tempo-continuo Cenni riguardo la trasformata di Laplace Progetto del regolatore Anti wind-up Regolatore Discreto Cenni riguardo la trasformazione Z Mappatura dei poli da s a z Risposta in frequenza Modellistica del regolatore PI Regolatore tempo-continuo classico Regolatore Z ottenuto dal tempo-continuo classico Regolatore Digitale Modello C-SIMULINK Metodo 1: Separazione parte proporzionale e integrale Metodo 2: Rielaborazione del PI ottenuto dalle funzioni z Metodo 3: Rielaborazione del PI ottenuto dalla configurazione anti wind-up Osservazioni e Confronti Simulazione del Duty-Cycle Regolatore Digitale con metodo di integrazione dei resti Implementazione di un regolatore PI Regolatore PI su processori dspic30f Sviluppo del regolatore in codice C Controllo di tensione Progetto e implementazione del regolatore

4 4 INDICE 5 Regolatore PID Regolatore tempo-continuo Regolatore Discreto Regolatore PID di corrente Progetto del regolatore Simulazione del regolatore digitale Implementazione su micro-processore dspic30f A Breviario sulla sintassi C 93 A.1 Tipi di dati A.2 Dichiarazioni B Validità del regolatore PI 103 B.1 Discretizzazione del regolatore B.2 Modellistica

5 Capitolo 1 Problematiche di calcolo digitale Prima di affrontare il progetto e la realizzazione del regolatore vero e proprio, verranno affrontate alcune problematiche tipiche del calcolo digitale con micro processori dedicati i quali normalmente non hanno potenzialità di calcolo molto elevate. Prima di proseguire con la trattazione viene brevemente introdotta la tabella dei simboli usati in questo capitolo: a lettera minuscola: indica il valore reale della grandezza a rif grandezza reale di riferimento bitbase A numero di bit che identifica la base indica il valore in per-unità della grandezza #A p indica il valore normalizzato in base p. Per esempio: #A 10 è un valore in base 10bit # indica il processo di normalizzazione, tipicamente 2 bitbase /a rif Verranno poi descritte le linee guida per la scrittura di un programma C. 1.1 Basi Il micro calcolatore deve in primo luogo effettuare calcoli in un intervallo temporale ben definito. Le ridotte capacità di calcolo normalmente non permettono di operare con variabili di dimensioni e/o struttura complesse e non ci si riferisce al formato float o double (doppia precisione), ma, spesso, neppure agli interi a 16bit! Un esempio sono i molti micro controllori PIC di MICROCHIP o HC di FREESCALE che lavorano con parole a 8bit 1. É chiaro quindi che, per rendere l esecuzione veloce (spesso in modo determinante), occorre fare in modo che il processore esegua i conti con numeri interi. Per rappresentare numeri reali si rende quindi necessario scegliere una base. Questo riporto non è complesso da gestire; in linea teorica infatti è sufficiente fissare un valore di riferimento per una determinata grandezza, prendere il valore reale, dividerlo per il riferimento (ossia riportare il valore in per-unità) e quindi moltiplicarlo per la base scelta. Per esempio: si supponga di avere un valore di corrente reale che al massimo raggiunga i 20A e il processore riesca a gestire parole a 16bit; si ipotizzi di usare 1 Si noti che tipicamente riescono a gestire parole a 16bit o multipli al costo di un maggiore carico computazionale. 5

6 6 CAPITOLO 1. PROBLEMATICHE DI CALCOLO DIGITALE una base pari a 4096 (2 12 ). Allora, indicando con i la corrente reale e con #I la corrente digitalizzata, si può asserire che #I 12 = i In questo esempio si è scelto come riferimento della corrente il suo valore massimo. Non è necessario operare in questo modo; infatti il valore di riferimento viene normalmente scelto in funzione delle caratteristiche del sensore. Per quanto riguarda la base scelta, il numero 4096 non è casuale! Esso è infatti una potenza di 2. Ciò renderà molto più comodo eseguire operazioni tra basi, come si vedrà in seguito. É però evidente che si è scelto di operare con variabili a 16 bit e che con tale base si possono rappresentare numeri in [p.u.] compresi tra -8 e 8. Potrebbe sembrare esagerato ma tali valori permettono di eliminare il problema dell overflow a seguito dell esecuzione di operazioni. Per esempio se una grandezza a 16bit (ma in base 12bit) viene calcolata come somma di qualche variabile (per esempio 3) in base 12bit (e supponiamo limitate a 4095) il risultato sarebbe contenuto in 14 bit senza bisogno di effettuare controlli sulle soglie che costano in termini computazionali e possono quindi essere differiti alla fine dei calcoli. Si noti che i bit a disposizione sono sì 16, ma il sedicesimo bit è di segno. Variabilità della base Una base non deve necessariamente rimanere la stessa durante tutta l esecuzione del programma. Essa non solo può variare, ma può essere anche diversa tra variabili che concorrono a generare lo stesso risultato, come per esempio il termine integrale in alcuni PI (sezioni e 4.1.1); se infatti il termine è molto minore di 1, conviene prevedere degli accorgimenti necessari a non perdere dati significativi. Il problema dell integrazione verrà affrontato più avanti, ma per ora basti sapere che spesso (e se possibile) conviene usare una variabile al doppio della base (pari a 24bit, quindi in una variabile tipo long int) ed effettuare conversioni di base quando verrà richiesto il valore in una base differente. 1.2 Operazioni tra numeri Le operazioni di somma e sottrazione tra numeri interi non presentano grossi problemi (escludendo l overflow descritto poco prima) e il risultato, qualunque valore abbia, è nella stessa base dei due addendi. Moltiplicazione e divisione invece hanno qualche problema. Moltiplicazione: la moltiplicazione tra due numeri della stessa base pari al prodotto dei due diviso la base dei due numeri: #C bitbase = #(A B) bitbase = #A bitbase #B bitbase 2 bitbase ma avendo scelto basi con potenze di 2, l operazione si semplifica e si velocizza in quanto la divisione per potenze di 2 equivale a uno shift logico dei bit verso destra: #C bitbase = #(A B) bitbase = (#A bitbase #B bitbase ) bitbase Questa operazione risulta molto più agevole per il micro processore, mentre una divisione è molto più pesante. La moltiplicazione tra basi differenti invece avviene all opposto: #C 10 = #(A B) 10 = #A 12 #B = (#A 12 #B 9 ) 11

7 1.3. VELOCIZZARE LE OPERAZIONI 7 Divisione: la divisione è analoga. In questo caso però conviene premoltiplicare il numeratore per non perdere in precisione: #C bitbase = # 1.3 Velocizzare le operazioni ( ) A = #A bitbase bitbase B bitbase #B bitbase Come si è accennato le operazioni matematiche come moltiplicazioni e somme sono molto pesanti per il microcontrollore. Per guadagnare tempo quindi si definiscono una serie di shift, normalmente più veloci da gestire i quali possono aiutare a velocizzare l esecuzione del programma. Se l operazione è tra un valore e una costante conviene riportare tutto all operazione di moltiplicazione, per esemio #A = #B/ = #B 3.2. In questo esempio si vede come il secondo termine non sia un numero intero. Grazie agli shift possiamo tenerne conto scomponendolo: da cui ne deriva #A = (#B 1) + (#B) + (#B 3) + (#B 4) + (#B 5). Le operazioni matematiche però non sono le uniche pesanti. Altre operazioni di rilievo sono le chiamate (CALL) di funzione le quali sono tanto più pesanti quanti più parametri vengono passati in quanto vanno normalmente salvati nello stack; è evidente quindi che in un sistema a micro-controllore sono da evitare funzioni di tipo ricorsivo. Per ovviare a questo inconveniente può risultare utile definire la funzione tramite la direttiva inline come segue: void inline callback(int, int, int); Lo svantaggio di usare questa formulazione è che il codice normalmente diventa molto voluminoso. Una alternativa alla direttiva inline è la definizione di una macro, ma l utilizzo è consigliabile solo se le operazioni sono relativamente poche o relative alla analisi di una struttura (ottimi esempi nel codice sorgente dei dispositivi a caratteri del kernel Linux). La definizione di una macro è: #define NOME_MACRO(var1, var2, varn)(var1*5-(var2> >4)-3*varN) Da porre attenzione al fatto che la macro non fa altro che sostituire l espressione che segue la definizione degli argomenti in parentesi con quanto gli veine passato. Quindi, quando la macro viene chiamata, i parametri devono essere o numerici o contenuti in parentesi per precauzione. Se all interno del programma la macro venisse chiamata nel modo seguente: x = NOME_MACRO(2-1, 0, 1+1) x assumerebbe il valore x=2-5-2*1+1=-4 al posto del valore desiderato ossia x=(2-1)*5-2*(1+1)=1. Quindi il metodo corretto per scrivere una macro è ricorrere il più possibile alle parentesi: #define NOME_MACRO(var1, var2, varn)((var1)*5-((var2)> >4)-3*(varN)) Altri errori di calcolo sono legati al metodo di scrittura degli shift logici i quali come precedenza sono inferiori alla somma, ossia una macro del tipo: #define MACRO(var1)(var1< <2 + var1> >1) il primo shift (a sinistra) avrà come numero di bit da shiftare un valore pari a (2 + var1). Per esempio con var1=4 il risultato di MACRO effettua il calcolo (4 (2+4)) 1=128 mentre il risultato atteso è (4 2)+(4 1)=18. Per questo anche in questo caso occorre usare il maggior numero di parentesi.

8 8 CAPITOLO 1. PROBLEMATICHE DI CALCOLO DIGITALE Le macro possono introdurre anche un altro problema legato alla castizzazione 2 ; infatti una macro del tipo seguente: #define NOME_MACRO(var1)((var1)< <10) se chiamata all interno del programma in modo che e sia una variabile per esempio di tipo int, ma il risultato sia da porre in una di tipo long int, il valore verrà prima calcolato in int e, se ciò causa un overflow, il risultato verrà troncato e successivamente assegnato a long int. Questo è un errore frequente quanto grave. Per porvi rimedio o si castizza l argomento della macro quando essa viene chiamata nel programma, o lo si castizza nel codice della macro. Le macro che realizzano shift verso destra (ossia divisioni per potenze di 2) hanno un grande inconveniente se lavorano su numeri con segno. Si consideri a tal proposito la seguente macro: #define SHIFT_DX(e)((e> >4)+(e> >5)+(e> >6)) Si supponga ora che venga passato come ingresso il numero intero (ossia definito int) pari a 10 che in binario a 16bit si esprime come 0b : il risutltato è chiaramente 0 perché ogni shift sposta i vari bit di una posizione sostituendo il vecchio valore con il valore del bit più significativo, ossia il bit di segno. Se però il numero è -10 (che in binario risulta 0b ) il risultato è -3! 3 Questo perché gli shift di numeri negativi sostituiscono i bit spostati con il valore 1 ossia il valore del bit di segno. Quindi se la macro ha shift negativi (soprattutto se la macro realizza un integrale) la corretta sintassi è la seguente: 1.4 Flusso del programma if(input>=0) output=shift_dx(input) else output=-(shift_dx((-input))) L esecuzione del programma non è lineare come invece avviene nei normali programmi 4. Il programma normalmente parte chiamando la funzione main la quale provvederà a compiere tutte le inizializzazioni di variabili e dispositivi. Fatto ciò il micro passa in un loop infinito. Il programma, quindi, continuerà ad eseguire le operazioni definite in questo loop il quale potrà essere interrotto da determinati eventi (interrupt) legati ai dispositivi presenti sul processore e alle condizioni di I/O. Normalmente infatti non si gestisce la richiesta di un evento in polling (ossia controllando ciclicamente che sia avvenuto un evento) in quanto si perde tempo di CPU per eseguire operazioni che il più delle volte danno risultato nullo (come per esempio la gestione dei pulsanti). Gli interrupt, però, possono essere asserviti anche ad eventi interni al micro-processore generati da sistemi come timer, PWM, convertitori, ecc. Ciò è fondamentale perché nei sistemi embedded normalmente è richiesto il real-time 5, ossia occorre essere sicuri che entro determinate scadenze temporali il sistema abbia effettuato tutte le operazioni necessarie per effettuare la regolazione. A titolo di esempio si consideri il sistema di controllo della corrente in un regolatore. É prassi fare in modo che la routine di regolazione (per esempio PI) venga asservita alla richiesta di interruzione dovuta all evento di fine conversione del convertitore analogico-digitale. Le temporizzazioni invece possono essere date con timer o PWM (come si vedrà in seguito). 2 Questo problema in realtà sarebbe da imputare al compilatore. Si noti che nel compilatore C30 e C18 di MICROCHIP questo problema esiste, mentre, per esempio, nel compilatore gcc Linux (da cui i compilatori menzionati derivano) non vi è questo problema. 3 Si ricorda che 0b = Sempre che non ricorrano a fork o thread. 5 Spesso si intende implicitamente hard real-time ossia che se non vengono garantite determinati risultati entro certe scadenze, viene compromesso il funzionamento del dispositivo sotto controllo (per esempio i sistemi intrinsecamente instabili); viceversa per il soft real-time.

9 1.5. SCRIVERE UN PROGRAMMA C ORIENTATO AL MICRO CONTROLLORE 9 Priorità Le funzioni di interrupt sono prioritarie ed interrompono l esecuzione normale del programma, dove per normale si intende tutto ciò che viene seguito dalla funzione main. Gli interrupt però, vengono a loro volta gestiti con determinate priorità in funzione del processore. A titolo di esempio si considerino le seguenti famiglie: PIC16F PIC18F dspic30f fino alla versione 16F i pic hanno una sola chiamata di interrupt. Per capire quale dispositivo ha invocato l interruzione, occorre esaminare specifici flags. sono più evoluti e tra le altre migliorie hanno introdotto anche due funzioni di interrupt: una a bassa priorità e una ad alta priorità. In questo caso la funzione di interrupt ad alta priorità è in grado di interrompere quella a bassa priorità. Rimane comunque da capire quale evento ha scatenato l interrupt e ciò viene fatto sempre esaminando determinati flags. hanno interrupt per ogni dispositivo con una priorità variabile tra 0 e 7. Le routine a più alta priorità possono interrompere quelle a più bassa priorità e sono normalmente più veloci per evitare di occupare troppo tempo di CPU che dovrebbe essere destinato ad altre routines. Infatti questo sistema di gestione delle priorità è si molto versatile ma può rendere difficoltoso l analisi del flusso di programma. In questi processori esistono comunque flags che indicano l avvenuta richiesta di interrupt, anche se normalmente vengono usati solo dai dispositivi che generano la stessa richiesta di interruzione a fronte di propri eventi interni differenti (come per esempio la ricezione, trasmissione, generazione errori, ecc nel modulo CAN). 1.5 Scrivere un programma C orientato al micro controllore Un programma C è costituito normalmente da files.h e.c. I primi sono detti di intestazione (header) e sono files in cui vengono definite le funzioni, macro, variabili, tipi, ecc; i secondi sono i files che contengono l implementazione delle funzioni definite nei files.h. Struttura di un file header É buona norma che tutto il codice definito in un file header sia posto all interno di una macro di precompilazione #if come segue: #ifndef NOMEFILE_H # define NOMEFILE_H //TODO #endif // NOMEFILE_H il che serve per comunicare al compilatore che durante la compilazione di un file.c se l inclusione del file nomefile.h viene fatta più volte (per esempio da altri file.h) questo file è gia stato incluso. In caso contrario il compilatore restituirebbe dei warnings (o degli error) a causa di definizioni multiple di tipi, define, ecc. Per quanto riguarda le definizioni di funzioni e variabili all interno del file header, tipicamente occorre definirle come extern: extern void CallBack(int, int); //funzione extern int error; //variabile

10 10 CAPITOLO 1. PROBLEMATICHE DI CALCOLO DIGITALE Questo implica che esisterà un file.c in cui queste label vengono riprese e, se funzioni, implementate. In caso contrario in fase di linking, il linker restituirà un errore simile al seguente: /tmp/ccgbptif.o(.text+0x16): In function main : : undefined reference to CallBack collect2: ld returned 1 exit status e analogamente per le variabili. La keyword extern ha anche un altro utilizzo, ossia permette al linker di collegare funzioni che non sono state implementate in un apposito file.c, ma passate tramite dei files oggetto o librerie precompilate. Nei files.h vengono spesso definite anche le grandezze const: const int X[LENGTH_X] = { //TODO, x es: 1, 2, 3 ; Questa non è la scelta più oculata in quanto potrebbero accadere errori dovuti alla multipla inclusione, ma normalemente queste costanti vengono usate solo da uno specifico file quindi incluse una volta sola. Nel micro controllore la keyword const implica che la variabile andrà scritta nell area codice (.code) e non nell area dati (.text), quindi non potrà essere scritta in run-time. Un tentativo di scrittura comporta normalmente un reset del processore. Si noti che normalmente l area.text è nettamente più piccola dell area.code. Per maggiori informazioni su questo argomento si veda [3] o il manuale del compilatore C del processore specifico. Struttura dei files C Come detto il file.c più importate è quello che contiene la funzione main. Essistono però i file che contengono l implementazione delle funzioni C definite negli header files. Tali funzioni non devono ovviamente ripetersi. Un file C che contiene la funzione main è normalmente strutturato come segue: #include <p30fxxxx.h> //inclusioni di file contenuti nelle directory del compilatore #include localfile.h //inclusione di un file nella directory di progetto //definizione macro #define MUL2(in)(((int)in< <1)) //definizione variabili globali long int integrale=10, derivata; //definizione di funzioni a visibilità globale, x es: int moltiplicazione(int x, int y); //implementazione del main: definita una volta sola all interno del progetto int main () { //TODO while(1) { //loop infinito //TODO //implementazione delle funzioni locali int moltiplicazione(int x, int y) { return x*y; //Eventuale implementazione delle routine i interrupt. //La sintassi varia da micro a micro; qui è riportata quella per dspic30f void _ISR _T1Interrupt(){ //TODO Come si nota all interno della funzione main deve esserci un ciclo infinito. Questo perché il micro non deve terminare il programma altrimenti si resetterebbe. All interno del ciclo while non è strettamente necessario che

11 1.6. INTEGRAZIONE 11 vengano svolte operazioni. Una volta entrati in questo ciclo tutto il controllo è affidato di norma alle routine di interrupt; solo routine di minore importanza vengono gestite in polling all interno del ciclo. Un ciclo infinito può essere definito anche nei seguenti modi: Ciclo do... while: do { // TODO while (1); Ciclo FOR: for(;;){ // TODO GOTO: goto_label: // TODO goto goto_label; 1.6 Integrazione L integrazione in un micro controllore viene tipicamente fatta con il metodo dei rettangoli o con il metodo dei trapezi (detto anche di Eulero) il quale è più preciso del precedente. L integrazione di una grandezza tipicamente è problematica in quanto il coefficiente di integrazione è normalmente molto piccolo e ciò implica che spesso il piccolo errore non venga valutato. Per esempio si consideri un coefficiente K i =10 e un tempo di integrazione T s = s. Supponendo ora una variabile errore e intera, la quota parte di integrale all istante n-esimo sarà pari a K i T s 2 (e(n) + e(n 1)) = 2, (e(n) + e(n 1)) Non entriamo per il momento nel merito di come si realizzi il parametro floating poit , ma è noto che il microprocessore elabori variabili intere e perciò il risultato di questa operazione dovrà essere un numero intero. Considerando ora la variabile errore e di tipo intero che, per esempio, assume valori tra 0 e 4096, è chiaro che perché il risultato della moltiplicazione dia almeno il valore 1 occorre che e(n) + e(n 1) valga almeno Per questo occorre gestire opportunamente la grandezza integrale. Di seguito sono proposti alcuni metodi. Il codice che verrà presentato nelle sezioni seguenti è da considerarsi pseudo codice nel senso che serve solo per dare un idea di come tradurre in C il problema formalizzato. Variabili a 32 bit Scelta la base di conversione delle grandezze fisiche (per esempio 12 bit) si suppone di lavorare con una base dell integrale diversa, tipicamente il doppio dei bit della base delle grandezze fisiche (quindi 24 bit). Questo vuol dire che il valore del coefficiente K i T s 2 verrà calcolato come K i T s = 1, 024. A questo punto è possibile valutare il piccolo errore tenendone memoria nella variabile di integrazione. Chiaramente la variabile risultante è in base 24 bit quindi occorre un intero a 32 bit per poterla gestire (long int nel micro controllore). Per quanto riguarda l implementazione è possibile seguire il metodo degli shift introdotto nella sezione 1.3. Volendo realizzare il parametro risulta: #define INTEGRALE(e)((e> >12))

12 12 CAPITOLO 1. PROBLEMATICHE DI CALCOLO DIGITALE il che implica praticamente la perdita di tutti i valori minori di 4095, come ci si poteva aspettare. Portando invece il valore di K i in base 24 nit si ha che la macro può essere definita come: #define INTEGRALE(e)((e)+(e> >6)+(e> >7)+(e> >11)) il che permette di tenere conto del piccolo errore anche in fase di integrazione. All interno del programma l integrale verrà gestito come segue: long int integrale; //variabile a 32 bit... error_i=error+error_1; //calcolo error_i come l errore attuale+l errore precedente if(error_i>=0) integrale+=integrale_l(error_i); else integrale-=integrale_l((-error_i)); Pro e contro di questo metodo sono evidenti: è sicuramente favorevole il fatto che tutte le operazioni si riducano a degli shift le quali sono operazioni di norma eseguite con un bassissimo numero di cicli di clock e quindi molto performanti anche con grandezze di notevole dimensione come le variabili long int. Di contro si ha che le operazioni su grandezze di tipo long restano comunque pesanti dal punto di vista computazionale per processori a 8 bit (come i PIC) perché occorre ricordare che tale grandezza andrà poi riscalata alla base scelta per poter essere omogenea con le altre grandezze del regolatore per esempio per calcolare l uscita: out=proporzionale+derivativo+((int)(integrale> >12)); dove out, proporzionale e derivativo in questo caso sono da considerarsi variabili in base 12 bit. Ciò nonostante in questa dispensa, questo metodo sarà quello più utilizzato. Gestione dei resti La gestione dei resti è utile per micro processori con scarse capacità computazionali o in quei casi in cui il metodo precedentemente descritto non funzioni correttamente. Un metodo per eseguire ciò può essere quello di tenere in considerazione l elaborazione del piccolo errore e del grande errore ; a tal proposito si supponga di essere nelle condizioni del caso precedente, ossia di avere un K i =10 e T s = s. Si consideri ora di avere due variabili che tengano conto della componente più significativa e meno significativa di un integrale (rispettivamente indicate con inth e intl). La gestione del resto può quindi essere espressa in questo modo: #define UNITA_INTEGRALE 4095 #define INTEGRALE_H(e)((e)) #define INTEGRALE_L(e)((e> >6)+(e> >7)+(e> >11)) int inth, intl, error_i; //int è da intendersi a 16 bit, ma i valori sono in base 12bit!... //nella routine si ha error_i=error+error_1; //calcolo error_i come l errore attuale+l errore precedente inth+=integrale_h(error_i); //non faccio controlli su error_i perché non ho shift destri if(error_i>=0) intl+=integrale_l(error_i); else intl-=integrale_l((-error_i)); //Controllo del superamento dell unità (UNITA_INTEGRALE) if(intl>unita_integrale) { inth++; //aumento di 1 la parte integrale più significativa //riduco di una unità intl che ha superato il valore massimo positivo intl-=unita_integrale; else if(intl<-unita_integrale) { inth--; //diminuisco di 1 la parte integrale più significativa //aumento di una unità intl che ha superato il valore massimo negativo

13 1.6. INTEGRAZIONE 13 intl+=unita_integrale;... out=proporzionale+derivativo+inth; Come di può notare l integrale è diviso in due e la somma è pari a quella del caso precedente solo che questa volta vengono calcolati separatamente e i risultati posti in variabili in base 12 bit. La parte minore (intl) viene trattata in modo tale che non superi mai il valore 4095, ossia il valore corrispondente all unità. Qualora questo valore venisse superato, intl avrà sicuramente il 13 bit a 1 che corrisponde all unità da aggiungere a inth, operazione che viene fatta subito dopo; quindi intl viene ridimensionata sottraendo il valore Per quanto detto è evidente che la variabile intl dopo la sottrazione si porta ad un valore minore di UNITA_INTEGRALE. Tutto quello che è stato appena detto è ripetibile anche nel caso in cui la soglia superata sia quella negativa. Si osservi che quando occorre utilizzare la variabile integrale (come per il calcolo di out) è sufficiente utilizzare la parte più significativa del valore dell integrale espressa nella stessa base delle altre grandezze. Il metodo appena descritto non ha nessun pregio significativo rispetto al precedente in quanto è evidente che la precisione resta la stessa a fronte di un carico computazionale maggiore. É possibile introdurre un altro modo per gestire il problema agendo direttamente sulla variabile error_i. Per fare questo si considera il valore reale del termine integrale è K i T s = 1, 024 il che è scomponibile come K i T s = 1, 024 = 1 + 0, 024 = H + L, do ve chiaramente H = 1 e L = 0, 024. La parte maggiore di zero continuerà ad essere gestita come in precedenza, mentre la parte inferiore verrà gestita in un altro modo. Ora occorre valutare quale valore della variabile error_i fa in modo che si raggiunga l unità; tale valore è chiaramente 0, = 41, 6 arrotondato sempre per eccesso, quindi 42. Quindi isolando i bit che compongono il numero 42 nella variabile error_i e sommandoli ad oni ciclo di integrazione, quando l integrale intl raggiungerà (o supererà) il valore 42 occorrerà aumentare di una unità il valore inth e ridimensionare intl. Assumendo che per poter esprimere il numero 42 occorrono 6 bit 6, lo stralcio di codice seguente dà un idea di come realizzare quanto detto: #define UNITA_INTEGRALE 42 #define MASK_INTL 0x3F //maschera separare i 6 bit necessari al calcolo di intl #define INTEGRALE_H(e)((e)) #define INTEGRALE_L(e)(((e)&MASK_INTL)) int inth, error_i; //int è da intendersi a 16 bit, ma i valori sono in base 12bit! short int intl; //short int è da considerarsi a 8 bit... //nella routine si avrà... error_i=error+error_1; //calcolo error_i come l errore attuale+l errore precedente inth+=integrale_h(error_i); //non faccio controlli su error_i perché non ho shift destri if(error_i>=0) intl+=integrale_l(error_i); else intl-=integrale_l((-error_i)); //Controllo del superamento dell unità (UNITA_INTEGRALE) if(intl>=unita_integrale) { // questa volta devo verificare che sia >= inth++; //aumento di 1 la parte integrale più significativa //riduco di una unità intl che ha superato il valore massimo positivo intl-=unita_integrale; else if(intl<=-unita_integrale) { inth--; //diminuisco di 1 la parte integrale più significativa //aumento di una unità intl che ha superato il valore massimo negativo intl+=unita_integrale;... out=proporzionale+derivativo+inth; 6 6 bit ottenuti arrotondando per eccesso il risultato di log 2 (42); in Matlab: ceil(log2(42))

14 14 CAPITOLO 1. PROBLEMATICHE DI CALCOLO DIGITALE Come si nota non cambia molto nella struttura del programma anche se il carico computazionale si è abbassato. Inoltre intl ora è a 8 bit quindi più facilmente gestibile da micro processori come i PIC. Come si nota la precisione è aumentata in quanto nei casi descritti precedentemente tutti i valori di error_i minori di = 63 venivano scartati, mentre ora vengono considerati.

15 Capitolo 2 Progetto di un regolatore PI In questo primo capitolo verrà trattato il progetto di un semplice regolatore PI per il controllo di un sistema del primo ordine, come per esempio la funzione di trasferimento tra corrente e tensione in un induttore. Verrà quindi presentato come realizzare un regolatore partendo dallo studio delle funzioni continue nella variabile tempo t (ossia si progetterà il regolatore analogico) per poi portare i risultati nel tempo discreto. Il passo successivo sarà realizzare il codice vero e proprio che un microprocessore possa eseguire. Ciò verrà fatto restando inizialmente in ambiente Simulink. 2.1 Regolatore tempo-continuo Il regolatore tempo-continuo, come noto, viene definito studiando il sistema da controllare nel dominio della frequenza, ossia applicando la trasformazione di Laplace alle equazioni di stato. Figura 2.1: Retroazione di un sistema con regolatore PI. Banalmente un sistema controllato con un regolatore PI è rappresentato in figura 2.1; in particolare questo regolatore PI controlla un sistema stabile di tipo R-L. In questo caso il regolatore permette di migliorare la risposta del sistema cercando di seguire il più fedelmente possibile il riferimento di corrente in ingresso. In questo schema sono volontariamente eliminati i ritardi e le funzioni di trasferimento degli azionamenti e dei sensori. É comunque chiaro che la corrente in un sistema reale dovrà essere retroazionata tramite un sensore apposito e che il regolatore è comprensivo dell azionamento vero e proprio (ossia dell alimentatore ideale 1 di tensione). I due blocchi in figura verranno indicati in seguito come R(s) per quanto riguarda il regolatore PI e G(s) per quanto riguarda la funzione del sistema in esame. Negli esempi seguenti il regolatore PI verrà applicato su sistemi intrinsecamente stabili. 1 Per ideale non si intende solo il fatto che i ritardi introdotti siano nulli, ma anche che il sistema può dare un valore di tensione continuo e illimitato istantaneamente. 15

16 16 CAPITOLO 2. PROGETTO DI UN REGOLATORE PI Cenni riguardo la trasformata di Laplace La trasformata di Laplace è una funzione lineare che permette di studiare una funzione reale (normalmente funzioni temporali) tramite una corrispondente funzione complessa. Definita una funzione reale (f : (0, + ) R) si ottiene l integrale di Laplace come o nella foma generalizzata F (s) = {Lf (s) = F (s) = {Lf (s) = T lim lim e st F f(t)dt T + τ 0 τ 0 e st F (t)dt Questa relazione è lineare ed è molto comoda per lo studio dei sistemi come regolatori e filtri per i quali non vi è motivo di effettuarne lo studio per valori temporali negativi. Per quanto riguarda la convergenza della serie, questa è legata sia alla funzione f(t) sia alla variabile s. Infatti se la funzione f(t) è, come precedentemente definito, una funzione reale ed anche s è una funzione reale, si ha che la trasformata di Laplace restituisce come risultato un numero reale; quindi indicando con A il dominio della trasformata di Laplace si ha A := { s R : + F : A R, F (s) = 0 e st f(t)dt + per tanto si ha convergenza se esiste ed è funito l integrale reale della funzione f(t). Se invece la funzione s è un numero complesso B := { s C : e st f(t)dt (2.1) e st f(t)dt come per esempio s = x + iy, allora la trasformata si esprime come F (s) = + 0 e xt (cos(yt) + i sin(yt)) f(t)dt (2.2) da cui deriva che la convergenza sia assicurata se convergono i due integrali reali in cui si scompone la funzione. Il principale vantaggio introdotta da questa trasformazione riguarda la risoluzione delle equazioni differenziali le quali diventano di tipo algebrico e consentono di studiare un sistema fisico come funzione fratta. La stabilità del sistema è assicurata dal fatto che le soluzioni che annullano il polinomio a denominatore (ossia i poli) devono essere tutti a parte reale negativa Progetto del regolatore Il progetto del regolatore PI è normalmente abbastanza semplice in quanto vengono definite due equazioni in due incognite. Le incognite sono i coefficienti del regolatore, mentre le due equazioni vengono definite fissando il margine di fase e banda passante. Il problema è come scegliere tali valori. Il margine di fase si fissa normalmente pari a 90. Ciò permette di non avere sovra-elongazioni nella risposta al gradino. Per quanto riguarda la banda passante, la cosa è più complessa in quanto dipende tutto da come verrà implementato il regolatore reale.

17 2.1. REGOLATORE TEMPO-CONTINUO 17 Infatti per il teorema del campionamento si sa che scelta la massima armonica campionabile senza aliasing, la frequenza di campionamento dovrà essere doppia di quella di tale armonica. Nei casi pratici, però, questo non avviene praticamente mai soprattutto se non vengono implementati filtri di ordine elevato in uscita al trasduttore 2. Tipicamente quindi si sceglie una frequenza di circa volte inferiore a quella di campionamento la quale viene decisa in funzione delle capacità elaborative dei micro-controllori e viene data in termini di pulsazione; ciò verrà trattato più avanti nel dettaglio, quindi per ora si consideri la scelta (tipica) di rad/s. Definito il sistema in termini di banda passante (ω t 3 ) e margine di fase (φ m ) è possibile ottenere le due equazioni di cui sopra esprimendo in modulo e fase la funzione d anello L(s) : { R(jω) G(jω) = 1 R(jω) + G(jω) = φ m (2.3) da cui si può isolare l espressione del regolatore in termini di modulo e fase: { R(jωt ) = 1 G(jω) R(jω t ) = 180 φ m G(jω t ) = θ L uscita di un regolatore PI nel dominio del tempo è funzione dell errore in ingresso ed è la seguente: t u P I (t) = K P e(t) + K I e(x)dx = K P (e(t) + 1 t ) e(x)dx T i (2.4) (2.5) la quale portata nel dominio di Laplace diventa: U P I = Esprimendo il regolatore in funzione della frequenza si ha: ( K P + K ) I E(s) = P I(s) E(s) = R(s) E(s) (2.6) s R(jω) = K P + K I jω = K P j K I ω = R(jω) ejθ = R(jω) (cos(θ) + jsin(θ)) (2.7) Detto questo, dalle equazioni 2.4, 3.2 e 2.7 si ottengono le due equazioni in due incognite che permettono la determinazione i parametri del regolatore: { KP = R(jω t ) cos(θ) = cos(θ) G(jω t) K I = R(jω t ) sin(θ) = sin(θ) G(jω t) ω t (2.8) Anti wind-up Normalmente tutti i regolatori (ma anche i sistemi in esame) vengono muniti di opportune soglie in uscita in modo da impedire che le azioni di un determinato blocco (ossia le loro uscite) raggiungano valori poco realistici a causa dei dispositivi fisici a disposizione per realizzare l azionamento vero e proprio. Ciò però normalmente non basta ad evitare il problema di wind-up. Tale problema è legato normalmente all azione integrale 4 la quale, a fronte di un errore non nullo, tende a divergere anche se l uscita del sistema viene saturata. Questo causa una notevole 2 Tali filtri possono anche essere di tipo digitale implementati sul microcontrollore applicati ai segnali campionati prima che esegua le routine di controllo e regolazione. 3 Si noti che la pulsazione relativa alla banda passante si assume coincidente con la pulsazione di taglio in quanto la funzione d anello i definita come L(s) = R(s)G(g) in retroazione, deve restituire una funzione di trasferimento risultante tra ingresso e uscita ( ) di modulo i rif unitario (0 in db nel diagramma di Bode) fino al punto di intersezione di L(s) con l asse 0 db, ossa fino alla pulsazione ω t. 4 Si vedrà in seguito che anche la componente derivativa può avere problemi di questo tipo.

18 18 CAPITOLO 2. PROGETTO DI UN REGOLATORE PI perdita di reattività da parte del controllo e, soprattutto, si può incorrere in spiacevoli conseguenze dipendenti dai tipi di integratori (sia analogici che digitali). Lo schema tipico di un sistema anti wind-up è riportato in figura 2.2. Non ci si dilungherà oltre in questa descrizione in quanto questo sistema di anti wind-up (come anche altri più complessi) serve solo per modellizare il sistema nel dominio del tempo, mentre nel digitale le cose si risolvono molto più semplicemente (sezione 3.3). Inoltre in [1] viene descritto dettagliatamente tutto il il processo di digitalizzazione. Figura 2.2: Schema a blocchi di un tipico sistema anti wind-up per regolatori PI. 2.2 Regolatore Discreto I regolatori di tipo discreto sono regolatori che elaborano ingressi di tipo reale, discretizzando il tempo, ossia prelevando le valori ad intervalli regolari. É immediato intuire che questo sistema si avvicina molto al comportamento del regolatore reale il quale però presenta ulteriori complicazioni che verranno mostrate in seguito Cenni riguardo la trasformazione Z La trasformata z di una sequenza x(n) generica è definita secondo le espressioni seguenti: x(z) = x(n)z n x(z) = x(n)z n (2.9) n= n=0 rispettivamente dette bilatera e unilatera, dove la variabile z è una variabile esprimibile in forma polare: z = re jω Da ciò ne consegue che la trasformazione si può esprimere come prodotto della trasformata di Fourier per la sequenza esponenziale: x(re iω ) = x(n)(re jω ) n = r n e jωn n= n= É chiaro che perché la funzione converga deve risultare finita la sommatoria x(n)r n < n= Tale espressione deriva direttamente dalla seguente x(n)z n < n=

19 2.2. REGOLATORE DISCRETO 19 dalla quale è immediato intuire che, data la natura della variabile z, la regione di convergenza di questa funzione sia una regione circolare (o anulare) del piano complesso. Dal punto di vista dei controlli/filtri digitali, lo studio delle funzioni tempo-discrete viene fatto normalmente ricorrendo alla Z-Trasformata. Con questo tipo di funzioni è normalmente possibile realizzare una approssimazione della funzione regolatore R(s) che permetterà poi di passare alla definizione di un modello digitale. (a) schema a blocchi (b) segnale e(t) (c) segnale capionato e(n) Figura 2.3: Campionamento di una funzione continua. In figura 2.3 è rappresentato lo schema di campionamento di una funzione continua (come per esempio la funzione errore) i cui campioni sono presi a intervalli regolari T s, da cui e (n) = e(kt s ) con k N; e (n) è una sequenza di campioni. Un grande vantaggio che deriva da questa formalizzazione è che ogni grandezza variabile definita nel dominio z moltiplicata per z n equivale a considerare l n-esimo campione della sequenza associata alla grandezza; per esempio: y = xz 1 + 2xz y (n) = x(n 1) + x(n + 1) Mappatura dei poli da s a z Come detto, per ottenere una funzione digitale implementabile su micro controllore, occorre passare per la trasformata z in modo da approssimare al meglio la funzione tempo-continua. Per fare questo occorre quindi mappare i poli e gli zeri in s nel corrispondente dominio z. Dalla figura 2.4 è subito chiaro che, essendo le due aree di convergenza una un semipiano e l altra una zona anulare, occorre determinare una funzione che degradi il meno possibile la risposta del regolatore in z. Per fare ciò si ricorre tipicamente alle trasformazioni bilineari le quali derivano dalla considerazione che lo scopo ultimo della progettazione del regolatore digitale è di descrivere il sistema tempo-continuo tramite opportune equazioni alle differenze ossia discretizzando la funzione continua R(s). Per fare ciò quindi si parte da semplici considerazioni riguardo l integrazione numerica, la quale deve approssimare quella nel continuo.

20 20 CAPITOLO 2. PROGETTO DI UN REGOLATORE PI Figura 2.4: Dominio di convergenza della funzione s e z. (a) tempo-continuo (b) discreto Figura 2.5: Integratori. Prendendo in considerazione quanto riportato in figura 2.5-a, un puro integratore è costituito da una semplice equazione di stato dy(t) dt = u(t) Se ora venisse richiesto di realizzare un algoritmo di integrazione della funzione u(t), le soluzioni immediate e più semplici che probabilmente vengono in mente, una volta definito che la funzione viene campionata a intervalli T s regolati, sono l approssimare la funzione con una serie di rettangoli identificabili tra due intervalli successivi, ossia y(kt s ) = T s u(kt s ) + y((k 1)T s ) (2.10) o anche y(kt s ) = T s u((k 1)T s ) + y((k 1)T s ) (2.11) detto appunto metodo dei rettangoli. Questo metodo è chiaramente molto approssimato anche se l errore commesso è tanto più piccolo quanto più piccolo è il periodo T s ; ciò fa comprendere che questo metodo è molto comodo per il controllo quando le potenze di calcolo a disposizione non sono molto elevate e/o i tempi di integrazione sono stringenti. Una soluzione più brillante è il metodo dei trapezi il quale non fa altro che considerare rettilineo il tratto tra due istanti (di campionamento) successivi sommando quindi le aree dei vari trapezi identificabili in ogni istante T s y(kt s ) = T s 2 (u(kt s) + u((k 1)T s ) + y((k 1)T s ) (2.12)

21 2.2. REGOLATORE DISCRETO 21 Concentrandosi ora su questa seconda soluzione è immediato formulare il problema in termini di sequenze y (n) = Ts 2 (u (n) + u (n 1)) + y (n 1) equivalente a y (n + 1) = Ts 2 (u (n + 1) + u (n)) + y (n) Come già detto, è chiaro che questo metodo di calcolo è una approssimante del sistema tempo-continuo, quindi cercando di utilizzare una formula che approssimi al meglio l integrazione, si può formulare il problema come in 2.5-b, ossia definendo un coefficiente a tale che y (n + 1) = T s ((1 a) u (n) + a u (n + 1)) + y (kn) con a [0, 1] da cui deriva la funzione di trasferimento dell integratore che mette in relazione la formulazione tempo-continua con quella digitale 1 s T a z + (1 a) s z 1 e quindi la definizione della variabile s che permetterà di mappare le funzioni tempo-continue nelle corrispettive digitali: s = 1 T s z 1 a z + (1 a) Dal fatto che la trasformazione sia bilineare deriva una importante considerazione ossia che se la funzione R(s) è una funzione razionale fisicamente realizzabile (cioè il grado del polinomio a denominatore è maggiore o uguale al grado del numeratore) e senza poli in 1/(aT s ), allora R(z) è razionale con denominatore di grado pari a quello di R(s) e maggiore o uguale al grado del numeratore. A questo punto risulta chiaro che il regolatore digitale possa essere ottenuto sostituendo a s la variabile definita in z. Il problema ora è valutare i valori che a può assumere; tipicamente i valori assegnabili sono tre: a = 0 equivale ad adottare come metodo di integrazione la formula di Eulero detta in avanti o del rettangolo destro. La funzione di mappatura del piano s diventa quindi s = 1 T s (z 1) (2.13) e sostituendola alla funzione di trasferimento dell integrale si ottiene e dividendo tutto per z si ottiene y = u T s z 1 da cui yz = T s u y y = T s uz 1 yz 1 da cui y (n) = T s u (n 1) + y (n 1) ossia la stessa relazione definita precedentemente (equazione 2.11). a = 1 equivale ad adottare come metodo di integrazione la formula di Eulero detta in indietro o del rettangolo sinistro. La funzione di mappatura del piano s diventa quindi s = 1 T s z 1 z (2.14)

22 22 CAPITOLO 2. PROGETTO DI UN REGOLATORE PI ed effettuando le stesse considerazioni del punto precedente si ottiene y = T s u yz 1 da cui y (n) = T s u (n) + y (n 1) ossia la stessa relazione definita precedentemente (equazione 2.10). a = 1 2 ossia il metodo di integrazione detto di Tustin o dei trapezi. La variabile s si definisce come s = 2 T s z 1 z + 1 (2.15) da cui deriva il metodo di integrazione dei trapezi definito in precedenza osservando semplicemente i campioni del segnale: y = T s 2 u ( 1 + z 1) + yz 1 da cui y (n) = T s 2 (u (n) + u (n 1)) + y (n 1) Risposta in frequenza Per diagrammare la risposta in frequenza di una funzione z, non si può considerare tutto il semipiano delle frequenze come per il diagramma di Bode per i sistemi tempo-continui; le funzioni in z infatti sono funzioni periodiche nell intervallo [ π T s, π T s ]. Tuttavia è possibile ottenerne la risposta sostituendo alla variabile z la forma polare e jωts. Si intuisce però che le trasformazioni bilineari, non essendo trasformazioni lineari, tendono a distorcere la risposta in frequenza della funzione in z rispetto a quella della funzione tempo-continua in s (si veda [2] per maggiori informazioni). Dal punto di vista teorico è quindi possibile determinare il minimo valore di frequenza oltre il quale la distorsione è trascurabile, ma dal punto di vista pratico ciò non è molto significativo in quanto le frequenze di campionamento sono normalmente molto elevate e comunque dipendenti anche dall hardware a disposizione. A titolo di esempio si consideri ora un regolatore con Ki=10 e Kp=0.01 e tempo di campionamento di 1kHz (ossia T s = 1ms); eseguendo i seguenti comandi MATLAB si ottengono i risultati in figura 2.6. La frequenza a cui è limitata la funzione in z è chiaramente 1kHz (Ts 1 ) che in termini di pulsazione è rad/sec; a questo punto è facile intuire che se il tempo di campionamento aumenta, anche la distorsione si riduce (figura 2.7); è lecito quindi aspettarsi che il sistema tempo-discreto risponda in modo pressoché identico al sistema tempo-continuo a patto che le frequenze di campionamento siano molto alte.

23 2.2. REGOLATORE DISCRETO 23 Ki=10; Kp=0.01; Ts=1e-3; filtros = tf([kp Ki],[1 0]); filtroz = tf([ts*ki/2+kp Ki*Ts/2-Kp],[1-1],Ts, variable, z ); bode(filtros, filtroz); Figura 2.6: Diagramma di Bode della funzione del regolatore di esempio s e z con T s = 1ms. Figura 2.7: Diagramma di Bode della funzione del regolatore di esempio s e z con T s = 100µs.

24 24 CAPITOLO 2. PROGETTO DI UN REGOLATORE PI

25 Capitolo 3 Modellistica del regolatore PI In questo capitolo verrà modellizzato il regolatore nella forma classica e con anti wind-up. L obiettivo è di ottenere tre regolatori (continuo, discreto e digitale) che restituiscano gli stessi risultati in termini di prestazioni dinamiche e precisione statica. Il sistema preso in considerazione è un induttore R-L lineare la cui equazione di stato è d dt i(t) = 1 (v(t) Ri(t)) (3.1) L Si consideri a titolo di esempio per le simulazioni successive L = 50 mh e R = 0.11 Ω. formulazione del regolatore sarà quella classica senza strutture anti wind-up. La prima Si consideri inizialmente un sistema come quello riportato in figura 3.1. Come si nota la relazione è banalmente un guadagno che moltiplicato per l ingresso restituisce il valore della tensione applicabile. É chiaro che questo presuppone una perfetta conoscenza del modello del dispositivo sotto controllo e comunque anche in questo caso questa soluzione ha una dinamica legata ai poli dell induttore. Questo schema permetterà di confrontare i risultati che seguiranno per verificare i miglioramenti apportati da un regolatore PI. (a) Schema Simulink (b) Tensione applicata (c) Corrente di riferimento e reale Figura 3.1: Schema in anello aperto per il controllo della corrente in un induttore. 25

26 26 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI 3.1 Regolatore tempo-continuo classico Il sistema in esame è un sistema intrinsecamente stabile. Introdurre un PI quindi in linea teorica non farà altro che modificare la dinamica del sistema. In particolare quello che si vuole fare è accelerare il sistema in esame. Per fare ciò si ipotizza inizialmente che l attuatore (ossia in questo caso il generatore di tensione) sia ideale, cioè non abbia una uscita teoricamente illimitata; inoltre non deve introdurre nessun ritardo addizionale 1, così come il regolatore. Si applichino quindi le considerazioni fatte al paragrafo 2.1. Solo a scopo didattico la banda passante non verrà posta intorno ai 1000 rad/s, ma pari a 50 rad/s: si ricorda infatti che l obiettivo è realizzare tre regolatori (tempo-continuo, tempo-discreto e infine C) che abbiano la stessa risposta; lo scopo principale è infatti quello di mostrare semplicemente che il regolatore migliora l andamento della corrente. Da ciò però nasce anche una considerazione di tipo pratico: la tensione imposta (almeno in termini di picco) dal regolatore ha un valore tanto più alto quanto più alta è la banda passante. Ciò è abbastanza intuitivo: più il regolatore è prestante, maggiore sarà la forzante che genererà in ingresso al sistema sotto controllo, chiaramente entro i limiti dell alimentatore. Problematiche di questo tipo rientrano nell ambito della così detta moderazione del controllo; il caso limite è quello in cui a fronte del più piccolo errore si ha la massima variazione dell uscita, ossia il raggiungimento istantaneo della soglia di saturazione (superiore o inferiore). Tornando al caso in esame, la pulsazione scelta permette di avere, a fronte di un errore massimo, una tensione massima di poco superiore a 120V. Nel caso in cui il regolatore possa dare tensioni di riferimento in uscita più elevate di quelle gestibili dell attuatore, si deve necessariamente prevedere una saturazione. Per quanto riguarda il margine di fase, viene impostato a 90. In figura 3.2 è riportato il PI con coefficienti pari a Kp = 2.5 e Ki = 5.5. Come si nota non vi è sovraelongazione e il sistema risponde più prontamente anche se la tensione applicata è ora molto più alta, quantomeno come valore di picco. Per quanto riguarda la risposta in frequenza, in fgura 3.3 è rappresentata la risposta del regolatore PI, del circuito R-L (G(s)), della funzione d anello (L(s) = P I(s) G(s)) e della funzione di trasferimento totale, ossia con F (s) = L(s)/(1 + L(s)) la quale ha un andamento di tipo passa-basso. Come si può notare la funzione d anello è una retta di pendenza 20dB/dec e ciò è corretto perché avendo impostato il margine di fase a 90 il PI assume valori tali da avere uno zero in corrispondenza del polo della funzione in esame G(s). Il sistema L(s) si riduce semplicemente ad un integrale moltiplicato per un guadagno. Applicando come riferimento una sinusoide di pulsazione 10rad/s e una di 100rad/s si deve trovare la prima inseguita con un leggero ritardo e poco attenuata in modulo, mentre la seconda attenuata e con sfasamento intorno ai 70. Ciò è verificato dalla figura I regolatori reali infatti possono introdurre ritardi legati ai filtri dei segnali, al campionamento, al tempo di elaborazione, ecc.

27 3.1. REGOLATORE TEMPO-CONTINUO CLASSICO 27 (a) Schema Simulink (b) Correnti (c) Tensioni applicate I colori sono, rispettivamente per ogni componente del vettore in ingresso al blocco scope, giallo-porpora-azzurro. Il riferimento di corrente è stato messo per ultimo per avere corrispondenza tra i colori relativi a ogni regolatore. I diagrammi sono ottenuti dal modello R_L_01.mdl. Figura 3.2: PI tempo-continuo.

28 28 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI Figura 3.3: Diagramma di Bode dei vari blocchi del sistema tempo-continuo. (a) Corrente (riferimento a 10rad/s) (b) Tensione (riferimento 10rad/s) (c) Corrente (riferimento 100rad/s) (d) Tensione (riferimento 100rad/s) Figura 3.4: PI tempo-continuo con ingresso sinusoidale.

29 3.2. REGOLATORE Z OTTENUTO DAL TEMPO-CONTINUO CLASSICO Regolatore Z ottenuto dal tempo-continuo classico Anche in questo caso si applicano le considerazioni precedentemente fatte nella sezione Si ricorda che la trasformata Z discretizza solo il tempo, mentre l ingresso è reale. Conseguenza di ciò è il fatto che neppure SIMULINK accetta come ingresso ai blocchi in z-trasformata variabili intere (a 16 o 32 bit) se non opportunamente castizzate. La funzione di trasferimento del PI è V rif (s) E(s) = K p + K i s = sk p + K i s (3.2) e applicando la trasformazione bilineare di Tustin si ottiene la funzione di trasferimento del regolatore discreto, ossia v rif (z) e(z) T s (z + 1) = K p + K i 2 (z 1) = K T P (z 1) + K s i 2 (z + 1) (z 1) ( ) ( ) T Ki s = 2 + K p z + T Ki s 2 K p z 1 = (3.3) (3.4) Introducendo questo nel modello Simulink si hanno i risultati mostrati in figura 3.5. Si noti che per effettuare la simulazione occorre cambiare le impostazioni settando i parametri di simulazione con passo fisso. In particolare è stato fissato un passo di integrazione pari a 50µs. In figura 3.5-a e 3.5-b si osserva che sia la corrente in uscita che la tensione dovuta al regolatore digitale e a quello analogico, si sovrappongono perfettamente.

30 30 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI (a) Schema simulink (b) Corrente. (c) Tensione applicata. I colori sono, rispettivamente per ogni componente del vettore in ingresso al blocco scope, giallo-porpora-azzurrorosso. Figura 3.5: PI tempo-discreto con T s = 50µs. In realtà se si ingrandisse notevolmente si noterebbe un piccolo scostamento della funzione discreta rispetto a quella continua. Se alzassimo il valore del passo di integrazione (per esempio a 50ms), questo scostamento si farebbe più marcato, come mostrato in figura 3.6. Si nota che la risposta è cambiata e sembrerebbe in meglio, ma questo leggero miglioramento lo si è pagato in termini di moderazione del controllo. Inoltre il sistema è tendenzialmente più instabile; infatti se si aumentasse oltre una certa soglia il passo di integrazione, il sistema divergerebbe e, comunque, un aumento del passo di integrazione riduce la prontezza del regolatore. Ad ogni modo il sistema non si è discostato molto dalla risposta che ci si attendeva partendo dal progetto del regolatore tempo-continuo. Anche in questo caso a fronte di un andamento sinusoidale il riferimento viene seguito con la stessa dinamica come mostrato in figura 3.7-a. Anche la risposta a 5ms non presenta sensibili variazioni (3.7-b) NOTA: a queste considerazioni si può giungere anche in termini matematici. Se infatti si osservano i risultati con uno sguardo al futuro ponendo l attenzione su come si comporterà il regolatore digitale, diventa chiaro fin d ora che il sistema digitale dovrà effettuare un campionamento e un controllo prima di restituire i

31 3.3. REGOLATORE DIGITALE 31 (a) Correnti. (b) Tensioni applicate. Figura 3.6: Risposta del PI continuo e discreto con T s = 5ms. (a) Ts=50us (b) Ts=5ms Figura 3.7: PI tempo-discreto con riferimento sinusoidale. risultati e quindi agire sul sistema. Di questo ritardo normalmente se ne deve tenere conto con un tempo di campionamento e uno di elaborazione. Tipicamente però si assume che questi due tempi siano pari all intervallo T s in quanto tra un campionamento e l altro si cercherà di effettuare tutti i calcoli necessari al controllo. Si tiene conto di tale ritardo normalmente nella parte tempo-continua del modello definendolo come e sts. É immediato capire che in termini di margine di fase si ha una riduzione pari a δφ m = ω c T s 2 il che equivale a rendere meno robusto il sistema. Ad ogni modo non se ne terrà conto in questi primi modelli. 3.3 Regolatore Digitale Il modello del regolatore digitale verrà anch esso sviluppato in SIMULINK, ma ora ci si trova a dover analizzare su quale struttura hardware il sistema dovrà essere implementato e ciò va oltre alla sola scelta del processore, ma

32 32 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI riguarda anche i sensori (e quindi la loro caratterizzazione) e gli attuatori. La famiglia di processori per la quale verrà plasmato il codice è la dspic30f. La scelta del processore è in linea teorica scorrelata dal codice SIMULINK tranne per alcuni fattori: 1. si deve sempre verificare che il codice SIMULINK reimplementato sul processore scelto rispetti perfettamente le scadenze temporali, soprattutto se stringenti (hard real-time) 2. soglie e variabili in SIMULINK vanno espresse tenendo conto dei limiti di calcolo del processore. I dspic30f, per esempio, hanno parole a 16bit con ALU, MCU per calcoli come moltiplicazioni e divisioni e anche una DSP unit che, anche se non performanti come un vero DSP, permette di eseguire calcoli di somma e moltiplicazione contemporaneamente (multiply and accumulate), mente i PIC12/16 hanno solo la ALU (Arithmetic/Logic Unit). 3. occorre riadattare gli ingressi per simulare la perdita di precisione legata ad ADC, PWM (e altre periferiche se necessario). Gli ADC sono a 10bit. Il secondo punto fondamentale è il sensore; prendendo in esame un sensore LEM di corrente e valutando la portata massima da rilevare si sceglie il modello. La caratteristica dei LEM è espressa in figura 3.8. V out = I P max I P N dove I P max è la corrente passante per il numero di spire avvolte. Si noti che il LEM satura a 4.5V Figura 3.8: Caratteristica LEM. Dai grafici la corrente da retroazionare ha un valore massimo nominale pari a 50A. La scelta quindi ricade sul LEM LTS-25-NP con una spira. Questo implica che a fronte di una tensione massima in uscita dal sensore di 4,5V, la corrente massima che può circolare nel conduttore è pari a 80A. Il LEM inoltre ha una tensione in uscita con un offset di 2,5V. Il terzo punto di cui occorre tener presente è l uscita. Occorre infatti pensare alla tensione massima applicabile la quale sarebbe meglio fosse maggiore (o al più uguale) alla tensione di picco ottenuta dalle simulazioni. Per semplicità si supponga di avere a disposizione una sorgente di tensione continua di valore 150V. Il sistema di parzializzazione della tensione può quindi essere un chopper o un ponte ad H. Per completezza verrà considerato un ponte ad H in quanto sarà possibile verificare le risposte in frequenza in quanto questo dispositivo permette di avere sul carico sia tensioni positive che negative 2. Da queste considerazioni si procede col modellizzare il regolatore Simulink e quello del micro processore. 2 Questa affermazione acquisirà importanza nel momento in cui il codice verrà adattato al micro-controllore, sul quale occorrerà introdurre i registri di PWM ed effettuare i debiti riscalamenti delle grandezze.

33 3.3. REGOLATORE DIGITALE Modello C-SIMULINK In questo esempio il sensore+convertitoread verranno sviluppati al di fuori del codice C in modo che il codice scritto sia il più vicino possibile a quello del micro processore. Per quanto appena detto occorre modellizzare prima di tutto il blocco sensore-adc. Per fare ciò si considera la formula riportata in figura 3.8. Inoltre si sa che la conversione digitale ad opera del micro processore ha una sensibilità di 5V/1024. Il blocco di conversione eseguirà (( V digit = round i I P N ) ) 1024 Si noti che sia il riferimento che il valore reale vengono campionati, mentre la loro differenza verrà calcolata all interno del codice C. Detto ciò, in figura 3.9 è riportato il componente aggiuntivo a cui si farà riferimento per il test del codice del regolatore riportato in seguito. Come si nota il blocco di campionamento è stato posto al di fuori del blocco che simula il micro controllore vero e proprio per fare in modo che il codice sia il più possibile simile a quello del micro controllore. Anche il riferimento viene digitalizzato in questo caso e non implementato sul controllore vero e proprio. Ciò è verosimile se si pensasse di avere la possibilità di settare il riferimento dall esterno. I due AD riportati non fanno altro che convertire la corrente in un valore compreso tra corrispondenti a 0-80A in quanto, come già detto, il LEM ha un offset di 2.5V e il micro acquisisce ingressi in 0-5V. 5 Figura 3.9: Blocco PI digitale. Il blocco programma C in figura 3.9 è un S-Function Builder. L help di MATLAB è completo e spiega perfettamente tutte le caratteristiche del blocco, ma per poter già scrivere e testare i programmi basti ricordare che: 1. Nella scheda Initialization, Sample mode deve essere settato su Discrete con un passo di 50e-6 (pari a T s ). Si sconsiglia di fare ereditare al blocco il tempo di sample impostato in simulazione, anche se questa fosse configurata (come deve essere) con un passo di integrazione fisso. 2. Nella Scheda Data Properties l ingresso u0 è un vettore di due elementi, così come l uscita y0. 3. In Libraries nel riquadro External Function Declaration verranno settate costanti e variabili globali. 4. In Outputs verrà scritto il codice. Si noti inoltre che la base scelta per i calcoli è 4096 (12bit). Il resto dell hardware non è modellizzato per il momento. Si tenga però conto che il regolatore dovrà andare a pilotare delle valvole (per esempio un ponte H) e, in generale, il pic introdurrà dei ritardi. Tutto ciò verrà tenuto in considerazione più avanti.

34 34 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI Metodo 1: Separazione parte proporzionale e integrale Il regolatore può essere scritto tranquillamente separando il termine proporzionale e quello integrale secondo quanto riportato nell equazione Secondo molti, compreso chi scrive, questo metodo è molto comodo per la scrittura di un PI perché evitando di mettere in relazione il termine proporzionale e quello integrale, diventa molto più agevole modificare i parametri per affinare il controllo in fase di test e collaudo sul campo del regolatore stesso. Algorithm 1 Variabili e definizioni globali. #define I_REALE u0[1] #define I_RIF u0[0] #define IUP #define IDW #define KP(e)((e< <1)+(e> >1)) #define KI(e)((e> >1)+(e> >4)) #define KIS 12 // extra shift per lítergale int error, error_1=0; int proporzionale; int integrale=0; int first_scan=0; Algorithm 2 Codice C del regolatore (SIMULINK) int error_i; error = ((I_RIF - I_REALE)< <3); /* errore riportato a 12bit */ error_i=error+error_1; /*errore da passare alla macro integrale*/ proporzionale = KP(error) if(error_i>=0) /* calcolo integrale */ integrale += KI(error_i); else integrale -= KI((-error_i)); error_1=error; /* memorizzo l errore per il passo successivo */ /*Ciò che segue è la satrazione dell integrale, ossia l anti wind-up. Introdurre ciò a questo punto è solo per completezza; ai fini dell esempio è ininfluente in quanto l anti wind-up verrà trattato in seguito*/ if(integrale>iup) /* Limito l integrale (anti wind-up) */ integrale=iup; else if(integrale<idw) integrale=idw; y0[0]=proporzionale+(integrale> >KIS); y0[1]=round(y0[0]*100)/4096; Analizzando il programma si vede che subito i dati in ingresso vanno riportati alla base scelta ossia moltiplicati per 8 mediante uno shift logico a sinistra di 3 bit; successivamente viene calcolata la componente proporzionale del regolatore la quale non viene limitata perché il prodotto dell errore massimo per il termine proporzionale non potrà mai dare un overflow della variabile intera a 16bit 3 : per comprendere meglio quanto appena detto si consideri che l errore massimo teorico di corrente è pari a 511 (=2 9 1) che moltiplicato per 8 restituisce 4088 che ancora moltiplicato per il coefficiente K p pari a 2,5 dà come risultato <2 15 1= L integrale 3 15 bit se si considera anche il bit di segno.

35 3.3. REGOLATORE DIGITALE 35 invece viene calcolato tramite la variabile error_i data dalla somma dei valori errore attuale (error) ed errore al passo precedente (error_1); questo farà in modo che la macro sia ottimizzata perché, come detto al capitolo 1, una macro tende a riscrivere il codice passatogli come parametro. Quindi la macro definita KI definita nell algoritmo 1 prendesse come argomento la somma dei due errori, tale operazione verrebbe richiamata tutte le volta che compare il simbolo e nella macro aumentando il carico computazionale. Oltre a ciò viene fatto un check sulla variabile error_i per evitare il problema legato agli shift logici a destra. Attenzione poi per quanto riguarda la conversione dell uscita: la conversione in tensione reale è data dalla costante 100/4096, ossia il reciproco del coefficiente di conversione analogico-digitale del sensore di corrente. Attenzione quindi a non confondere il valore 100A con il massimo teorico della tensione in uscita dal generatore! La dimostrazione di ciò è relativamente semplice e la si può fare per analogia. L espressione seguente: out_i(n) = e(n) K p + K i T s 2 (e(n) + (e(n 1)) (3.5) rappresenta il valore dell uscita senza tenere conto del valore accumulato dall integrale espressa con grandezze reali. Tale funzione è possibile riscriverla digitalizzando l ingresso; come noto la costante di conversione del convertitore AD è 4096/100 da cui si può esprimere che il valore digitale della grandezza sarà E(n) = e(n) = e(n) k AD. L equazione 3.5 può quindi essere scritta in digitale come: OUT _I(n) = E(n) K p + K i T s 2 (E(n) + (E(n 1)) (3.6) A questo punto non resta da chiedersi qual è il valore della costante che moltiplicata per il valore digitale dell uscita restituisce il valore reale dell ingresso: k = out_i OUT _I = e(n) K T p + K s T i 2 (e(n) + (e(n 1)) T E(n) K p + K s i 2 (E(n) + (E(n 1)) = e(n) K p + K s i 2 (e(n) + (e(n 1)) ( k AD e(n) T Kp + K s i 2 (e(n) + (e(n 1)) ) = 1 Con questo è dimostrato che per ottenere l uscita y0[0] reale occorre moltiplicare per il reciproco del fattore di conversione del convertitore analogico digitale. k AD Si noti che per essere precisi occorrerebbe limitare l uscita alla tensione massima di DC bus: senza questa limitazione si assume l alimentatore ideale e in grado di erogare qualsiasi valore di tensione e corrente. Per quanto riguarda la regolazione vera e propria, i parametri K p e K i vengono realizzati tramite una macro. Il KP come si vede resta uguale e pari a 2.5, mentre KI tiene conto anche del tempi di campionamento (KI K i T s 2 ). Così facendo il nuovo coefficiente risulta il quale è troppo piccolo per poter essere applicato ad una variabile che al massimo raggiunge il valore Per questo la macro viene applicata ad una variabile a 32 bit (int in MATLAB) e limitata a 2 24 (= ), mentre il coefficiente verrà moltiplicato per 4096 (il che diventa 0,5632). Ora l integrale può tenere conto di tutti i valori maggiori o uguali di 2 perché 2 0,5632=1,1264 che arrotondato all intero più vicino è 1, aumentando decisamente la precisione. Mantenendo invece il valore dell integrale pari a la macro sarebbe stata scritta come KI(e)((e> >13)+(e> >16)) il che implica che perché il risultato di KI sia maggiore di 1, occorre che error_i sia almeno pari a L integrale però viene utilizzato per calcolare grandezze in base 12 bit come y0[0] e quindi occorre riportarne il valore nella base corretta applicando uno shift logico a destra di 12 bit. La risposta è seguita perfettamente, come mostrato in figura 3.10.

36 36 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI (a) Corrente. (b) Tensione Figura 3.10: Risposta PI digitale (metodo 1). Anche in questo caso la risposta alla sinusoide segue il comportamento voluto (figura 3.11 e 3.11), ma con un particolare: infatti osservando le figure 3.11-b e 3.12-b si vede che la forzante appare un po frastagliata. I valori però sono accettabili come ordine di grandezza e andamento; questi andamenti discontinui sono da imputare alla quantizzazione del segnale in ingresso. E chiaro poi che la corrente in uscita abbia un comportamento buono a causa dell effetto filtrante dell induttanza. (a) Corrente (b) Tensione Figura 3.11: PI digitale con forzante sinusoidale a 10rad/s.

37 3.3. REGOLATORE DIGITALE 37 (a) Corrente (b) Tensione Figura 3.12: PI digitale con forzante sinusoidale a 100rad/s Metodo 2: Rielaborazione del PI ottenuto dalle funzioni z Esaminiamo ora un altro modo per ottenere il regolatore PI digitale. Considerando l equazione 3.3, ne deriva che (z 1) v rif = ( ) T s K P (z 1) + K i (z + 1) e 2 e dividento tutto per z e facendo gli opportuni passaggi, si ottiene v rif = ( K p ( 1 z 1 ) K i T s 2 ( 1 + z 1 )) e + z 1 v rif da cui v rif (n) = ( K i T s 2 + K p ) e(n) + ( Ki T s 2 K p ) e(n 1) + v rif (n 1) e sostituendo K 1 = K i T s 2 + K p e K 2 = K i T s 2 K p si ottiene una relazione seguente: v rif (n) = K 1 e(n) + K 2 e(n 1) + v rif (n 1) Prima di scrivere il codice si osservi che il valore assunto dalle due costanti K 1 e K 2, per i valori K p e K i precedentemente calcolati e per il tempo di campionamento T s, è K 1 = = K 2 = = ed è subito chiaro che l integrale causa una variazione praticamente trascurabile ai due valori i quali risultano in modulo pressoché identici. Questa affermazione è tanto più vera se ora si procede con la digitalizzazione. Consideriamo subito di creare le macro che con opportuni shift logici realizzino i due numeri K 1 e K 2. Per raggiungere questo grado di precisione, le due macro diventano K1(e) ((e 1)+(e 1)) K2(e) ((e 1)+(e 2)+(e 3)+(e 4)+(e 5)+(e 6)+(e 7)+(e 8)+(e 9)+(e 10)+(e 11)) L ultimo shift è pari a 11 perché e, ossia l errore in ingresso alle due macro, è una variabile in base 12 bit e shiftare di 12 darebbe sicuramente contributo nullo. É chiaro che macro come K2 sono da evitare, sia perché il carico computazionale diventa tale da annullare (o ridurre) i benefici derivati dall introduzione degli

38 38 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI shift, sia perché ciò implica che un numero (e) deve valere almeno 2 12 perché esso venga valutato in modo utile dall ultimo shift. Tale valore difficilmente verrà raggiunto se si presuppone un corretto funzionamento del sistema di regolazione. Discorso analogo vale per gli altri shift con numero di bit almeno pari a 9. Come se non bastasse la macro K1 è chiaramente troncata in quanto il contributo del termine K i T s 2 è troppo piccolo. Da queste considerazioni è lecito pensare che il sistema non avrà una risposta fedele a quella ottenuta studiando il sistema in s, in z o semplicemente in come dimostrato dalla figura 3.13-a. Per eliminare i problemi appena esposti riguardanti il calcolo, si potrebbe pensare di approssimare il valore di K1 e K2 al valore 0.5 (ossia (e 1)) il che comporterebbe un errore trascurabile dal punto di vista del calcolo del coefficiente, ma ciò comporterebbe l annullamento del coefficiente integrale che, anche se piccolo, è fondamentale per avere precisione statica. La figura 3.13-b mostra l effetto legato a questa approssimazione. É chiaro che si potrebbe agire per tentativi per ridurre l errore a regime aumentando il coefficiente proporzionale oppure quello integrale, ma in entrambi i casi il sistema non avrebbe più la risposta ottenuta dal progetto nel tempo continuo. Riferimento (a) Approssimazioni di K1 e K2 Risposta libera del sistema Sistema tempo-continuo Sistema tempo-discreto (b) Annullamento Ki Sistema digitale Grafici ottenuti dalla simulazione R_L_04.mdl. Figura 3.13: Corrente con PI digitale a variabili discrete ossia int (metodo2). Detto questo, potrebbe sembrare che se il sistema lavorasse con grandezze a più alta precisione (float o double) questo problema potrebbe essere attenuato. Ciò tendenzialmente è vero come mostrato anche in figura 3.14, ma va sempre verificato onde evitare di scegliere processori con potenze di calcolo (e quindi costo) eccessivi. In figura 3.14-b è riportato l andamento della tensione che come si vede è a gradini in quanto l elaborazione viene comunque fatta su un segnale digitale intero proveniente dal convertitore AD. Va comunque notato che le operazioni compiute sono di moltiplicazione e accumulazione, operazioni che normalmente vengono eseguite da molti processori (anche a basso costo) con tempi di elaborazione non troppo elevati come per esempio i processori dspic30f o gli ADuC7000.

39 3.3. REGOLATORE DIGITALE 39 (a) Elaborazione in double di ingressi e regolazione (b) Particolera della tensione impostata dal regolatore. Riferimento Risposta libera del sistema Sistema tempo-continuo Sistema tempo-discreto Sistema digitale Grafici ottenuti dalla simulazione R_L_04.mdl. Figura 3.14: Corrente con PI digitale a variabili in doppia precisione double (metodo2). Il codice che permette di ottenere queste risposte è riportato negli algoritmi 3 e 4. Si noti che l algoritmo 4 può sembrare più corto e veloce del precedente algoritmo 3. In realtà ciò è normalmente falso soprattutto per micro-controllori a basso costo in quanto le operazioni sviluppate sono tutte in virgola mobile e quindi possono richiedere molti cicli di clock. Algorithm 3 Codice C del regolatore a variabili discrete. /***** DEFINIZIONI E VAR GLOBALI *****/ #define I_REALE u0[1] #define I_RIF u0[0] #define IUP 8095 /*occorre aumentare la soglia x avere la stessa risposta*/ #define IDW -IUP #define K2(e)((e< <1)+(e> >2)+(e> >3)+(e> >4)+(e> >5)+(e> >6)+(e> >7)+(e> >8)+(e> >9)+(e> >10)+(e> >11)) #define K1(e)((e< <1)+(e> >1)) int error, error_1=0; int out=0; /*************************************/ /***** PROGRAMMA *****/ int k1, k2; error = ((I_RIF - I_REALE)*8); if(error>=0) k1=k1(error); else k1=-(k1((-error))); if(error_1>=0) k2=k2(error_1); else k2=-(k2((-error_1))); out = +out + k1 - k2; error_1=error; if (out>iup) out=iup; else if(out<idw) out=idw; y0[0]=out; y0[1]=round((out)*100)/4096; /*********************/

40 40 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI Algorithm 4 Codice C del regolatore a variabili double. /***** DEFINIZIONI E VAR GLOBALI *****/ #define I_REALE u0[1] #define I_RIF u0[0] #define IUP 8095 /* occorre aumentare la soglia */ #define IDW -IUP #define K2(e)((e* )) #define K1(e)((e* )) int error, error_1=0; double out=0; /*************************************/ /***** PROGRAMMA *****/ error = ((I_RIF - I_REALE)*8); out = out + K1(error) - K2(error_1); error_1=error; if (out>iup) out=iup; else if(out<idw) out=idw; y0[0]=error; y0[1]=(out*100)/4096; /*********************/ Metodo 3: Rielaborazione del PI ottenuto dalla configurazione anti wind-up Si consideri la figura 2.2. Il sistema così sviluppato serve semplicemente per evitare l anti wind-up negli schemi tempo-continui. Nonostante ciò è possibile definire il regolatore in z e successivamente il regolatore digitale. Si consideri quindi il blocco della fase integrale (che d ora in poi verrà indicato con R I ) R I (s) = riportato nel dominio z applicando il metodo di Tustin R I (z) = s Ki K p z 1 K p = (1 b) z z b T s z+1 K i dove Introducendo i parametri K i T s b = K it s + K p g = 1 2 (1 b) e h = ( (1 b) ) (1 b) si ottiene R I (z) = g + h z b Il regolatore quindi può essere rappresentato come in figura 3.15.

41 3.3. REGOLATORE DIGITALE 41 Figura 3.15: Ridefinizione del PI con anti wind-up analogico discretizzato con bilineare di Tustin. Proseguendo si osserva che il blocco g può essere eliminato ponendo un blocco equivalente prima della saturazione come mostrato in figura 3.16-a. Successivamente si sposta il blocco 1 (figura 3.16-b). Considerando quindi che 1 b = figura 3.16-c ossia il regolatore in z. 1 g prima del nodo sommatore h 1 g e introducendo Γ = 1 2 T sk i + K p si ottiene lo schema in (a) Sostituzione di g con la relativa funzione d anello (b) Spostamento del blocco 1/(1-g) (c) Schema finale del PI discretizzato Figura 3.16: Riborazioni dello schema Dallo schema riportato in figura 3.16-c è possibile ottenere il regolatore digitale da implementare poi in SIMULINK. Osservando il blocco in retroazione all anello si può scrivere x r (z) = 1 b z b u(z) da cui x r(z) bz 1 = (1 b)z 1 u(z)

42 42 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI Ne consegue quindi la formulazione discreta x r (n) = bx r (n 1) + (1 b)u(n 1) (3.7) Chiaramente l uscita è definita come u(n) = x r (n) + Γe(n) (3.8) la quale poi dovrà essere limitata (saturata). In figura 3.17 sono riportati i due sottosistemi SIMULINK (file R_L_05.mdl) che realizzano il regolatore tempo-continuo e tempo-discreto in un modello simile a quello della figura 3.5. (a) PI anti wind-up tempo-continuo (b) PI anti wind-up tempo-discreto. Figura 3.17: Schemi dei sottosistemi tempo-continuo e tempo-discreto. Avendo già analizzato il comportamento dei regolatori senza anti wind-up, verrà ora abilitata la soglia che farà in modo che la tensione in uscita non superi, per esempio, 80V. In figura 3.18 sono riportati gli andamenti di corrente e tensione nel caso in cui la soglia sia attivata o disattivata. Come si nota la tensione tende a ridurre le prestazioni dinamiche, anche se la precisione statica non è alterata. (a) Tensione (b) Corrente. Grandezza non limitata Grandezza limitata Figura 3.18: PI con e senza anti wind-up. Basandosi sulle equazioni 3.7 e 3.8 e sostituendo i valori dei coefficienti del regolatore si ottiene b = b = Γ =

43 3.3. REGOLATORE DIGITALE 43 Approssimando i coefficienti come segue b = 1 1 b = 0 Γ = 2.5 sembra che non si commetta un grande errore. Ne deriva il codice riportato nell algoritmo 5. Algorithm 5 PI anti wind-up: Codice C SIMULINK. /*** MACRO E VARIABILI GLOBALI ***/ #define I_REALE u0[1] #define I_RIF u0[0] #define IUP 3277 /* 80/100*4096 */ #define IDW 0 #define B 1 /* */ #define B_1 0 /* 1-B= */ #define GAMMA(e)((e< <1)+(e> >2)) /* */ int error, error_1=0; int xr=0, out=0; /************************************/ /*** PROGRAMMA ***/ error=((i_rif)-(i_reale))< <3; xr=b*xr+b_1*out; if(xr>iup) xr=iup; else if(xr<idw) xr=idw; out=xr+(gamma(error)); if(out>iup) out=iup; else if(out<idw) out=idw; y0[0]=out; y0[1]=round(out*100)/4096; /*************************************/ Ne derivano quindi i risultati in figura Come si nota vi è un errore statico a regime, il che era prevedibile perché osservando il codice si nota che il termine integrale è tenuto in conto dal parametro 1 b il quale in questo caso è nullo. L unico modo per avere una risposta uguale a quella in fase di progetto è utilizzare variabili ad alta precisione come float, double o comunque intere ad almeno 32 bit come long int 4. (a) Corrente (b) Tensione Figura 3.19: Risposta PI digitale relativa all algoritmo 5. 4 Si ricorda che per MATLAB le variabili definite int hanno la stessa dimensione dei long int in quanto il compilatore è quello di default del sistema ossia il gcc (per Linux) il quale assegna la parola a 32 bit. Nei PIC, dspic e altri microcontrollori da 8 a 16 bit, int equivale a 16 bit, mentre long int a 32.

44 44 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI Ridefinendo le variabili in base 24 bit per poi riportarle a 12 bit nel calcolo dell uscita, si ottiene il codice riportato nell algoritmo 6. Da questo codice si ottengono i risultati riportati in figura Si osservi subito una cosa molto importante: dovendo lavorare con grandezze a 24 bit, l unico parametro da dover far variare è il termine Γ (ottenuto con la macro GAMMA) il quale verrà moltiplicato per 4096; questo fa in modo che l uscita out24 sia a 24 bit. Per quanto riguarda il valore delle macro B e B1, non devono essere moltiplicati per 4096 perché xr dipende da out24 che è già in base 24 bit; in altre parole xr eredita la base di out24. Infine out è ottenuto dividendo per 4096 il valore di out24 (effettuato tramite shift di 12 bit). Algorithm 6 PI anti wind-up con variabili a 32bit. /*** MACRO E VARIABILI GLOBALI ***/ #define B(e)((e)-(e> >13)) /* */ #define B1(e)((e> >14)+(e> >15)+(e> >16)) /* (1-b)*/ #define GAMMA(e)((e< <13)+(e< <11)+(e> >1)+(e> >4)) /* *4096 */ #define RDI 12 int error, error_1=0; long int xr=0, out24=0, out=0; /************************************/ /*** PROGRAMMA ***/ error=((i_rif)-(i_reale))< <3; if(xr>=0) xr=b(xr); else xr=-(b((-xr))); if(out>=0) xr+=b1(out24); else xr+=-(b1((-out24))); out24=xr+(gamma(error)); /* shift a SX, quindi non servono controlli */ if(out24>iup) out24=iup; /* Calcolo di out24 */ else if(out24<idw) out24=idw; out=out24> >RDI; y0[0]=out; y0[1]=round(out*100)/4096; (a) Corrente (b) Tensione Figura 3.20: Risposta PI digitale relativa all algoritmo Osservazioni e Confronti Premesso che la soluzione ottima non esiste e che ogni regolatore andrebbe analizzato per ogni specifica applicazione, è comunque possibile trarre delle conclusioni. Il primo metodo ( ) realizza del codice tendenzialmente molto voluminoso in quanto se vengono previsti degli shift logici (soprattutto se negativi) occorre effettuare un controllo sulla variabile in ingresso ad ogni macro. La macro di integrazione, poi, deve essere gestita definendo una variabile di appoggio che occorre passargli per evitare che prima di ogni shif della macro venga

45 3.3. REGOLATORE DIGITALE 45 calcolata continuamente la somma dell errore al passo attuale e al passo precedente. Infine, per evitare il sovraccarico dell integrale, occorre limitare il valore dell uscita e dell integrale stesso 5. Questo sistema ha però dei grandi vantaggi: permette infatti di modificare semplicemente i parametri del regolatore e le grandezze in esame possono essere gestite a 16bit (a parte l integrale che spesso va gestito con variabili a 32, anche se le operazioni svolte su di esso sono semplici somme o shift, ossia operazioni leggere in termini computazionali) generando quindi del codice tendenzialmente molto veloce. Il secondo metodo ( ) presenta fondamentalmente gli stessi inconvenienti del primo, con la differenza che tutte le grandezze vanno gestite (se necessario) con variabili maggiori di 16bit. Inoltre la modifica di un coefficiente interviene su entrambi i coefficienti K 1 e K 2 rendendo più complessa l affinazione dei parametri sul campo. Il terzo metodo ( ) è forse il più usato anche se, a detta di chi scrive, non è il migliore. É innegabile che progettare il regolatore tempo-continuo anti wind-up è una soluzione brillante e, dalla teoria sia dei controlli che dei filtri digitali, si è ereditato il fatto che se possibile si progetti il regolatore digitale partendo da quello tempo continuo. Ma ciò obbliga a ricalcolare tutto per arrivare a un risultato non differente dal caso Inoltre i coefficienti sono 3 appesantendo l esecuzione del codice, soprattutto se venissero realizzati con degli shift. Inoltre i valori calcolati devono necessariamente avere grande precisione anche a livello digitale per avere un andamento il più fedele possibile al progetto. D altro canto questo sistema ha il grande vantaggio di effettuare una sola saturazione sulla variabile di uscita; infatti limitando quest ultima si ottiene automaticamente la saturazione dell integrale (ossia l anti wind-up) risparmiando una comparazione Simulazione del Duty-Cycle Le simulazioni così progettate e implementate fino ad ora non tengono conto precisamente del duty-cycle. Infatti l uscita del sistema anche se deriva da valori digitali, ossia ha un andamento a gradini discreti, non simula appieno il fatto che il duty-cycle è una grandezza digitale con un preciso valore indipendente dalla base scelta per i conti, funzione del clock del sistema e della frequenza di PWM che si vuole generare in uscita. Si consideri a tal proposito un ponte ad H i cui gate vengono controllati con driver i quali ricevono un solo segnale in ingresso dal micro-controllore (PWM), ma pilotando entrambe le valvole di un ramo (come si vedrà nella sezione 4.1) semplicemente negando il segnale destinato al gate della valvola bassa rispetto a quello della valvola alta. La frequenza di PWM viene comandata con la variabile PDCx con x pari a 1 o 2 in funzione del ramo da controllare. Non ci si vuole addentrare ora nelle problematiche relative all implementazione su micro processore, quindi si assuma che una volta eseguiti i debiti calcoli indicati sul datasheet del processore, si ottenga che la variabile PDCx possa assumere per esempio valori compresi tra 0 e 736: essendo un ponte ad H si ha che quando PDC1=PDC2=368 la tensione media sul carico è pari a 0. A questo punto occorre prevedere che il sistema reale abbia un massimo valore di tensione di DCbus, per esempio 150V. Ciò vorrà dire che la tensione sul carico varierà in modo quantizzato con una risoluzione legata a PDCx pari a 150V/368=0,476V/digit. Detto questo, prendendo in considerazione uno dei metodi analizzati (per esempio il Metodo 1), nel programma di simulazione è quindi opportuno apportare una modifica tale per cui venga calcolata la tensione vera (ossia si moltiplica l uscita per 100/4096) e riportata al valore digitale di duty-cycle moltiplicando la tensione vera per 368/150, si divide la tensione vera per il massimo valore di tensione ammissibile in uscita (ottenendo così il duty-cycle in per-unità) e quindi moltiplicando per il massimo valore digitale del duty-cycle accettato dal micro-controllore. Si ottiene quindi la seguente costante: dc = = 0, In alcuni casi occorre anche limitare il proporzionale se molto alto.

46 46 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI il che si traduce nella macro GET_DC indicata nel codice riportato di seguito: #define I_REALE u0[0] #define I_RIF u0[1] #define VMAX 150 #define VMAXD 6144 #define DCMAX 368 /*MACRO*/ #define KP(e)((e< <1)+(e> >1)) #define KI(e)((e> >1)+(e> >4)) #define KIS 12 #define GET_DC(v)((v> >5)+(v> >6)+(v> >7)+(v> >8)+(v> >10)) short int error, error_1=0, proporzionale; int integrale=0; /********************************/ short int error_i, out, dc; error = ((I_REALE - I_RIF)< <3); proporzionale = KP(error); error_i=error+error_1; if(error_i>=0) integrale += KI(error_i); else integrale -= KI((-error_i)); error_1=error; out=proporzionale+(integrale> >KIS); if(out>vmaxd) out=vmaxd; else if(out<-vmaxd) out=-vmaxd; if(out>=0) y0[0]=(get_dc(out)); else y0[0]=-(get_dc((-out))); y0[1]=y0[0]*vmax/dcmax; /* Grandezza reale */ /**** Nel codice del micro ci sarà scritto circa quanto segue **** * PDC1=DCMAX+GET_DC(out); * PDC2=DCMAX-GET_DC(out); ******************************************************************/ In questo caso il sistema deve necessariamente prevedere una saturazione dell uscita 6 perché non è possibile dare un valore negativo o troppo elevato della grandezza PDCx. Il valore massimo digitale dell uscita è chiaramente il valore arrotondato all intero minore di 150V/100*4096 ossia Questa volta l uscita reale y0[1] è ottenuta moltiplicando per l inverso della nuova scala cioè per 150/368. Per quanto riguarda il commento finale, per il momento non si entrerà nel merito in quanto verrà ripreso più approfonditamente nel capitolo 4 in fase di sviluppo del codice C per micro controllore. I risultati ottenuti con il codice di cui sopra sono pressoché identici a quelli ottenuti nelle simulazioni precedenti. Si nota comunque un degrado dell informazione (tensione) in uscita come mostra il confronto tra le figure 3.21-a e 3.21-b. Ciò si traduce nell avere delle oscillazioni leggermente più marcate (ma sempre trascurabili come entità) nell intorno del valore di corrente di regime a causa del fatto che la minima variazione della tensione in uscita è aumentata (figura 3.22). 6 Le saturazioni fino ad ora sono state trascurate per motivi puramente didattici. Di norma dovrebbero sempre essere previste.

47 3.3. REGOLATORE DIGITALE 47 (a) Tensione i uscita senza l introduzione del duty-cycle (b) Tensione in uscita senza introducendo il duty-cycle Figura 3.21: Confronto tra tensioni in uscita dal regolatore. (a) Tensione a regime senza considerare il duty-cycle. (b) Tensione a regime considerando il duty-cycle. Figura 3.22: Confronto tra tensioni in uscita dal regolatore a regime Regolatore Digitale con metodo di integrazione dei resti Il metodo di gestione dell integrale utilizzato nella sezione 3.3 si basa sull utilizzo di variabili a 32 bit e di macro che scompongono i coefficienti reali in potenze di due. Nel capitolo 1, però, è stato menzionato un secondo metodo di gestione dell integrale che si basa sulla gestione dei resti (a pagina 12). Per completezza ora si vuole risolvere il medesimo problema con un metodo che tenga conto di un diverso sistema di integrazione basato appunto sulla gestione dei resti per vedere le differenze anche dal punto di vista computazionale. L algoritmo che verrà presentato è quello relativo al Metodo 1 ( ). In questo caso però si considera il coefficiente integrale pari a K I T s 2 = 1, senza maggiorarlo di Rifacendosi all implementazione vista nel capitolo 1 riguardo la gestione dei resti, occorre definire due macro di integrazione come INTEGRALE_H e INTEGRALE_L. In questo caso il primo è chiaramente nullo, in quanto K I T s 2 è minore di 1, e il secondo deve tenere conto dei decimali. Detto ciò, per fare incrementare di una unità la variabile inth occorrerebbe che la variabile intl raggiunga il valore 2 (K I T s ) 1 = 7272, 7: tutto ciò rende per tanto inutile anche la definizione della macro

48 48 CAPITOLO 3. MODELLISTICA DEL REGOLATORE PI INTEGRALE_L a causa del fatto che occorre valutare tutta la somma error+error_1 ossia senza effettuare mascheramenti e/o shift. Il codice proposto è il seguente: #define I_REALE u0[0] #define I_RIF u0[1] #define INT_UNIT 7273 /* minimo valore corrispondente al superamento dell unità*/ #define KP(e)((e< <1)+(e> >1)) short int error, error_1=0, proporzionale; short int inth=0, intl=0; /* short int in Simulink sono 16 bit */ / / short int out, dc; error = ((I_REALE - I_RIF)< <3); proporzionale = KP(error); intl += error+error_1; if(intl>=int_unit) { inth++; intl-=int_unit; else if(intl<=-int_unit) { inth--; intl+=int_unit; error_1=error; y0[0]=proporzionale+(inth); y0[1]=round(y0[0]*100)/4096; Analizzando il codice si vede che le variabili sono tutte a 16 bit. intl non è altro che l integrale dell errore attuale più il precedente; quando intl supera il valore di +7273, la variabile inth deve incrementarsi di una unità, mentre se intl è minore di -7273, allora inth si decrementerà. Nel momento in cui si calcolerà l uscita y0[0], la variabile inth non viene più shiftata perché rappresenta già il valore corretto nella base scelta. I risultati sono riportati in figura 48; la risposta è perfetta, senza sovra-elongazioni e con errore a regime trascurabile (figura 48-b). Il codice così scritto sembra più semplice e veloce di quelli scritti in precedenza e ciò è tendenzialmente vero, ma solo in questo caso. In generale infatti si potrebbero avere più operazioni per ottenere la variabile inth (per esempio nel caso in cui il coefficiente di integrazione sia maggiore di 1) il che comporta un aumento anche notevole del carico computazionale. In altre parole ciò dimostra che non esiste una soluzione migliore o peggiore, ma tutte le strategie proposte andrebbero studiate e valutate in ogni specifico caso. (a) Risposta al gradino (b) Dettaglio della risposta al gradino Figura 3.23: Integrazione con il metodo dei resti.

49 Capitolo 4 Implementazione di un regolatore PI L obiettivo è sviluppare un regolatore PI su micro-controllore affrontando le varie problematiche relative alle scelte hardware e software. 4.1 Regolatore PI su processori dspic30f Il processore che verrà utilizzato è il dspic30f4012. Il codice che verrà scritto, comunque, potrà essere tranquillamente usato su tutti gli altri dspic, salvo il fatto che devono esserci le stesse periferiche. Hardware del sistema di controllo Per prima cosa occorre conoscere il sistema che si vuole controllare e realizzarne il modello. Supponiamo per semplicità che il modello sia come quello trattato al capitolo 3, ossia un carico R-L e che si voglia tenere sotto controllo la corrente in detto induttore. L azionamento che ci permette di fare ciò può essere per esempio un ponte ad H o più semplicemente un chopper. In questo esempio sceglieremo un ponte ad H in quanto richiede qualche accorgimento in più rispetto al chopper. Inoltre il ponte H permetterà di valutare la risposta in frequenza e di seguire riferimenti sinusoidali (o comunque riferimenti che possono essere anche negativi). Ad ogni modo tutta la trattazione può essere portata semplicemente anche su un chopper. Le potenze in gioco sull azionamento sono normalmente molto più elevate rispetto a quelle dell elettronica di controllo la quale si dovrà interfacciare con le valvole 1 del ponte H (o del chopper) con opportuni sistemi detti driver i quali pur ricevendo un segnale normalmente in logica TTL a 0-5V riescono a generare un impulso di correte sul gate delle valvole tale da attivarle in un tempo ragionevolmente basso e portarle in conduzione. La tensione dei driver è spesso diversa sia da quella dell elettronica che da quella del circuito di potenza (nel caso seguente 15V). Questa tensione è legata alla caratteristica di gate della valvola da controllare. Infine vi è il micro controllore e i sensori i quali normalmente sono alla stessa tensione pari a 5V. L hardware scelto è quindi il seguente: MDA 990 Ponte raddrizzatore a diodi (MOTOROLA). Dovrà essere alimentato da un variac monofase. Si vuole raggiungere la tensione media a vuoto di 100V sul DC-bus. 1 Per valvole si intendono dispositivi generici a semiconduttore che possono essere controllati come interruttori. In questo caso si assumono come valvole gli IGBT ossia dispositivi che permettono una rapida interruzione di valori anche molto elevati di corrente come le SKM100GB di SEMIKRON. 49

50 50 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI SKM100GB IGBT SEMIKRON da 1200V 100A alla frequenza di commutazione di 10kHz ad una temperatura di giunzione pari a 25 C. Per come è stato pensato il circuito (anche in relazione al tipo di driver) occorre considerare un tempo morto tra la commutazione delle due valvole di uno stesso ramo non inferiore a 2,5µs 2. In figura 4.1 è riportato lo schema di un ponte H. Figura 4.1: Ponte H. IR21844 Driver International Rectifier che permette di generare impulsi di corrente in attivazione dell ordine di 1,4A. Inoltre è possibile agire sul tempo morto da dare alle valvole senza bisogno di agire via software andando ad agire sulla resistenza connessa tra il pin DT e Vss. Lo schema in figura 4.2 mostra la tipica connessione di questo driver il quale richiede un circuito di bootstrap. Il circuito reale presenta anche dei diodi in parallelo alla resistenza posta tra il gate della valvola e il driver in modo da poter avere un impulso di entità maggiore in fase di spegnimento. Questo tende a ridurre molto i tempi morti. Figura 4.2: Tipica connessione del driver IR LTS25NP Sensore a effetto HALL le cui caratteristiche sono state descritte nella sezione 3.3. Le figure 4.3-a e 4.3-b riportano la scheda realizzata (completa di ponte raddrizzatore e valvole) il cui schematico è rappresentato in figura 4.4, utile per capire quali dispositivi sono collegati al microcontrollore e facilitare la lettura del programma. Chiaramente la scheda riportata ha molti altri dispositivi i quali non verranno esaminati in questa sede. 2 Valore ottenuto dalle prove sulla valvola interrompendo correnti di circa 30A a 20kHz

51 4.1. REGOLATORE PI SU PROCESSORI DSPIC30F (a) Ponte H (b) Scheda di controllo NOTA: i diodi e i pulsanti sono gestiti in logica inversa ossia 0 = ON, 1 = OFF. Figura 4.3: Dispositivo realizzato. 51

52 52 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI Figura 4.4: Schematico della scheda di controllo.

53 4.1. REGOLATORE PI SU PROCESSORI DSPIC30F 53 Strategia di controllo Per prima cosa si consideri il riferimento impostato direttamente all interno del processore (quindi non da dispositivi esterni ai quali il processore sia eventualmente interfacciato) pari a un valore costante. L obiettivo è di ottenere sul carico un valore di corrente costante pari al riferimento. Questo implica che il ripple deve essere il più ridotto possibile. Per ottenere questo, il ponte H verrà controllato in modo che i due duty-cycle dei due rami del ponte siano tali per cui δ 1 = 1 δ 2 come indicato in figura 4.5. Figura 4.5: Controllo PWM con portante triangolare. Ciò permette di avere sul carico una frequenza pari al doppio di quella di commutazione delle valvole. Periferiche richieste Le periferiche necessarie per effettuare il controllo di corrente sono: PWM ADC PORTx TIMERx (Pulse Width Modulation) è l impulso che attiva o disattiva le valvole e permette la regolazione della tensione media sul carico. (Analog to Digital Converter) convertitore analogico-digitale per poter acquisire le grandezze. (Porte) Porte I/O digitali (o analogiche se ingressi per ADC) per usi generali. (Temporizzatori) eventuali temporizzatori per gestire alcuni eventi. Non dovrebbero servire in questa prima applicazione. Altre periferiche come Seriale UART, CAN, Output Compare, ecc non verranno analizzate, anche se possono essere molto utili per prelevare informazioni dal micro-processore e quindi effettuarne il monitoraggio e il debug Sviluppo del regolatore in codice C Il codice che si andrà a implementare è scritto in C orientato al compilatore C30 fornito da MICROCHIP. Prima di procedere alla scrittura del codice occorre inizializzare le periferiche precedentemente elencate. Tutte le informazioni sulla famiglia dspic30f sono ottenibili dal manual family [4]. Si osservi infatti che il datasheet del singolo processore è approssimativo e documenta esclusivamente il comportamento delle varie

54 54 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI periferiche. Ciò che invece serve in questo momento è conoscere tutti i flags e registri che occorre settare per impostare il corretto funzionamento delle periferiche integrate 3. Il programma verrà strutturato nei seguenti file: global.h init.h init.c pi.h main.c definisce le principali variabili e definizioni di costanti comuni a tutti i files. file di intestazione delle funzioni di inizializzazione. Contiene le dichiarazioni delle funzioni di InitPORT(), InitPWM(), InitADC() ed eventuali macro. file C di implementazione delle funzioni di inizializzazione. file di intestazione contenente le dichiarazioni e macro necessarie per effettuare la routine di regolazione. file C principale. Contiene la funzione main e le funzioni di interrupt. Temporizzazioni e dead-line Una fase molto importante è decidere le temporizzazioni e scadenze temporali. Ciò è fondamentale perché per garantire il real-time occorre essere certi che le operazioni vengano eseguite correttamente e nei tempi stabiliti. Ora occorre scegliere la frequenza di commutazione delle valvole. Da datasheet la frequenza nominale è 10kHz, ma possono funzionare anche a frequenze molto più alte a patto che la corrente da interrompere sia inferiore alla nominale. Si sceglie una frequenza di 20kHz. Per essere precisi occorrerebbe valutare anche la frequenza ammissibile del driver, la quale normalmente è molto alta (nell ordine dei 100kHz) e non costituisce un problema. A questo punto occorrerebbe valutare quanto il sistema impiega per eseguire le operazioni basilari (shift, moltiplicazioni, somme, if..else, ecc). Si consideri in linea del tutto indicativa che un dspic30f con un quarzo da 7,37228 MHz difficilmente supera i 2,4µs/PLL 4 per operazioni su variabili int a 16 bit. Questo permette di stimare i tempi di calcolo. Detto questo, dato il quarzo da 7,37228 MHz posto sulla scheda si sceglie di lavorare con un PLL di 8 che porta la frequenza di clock a 58,9MHz (figura 4.6). Frequenze più alte fanno assorbire molta corrente al processore 5 il quale tende a scaldarsi e spesso a degradare le prestazioni. Rimangono ora da definire le scadenze temporali. Sicuramente il sistema di controllo vero e proprio verrà asservito all ADC, ossia la routine di controllo dovrà essere eseguita ogni volta che l ADC avrà campionato un nuovo valore. A sua volta il convertitore sarà asservito al PWM il quale andrà ad attivare il convertitore AD ad intervalli regolari di 50µs (pari al reciproco della frequenza di commutazione delle valvole) o multipli: ciò definisce la base dei tempi di integrazione. Questa gestione dell ADC e PWM con portante triangolare è particolarmente vantaggiosa perché permette di andare a campionare il valore della corrente nel punto centrale dell intervallo ON o OFF del PWM; questo valore è pari al valore medio nell intervallo della corrente. Rifacendosi alla figura 4.5 si noti che è possibile fare scatenare gli eventi di ativazione dell ADC e/o gli interrupt a uno o entrambi dei due vertici della triangolare. A questo punto occorre valutare che la routine che si vuole implementare (definita nelle simulazioni) abbia un carico computazionale minore o al più uguale all intervallo di tempo che avviene tra l evento di fine conversione dell ADC e l istante di aggiornamento del duty-cycle del PWM. Per fare ciò il metodo più semplice è implementare il codice, eseguirlo senza collegare l hardware di potenza alla scheda e misurare per esempio il 3 Si noti che ciò non è vero per i pic i quali hanno datasheet completi per ogni processore. 4 il PLL è un coefficiente moltiplicativo che può assumere i valori x1, x4, x8, x16. 5 Si consideri che con PLL=1 il dspic assorbe a vuoto circa 15 20mA contro i mA con PLL=16.

55 4.1. REGOLATORE PI SU PROCESSORI DSPIC30F 55 cambiamento di stato di un pin con un oscilloscopio. Si noti che indicativamente il tempo di elaborazione di un PI implementato con questo processore, a queste frequenze e con le modalità descritte, impiega dai 4,5 ai 6 µs per essere eseguito. Configurazione delle periferiche Per la configurazione delle periferiche, in funzione di quanto detto in precedenza e in funzione del layout della scheda (figura 4.3-b), le porte B (PORTB) devono essere configurate come ingressi analogici per permettere all ADC di effettuare il campionamento in modo corretto; le porte D (PORTD) sono invece configurate come input (collegate ai pulsanti), mentre le porte E (PORTE) alle quali sono connessi i diodi led vanno settate come uscite, mentre quelle relative al PWM non ha importanza in quanto se un pin ha una funzione ulteriore oltre a quella di semplice porta I/O, il device ulteriore è dominante rispetto a quello di semplice porta. L ADC va configurato in modo che venga letto solo un canale (ossia il segnale proporzionale alla corrente dato dal sensore) e il risultato posto nel buffer 0 (ADCBUF0) e deve generare un interrupt (_ADCIE=1) alla fine di ogni conversione; la chiamata all interrupt richiesto dall ADC (interrupt subroutine _ADInterrupt()) sarà la routine di regolazione vera e propria (PI). La temporizzazione del sample&hold+conversione è, come detto, legata al PWM. Il PWM è configurato per lavorare a 20kHz, ossia occorre definire la variabile PTPER, che identifica il periodo, ottenibile da datasheet come segue: PTPER = 1 2 ( ) Fosc 4 P LL = = 368 (4.1) f desiderata Il valore così calcolato è per portante triangolare e il numero deve essere l intero troncato per difetto. Si noti che questa variabile è a 15bit, mentre il duty-cycle è a 16bit (_PDCx dove x è 1, 2, o 3) e il valore massimo impostabile è doppio rispetto a _PTPER. I tre moduli PWM devono essere indipendenti. Infine si noti che il PWM sul microcontrollore può controllare sia la valvola alta che quella bassa di un ramo di inverter. La logica del segnale PWM in uscita dai pin specifici è condizionata dai flag High-side/Low-side PWM Output Polarity di configurazione di figura 4.6. Figura 4.6: Configuration bits del dspic30f4012.

56 56 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI Codice C Si consiglia di leggere il codice seguente tenendo sempre a portata di mano [4], quanto meno per capire quali sono le procedure necessarie per la configurazione e la gestione delle periferiche. ======================= global.h #ifndef GLOBAL_H # define GLOBAL_H #include <p30f4012.h> #define ON 1 #define OFF 0 /* Logica di controllo dei LED inversa */ #define LED_VERDE_ON _RE5=0b0 #define LED_VERDE_OFF _RE5=0b1 #define LED_ROSSO_ON _RE4=0b0 #define LED_ROSSO_OFF _RE4=0b1 #define CLOCK // Clock esterno, come slle schede di valutazione #define NBIT 12 #define NBIT2 13 #define NBASE 4095 #define NBASE #define NBASE #define NBASE //in realtà 2^24= #define FREQ //20KHz #define PER //Periodo #define PERIODO (int)368 #define DUTYCYM (int)736 //DC massimo in unipolare singola gamba #define DUTYCY PERIODO //DC massimo in unipolare doppia gamba #define OFFSET_I 512 //Offset delle correnti per riportarle allo 0 #define CORRENTEP ADCBUF0 //Primo buffer contenente il valore della corrente digitalizzato #endif // GLOBAL_H ======================= init.h #ifndef INIT_H # define INIT_H #define TRIGGER_AD_PWM #define TRIGGER_AD_TMR3 #define TRIGGER_AD_AD #define CHANNEL4 0b11 #define CHANNEL2 0b01 0b011 0b010 0b000 #define CHANNEL1 0b00 extern void InitTIMER(unsigned int nstep); extern void InitPORT(); extern void InitPWM(int nleg, unsigned char interrupt_enable); extern void InitAD(unsigned char trigger_ad, unsigned char ADCS_delay, unsigned char ingresso, unsigned #endif // INIT_H ======================= init.c #include "init.h" #include "global.h" #include <p30f4012.h> /** InitPORT **/ void InitPORT() { TRISD=0x0000; PORTD=0xFFFF; TRISB=0xFFFF;

57 4.1. REGOLATORE PI SU PROCESSORI DSPIC30F 57 TRISE=0x0080; //setto come input solo il pulsante PORTB=0xFFFF; PORTE=0xFFFF; //Sulle mie schede i led e i pulsanti sono in logica inversa ADPCFG=0x0000; //Specifica che PORTB, se configurato come input, è analogico /** Inizializza il PWM ** Il parametro in ingresso nleg determina quante gambe voglio abilitare in modo indipendente, mentre interrupt_enable indica se voglio abilitare l interrupt ************************/ void InitPWM(int nleg, unsigned char interrupt_enable) { PTPER=PERIODO; //PWM Time Period register 15bit (Fquarz/4*PLL8)/(2*Freq desiderata). Attenzione _PTMO PTCONbits.PTMOD=0b10; //Free Running Mode=00, Continuous Up/Dw=10. Attenzione: il periodo complessivo PTCONbits.PTOPS=0b0000; //Postscaler PTCONbits.PTCKPS=0b00; //Prescaler PTCONbits.PTSIDL=0b0; PTCONbits.PTEN=0b1; //Abilitazione (e attivazione) del PWM PWMCON1=0x0000; //Inizialmente azzero tutto il registro per precauzione if(nleg>0) { PDC1=0; //duty cycle per PWM1 16bit, quindi duty=50%->pdcx=ptper PWMCON1bits.PMOD1=0b1; //Indipendent mode 0=off, 1=on PWMCON1bits.PEN1H=0b1; //Abilito la gamba alta PWMCON1bits.PEN1L=0b1; //Abilito la gamba bassa if(nleg>=2) { PDC1=DUTYCY; //se 2 è perché controllo il ponte ad H PDC2=DUTYCY; //duty cycle per PWM1 16bit, quindi duty=50%->pdcx=ptper PWMCON1bits.PMOD2=0b1; //Indipendent mode 0=off, 1=on PWMCON1bits.PEN2H=0b1; //Abilito la gamba alta PWMCON1bits.PEN2L=0b1; //Abilito la gamba bassa FLTACON=0x0000; _PWMIF=0; _PWMIE=(interrupt_enable&0x1); //Abilito o no l interrupt /** Inizializza l ADC **/ void InitAD(unsigned char trigger_ad, unsigned char ADCS_delay, unsigned char ingresso, unsigned char ch /* Le tabelle di configurazione sono da pagina 420 in poi del Manual Family. */ ADCHS=0; ADCHSbits.CH0SA=ingresso&0x0F; //numero di ingressi da campionare AN0->CH1=>ADCBUF1, AN1->CH0=>ADCBUF _SIMSAM=0b1; //se 1 -> simultaneous sampling _SMPI=0b000; //0=Interrupt dopo ogni campionamento e si riparte dal buffer 0 a scrivere, 1=interrupt switch(trigger_ad){ case TRIGGER_AD_PWM: _SSRC=TRIGGER_AD_PWM; //gestito da PWM = 011 break; case TRIGGER_AD_TMR3: _SSRC=TRIGGER_AD_TMR3; //gestito dal timer break; default: _SSRC=TRIGGER_AD_AD; //tutto gestito dall AD=111, _ASAM=0b1; //Automatic sample _CSCNA=0b0; //Disabilito lo scanning dei sample/hold se 0 _ALTS=0; //Alternate MUX Sampling: se 0 il multiplexer è sempre impostato si A ADCON2bits.CHPS = channel&0x03; //Scelta del canale: 00=S/H su CH0, 01=S/H su CH0 e CH1, 1x=CH0,1,2,3 //---Questi sono flag del PWM---// SEVTCMPbits.SEVTCMP=0; SEVTCMPbits.SEVTDIR=0b0; _SEVOPS=0b0000; //0=Evento per l ADC ogni intervallo di PWM, 1=conversione AD ogni 2 PWM, ecc // // ADCON3bits.SAMC = 1; //tempo minimo di sample ADCON3bits.ADCS = ADCS_delay&0x3F; //Setta il minimo tempo per la conversione A/D. ADPCFGbits.PCFG0 = 0; ADPCFGbits.PCFG1 = 0; ADPCFGbits.PCFG2 = 0; _ADIE=1; //Abilito l interrupt _ADIF=0;

58 58 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI _ADON=0b1; //Attivo l ADON ======================= pi.h #ifndef PI_H # define PI_H /********** REGOLATORE DI CORRENTE ***********/ #define CURRENT_BASE 100 //lem da 25A con una spira ->100A teorici, 80 in saturazione #define OFFSET_CURRENT 512 #define INITIAL_CURRENTR 0 //eventuale valore iniziale dell integrale #define CURRENT_RIF 2048 //2048->50A /***** PI di corrente *****/ #define INTEGRALEI(e)((e> >1)+(e> >4)) #define RID_IP 12 #define TKIUPI NBASE24 // sarebbe più corretto #define TKIDWI -NBASE24 // sarebbe più corretto // // #define PROPORZIONALEI(e)((e< <1)+(e> >1)) #define TKPUPI NBASE //KP threshold up #define TKPDWI -NBASE //KP threshold down #define VDUP 3276 // limito superiormente l uscita a ~ 80V #define VDDW // limito inferiormente l uscita a ~ -80V /********** CHECK DUTY-CYCLE *************/ #define DCUP 699 //perdo il 5% della tensione che perdo x colpa dei tempi morti #define DCDW 37 /********** MACRO DI RIPORTO DEL DC **************/ #define V_OFFSET 4095 #define GET_DC(v_digit)((v_digit> >4)+(v_digit> >6)+(v_digit> >7)+(v_digit> >8)) #endif // PI_H In questo file vengono definite le principali costanti relative al regolatore PI. Meritano però una breve considerazioni le definizioni delle soglie relative al duty-cycle: si osservi infatti che il valore minimo e il valore massimo sono rispettivamente il 5% e il 95% del valore massimo della variabile PDCx. Ciò è dovuto al fatto che è bene non far avvenire due commutazioni troppo ravvicinate. Infatti se per esempio il duty-cycle fosse del 99% per più di un ciclo si avrebbe la commutazione di una valvola (per esempio in spegnimento) e dopo / ns si avrebbe un altra commutazione. Commutazioni troppo ravvicinate possono danneggiare irreparabilmente il driver. Ciò è solo una precauzione nel caso le soglie VDUP e VDDW vengano modificate inavvertitamente in modo errato. Si noti che per quanto riguarda l integrale, la soglia corretta da porre sarebbe quella di 80/ = ======================= main.c #include <p30f4012.h> #include "global.h" #include "init.h" #include "pi.h" /***** Global *****************/ int errori,errori_1; //errore ed errore precedente int riferimentoip=current_rif; long int integraleip; //24bit+1bit di segno int correnteip; //12bit+1bit di segno long int vd_out; //variabile in base 12bit+1bt di segno /********************************** MAIN **********************************/ int main() {

59 4.1. REGOLATORE PI SU PROCESSORI DSPIC30F 59 InitPORT(); //Inizializzo le porte InitPWM(2,OFF); //Abilito due gambe del PWM, ma senza abilitare l inerrupt LED_VERDE_ON; while(_re8); //Fino a che resta tutto in stop o non premo RE8 non fare nulla Nop(); while(!_re8); //Se rilascio il pulsante parte il sistema LED_VERDE_OFF; InitAD(TRIGGER_AD_PWM,10,0,CHANNEL1); //Abilito l AD asservendo l evento di conversione al PWM e camp LED_ROSSO_ON; while(1); //Entro nel ciclo infinito per evitare il reset del micro. Tutto il controllo verrà gestito /**************************** Interrupt SubRoutine ****************************/ void _ISR _ADCInterrupt() { //Sintassi della routine di interrupt dell ADC int dc, errorii; _RD0=1; //Flag per la misura dei tempi di esecuzione. Può essere omesso. /*************************************************** REGOLATORE DI CORRENTE: metodo dei trapezi ***************************************************/ correnteip=((correntep-offset_i))< <3; //riporto la corrente a 12bit errori=(riferimentoip-correnteip); //calcolo l errore //INTEGRALE: errorii=errori_1+errori; //errore x l integrale=errore attuale + errore precedente if(errorii>=0) integraleip+=integralei(errorii); else integraleip-=integralei((-errorii)); //PROPORZIONALE: vd_out = PROPORZIONALEI((errorI))+(int)(integraleIp> >12); if(vd_out>vdup) vd_out=vdup; else if(vd_out<vddw) vd_out=vddw; /*************************************************** USCITA riportata sul DC ***************************************************/ vd_out+=v_offset; //porto il valore da 0 a 8191 (->13bit) dc=get_dc(vd_out); if(dc>dcup) dc=dcup; //Controllo precauzionale sul DC else if(dc<dcdw) dc=dcdw; PDC2=dc; PDC1=DUTYCYM-dc; /*********************************************** TRATTAMENTO FINALE DELLE VARIABILI ***********************************************/ if(integraleip>tkiupi) integraleip=tkiupi; else if(integraleip<tkidwi) integraleip=tkidwi; errori_1=errori; _ADIF=0; _RD0=0; _RD0=0; //Flag per la misura dei tempi di esecuzione. Può essere omesso. Osservando il codice si vede che a parte la fase di inizializzazione dei devices del micro processore, il resto è molto simile a quanto modellizzato in SIMULINK. La parte più importante è la routine di interrupt invocata dal convertitore AD. Come si vede il sistema calcola l errore di corrente a 12bit. Il riferimento è pari a 2047 che corrisponde a 50A. Successivamente viene calcolato l integrale e il proporzionale. Si noti che il primo viene condizionato tramite opportuni costrutti if che servono ad evitare gli errori legati agli shift negativi (sezione 1.3), mentre il proporzionale no; questo perché il primo shift del proporzionale è ha sinistra e dello stesso valore di quello destro, quindi il risultato presenta un errore sensibile solo se il dato in ingresso vale -1. In più il proporzionale non ha memoria e quindi non accumula errori. Inoltre il proporzionale non viene saturato perché l errore massimo che può essere letto è di 2048 che moltiplicato per 2,5 dà Ammettendo che l integrale (opportunamente shiftato) sia pari a 4096, la loro somma è inferiore a 2 15 ; in altre parole non vi è l overflow della variabile intera con segno a 16 bit. Una volta calcolata l uscita, essa viene saturata a 3276 che corrisponde a

60 60 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI 80V (per rispettare la simulazione). Successivamente il duty-cycle viene ottenuto dalla tensione in scala (ossia 13 bit) e nuovamente saturato. Questa soglia di saturazione viene posta solo per completezza per evitare che il sistema dia un duty-cycle del 100% (o prossimo al 100%) il che può danneggiare il driver. Conviene quindi prevedere un 5% di tensione in meno del valore massimo e minimo. É chiaro che tutto ciò potrebbe essere tenuto in conto nella saturazione della variabile vd_out. Per riportate la tensione espressa in scala 13 bit sul duty-cycle espresso in scala occorrerebbe dividere per 2 13, moltiplicare per la corrente massima di riferimento (100A), dividere per la tensione massima di DC-bus (100V) e moltiplicare per 736: δ = vd_out = il che corrisponde alla macro GET_DC. Il numero in ingresso alla macro è sempre positivo e quindi non ha bisogno di controlli sulla variabile. L ultima parte della routine di controllo serve per limitare l integrale. La posizione più corretta per effettuare la saturazione è subito dopo il calcolo dell integrale. Il fatto che venga posta alla fine è solo a titolo di esempio in quanto si preferisce aggiornare il duty-cycle il più presto possibile. In questo esempio ciò non comporta nessun beneficio perché i tempi di calcolo sono molto più bassi del periodo del duty-cycle. Potrebbe invece avere effetti positivi se i tempi fossero maggiori di questo periodo, o se il campionamento non fosse sincrono con gli eventi di PWM. ====================== 4.2 Controllo di tensione In questo capitolo verrà affrontato lo sviluppo di un regolatore mediante processore PIC16F684. Premesso quanto detto nei capitolo precedenti, si cercherà di realizzare un regolatore PI per la simulazione di un controllo di corrente. Per fare ciò si utilizzerà la demoboard PICKIT2 (e relativo programmatore PICKIT2) di MICROCHIP. Alla scheda verrà connesso un circuito RC (R=1KΩ, C=1µF elettrolitico) il quale viene alimentato direttamente dal PWM del micro controllore retroazionando la tensione sul condensatore la quale verrà acquisita dal convertitore analogico-digitale. É chiaro che se R e C sono scelti adeguatamente è possibile avere un circuito RC che presenta la stessa costante di tempo di un circuito RL. Chiaramente ciò che verrà tenuto sotto controllo non è la corrente, ma la tensione sul condensatore in quanto quest ultima presenta lo stesso andamento della corrente. Scegliendo opportunamente R e C sarebbe possibile anche avere anche la stessa risposta (in termini di dinamica) di un eventuale sistema R-L da simulare. G RL (s) = 1 R L s L G RC (s) = 1 + src R L se R = 1 C = L/R L In figura 4.7 è riportato lo schema di connessione del circuito RC alla demo board PicKit2 il cui datasheet è [7] disponibile su [L3]. Il vantaggio principale di ciò è che il micro processore realizza contemporaneamente il sistema di controllo, l attuatore e il sensore senza bisogno di collegare altri dispositivi esterni. Esaminando [7] si osserva che la scheda non presenta un clock esterno, quindi il micro processore dovrà necessariamente utilizzare il proprio oscillatore interno (frequenza nominale 4MHz); questi tipi di oscillatori non sono precisissimi quindi le formule descritte in [8] per il calcolo del PWM potrebbero non essere affidabili. É consigliabile quindi andare a misurare con un

61 4.2. CONTROLLO DI TENSIONE 61 (a) Connettore dei pin disponibili (da datasheet della demo board PicKit2) (b) Circuito R-C e relative connessioni alla demo board. Figura 4.7: Schema di collegamento del circuito RC ai pin accessibili della scheda di valutazione PICKIT2 DEMO. oscilloscopio la frequenza di PWM che, in questo caso, verrà impostata alla massima possibile e pari a 3,9kHz. Tale frequenza sarà anche quella di campionamento Progetto e implementazione del regolatore Il progetto del regolatore resta pressoché invariato rispetto a quanto detto nei capitoli 2 e 3. Si consideri quindi un margine di fase di 90 e una banda passante di 1500 rad/s. Ne conseguono K P =1,5 e K I =1500. Implementando il regolatore in digitale si ha che il coefficiente di integrazione KI sarà pari a: KI = K I T S 2 = = mentre KP resta pari a K P. Il codice si sviluppa quindi nei seguenti files: main.c init.h init.c file principale contenete la funzione main, le macro del regolatore e le funzioni di interrupt file contenente i prototipi delle funzioni file di implementazione delle funzioni definite in init.h Configurazione del processore e relative periferiche I bit di configurazione del processore devono essere settati come segue: watchdog disabilitati, clock interno (Internal RC clockout) e Master Clear Enabled (figura 4.8). Per quanto riguarda le periferiche, ciò che serve è la configurazione delle porte I/O le quali vanno definite come output per le porte C (PORTC) alle quali sono collegati i led della demo board, e come input analogico la porta 1 delle porte A (RA1). L ADC dovrà essere configurato in modo da leggere l ingresso analogico su RA1. Si sceglie di usare solo gli 8 bit più significativi quindi il risultato del campionamento dovrà essere giustificato a sinistra ossia resettando il bit ADFM. Il PWM è gestito tramite il timer 2 grazie al quale è possibile definire il periodo di PWM e il numero di periodi che devono trascorrere perché venga generato l interrupt. La configurazione è tale per cui si vuole ottenere la massima frequenza di PWM e un interrupt ad ogni periodo quindi postscaler e prescaler verranno azzerati (almeno inizialmente). Il duty-cycle è una grandezza a 10 bit i cui 8 bit più significativi sono contenuti nella variabile CCPR1L. Gli altri due bit verranno mantenuti a 0.

62 62 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI Figura 4.8: Configuration bits per processore pic16f684 (da MPLab). Codice C Si consiglia di leggere il codice seguente tenendo sempre a portata di mano [8], quanto meno per capire quali sono le procedure necessarie per la configurazione e la gestione delle periferiche. La base scelta per i calcoli è 8 bit. ESEMPIO N 1: ======================= init.h #ifndef INIT_H #define INIT_H extern void InitPORT(void); extern void InitTIMER2(void); extern void InitPWM(void); extern void InitAD(void); #endif // INIT_H //porte //x controllo PWM //set pin PWM + event trigger AD //config AD ======================= init.c #include "init.h" #include "htc.h" void InitPORT() { ANSEL=0x03; TRISA=0b ; TRISC=0x00; PORTC=0; CMCON0=0xFF; //se non metti questo le ANx assumono valori assurdi!!!! /**************************** PWM: Per capire come i tempi impostati nel timer 2 siano correlati al PWM e come configurare le porte, s Si noti che per fare il ponte ad H occorre settare P1M=0b10 (vedere in [8] figura 11-6) ****************************/ void InitPWM() { //riferirsi a CCP1CON CCP1CON=0x00; //azzero tutto per sicurezza P1M1=0b1; P1M0=0b0; //01=Full bridge foreward. 10=Half bridge (comando 2 valvole) CCP1M3=0b1; //1100=P1A,C,B,D attive alte CCP1M2=0b1; //1101=P1A,C attiveh, B,D attiveb //in altre parole B e D sono negate CCP1M1=0b0; //1110=P1A,C attivel, B,D attiveb CCP1M0=0b0; //1100=P1A,C,B,D attivel InitTIMER2();

63 4.2. CONTROLLO DI TENSIONE 63 /* TIMER2: Timer a 8 bit. */ void InitTIMER2() { T2CON =0x00; //Azzero tutto per precauzione TOUTPS3 =0b0; TOUTPS2 =0b0; TOUTPS1=0b0; TOUTPS0=0b0; //Postscaler 0000=1:1, 1111=1:16 T2CKPS1 =0b0; T2CKPS0=0b0; //Prescaler 00=1, 01=4, 1x=16 TMR2IF =0; //Azzero il flag di interrupt TMR2IE =1; //Abilito l interrupt. Verrà usato come interrupt del PWM! TMR2 =0; //Contatore da comparare a PWM PR2 =0xFF; //Con PR2 definisco il periodo del PWM TMR2ON =1; //Attivo il TMR void InitAD(void) { ADFM=0b0; //0= giustificazione a sinistra VCFG=0b0; //0= tensione di riferimento pari ai 5V di alimentazione CHS2=0; CHS1=0; CHS0=1; // 000=AN0=RA0, 001=AN1 ADCS0=0; ADCS1=0; ADCS2=0; //000=Fosc/2 x la conversione, che con il clock interno a 4MHz sono circa ADIF=0; ADIE=1; ADON=1; //abilito l adc ======================= main.c #include <htc.h> #include "init.h" //DEFINIZIONI #define RIFERIMENTO 5 //in volt #define RIFD 105 //riferimento digitale #define INTEGRALE(e)((e> >3)+(e> >4)+(e> >8)) #define PROPORZIONALE(e)((e)+(e> >1)) //GLOBALS short int error, error_1, riferimento, proporzionale; //8bit con segno int out, integrale; //16bit void main() { GIE=1; //interrup globalo ON PEIE=1; //interrupt delle periferiche ON InitPORT(); InitAD(); InitPWM(); InitTIMER1(); GODONE=1; //inizio prima conversione while(1); //entro nel ciclo infinito // INTERRUPT SUB-ROUTINE void interrupt isr(void) { int errori; if(tmr2if) //se scatta l interrupt a causa del timer 2 (ossia del PWM) allora... { RC0=RC0^0x1; //lampeggio del primo led (per debug) GODONE=0b1; TMR2IF=0b0; if(adif) { //Inizio conversione AD //azzero il flag di interrupt RC1=0b1; // set di un bit per la misura dei tempi di calcolo ADIF=0b0; error=rifd-(adresh); //calcolo dell errore errori=(int)error+error_1; //cast di error per eseguire i calcoli in int if(errori>=0) integrale+=integrale(errori); else integrale-=integrale((-errori)); if(integrale>255) integrale=255; //saturazione positiva dell integrale else if(integrale<-255) integrale=-255; //saturazione negativa dell integrale proporzionale=proporzionale(error); out=(int)proporzionale+integrale; if(out>255) out=255; //soglia superiore dell uscita else if(out<0) out=0; //soglia inferiore dell uscita

64 64 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI CCPR1L=out; error_1=error; //salvo l errore attuale RC1=0b0 // Reset del bit per la misura dei tempi di calcolo ======================= In questo primo esempio il codice proposto realizza brutalmente il regolatore gestendo l integrale a 16 bit in modo da poter avere un valore dell integrale compreso tra ±255. Si è infatti ipotizzato che la base sia 8 bit (ossia con 255 5V in ingresso) ed è noto che l uscita sia ancora una tensione compresa tra 0V e 5V; ciò implica che anche l integrale debba avere una soglia pari al valore massimo raggiungibile dall uscita o, per meglio dire, raggiungibile dalla variabile out. Tale considerazione andrebbe fatta anche per il proporzionale il quale, però, viene gestito a 8bit con segno (short int). É evidente che ciò potrebbe dare problemi legati al bit di segno che il compilatore assegna all ultimo bit; nonostante questo è ragionevole pensare che non vi siano particolari problemi di computazione in quanto valori negativi inferiori a -127 (ossia 2 7-1) non dovrebbero mai verificarsi, soprattutto a regime. Questa scelta può sembrare un inutile complicazione in quanto se si applicasse la stessa considerazione fatta per l integrale a tutte le variabili questo problema, effettivo o presunto che sia, cesserebbe di esistere. É però necessario tenere presente che la potenza computazionale di questi processori non è rilevante e, unitamente al fatto che si sta lavorando con l oscillatore interno da 4MHz, si ha che il codice deve essere il più performante possibile; dove possibile è quindi meglio usare variabili con dimensione di memoria pari alla parola del processore (8 bit in questo caso). Detto ciò, esaminando il codice del regolatore dovrebbe essere tutto chiaro fino al calcolo dell uscita (out). A questo punto viene settato il duty-cycle pari all uscita (CCPR1L=out) e ciò forse richiede una breve spiegazione: da [8] cap 11 si evince che il duty-cycle è una variabile a 10bit divisa in una variabile da 8 bit più significativi (CCPR1L) e 2bit meno significativi (DC1B<1:0> nel registro CCP1CON). Detto ciò, è noto che il valore del duty-cycle è dato dal valore di OUT moltiplicato per il reciproco del coefficiente di conversione (pari a 256/5V) diviso il valore massimo della tensione di uscita (5V in questo caso), per il valore massimo digitale del duty-cycle (2 10 ): δ digit = out = out 2 2 = out 2 5 ma essendo OUT un valore compreso nei primi 8 bit, ne deriva che OUT è il valore dei primi 8 bit più significativi del duty-cycle. Gli ultimi due bit sono sicuramente nulli, quindi non è necessario settarli. Il codice così sviluppato è formalmente corretto, ma esaminando l uscita con un oscilloscopio si nota che vi sono dei problemi legati al controllo. Fugati i dubbi legati ai problemi di calcolo, si suppone che il regolatore presenti dei problemi legati ai tempi di esecuzione. Per valutare ciò occorre misurare i tempi osservando il cambiamento di stato dei bit RC0, RC1, RC2 e RC3 (i quali sono connessi ai diodi led sulla demo board). Disabilitando il regolatore, tramite RC0 si valutano gli istanti in cui avviene l interrupt a fronte dell evento di PWM come si può osservare dalla figura 4.9. Attivando il regolatore è possibile valutare gli istanti in cui la routine di regolazione comincia e termina e, per differenza, ottenere i tempi di esecuzione della stessa. tutto funzionasse correttamente, ci si dovrebbe aspettare che l istante di inizio della routine e quello finale siano compresi in un singolo periodo di PWM, ma dalla figura 4.10 si osserva che così non è. Infatti il tempo di esecuzione della routine di regolazione è più di 100µs e quindi maggiore del periodo di PWM. Analizzando il grafico 4.10-b si osserva che i tempi di esecuzione non sono sincroni con la triangolare (tensione sul condensatore) e pertanto non saranno sincroni con il PWM, ma ciò causa il sovrapporsi degli eventi di interrupt; per esempio è frequente che l evento di interrupt di PWM scatti durante la regolazione andando così a sfasare anche gli altri eventi (figura 4.10-a); lo sfasamento legato all evento di PWM crea un ritardo nell attivazione dell ADC e ciò si Se

65 4.2. CONTROLLO DI TENSIONE 65 La frequenza di PWM è 3,9kHz (rosso) e ogni evento di PWM (blu) avviene con la stessa frequenza ed è rappresentato da ogni singolo fronte di salita e discesa. Figura 4.9: Interrupt di PWM sovrapposto al segnale di PWM con δ al 50%. (a) Sfasamento degli eventi di interrupt (regolatore disabilitato). (b) Andamento della tensione sul condensatore e misura dei tempi di esecuzione (regolatore abilitato). Figura 4.10: Sfasamento degli eventi di interrupt. ripercuote sui tempi di integrazione. Una fotografia della tensione in una finestra temporale più ampia dimostra l andamento irregolare della tensione stessa la quale non ha un valore medio costante 6 (figura 4.11). 6 Il valore medio è inteso come valore calcolato in ogni singolo intervallo di PWM.

66 66 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI Il fatto che l attivazione della conversione sia effettuata in ritardo, in linea teorica comporta che il valore campionato sia un qualsiasi valore compreso all interno del ripple di un periodo di PWM. Ciò avviene con una certa frequenza generando un onda che nel tempo presenta una evidente sub-armonica Figura 4.11: Andamento reale della tensione sul condensatore. ESEMPIO N 2: Per ovviare a quanto detto le soluzioni sono fondamentalmente tre. La prima è provare a riscrivere il codice in assembler, cosa che non verrà affrontata in quanto oltre che complesso può anche risultare inutile a causa del fatto che se il compilatore C riesce ad ottimizzare il programma; è molto probabile che la scrittura del codice in assembler non porti i vantaggi sperati. La seconda soluzione prevede di allungare il periodo di PWM ma la cosa non è conveniente perché si rischia di aumentare troppo il ripple. La terza consiste invece nel far avvenire l evento di interrupt ogni due periodi di PWM sfruttando il post-scaler. Ciò comporta che il PWM ha ancora la stessa frequenza (e quindi ripple più basso possibile), ma la base dei tempi di integrazione è raddoppiata. Il codice seguente rappresenta la sola funzione di inizializzazione del PWM e il main file in quanto sono le uniche due cose che variano rispetto al caso precedente. ======================= init.c... void InitTIMER2() { T2CON =0x00; //Azzero tutto per precauzione TOUTPS3 =0b0; TOUTPS2=0b0; TOUTPS1=0b0; TOUTPS0=0b1; //Postscaler 0000=1:1, 1111=1:16 T2CKPS1 =0b0; T2CKPS0=0b0; //Prescaler 00=1, 01=4, 1x=16 TMR2IF =0; //Azzero il flag di interrupt TMR2IE =1; //Abilito l interrupt. Verrà usato come interrupt del PWM! TMR2 =0; //Contatore da comparare a PWM PR2 =0xFF; //Con PR2 definisco il periodo del PWM TMR2ON =1; //Attivo il TMR... ======================= main.c #include <htc.h> #include "init.h" //DEFINIZIONI #define INTEGRALE(e)((e> >2)+(e> >3)+(e> >7))

67 4.2. CONTROLLO DI TENSIONE 67 #define PROPORZIONALE(e)((e)+(e> >1)) //GLOBALS short int error, error_1, proporzionale, riferimento; //8bit int out, integrale; //16bit void main() { GIE=1; //interrup globalo ON PEIE=1; //interrupt delle periferiche ON InitPORT(); InitAD(); InitPWM(); InitTIMER1(); GODONE=1; while(1); //entro nel ciclo infinito // INTERRUPT SUB-ROUTINE void interrupt isr(void) { int errori; if(tmr2if) { //se scatta l interrupt a causa del timer 2 (ossia del PWM) allora... RC0=RC0^0x1; GODONE=1; TMR2IF=0b0; //azzero il flag di interrupt if(adif) { RC1=0b1; ADIF=0b0; error=rifd-(adresh); errori=(int)error+error_1; if(errori>=0) integrale+=integrale(errori); else integrale-=integrale((-errori)); if(integrale>255) integrale=255; else if(integrale<-255) integrale=-255; proporzionale=proporzionale(error); out=(int)proporzionale+integrale; if(out>255) out=255; else if(out<0) out=0; CCPR1L=out; error_1=error; RC1=0b0; if(tmr1if) { RC3=RC3^0b1; TMR1ON=0b0; TMR1IF=0b0; ======================= Il fatto che ora i tempi di integrazione siano doppi (grazie a TOUTPS0=0b1) implica che il coefficiente di integrazione sia doppio. Ne risulta che la macro INTEGRALE sia definita come: #define INTEGRALE(e)((e> >2)+(e> >3)+(e> >7)) In figura 4.12 sono riportati gli istanti in cui avviene l evento di interrupt del PWM e i tempi di inizio ed esecuzione correlati alla routine di regolazione. La frequenza con cui si verificano gli interrupt di PWM è di circa 1938 khz (pari a 516µs) e si ha quindi tutto il tempo per eseguire la routine di regolazione. ESEMPIO N 3: Il sistema fino ad ora proposto permette di effettuare la regolazione in modo corretto. Però il valore di tensione tenuto sotto controllo non è il valore medio, bensì il valore di tensione nel punto più basso della triangolare 7 o comunque in un intorno di questo punto. Scopo di questo terzo esempio è quello di mostrare come risolvere 7 Si ricorda infatti che in questo tipo di micro-processore il PWM viene generato da un onda a dente di sega e non da una triangolare (come invece possono fare per esempio i dspic), quindi se l interrupt avviene in un vertice della portante, questo istante non corrisponde a metà del tempo T ON (o T OF F ).

68 68 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI (a) Periodo di PWM (rosso) e interrupt relativo (blu, uno per ogni (b) Tensione sul condensatore (rosso), tempo di esecuzione routine fronte) PI (blu), interrupt dell ADC Figura 4.12: Regolazione in due periodi di PWM. questo problema. Prima di mostrare il codice è però bene individuare i tempi esatti in cui avvengono i vari interrupt: infatti osservando la figura 4.13 (o anche la figura 4.9) è possibile vedere come tra l onda di PWM e la rilevazione dell interrupt di PWM vi sia un ritardo pari a circa 32µs 8 di cui necessariamente si dovrà tenere conto. Figura 4.13: Ritardo tra l inizio del PWM e l effettiva rilevazione dell interrupt. Per risolvere il problema è quindi intuitivo pensare di sfruttare un timer (o contatore) il quale dovrà attendere il tempo necessario per fare in modo che la conversione AD parta nell istante corrispondente al punto medio dell intervallo T ON del PWM. I timer a disposizione sono il timer TMR0 e TMR1: il primo non si può utilizzare in quanto non è possibile poterlo attivare via software, quindi la scelta ricade inevitabilmente su TMR1. Il codice che mostra una possibile soluzione del problema è il seguente: ======================= 8 Tale ritardo è probabilmente imputabile ad alcuni fattori tra cui la chiamata di funzione di interrupt che deve salvare il contesto del programma e alla comparazione if(tmr2if) per identificare l evento di PWM.

69 4.2. CONTROLLO DI TENSIONE 69 init.h #ifndef INIT_H #define INIT_H extern void InitPORT(void); extern void InitTIMER1(void); extern void InitTIMER2(void); extern void InitPWM(void); extern void InitAD(void); #endif // INIT_H //porte //x controllo PWM //set pin PWM + event trigger AD //config AD ======================= init.c #include "init.h" #include "htc.h" void InitPORT() { ANSEL=0x03; TRISA=0b ; TRISC=0x00; PORTC=0; CMCON0=0xFF; //se non metti questo le ANx assumono valori assurdi!!!! void InitPWM() { //riferirsi a CCP1CON CCP1CON=0x00; //azzero tutto per sicurezza P1M1=0b1; P1M0=0b0; //01=Full bridge foreward. 10=Half bridge (comando 2 valvole) CCP1M3=0b1; //1100=P1A,C,B,D attive alte CCP1M2=0b1; //1101=P1A,C attiveh, B,D attiveb //in altre parole B e D sono negate CCP1M1=0b0; //1110=P1A,C attivel, B,D attiveb CCP1M0=0b0; //1100=P1A,C,B,D attivel InitTIMER2(); /* TIMER2: Timer a 8 bit. */ void InitTIMER2() { T2CON =0x00; //Azzero tutto per precauzione TOUTPS3 =0b0; TOUTPS2 =0b0; TOUTPS1=0b0; TOUTPS0=0b0; //Postscaler 0000=1:1, 1111=1:16 T2CKPS1 =0b0; T2CKPS0=0b0; //Prescaler 00=1, 01=4, 1x=16 TMR2IF =0; //Azzero il flag di interrupt TMR2IE =1; //Abilito l interrupt. Verrà usato come interrupt del PWM! TMR2 =0; //Contatore da comparare a PWM PR2 =0xFF; //Con PR2 definisco il periodo del PWM TMR2ON =1; //Attivo il TMR void InitAD(void) { ADFM=0b0; //0= giustificazione a sinistra VCFG=0b0; //0= tensione di riferimento pari ai 5V di alimentazione CHS2=0; CHS1=0; CHS0=1; // 000=AN0=RA0, 001=AN1 ADCS0=0; ADCS1=0; ADCS2=0; //000=Fosc/2 x la conversione, che con il clock interno a 4MHz sono circa ADIF=0; ADIE=1; ADON=1; //abilito l adc void InitTIMER1() { TMR1L=0xFF; TMR1H=0xFF; T1CON=0; TMR1ON=0b0; TMR1IF=0; TMR1IE=1; ======================= main.c #include <htc.h>

70 70 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI #include "init.h" #define RIFD (short)80 //riferimento digitale #define INTEGRALE(e)((e> >3)+(e> >4)+(e> >8)) #define PROPORZIONALE(e)((e)+(e> >1)) //GLOBALS short int error, error_1, proporzionale, riferimento; //8bit int out, integrale; //16bit //DELCARATION void main() { GIE=1; //interrup globalo ON PEIE=1; //interrupt delle periferiche ON InitPORT(); InitAD(); InitPWM(); InitTIMER1(); GODONE=1; while(1); //entro nel ciclo infinito // INTERRUPT SUB-ROUTINE void interrupt isr(void) { int errori; if(tmr2if) {//se scatta l interrupt a causa del timer 2 (ossia del PWM) allora... TMR1ON=0b1; //attivo il timer1 RC0=RC0^0x1; TMR2IF=0b0; //azzero il flag di interrupt if(adif) { RC1=0b1; //flag di misura del tempo ADIF=0b0; error=rifd-(adresh); errori=(int)error+error_1; if(errori>=0) integrale+=integrale(errori); else integrale-=integrale((-errori)); if(integrale>255) integrale=255; else if(integrale<-255) integrale=-255; proporzionale=proporzionale(error); out=(int)proporzionale+integrale; if(out>255) out=255; else if(out<0) out=0; CCPR1L=out; error_1=error; TMR1H=0xFF; //setto a 255 la parte alta del TMR1 TMR1L=0xFF-(CCPR1L> >1)+36; //sottraggo a 255 il tempo necessario RC1=0b0; //flag di misura del tempo if(tmr1if) { RC3=RC3^0b1; //flag per individuare l evento GODONE=1; //attivo il campionamento TMR1ON=0b0; //spengo il timer1 TMR1IF=0b0; ======================= Il codice sostanzialmente non è diverso per quanto riguarda l inizializzazione e la regolazione se non per il fatto che è stata aggiunta la funzione InitTMR1. Nella funzione di interrupt si può osservare che l evento di PWM fa attivare TMR1 e non più la conversione. Occorre ora ricordarsi che nei PIC il timer comincia a contare da un valore (nel caso di TMR1 comincia dal valore TMR1H 2 8 +TMR1L) per arrivare la massimo (in questo caso 0xFFFF, ossia in quanto timer a 16 bit), azzerarsi e generare l interrupt. Ciò implica che se si vuole far contare al timer un numero x di impulsi, il valore TMR1H 2 8 +TMR1L deve essere pari a TMR1H 2 8 +TMR1L=0xFFFFx. La parte di codice che esegue questi passaggi è chiaramente TMR1L=0xFF-(CCPR1L> >1)+36; dove (CCPR1L> >1)+36=x. CCPR1L è il duty-cycle ossia il numero di tic che occorre aspettare per attendere un tempo pari a T ON. per questo viene diviso per 2 (mediante shift). A questo viene poi sommato 36. Questo nu-

71 4.2. CONTROLLO DI TENSIONE 71 mero deriva da quanto detto in precedenza in quanto per avere 32µs su un timer senza pre/post-scalatori occorre un numero di tic pari a: 32µs = N ( fosc 4 ) 1 = N s N = 32 Il fatto che sia stato posto 36 è legato al fatto che, una volta programmato il processore, effettuando alcune misure il risultato è sembrato più preciso; in altre parole si è affinato sul campo il dispositivo. I risultati di questo programma sono visibili in figura Si osserva che il PWM in regolazione (rosso) viene intersecato nel punto medio dall onda che rappresenta l istante di inizio conversione AD (blu). Chiaramente anche la tensione sul condensatore è intersecata nel punto medio. Figura 4.14: Sincronizzazione dell istante di campionamento con il punto medio di T ON.

72 72 CAPITOLO 4. IMPLEMENTAZIONE DI UN REGOLATORE PI

73 Capitolo 5 Regolatore PID In questo capitolo verrà affrontato lo studio di un regolatore PID. Tutta la trattazione è realizzata basandosi sul lavoro fatto per stabilizzare il levitatore elettromagnetico studiato in [5] e [6]. 5.1 Regolatore tempo-continuo L uscita di un regolatore PI nel dominio del tempo è funzione dell errore in ingresso ed è la seguente: t ( d u P I (t) = K P e(t) + K I e(x)dx + K D dt e(t) = K P e(t) + 1 t ) d e(x)dx + T d T i dt e(t) (5.1) e, applicando la trasformata di Laplace, si ottiene U P I = ( K P + K ) I s + sk D E(s) = s2 K D + sk P + K I E(s) = P I(s) E(s) = R(s) E(s) (5.2) s Realizzare un regolatore PID è quindi fisicamente impossibile in quanto il grado del numeratore è maggiore del denominatore. Ciò in teoria non è un problema se si pensa ai regolatori digitali; infatti con un micro controllore è possibile effettuare i calcoli necessari affinché la routine di regolazione possa essere compiuta. Nonostante ciò è preferibile studiare un regolatore che sia fisicamente realizzabile introducendo un polo in alta frequenza sul termine derivativo. Secondo quanto spiegato in [2] una formulazione interessante è esprimere la parte derivativa come segue: U D (s) = sk D 1 + s T d N dove, secondo [2], N è un numero tipicamente compreso tra 3 e 30, mentre T d è chiaramente pari a K D /K I. Nonostante ciò il progetto del regolatore PID si sviluppa basandosi sull equazione 5.2 in quanto più semplice da trattare. Per il progetto si possono seguire vari metodi; di seguito ne vengono esposti alcuni indicandone pregi e difetti. (5.3) Metodo di Zigler e Nichols La via tradizionale è usare il metodo Zigler e Nichols in anello chiuso che si basa sull osservazione della risposta al sistema ponendo K D e K I pari a 0 e facendo variare K P partendo da valori molto piccoli non a raggiungere un oscillazione permanente della risposta. Da questo si determina il periodo di oscillazione e successivamente 73

74 74 CAPITOLO 5. REGOLATORE PID i valori di K D e K I mediante apposite tabelle. Chiaramente questo sistema non permette una determinazione analitica della soluzione. Per maggiori informazioni si rimanda a [9]. Metodo analitico Il metodo analitico è tendenzialmente simile a quello esposto per il regolatore PI (sezione 2.1.2). Anche in questo caso infatti è possibile fissare margine di fase e banda passante, ma occorre aggiungere anche una terza equazione a causa della nuova incognita K D. Per fissare la terza equazione si ricorre al margine di guadagno. Il margine di guadagno di per sè non dà solo un informazione sull asintotica stabilità, ma qualifica anche la robustezza della stessa; in altri termini indica la sicurezza con la quale possiamo tollerare incertezze sul modello senza compromettere l asintotica stabilità ([10]). Per ottenere il margine di guadagno occorre calcolare la pulsazione ω p ovvero quel valore di frequenza per la quale la fase della funzione d anello L(s) 1 risulta pari a 180 ; ottenuto questo valore occorre porre il modulo di L(s) maggiore di 1: k m = 1 L(jω p ) > 1 con L(jω p) = 180 Ciò comporta la nascita di una ulteriore incognita (ω p appunto) che si aggiunge alle altre due equazioni sul margine di fase e banda passante: il sistema risulta costituito da quattro equazioni in quattro incognite, ma nonostante ciò non è risolvibile in forma chiusa a causa del fatto che l equazione per determinare ω p è trascendente. Il sistema di equazioni è comunque il seguente: Questo sistema permetterebbe di decidere il tipo di risposta desiderata e calcolare esattamente i vari coefficienti. K P = R(jω t ) cos(θ) = cos(θ) G(jω t) K I + K D ω 2 t = R(jω t ) sin(θ) = sin(θ) G(jω t) ω t K P + jω P K D jω P K I = 1 k m G(jω p) (K P + jω P K D jω P K I ) = 180 G(jω p ) (5.4) Metodo del piazzamento poli Il metodo del piazzamento poli permette di scegliere i poli e determinare degli opportuni coefficienti per fare in modo che tali poli siano quelli del sistema. Per fare ciò si ricorre alla funzione place di MATLAB come indicato nell algoritmo 7. Per poter applicare il metodo seguente occorre ottenere le matrici di stato che descrivono il sistema in esame G(s). Le matrici che occorrono sono quella di stato A e quella degli ingressi B. La funzione MATLAB place che permette di ottenere un vettore K dato un fissato vettore P di autovalori che moltiplicata per il vettore B degli ingressi e sottratto ad A permette di ottenere la nuova matrice di stato: An = A B K A questo punto è possibile ottenere la nuova funzione di trasferimento. Data questa funzione è poi possibile per analogia confrontarne il denominatore con quello della funzione L(s) espressa nelle incognite K P, K I, K D. Tutto ciò è valido nell ipotesi che il sistema sia SiSo o MiSo e lo stato sia accessibile ovvero che tutte le grandezze del sistema siano rilevabili 2. 1 Si ricorda che con L(s) si intende L(s) = R P ID (s) G(s) 2 Nella pratica spesso le grandezze non accessibili vengono stimate aggirando quindi il problema e permettendo sempre, almeno in linea di massima, di utilizzare questa tecnica.

75 5.1. REGOLATORE TEMPO-CONTINUO 75 Algorithm 7 Utilizzo funzione place di MATLAB. sys = tf(num, den); %definizione dela funzione di trasferimento G(s) [A, B, C, D] = tf2ss(num, den); %generazione delle matrici di stato P =[ p1 p2... pn]; %definizione del vettore dei poli di lunghezza pari alla dimensione di A K = place(a, B, P); %definizione del vettore K An = A-B*K; %definizione del nuovo sistema da considerarsi in anello chiuso [num_n, den_n] = ss2tf(an, B, C, D); %calcolo i nuovi denominatori sys_n = tf(num_n, den_n); %calcolo nuovo sistema (in anello chiuso) Si noti che le incognite sono tre, quindi il sistema in esame deve essere almeno del terzo ordine. Se fosse di ordine inferiore, la funzione sys nell algoritmo 7 dovrebbe essere portata al terzo ordine moltiplicando numeratore e denominatore per s come nell esempio seguente: sys=tf(20,[1 10 0]); sys=tf([20 0], [ ]); % NO % SI I due sistemi hanno esattamente la stessa risposta, ma la matrice A risulterà di dimensione 3x3 e non 2x2. Si ricorda che per ottenere le matrici A, B, C e D del sistema dati numeratore e denominatore della funzione di trasferimento, in MATLAB si utilizza la funzione tf2ss 3 : [A,B,C,D]=tf2ss([20],[1 10]); [A,B,C,D]=tf2ss([20 0 0],[ ]); % A matrice 1x1 % A matrice 3x3 Questo metodo permette di determinare un nuovo sistema da considerarsi in anello chiuso (sys_n nell algoritmo 7 che verrà indicata in seguito con F (s)) il quale sarà stabile e caratterizzato da una certa risposta dinamica. A questo punto se si calcolasse la funzione di trasferimento in anello chiuso F (s) che comprende il regolatore R(s) e la funzione G(s) (sys nell algoritmo 7), si otterrebbe una funzione che come al solito non è altro che un rapporto tra due polinomi i cui denominatori sono dello stesso grado. Quindi per analogia si otterranno i coefficienti K P, K I, K D del regolatore PID. Questo metodo ha il difetto che la risposta del sistema in anello chiuso calcolato (F (s) = R(s)G(s)) sarà sì stabile, ma diversa dalla funzione sys_n perché il numeratore delle due funzioni non viene valutato per ottenere i coefficienti del regolatore, ma solo il denominatore è considerato (per capire meglio quanto appena detto si consideri l esempio posto alla fine di questa sezione). Inoltre i poli fissati non danno informazioni riguardo al margine di fase e quindi normalmente il sistema calcolato sottoposto ad un gradino presenta sovra-elongazioni più o meno sensibili. Inoltre occorre tenere presente che fissando poli troppo elevati (in modulo), ossia velocizzando la risposta del sistema, si tende ad avere una elevata reazione da parte del regolatore. Vi sono però anche grandi pregi come la possibilità di fissare la dinamica a piacimento 4 e quindi di stabilizzare i sistemi instabili. ESEMPIO: si supponga un sistema del primo ordine da controllare e un regolatore PID da cui derivano le relative funzioni di anello e in anello chiuso: G(s) = µ s + a R(s) = K Ds 2 +K P s+k I s L(s) = G(s)R(s) = µ K Ds 2 + K P s + K I s (s + a) F (s) = L(s) ( ) 1 + L(s) = µ KD s 2 + K P s + K I s 2 (µk D + 1) + s (µk P + a) + µk I 3 Una lista dei comandi principali per lo situdio dei sistemi si può trovare in [11] 4 Ciò è vero entro i limiti della moderazione del controllo e della risposta libera del sistema se esso è instabile. Infatti se un sistema è instabile i poli che stabilizzano il sistema devono possibilmente essere scelti in modulo maggiori del modulo maggiore dei poli del sistema da stabilizzare.

76 76 CAPITOLO 5. REGOLATORE PID e si supponga inoltre che il guadagno µ e la costante di tempo a siano pari all esempio precedente, ossia rispettivamente pari a 20 e 10. Ora si vogliono fissare i poli. Premesso che la funzione place non piazza poli coincidenti, si supponga di fissare il seguente vettore di poli: poli=-[30 100] tale per cui la funzione MATLAB min(abs(poli)) restituisca un valore maggiore di 10. A questo punto occorre determinare le matrici di stato del sistema. Basandosi su quanto riportato nell algoritmo 7, si eseguono i seguenti comandi: sys = tf([ 20 0 ], [ ]); %aggiungo uno 0 per avere un sistema 2x2 [A, B, C, D] = tf2ss(num, den); %generazione delle matrici di stato (A è 2x2) P =[ ]; %definizione del vettore dei poli P è 1x2 K = place(a, B, P); %ne risulta K=[ ] An = A-B*K; %definizione del nuovo sistema da considerarsi in anello chiuso [num_n, den_n] = ss2tf(an, B, C, D); %calcolo i nuovi denominatori sys_n = tf(num_n, den_n); % questa è F(s) A questo punto il numeratore vale den_n=[ ] e la funzione d anello è F (s) = 20s s s+3000 la quale è evidentemente asintotica a 0 a causa dell s a numeratore. Quello che però interessa è il denominatore il quale per analogia con il denominatore di F(s) si ha: 1 = µk D = µk P + a 3000 = µk I K D = 20 1 = 0.05 K P = (130 10)/20 = 6 K I = 3000/20 = 150 Quindi F (s) F (s) come anche L(s) L (s). Da ciò si possono trarre alcune osservazioni. La funzione F (s) ha numeratore e denominatore uguali in grado. Ciò implica che sicuramente il sistema presenterà errore non nullo a regime. Di questo però non si terrà conto in questo esempio che mira solo a far vedere come ottenere i coefficienti 5. Si osservi inoltre che se il sistema fosse instabile (per esempio a=-10) questa procedura avrebbe stabilizzato il sistema, ma non per ogni valore di K P. Infatti è chiaro che tutti i coefficienti del regolatore debbano essere maggiori di 0 (o al limite uguali). Quindi si deve necessariamente avere che il coefficiente di s (in questo caso pari a 130) sia maggiore di a. Infine si noti che la determinazione dei coefficienti (soprattutto di K D ) non tiene conto dell eventuale polo in alta frequenza. Normalmente questo polo è bene prevederlo, ma non in fase di progetto in quanto tende a complicare anche notevolmente le formule. 5.2 Regolatore Discreto Anche in questo caso è possibile procedere in più modi per la discretizzazione del regolatore. Metodo 1: separazione della parte P, I e D La discretizzazione del regolatore viene fatta seguendo le stesse indicazioni date nella sezione ossia applicando la trasformazione di Tustin. Sull analisi vera e propria del sistema si entrerà nel dettaglio più avanti; tuttavia è bene riallacciarsi ad una nota fatta in precedenza riguardante il posizionamento di un polo in alta frequenza (equazione 5.3). Provando ad applicare Tustin alla componente derivativa del regolatore si ottiene: R D (z) = K D 2 T S ( ) z 1 u D (z) = 2K D ( 1 z 1 ) e(z) z 1 u D (z) (5.5) z + 1 T s 5 Possibili soluzioni per migliorare la risposta potrebbero essere l aggiunta di un integratore o di un eventuale regolatore in cascata a quello appena determinato.

77 5.2. REGOLATORE DISCRETO 77 Osservando questa relazione è subito chiaro che il termine costante 2K D T s è tanto più grande quanto più piccolo è l intervallo di campionamento. Molto spesso nella pratica il valore assunto da questo parametro è tale per cui il micro non riesce a gestirlo con le normali variabili. Inoltre, se sommato alla parte proporzionale e integrale, questo termine è ordini di grandezza più elevato e vanifica l effetto degli altri parametri. Studiando invece la funzione con il polo in alta frequenza (equazione 5.3) si ottiene: R D (z) = K D 2 T s ( ) z 1 z + 1 da cui si ottiene la relazione 1 ( ) 2 z 1 Td T s z+1 2 z 1 = K D ( ) ( N + 1 T s Td 2 z T d N T s N {{ a ) 2 T s {{ b = K D 2 T s z 1 za + b (5.6) u D (z) = 2K D at s ( 1 z 1 ) e(z) z 1 b a u D(z 1 ) (5.7) Ora il termine moltiplicativo della differenza è 2K D at s risulta molto più contenuto in quanto a e Ts 1 hanno circa lo stesso ordine di grandezza. Ciò rende il sistema più semplice da trattare dal punto di vista numerico anche per un micro processore. Tutto ciò sarà più chiaro in fase di scrittura del codice, ma fin d ora è possibile sostituire alcuni plausibili valori per vedere le differenze numeriche dei coefficienti. Per esempio supponendo coefficienti K P = 2, K I = 500, K D = 1 e un tempo di integrazione pari a T s = 50µs si avrebbe nel primo caso 2K D T s 2K D at s = 40000, mentre nel secondo caso, se per esempio N = 10, T d = K D K P = 19, 99; le grandezze sono decisamente più consone al micro processore. = 0, 5, a = 2001, b = 1999 e Metodo 2: discretizzazione della funzione Z totale In questo caso si considera la funzione equivalente che esprime il regolatore PID. Partendo dalla funzione tipica (ossia P+I+D) si ha, trasformando con Tustin, la seguente relazione: R P ID (z) = K P + K I T s 2 z + 1 z 1 + K 2 z 1 D T s z + 1 = (5.8) = K P (z 2 1) + Ts 2 K I(z + 1) T s K D (z 1) 2 z 2 1 = = z 2 (K P + Ts 2 K I + 2 T s K D ) + z = ) (T s K I + 4Ts K D + ( T s 2 K I + 2 T s K D ) z 2 1 ( ) ( ) ( ) K P + Ts 2 K I + 2 T s K D + z 1 T s K I + 4 T s K D + z 2 T s 2 K I + 2 T s K D 1 z 2 ma anche in questo caso è evidente che se i tre coefficienti non sono di ordine di grandezza paragonabile, i termini di questa relazione sono difficilmente gestibili in quanto tutti i coefficienti moltiplicativi della variabile z, presentano il coefficiente K D diviso per T s. Ricalcando l esempio precedente in cui K P = 2, K I = 500, K D = 1 è chiaro che K D Ts K P T s K I e quindi il termine proporzionale e ancora di più quello integrale per essere valutati richiederebbero precisioni molto elevate. Viste le considerazioni fatte per il metodo 1, anche in questo caso si terrà in considerazione il polo in alta

78 78 CAPITOLO 5. REGOLATORE PID frequenza. La funzione tempo-continua diventa quindi la seguente: R(s) = K P s + K I s + sk ( D s T d N + 1 = s2 KD + T d N K ) ( P + s KP + T d N K I) + KI s 2 T d N + s = s2 a + sb + c s 2 T d N + s (5.9) Procedendo con la trasformazione di Tustin si ottiene: R P ID (z) = = 4 T 2 s ( 4 T 2 s z 1 z+1 ( z 2 (a 4 T 2 s ) 2 ( ) a + 2 z 1 T s z+1 b + c ) 2 ( ) = Td N + 2 z 1 T s z+1 ) ( + b 2 T s + c + z 2c a 8 z 1 z+1 z 2 ( 4Td NT 2 s + 2 T s ) z ( 8Td NT 2 s T 2 s 4 T (z 1) 2 ( a + 2 s 2 T s z 2 1 ) b + c (z 1) 2 4 T (z 1) 2 T s 2 d N + 2 T s (z 2 1) ) + ( a 4 T 2 s ) + ( 4Td NT 2 s ) b 2 T s + c ) (5.10) 2 T s Anche in questo caso a, b e c (legate ai coefficienti del regolatore) sono confrontabili, quindi tutti i termini che presentano T 2 s a numeratore sono termini preponderanti. = 5.3 Regolatore PID di corrente Il regolatore PID che verrà presentato, mira a risolvere un problema nato nel sistema di controllo di un levitatore magnetico EMS con doppia bobina studiato in [5] e [6]. Senza entrare troppo nel dettaglio della macchina in esame, basti sapere che il levitatore è costituito da due espansioni esapolari e su ogni polo è montata una bobina di polarizzazione e una di regolazione. Tutte le bobine dei sei poli sono connesse in serie. Inoltre per quanto riguarda la polarizzazione gli avvolgimenti di entrambe le espansioni esapolari sono a loro volta connesse in serie. Ovviamente ciò non è stato fatto per la regolazione in quanto essa deve funzionare in modo indipendente per il controllo di ciascun traferro. La bobina di polarizzazione ha il compito di sostenere il flusso magnetico al traferro e il regolatore ha il compito di mantenere costante la corrente in questa bobina. In figura5.1 è rappresentato un singolo polo e le equazioni relative ai due avvolgimenti. Senza scomodare tutti i modelli studiati in [6], si consideri un singolo avvolgimento come un induttore accoppiato ad un altro in una configurazione tale per cui il flusso che si concatena con le spire dell avvolgimento possa variare a fronte fondamentalmente di due fenomeni: il primo è la variazione di traferro che provoca una variazione di tipo mozionale (infatti l induttanza è funzione del traferro δ), mentre il secondo è legato alla regolazione la quale per stabilizzare il sistema deve generare una corrente che è sì mediamente costante, ma istantaneamente ha variazioni difficilmente prevedibili. Dei due problemi elencati, il primo è trascurabile perché se il sistema funziona correttamente, il traferro è tendenzialmente costante o comunque i movimenti sono molto piccoli e non troppo rapidi 6 e quindi i termini mozionali non sono significativi. Il secondo termine è invece complesso da gestire e causa grandi interferenze anche a frequenze maggiori di 1 khz. Utilizzando un PI questi disturbi sono particolarmente visibili e l accoppiamento è tale che tende ad instabilizzare il sistema se il controllo non è fatto adeguatamente. Per questo motivo si è scelto di utilizzare un PID. Un PID ha tendenzialmente lo svantaggio di amplificare i disturbi sul riferimento. Tali disturbi derivano normalmente dall accoppiamento dei conduttori che collegano sensore e micro-processore. Nonostante ciò si presuppone che il sistema sia schermato e filtrato adeguatamente. Detto questo, prima di valutare i reali vantaggi di un PID in questo sistema è bene definire il modello (semplificato) del sistema che si vuole controllare. Banalmente il sistema viene analizzato come un semplice circuito 6 Oscillazioni stimate intorno alla decina di Hz.

79 5.3. REGOLATORE PID DI CORRENTE 79 A fronte di ragionavoli ipotesi sulla linearità del circuito magnetico, un possibile modo di descrivere il sistema è il seguente: ψ p { { (L p (δ)i p + L m (δ)i r ) v p = R p i p + d dt v r = R r i r + d dt (L r(δ)i r + L m (δ)i p ) {{ ψ r (a) Polo centrale di una espansione esapolare Figura 5.1: Singolo polo EMS con bobine di regolazione e polarizazione. R-L 7 al quale però è sommato un disturbo sotto forma di forza elettromotrice (e(t)) variabile con legge ignota nel tempo: schematizzabile come in figura 5.2. v p = R p i p + L p d dt i p + e(t) (5.11) 1 G(s) = R p + sl p R p = 0.42Ω L p = H Figura 5.2: Schema a blocchi relativo al controllo del sistema descritto dall equazione Per studiare l effetto del regolatore sul sistema visto dall ingresso e(t), ossia dal disturbo, è sufficiente studiare la funzione di trasferimento seguente: I(s) e(s) = G(s) 1 + G(s)R(s) (5.12) Ora si considerino i regolatori PI e PID classici (ossia senza poli in alta frequenza). La funzione di trasferimento del disturbo in funzione dei due tipi di regolatori è fondamentalmente la stessa: s s 2 L P +s(r+k P )+K I s s 2 (L p+k D )+s(r+k P )+K I per regolatore PI per regolatore PID In entrambi i casi si nota una s a numeratore. Ciò implica che il sistema tende a derivare il disturbo. Se il disturbo fosse a gradino ciò è benefico perché annullerebbe il valore del disturbo a regime, ma se presentasse 7 Con L si intende l auto induttanza di polarizazione equivalente dei dodici poli vista ai morsetti di ingresso e uscita dell indutore in esame calcolata al traferro di 4mm.

80 80 CAPITOLO 5. REGOLATORE PID delle armoniche, queste verrebbero amplificate (in quanto derivate) anche se la retroazione tende ad attenuare questo fenomeno. Fermo restando quanto detto si osservino allora i termini a denominatore: si nota che a pari K P e K I, l aggiunta del derivativo aumenta l inerzia (in termini elettrici) del sistema. Ciò implica che a fronte di un gradino, il disturbo si annullerà presentando oscillazioni di durata leggermente superiore, ma più contenute in termini di ampiezza Progetto del regolatore La determinazione di parametri come già accennato in precedenza non è semplice se effettuata in anello chiuso. Quindi in questo caso il metodo di progetto è stato un po più spartano. Per prima cosa non si è tenuto conto del termine in alta frequenza in quanto esso dipende dai termini K P e K D, quindi verrà determinato di conseguenza una volta trovati gli altri coefficienti. Detto ciò si è proceduto fissando i coefficienti K P e K I (noti già dalla pratica per le prove fatte con il regolatore PI) e successivamente si è cercato di scegliere un K D al massimo pari a 1 che permettesse di ottenere una risposta con una banda passante maggiore o uguale a 1000 rad/s. I coefficienti trovati sono K P =10, K I =1000, K D =1. Successivamente è stato scelto il coefficiente N necessario per il polo in alta frequenza (equazione 5.3) anche in relazione a come verrà scritto il codice. Si noti fin d ora che maggiore è N, migliore è il comportamento in quanto il regolatore si comporta da come un PID puro in una gamma di frequenze maggiore, ma di contro i numeri da gestire, soprattutto a livello digitale, sono molto più elevati. In simulazione un giusto compromesso è sembrato i coefficiente N=10. Il regolatore così realizzato è caratterizzato da un banda passante pari a ω t =1110 rad/s e un margine di fase φ m =94. Per valutare meglio il comportamento del regolatore PID così ottenuto, si consideri un regolatore PI ottenuto in forma chiusa con la stessa banda passante e margine di fase φ m =90 8. Da ciò si otterrebbero i valori K Ipi =466,2 e K P pi =109,16. Il diagramma di Bode di L(s) = R P ID (s)g(s) e L P I (s) = R P I (s)g(s) ossia le funzioni di anello date rispettivamente dal regolatore PID e PI sono riportate in fgura 5.3; in questa figura è riportato anche l andamento della funzione d anello ottenuta dal regolatore PI ottenuto dagli stessi coefficienti integrale e proporzionale del regolatore PID. Si osserva che tutti gli andamenti sono stabili in anello chiuso ed in particolare PIpi e PID coincidono in alta frequenza. Osservando poi la risposta in frequenza della funzione di trasferimento tra uscita e disturbo relativa alla funzione d anello L(s) ottenuta con regolatore PI e PID (figura 5.4) si osserva che per disturbi di qualche decina di Hz il sistema con PID attenua un po meglio, ma per le altre frequenze il regolatore PI sembra nel complesso migliore. Da questa analisi può sembrare che non vi sia motivo di utilizzare un PID per il controllo, ma che convenga concentrarsi su un regolatore PI. In realtà così non è perché i problemi reali si hanno quando si va a creare il regolatore digitale (cioè quando lo si sintetizza in C) nel quale il termine K P di valore superiore a 100 e K I di circa 450 causano alcuni problemi di calcolo. Il termine proporzionale è molto alto e quindi tende a dare in uscita, a fronte per esempio di piccoli errori in ingresso, grandi variazioni di duty-cycle, mentre l integrale è tale per cui il termine KI = K I T s 2 è piccolissimo; talmente piccolo che in alcune versioni del programma era stato addirittura eliminato trasformando di fatto il regolatore in un semplice proporzionale 9 : introdurre tale termine, anche se piccolissimo, comportava normalmente l instabilità del sistema sia in simulazione sia sul campo. Adottare invece la soluzione PID permette di avere termini nel complesso più gestibili. In realtà anche il PID presenta questi problemi se non venisse implementato senza polo in alta frequenza. A tal proposito si tenga sempre presente che se il fattore N aumentasse, il coefficiente derivativo digitale aumenterebbe anch esso in modo proporzionale. 8 Si osservi che se fosse φ m = 94, determinando K I e K P in forma chiusa si otterrebbe un K I negativo e quindi il sistema sarebbe instabile. Porre φ m = 90 migliora comunque la risposta almeno in termini di fase. 9 Tra le varie versioni fatte ve n era una in cui il regolatore era un semplice P in cascata ad un filtro passa-basso (ovviamente digitale) che tagliava frequenze molto alte. Questo risolse molti problemi, ma presentava comunque oscillazioni di ampiezza rilevante sulla corrente di uscita.

81 5.3. REGOLATORE PID DI CORRENTE 81 blu - PI ottenuto dai coefficienti PID, verde - PI con la stessa ω t di PID, rosso - PID Figura 5.3: Diagramma di Bode delle funzioni d anello ottenute con regolatori PI e PID. Figura 5.4: Risposta in frequenza della funzione di trasferimento tra uscita I(s) e disturbo e(s) Simulazione del regolatore digitale La simulazione deve ovviamente rispettare il più possibile la configurazione del caso reale. Si noti a tal proposito che il sistema di controllo PID è stato sviluppato per essere particolarmente reattivo: mentre tutto il sistema è controllato con PWM a 20kHz, il PWM del regolatore di polarizzazione viene gestito a 40kHz. Il periodo di PWM è anche il tempo di integrazione che in questo caso sarà quindi pari a T s =25µs. La simulazione verrà condotta come al solito confrontando la soluzione tempo-continua (s), tempo-discreta (z) e digitale (C SIMULINK) usando il modello in figura 5.5. Il disturbo verrà posto all interno del regolatore come

82 82 CAPITOLO 5. REGOLATORE PID indicato. Il metodo di implementazione segue il primo metodo di discretizzazione (sezione 5.2) del regolatore, ossia i termini P, I e D sono valutati separatamente. Figura 5.5: Modello per la simulazione PID. Implementazione classica del regolatore L implementazione classica prevede di scrivere il regolatore basandosi sulla funzione z. Si osservi fin d ora che tutti e tre i regolatori non presentano soglie sull uscita. Ciò è legato fondamentalmente al fatto che porre un anti wind-up poteva complicare almeno inizialmente le cose, senza una reale utilità in quanto le saturazioni sarà sì bene tenerle in considerazione, ma in fase di implementazione su micro-processore. Scopo di queste simulazioni è riuscire a sintetizzare il regolatore in modo corretto e vedere quali sono le problematiche (soprattutto di calcolo). Il codice è il seguente: /* DEFINIZIONI */ #define I_REALE u0[1] #define I_RIF u0[0] #define OUP 7373 /*=90V*/ #define ODW -OUP #define IUP /* =OUP*2^8 */ #define IDW -IUP #define DUP OUP /* Soglia del derivativo */ #define DDW -DUP /*MACRO*/ #define KP(e)((e*10)) #define KI(e)((e*3)+(e> >3)+(e> >4)) #define KIS 8 #define KD(e)((e*799)) #define B_A(ba)((ba)-(ba> >7)+(ba> >8)+(ba> >10)+(ba> >11)) #define KDS 3 short int error, error_1=0, proporzionale; long int integrale=0, derivata=0;

83 5.3. REGOLATORE PID DI CORRENTE 83 /* --- FUNZIONE DI REGOLAZIONE --- */ short int error_i, error_d, dc; double out; /* è a 32bit perché 4096* > 2^15 */ error = ((I_RIF-I_REALE)*8); error_i = error+error_1; error_d = error-error_1; error_1 = error; /* PROPORZIONALE */ proporzionale = KP(error); /* INTEGRALE */ if(error_i>=0) integrale+=ki(error_i); else integrale-=ki((-error_i)); /* DERIVATIVO */ if (derivata>=0) derivata=b_a(derivata); /*Per prima cosa peso subito la derivata... */ else derivata=-(b_a((-derivata))); derivata += KD(error_d); /*...poi aggiungo il nuovo termine */ /* OUT */ out=(derivata> >KDS)+proporzionale+(integrale> >KIS); /* sarebbe meglio fare il cast a long */ y0[0]=out; y0[1]=(y0[0]*50)/4096; y0[2]=error; y0[3]=proporzionale; y0[4]=integrale> >KIS; y0[5]=derivata> >KDS; Leggendo il codice si possono trovare alcune definizioni riguardo le soglie che però non vengono utilizzate. Come noto la macro KP non altera il coefficiente a differenza di KI e KD. Essendo KI=K I T s 2 =0,0125 si è preferito moltiplicarlo per 256 (2 8 ) portandolo KI=3,2 per aumentarne la precisione; è esattamente quanto fatto per il regolatore di corrente PI (paragrafo 3.3.1) anche se in quel caso il termine KI è stato maggiorato di Per 2 quanto riguarda il termine KD esso è pari a KD=K D T sa 99,875; potrebbe sembrare insensato maggiorare questo valore, ma così è stato fatto. Precisamente è stato maggiorato di 2 3. Questo perché il termine derivativo è accompagnato dal termine B_A il quale è negativo e in valore assoluto è pari a 0,9975. Da questo termine è richiesta la massima precisione possibile! più si riesce a renderlo in maniera precisa, più fedele sarà la risposta. Si osserva che questo valore va a riscalare (pesare) il valore al passo precedente della derivata, quindi il risultato di tale operazione è un numero nella stessa base della derivata e per questo non può essere riscalato. Detto ciò è chiaro che conviene riscalare il termine derivativo che in questo caso è pari a KD=K D 2 4 T sa 99, =799; ora la derivata è un valore in base 11 bit. Tornando un momento sul termine B_A si è detto che il suo valore è negativo. Leggendo il codice, però si nota come questo termine venga gestito come termine positivo. Questo perché se si valuta l espressione 5.7 si osserva che il termine viene sottratto per ottenere il risultato voluto e quindi è come gestire un fattore positivo. I riscalamenti introdotti su proporzionale e integrale fanno sì che le variabili derivata e integrale debbano essere a 32 bit. É chiaro che quando l uscita verrà calcolata (out), le grandezze dovranno essere riportate in base 12 bit mediante appositi shift. debug. Per quanto riguarda le varie grandezze portate in uscita (y0[0], y0[1], ecc) servono solo per attività di In figura 5.6 sono riportati gli andamenti di corrente circolante nel sistema e tensione in uscita dal regolatore a fronte di un ingresso a gradino con disturbo di tensione pari ad una sinusoide di ampiezza 30V e frequenza 1000rad/s. Mentre in uscita gli effetti del disturbo sono trascurabili, sulla tensione si vede che vi è una armonica che mira ad eliminare gli effetti del disturbo e. Si nota inoltre che all inizio vi è un impulso di tensione che raggiunge circa i 2700V. É chiaro che nel caso reale occorrerà prevedere una saturazione. Come si vedrà in seguito un valore elevato di N unito al fatto che vengano fatte determinate scelte su come calcolare la derivata, potrebbe provocare alcuni problemi a livello computazionale risolvibili per esempio dimi-

84 84 CAPITOLO 5. REGOLATORE PID Figura 5.6: Riferimento a gradino con disturbo sinusoidale a 1000rad/s di ampiezza 30 V. nuendo N. Se si volesse ridurre il coefficiente N per esempio a 5 ne conseguirebbe la seguente variazione nel codice: #define KD(e)(((e*799)+(e> >1))) #define B_A(ba)((ba)-(ba> >7)+(ba> >8)+(ba> >9)+(ba> >11)) #define KDS 4 Queste macro sono legate al fatto che KD=49,9688 e viene maggiorato di 2 4, mentre b a =-0,9988. Dal punto di vista delle simulazioni non vi sono cambiamenti sensibili. Implementazione del regolatore con derivata a 20Ts In altri casi affrontati sul levitatore si è visto che spesso il sensore introduce degli errori spesso causati da interferenze ed accoppiamenti. Ciò non causa tendenzialmente problemi in un controllo PI, ma può causarne per la parte derivativa. Supponendo ora che il derivativo sia molto elevato è facile prevedere che si possano avere grandi escursioni del duty-cycle a fronte di errori molto piccoli. Di contro esiste anche il problema opposto. Se il derivativo è molto piccolo e il sistema presenta inerzie molto alte è probabile che tra un quanto di tempo (T s ) e l altro vi siano variazioni talmente piccole che non possano essere valutate. In entrambi i casi, quindi, si rischierebbe esclusivamente di derivare il rumore il quale tipicamente è ad alta frequenza e quindi può dare contributi significativi. Tra le varie soluzioni provate per ovviare al problema, quella che ha dato i migliori risultati è di considerare la derivata in una scala temporale diversa, ossia all errore attuale deve essere sottratto non al valore precedente, ma al valore di n volte precedenti, per esempio 20; con un intervallo di 20 campioni la finestra temporale su cui viene effettuata la derivata è pari a T sn =20 25µs=500µs. Quindi ricalcolando l equazione 5.6 con T sn al posto di T s si ottengono i seguenti coefficienti: KD=49,3827 b a =-0,9753 a=81 b=-79 Attenzione però che questi valori sono stati ottenuti con N=5. Si è notato che aumentando N si hanno problemi di integrazione che provocano oscillazioni non accettabili. Ciò è dovuto al termine B_A: annullandolo, infatti, il sistema torna ad avere una risposta corretta nel senso che arriva a regime e l errore statico è nullo, ma l andamento della risposta è ben diverso da quello del regolatore z. Probabilmente questo è dovuto al fatto che tutti i termini che costituiscono le grandezze derivative (ossia KD e B_A) richiedono di rappresentare i coefficienti calcolati nel modo più preciso possibile; anche piccole variazioni possono dare risultati completamente errati.

85 5.3. REGOLATORE PID DI CORRENTE 85 Il codice proposto di seguito realizza quanto detto: /* DEFINIZIONI */ #define I_REALE u0[1] #define I_RIF u0[0] #define OUP 7373 /*=90V*/ #define ODW -OUP #define IUP /* =OUP*2^8 */ #define IDW -IUP #define EDTHUP 147 /* 7373/KD = Soglia errore derivativo */ #define EDTHDW -EDTHUP #define DUP OUP /* Soglia del derivativo */ #define DDW -DUP /*MACRO*/ #define KP(e)((e*10)) #define KI(e)((e*3)+(e> >3)+(e> >4)) #define KIS 8 #define KD(e)(((e*790)+(e> >3))) #define B_A(ba)((ba)-(ba> >5)+(ba> >8)+(ba> >9)+(ba> >11)) #define KDS 4 #define ND 20 /*Campioni x la derivazione */ short int error[nd], error_1=0, proporzionale; long int integrale=0, derivata=0; /* --- FUNZIONE DI REGOLAZIONE ---*/ short int error_i, error_d, dc, i; double out; /* è a 32bit perché 4096* > 2^15 */ for(i=nd-1; i>0; i--) error[i]=error[i-1]; /* sposto tutti i termini precedenti */ error[0] = ((I_RIF-I_REALE)*8); error_i=error[0]+error[1]; /* errore integrale */ error_d=error[0]-error[nd-1]; /* errore derivativo */ /* PROPORZIONALE */ proporzionale = KP(error[0]); /* INTEGRALE */ if(error_i>=0) integrale+=ki(error_i); else integrale-=ki((-error_i)); /* DERIVATIVO */ if (derivata>=0) derivata=b_a(derivata); /*Per prima cosa peso subito la derivata... */ else derivata=-(b_a((-derivata))); derivata += KD(error_d); /*...poi aggiungo il nuovo termine */ /* OUT */ out=(derivata> >KDS)+proporzionale+(integrale> >KIS); y0[0]=out; y0[1]=(y0[0]*50)/4096; y0[2]=error[0]; y0[3]=proporzionale; y0[4]=integrale> >KIS; y0[5]=derivata> >KDS; Il codice è sostanzialmente uguale al precedente tranne per il fatto che error_d viene calcolato con il valore attuale e il valore di 20 passi prima. É chiaro che per fare ciò occorre memorizzare tutti i termini fino al ventesimo e tramite il ciclo for i termini vengono spostati indietro di una posizione aggiornando così ad ogni ciclo (ossia ogni T s ) la finestra temporale per eseguire la derivata. Per quanto riguarda i risultati essi sono soddisfacenti, ma è possibile comunque identificare dei problemi all inizio del gradino e sul fatto che la risposta non è fedele a quella della soluzione con il regolatore in z-trasformata, in quanto quest ultimo è sviluppato considerando un intervallo di tempo pari a T s, mentre il regolatore digitale effettua la derivata a 20T s. In figura 5.7-a è riportato il comportamento del sistema con ingresso a gradino, ma senza disturbo, mentre in 5.7-b è stato aggiunto un disturbo sinusoidale di 30V a 100rad/s. Chiaramente l andamento tra regolatore z (rimasto invariato) e regolatore C sono diversi.

86 86 CAPITOLO 5. REGOLATORE PID (a) Nessun disturbo (b) Disturbo sinusoidale: 30V - 100rad/s Figura 5.7: Risposta con regolatore ottenuto con N=5 e derivata su 20 campioni Implementazione su micro-processore dspic30f Anche questa volta il codice implementato è scritto in C orientato al compilatore C30 di MICROCHIP. I files di progetto sono i seguenti: global.h init.h init.c pid.h definisce le principali variabili e definizioni di costanti comuni a tutti i files. file di intestazione delle funzioni di inizializzazione. Contiene le dichiarazioni delle funzioni di InitPORT(), InitPWM(), InitADC() ed eventuali macro. file C di implementazione delle funzioni di inizializzazione. file di intestazione contenente le dichiarazioni e macro necessarie per effettuare la routine di regolazione. main_polarizzazione.c file C principale. Contiene la funzione main e le funzioni di interrupt. Per quanto riguarda la configurazione delle periferiche e la determinazione delle scadenze temporali, si osservi che non è cambiato nulla dal sistema descritto al capitolo 4. Anche la formula per il calcolo del periodo di PWM (4.1) non è cambiata anche se in questo caso il PLL rispetto al caso precedente (figura 4.6) adesso il PLL è pari a x16. Però si è detto che la frequenza di commutazione è stata portata a 40 khz quindi l equazione 4.1 risulta: Codice C PTPER = = 368 Si consiglia di leggere il codice seguente tenendo sempre a portata di mano [4], quanto meno per capire quali sono le procedure necessarie per la configurazione e la gestione delle periferiche. Si noti che il codice seguente nasce dalla raffinazione di altre versioni del codice, quindi potrebbero esserci definizioni e variabili che non vengono usate nel codice vero e proprio. Infine si osservi che il codice è relativo alla derivata calcolata con polo in alta frequenza con N=5 e una maggiorazione del coefficiente derivativo di 2 4 per contenere le variazioni sul piccolo errore, come detto in precedenza.

87 5.3. REGOLATORE PID DI CORRENTE 87 ======================= global.h #ifndef GLOBAL_H #define GLOBAL_H #include <p30f4012.h> #define ON 1 #define OFF 0 /* Logica di controllo dei LED inversa */ #define LED_VERDE_ON _RE5=0b0 #define LED_VERDE_OFF _RE5=0b1 #define LED_ROSSO_ON _RE4=0b0 #define LED_ROSSO_OFF _RE4=0b1 #define CLOCK //Clock esterno, come sulle schede di valutazione #define NBIT 12 #define NBIT2 13 #define NBASE 4095 #define NBASE #define NBASE #define NBASE //in realtà 2^24= #define FREQ //40KHz #define PER //Periodo #define DUTYCYM (int)736 //DC massimo in unipolare singola gamba #define DUTYCY PERIODO //DC massimo in unipolare doppia gamba #define DUTYCYUP 332 //Saturazione UP di duty-cycle #define DUTYCYDW -332 //Saturazione DW di duty-cycle #define OFFSET_I 518 //Offset delle correnti per riportarle allo 0 #define CORRENTEP ADCBUF0 //an0! #endif //end of GLOBAL_H ======================= init.h #ifndef INIT_H #define INIT_H #define TRIGGER_AD_PWM #define TRIGGER_AD_TMR3 #define TRIGGER_AD_AD #define CHANNEL4 0b11 #define CHANNEL2 0b01 0b011 0b010 0b000 #define CHANNEL1 0b00 extern void InitTIMER(unsigned int nstep); //Non serve in questo programma extern void InitPORT(); extern void InitPWM(int nleg, unsigned char interrupt_enable); extern void InitAD(unsigned char, unsigned char, unsigned char, unsigned char); #endif // INIT_H ======================= init.c #include <p30f4012.h> #include "Init.h" #include "Global.h" /** Inizializzazione delle PORTE (I/O, digitali/analogiche **/ void InitPORT() { TRISD=0x0000; PORTD=0xFFFF; TRISB=0xFFFF; TRISE=0x0080; PORTB=0xFFFF; PORTE=0xFFFF; //Sulle mie schede i led e i pulsanti sono in logica inversa ADPCFG=0x0000;

88 88 CAPITOLO 5. REGOLATORE PID /** Inizializza il PWM ******************************************************************* Il parametro in ingresso nleg determina quante gambe voglio abilitare in modo indipendente ******************************************************************************************/ void InitPWM(int nleg, unsigned char interrupt_enable) { PTPER=PERIODO; //Attenzione a _PTMOD!!! che influenza PTPER se >= 0b10 PTCONbits.PTMOD=0b10; //Free Running Mode=0b00, Continuous Up/Dw=0b10 PTCONbits.PTOPS=0b0000; //Postscaler PTCONbits.PTCKPS=0b00; //Prescaler PTCONbits.PTSIDL=0b0; PTCONbits.PTEN=0b1; PWMCON1=0x0000; if(nleg>0) { PDC1=0; //duty cycle per PWM1 16bit, quindi duty=50%->pdcx=ptper PWMCON1bits.PMOD1=0b1; //Indipendent mode 0=off, 1=on PWMCON1bits.PEN1H=0b1; //Abilito la gamba alta PWMCON1bits.PEN1L=0b1; //Abilito la gamba bassa if(nleg>=2) { PDC1=DUTYCY; //se 2 è perché controllo il ponte ad H PDC2=DUTYCY; //duty cycle per PWM1 16bit, quindi duty=50%->pdcx=ptper PWMCON1bits.PMOD2=0b1; //Indipendent mode 0=off, 1=on PWMCON1bits.PEN2H=0b1; //Abilito la gamba alta PWMCON1bits.PEN2L=0b1; //Abilito la gamba bassa if(nleg>=3) { PDC3=0; //duty cycle per PWM1 16bit, quindi duty=50%->pdcx=ptper PWMCON1bits.PMOD3=0b1; //Indipendent mode 0=off, 1=on PWMCON1bits.PEN3H=0b1; //Abilito la gamba alta PWMCON1bits.PEN3L=0b1; //Abilito la gamba bassa FLTACON=0x0000; _PWMIF=0; _PWMIE=(interrupt_enable&0x1); void InitAD( unsigned char trigger_ad, unsigned char ADCS_delay, unsigned char ingresso, unsigned char channel ) { /* Le tabelle di configurazione sono da pagina 420 in poi del Manual Family [4]. */ ADCHS=0; ADCHSbits.CH0SA=ingresso&0x0F; //ingressi AN0->CH1=>ADCBUF1, AN1->CH0=>ADCBUF0 _SIMSAM=0b1; //se 1 -> simultaneous sampling _SMPI=0b000; //Interrupt dopo ogni campionamento se 0 switch(trigger_ad) { case TRIGGER_AD_PWM: _SSRC=TRIGGER_AD_PWM; //011=PWM trigger event break; case TRIGGER_AD_TMR3: _SSRC=TRIGGER_AD_TMR3; //Timer3 trigger event break; default: _SSRC=TRIGGER_AD_AD; //ogni fine conversione l AD si autoriattiva _ASAM=0b1; //Automatic sample _CSCNA=0b0; //Disabilito lo scanning dei sample/hold se 0 _ALTS=0; //Alternate MUX Sampling disabilitato ADCON2bits.CHPS = channel&0x03; //00=S/H su CH0, 01=S/H su CH0 e CH1, 1x tutti //---Questi sono flag per PWM---// SEVTCMPbits.SEVTCMP=0; SEVTCMPbits.SEVTDIR=0b0; _SEVOPS=0b0000; //se 1,ogni 2 PWM scatta l int AD // // ADCON3bits.SAMC = 1; //tempo minimo di sample ADCON3bits.ADCS = ADCS_delay&0x3F; //Setta il minimo tempo per la conversione A/D. ADPCFGbits.PCFG0 = 0; ADPCFGbits.PCFG1 = 0; ADPCFGbits.PCFG2 = 0; _ADIE=1; _ADIF=0;

89 5.3. REGOLATORE PID DI CORRENTE 89 _ADON=0b1; //Attivo l ADON ======================= pid.h #define CURRENT_BASE 50 //lem da 25A con una 2 spire ->50A teorici, 40 saturati #define OFFSET_CURRENT 512 #define INITIAL_CURRENT 0 //eventuale valore iniziale della corrente #define CURRENT_RIF 2047 //2047=25A /***** PID di corrente *********/ #define PROPORZIONALEI(e)((e*10)) #define INTEGRALEI(e)((e*3)+(e> >3)+(e> >4)) #define KIS 8 //shift per l integrale #define KD(e)(((e*800)-(e> >1))) //con 400 o 500 forse è meglio #define B_A(ba)((ba)-(ba> >7)+(ba> >8)+(ba> >9)+(ba> >11)) #define KDS 4 //shift per la derivata // SOGLIE // #define OUP 7373 /*=90V -> 90/50*4096*/ #define ODW -OUP #define IUP /* =OUP*2^8 */ #define IDW -IUP #define DUP OUP /* Soglia del derivativo */ #define DDW -DUP /********** CHECK DUTY-CYCLE *************/ #define DCUP 699 //perdo il 5% della tensione x sicurezza #define DCDW 37 /********** MACRO DI RIPORTO DEL DC **************/ #define V_OFFSET 4097 #define GET_DC(v_digit)((v_digit> >4)+(v_digit> >6)+(v_digit> >7)+(v_digit> >8)) Rispetto alle simulazioni sono state aggiunte le soglie per variabili di uscita, integrale e derivata, oltre alla acro GET_DC per il calcolo del valore digitale del duty-cycle. ======================= main_polarizzazione.c #include <p30f4012.h> #include "Global.h" #include "Init.h" #include "pid.h" /***** Global *****************/ int errori, errori_1=0, proporzionale, correnteip, riferimentoip=current_rif, vd_out; long int integrale=initial_current, derivata=0; /******************************/ /********* MAIN *******************/ int main() { InitPORT(); InitPWM(2,OFF); LED_VERDE_ON; while(_re8); //fino a che resta tutto in stop o nn premo RE8 nn fare nulla Nop(); while(!_re8); LED_VERDE_OFF; InitAD(TRIGGER_AD_PWM,10,0,CHANNEL1); LED_ROSSO_ON; while(1); /**********************************/ /**************************** Interrupt SubRoutine ****************************/ void _ISR _ADCInterrupt() {

90 90 CAPITOLO 5. REGOLATORE PID int dc, dcaux, errorii, errorid; _RD0=1; //Flag per la misura dei tempi di esecuzione /*************************************************** REGOLATORE DI CORRENTE: metodo dei trapezi ***************************************************/ correnteip=((correntep-offset_i))< <3; //riporto la corrente a 12bit errori=(riferimentoip-correnteip); //calcolo l errore //INTEGRALE errorii=errori_1+errori; errorid=errori-errori_1; if(errorii>=0) integrale+=integralei(errorii); else integrale-=integralei((-errorii)); //PROPORZIONALE proporzionale=proporzionalei(((long int)errori)); //DERIVATA if(derivata>=0) derivata=b_a(derivata); else derivata=-(b_a((-derivata))); derivata+=kd(errorid); //CALCOLO DELL USCITA vd_out=(derivata> >KDS)+proporzionale+(integrale> >KIS); if(vd_out>oup) vd_out=oup; else if(vd_out<odw) vd_out=odw; /*************************************************** USCITA riportata sul DC ***************************************************/ vd_out+=v_offset; //porto il valore da 0 a 8191 (->13bit) dc=get_dc(vd_out); if(dc>dcup) dc=dcup; else if(dc<dcdw) dc=dcdw; PDC2=dc; PDC1=DUTYCYM-dc; /************************************ TRATTAMENTO FINALE DELLE VARIABILI ************************************/ if(integrale>iup) integrale=iup; else if(integrale<idw) integrale=idw; errori_1=errori; if(derivata>dup) derivata=dup; elae if(derivata<ddw) derivata=ddw; errori_1=errori; _ADIF=0; _RD0=0; Il codice del regolatore non è molto diverso da quello delle simulazioni. In più a prima si osserva che tramite la macro GET_DC viene calcolato il termine del duty-cycle (dc) riscalando la grandezza vd_out opportunamente saturata tra 0 e 736. Una volta ottenuto il duty-cycle questo viene precauzionalmente limitato tra DCDW e DCUP in modo da avere un duty-cycle compreso tra 5% e 95% del dutty-cycle per ogni singola gamba 10. Successivamente il valore dc viene assegnato ad una gamba (PDC2=dc) mentre il suo complemento vine assegnato all altra (PDC1=DUTYCYM-dc). Infine, oltre alla saturazione dell uscita, si procede anche alla saturazione dell integrale e derivata. Infatti la derivata presenta un termine (B_A) integrativo ossia si può dire che anche la derivata è una variabile con memoria in quanto dipende dagli stati precedenti. ======================= Per quanto riguarda lo sviluppo del codice con derivata ogni 20T s verranno riportate le modifiche rispetto al codice precedente: ======================= 10 Ciò aiuta a evitare che le valvole e/o i driver si danneggino.

91 5.3. REGOLATORE PID DI CORRENTE 91 pid.h... /***** PID di corrente *********/ #define PROPORZIONALEI(e)((e*10)) #define INTEGRALEI(e)((e*3)+(e> >3)+(e> >4)) #define KIS 8 #define KD(e)(((e*790)+(e> >3))) //con 500 forse è meglio #define B_A(ba)((ba)-(ba> >5)+(ba> >8)+(ba> >9)+(ba> >11)) #define KDS 4 #define STEPN 20 //STEP per il calcolo della derivata... ======================= main_polarizzazione.c /***** Global *****************/ int errori[stepn], proporzionale, correnteip, riferimentoip=current_rif, vd_out; long int integrale=initial_current, derivata=0; /***********************************************************/... /**************************** Interrupt SubRoutine ****************************/ void _ISR _ADCInterrupt() { int dc, dcaux, errorii, errorid, i; _RD0=1; //Flag per la misura dei tempi di esecuzione /*************************************************** REGOLATORE DI CORRENTE: metodo dei trapezi ***************************************************/ correnteip=((correntep-offset_i))< <3; //riporto la corrente a 12bit for(i=stepn-1; i>0; i--) errori[i]=errori[i-1]; errori[0]=(riferimentoip-correnteip); //calcolo l errore errorii=errori[0]+errori[1]; errorid=errori[0]-errori[stepn]; //INTEGRALE if(errorii>=0) integrale+=integralei(errorii); else integrale-=integralei((-errorii)); //PROPORZIONALE proporzionale=proporzionalei((errori[0])); //DERIVATA if(derivata>=0) derivata=b_a(derivata); else derivata=-(b_a((-derivata))); derivata+=kd(errorid); // CALCOLO DELL USCITA vd_out=(derivata> >KDS)+proporzionale+(integrale> >KIS); if(vd_out>oup) vd_out=oup; else if(vd_out<odw) vd_out=odw;... =======================

92 92 CAPITOLO 5. REGOLATORE PID

93 Appendice A Breviario sulla sintassi C In questa appendice vengono riportate le nozioni base necessarie per la scrittura di un programma in C. Per informazioni più complete e dettagliate si rimanda comunque alla lettura di un buon libro sui fondamenti del C o alle numerosissime guide su internet come per esempio [L6]. A.1 Tipi di dati Le informazioni che verranno date di seguito si possono trovare anche nel manuale del compilatore. Nel caso di dspic si fa riferimento al manuale del compilatore C30 [3]. Le informazioni sotto riportate sono di carattere generale, quindi si consiglia sempre di verificarle con quanto scritto nel manuale del compilatore che si ha in dotazione. Scalari char 8bit con segno. Usato per i caratteri. unsigned char 8bit senza segno. short int 8bit interi con segno. Usato per i numeri. Se il processore è a 32bit, tipicamente short int è a 16bit. unsigned short int 8bit senza segno. Valgono le considerazioni fatte per short int. int 16bit con segno. Tipicamente è la parola del processore se il processore computa a 16 bit o più. In altre parole se il processore è a 8bit, int vale sempre 16, mentre se il processore è a 32 bit, int è a 32bit. Se non precisato, in questa sede si assume int pari a 16bit. unsigned int 16bit con segno. Valgono le considerazioni fatte per int. long int 32bit con segno. Tipicamente se il processore è a 32bit e int è a 32bit, long int resta comunque a 32 bit. unsigned long int 32bit senza segno. Valgono le considerazioni fatte per int. long long int 64bit con segno; con unsigned diventa senza segno. 93

94 94 APPENDICE A. BREVIARIO SULLA SINTASSI C float double 32bit in virgola mobile, tipicamente a 64 per sistemi a 32bit. Nel caso del C30 il valore va da a bit a virgola mobile tipicamente a 64 per sistemi a 32bit. valgono le stesse considerazioni di float. long double 64bit in virgola mobile, tipicamente 128 per sistemi a 32bit. il valore va da a Spesso double e long double hanno la stessa lunghezza. Ciò dipende tipicamente dal compilatore o dai parametri si compilazione. Per assegnare (o definire) un numero si può ricorrere alle forme seguenti: c= A assegna un carattere x=123 assegna un numero espresso in decimale y=0x3f0 z=0b101 assegna un numero espresso in esadecimale. In questo caso il valore è a 16bit. assegna un numero espresso in binario. o=011 assegna un numero ottale. l=123l f=2.344 assegna un numero di tipo long. Chiaramente se l non è long il compilatore provvederà alla castizzazione. assegna un numero in virgola mobile (float o double). Si può anche porre una f alla fine per forzare il tipo float, ma il numero deve avere anche il. (per esempio 0.1f) Array Gli array sono strutture di dati omogenei contigui. Sono definiti come segue: char string[100]; //definizione stringa di lunghezza 100 byte int vector[10]; //definizione vettore di 10 numeri interi a 16 bit. string[10]= X ; //assegnazione del carattere X all undicesimo carattere l incremento dell indice in string permette di accedere ai vari byte della stringa (ossia ci si sposta di 8bit per volta), mentre in vector permette di accedere ai vari numeri del vettore (ossia ci si sposta di 16bit per volta). Per accedere ai vari valori è sufficiente scrivere il nome della variabile seguito da un numero che, per esempio nel caso della variabile string, va da 0 a 99. I valori negativi non sono accettati, mentre quelli superiori a 99 causano i così detti buffer overflow; ciò in un microprocessore si traduce nella sovrascrittura di altre variabili e/o indirizzi di ritorno delle funzioni 1 Un array può anche essere definito come un puntatore (pag. 96), ma il metodo per accedervi è il medesimo. É anche possibile definire array di strutture. 1 Normalmente in processori come i pic ciò si traduce in un reset. Si osservi che in alcuni micro della serie 18 è possibile, configurando opportunamente i configuration bits, impedire il reset a fronte di un buffer/stack-overflow.

95 A.1. TIPI DI DATI 95 Strutture e unioni Le strutture sono aree dati formattate (strutturate) in un particolare modo. Tipicamente racchiudono più dati spesso di tipo diverso. Si indicano come segue struct NOME_STRUTTURA { tipo NOME_VARIABILE1, NOME_VARIABILE2; tipo NOME_VARIABILE3; ; dove il NOME_STRUTTURA può anche essere posto alla fine, ossia dopo la parentesi graffa chiusa. Normalmente la definizione della struttura è preceduta dalla keyword typdef che permette di definire un nuovo tipo di variabile: typedef struct { tipo NOME_VARIABILE1, NOME_VARIABILE2; tipo NOME_VARIABILE3; NOME_STRUTTURA ; Per richiamare la struttura e per accedere ai vari campi si scrive semplicemente: typedef struct { //definizione della struttura int x; char c; //campi t_struct; //t_ indica che è un tipo; è una pura convenzione. struct t_struct x,y; //definizione delle variabili x.x=10; //assegno il numero 10; x.c= x ; //assegno il carattere x y=x; //copio x in y. Non tutti i compilatori lo accettano. Spesso però è necessario poter accedere singolarmente ai singoli bit che compongono una struttura. Una struttura come la seguente permette di fare ciò: typedef struct { unsigned LSB :1; //bit meno significativo unsigned BIT2 :1; //2 bit unsigned :2; //2 bit non indirizzabili unsigned NIBBLE :4; //4 bit = 1 Nibble short int BYTE :8; //byte con segno; :8 in questo caso non è obbligatorio, t_complexstruct; //come non è obbligatorio cambiare variabile in short int Così facendo è possibile definire una variabile (in questo caso di 16bit) divisi in vari campi che minimo devono essere di 1 bit. Ciò risulta molto comodo nei micro controllori. Dal punto di vista della memoria, una struttura occupa tanti byte quanti quelli delle singole variabili definite all interno; per esempio t_struct definita in precedenza occupa 3 byte. Spesso però è utile avere una certa area di memoria alla quale si vuole accedere contemporaneamente con due o più formattazioni diverse. Per fare ciò si ricorre alle union come segue: typedef union { long int l; //32 bit unsigned int i; //supposto int 16 bit char c[2]; t_union; La union appena definita permette di accedere alla stessa area di memoria agendo sullo scalare i o sull array c. Per esempio:

96 96 APPENDICE A. BREVIARIO SULLA SINTASSI C t_union x; x.l=0x10009; //x.i=0x0009, c[0]=0x09, c[1]=0x00 x.i=0xf50; //setto la variabile i: c[0] vale 0x50, c[1]=0x0f, l=0x10f50 x.c[1]++; //ora si ha i=0x1050 e l=0x11050 questo implica che sizeof(t_union) sizeof(long int)+sizeof(int)+2*sizeof(char). In altre parole tutte le variabili contenute in una union partono dal medesimo indirizzo di memoria. Per capire meglio l organizzazione della memoria si osservi la tabella seguente che mostra come è allocato il valore 0x11050: La variabile di dimensioni maggiori setta la dimensione della union e viene posizionata, in questo esempio, alla posizione di memoria 0x2000; a questa posizione corrisponde anche il primo byte (ossia quello meno significativo) della union. Tutte le altre variabili vengono collocate a questo indirizzo di memoria: condividendo lo stesso indirizzo di memoria tutti sottocampi della variabile x condividono i singoli byte. Attenzione però che l esempio proposto è solo qualitativo per capire come funziona una union. Infatti l organizzazione dei dati dipende dal processore. L esempio quindi calza per i processori dspic30f i quali rappresentano i dati nel formato little endian (vedi [3] 5.3) ossia il byte più significativo risiede all indirizzo di memoria più alto, viceversa il formato big endian usato per esempio nei processori POWERPC di FREESCALE (IBM). Se ora si volesse fare in modo che la variabile c[2] punti al secondo e terzo byte della union, è possibile unire quanto fin ora detto e ottenere una struttura di questo tipo: typedef union { long int l; //32 bit unsigned int i; //supposto int 16 bit struct { unsigned :8; char c[2]; ; t_union; Puntatori Si indicano con * prima del nome della variabile: void* char* int* puntatore generico. puntatore a carattere o ad array di caratteri (ossia stringhe). puntatore a numero intero o ad array di numeri interi. I puntatori sono tutti di dimensione pari alla parola del processore. Ciò significa che in termini di memoria non vi è differenza tra char*, int*, ecc. Lo stralcio di codice seguente mostra come si indica alla variabile di puntare ad una determinata cella di memoria:

Cristian Secchi Pag. 1

Cristian Secchi Pag. 1 CONTROLLI DIGITALI Laurea Magistrale in Ingegneria Meccatronica SISTEMI A TEMPO DISCRETO Ing. Tel. 0522 522235 e-mail: cristian.secchi@unimore.it http://www.dismi.unimo.it/members/csecchi Richiami di Controlli

Dettagli

A.S. 2008/2009 CLASSE 5BEA SISTEMI AUTOMATICI SINTESI DEL CORSO

A.S. 2008/2009 CLASSE 5BEA SISTEMI AUTOMATICI SINTESI DEL CORSO A.S. 2008/2009 CLASSE 5BEA SISTEMI AUTOMATICI SINTESI DEL CORSO Sono stati trattati gli elementi base per l'analisi e il dimensionamento dei sistemi di controllo nei processi continui. E' quindi importante:

Dettagli

Catene di Misura. Corso di Misure Elettriche http://sms.unipv.it/misure/

Catene di Misura. Corso di Misure Elettriche http://sms.unipv.it/misure/ Catene di Misura Corso di Misure Elettriche http://sms.unipv.it/misure/ Piero Malcovati Dipartimento di Ingegneria Industriale e dell Informazione Università di Pavia piero.malcovati@unipv.it Piero Malcovati

Dettagli

Analisi dei sistemi di controllo a segnali campionati

Analisi dei sistemi di controllo a segnali campionati Analisi dei sistemi di controllo a segnali campionati Sistemi di controllo (già analizzati) Tempo continuo (trasformata di Laplace / analisi in frequenza) C(s) controllore analogico impianto attuatori

Dettagli

Cristian Secchi Pag. 1

Cristian Secchi Pag. 1 INGEGNERIA E TECNOLOGIE DEI SISTEMI DI CONTROLLO Laurea Specialistica in Ingegneria Meccatronica STRUMENTI MATEMATICI PER L ANALISI DEI SISTEMI DISCRETI Ing. Tel. 0522 522235 e-mail: secchi.cristian@unimore.it

Dettagli

SISTEMI DIGITALI DI CONTROLLO

SISTEMI DIGITALI DI CONTROLLO Sistemi Digitali di Controllo A.A. 9- p. /3 SISTEMI DIGITALI DI CONTROLLO Prof. Alessandro De Luca DIS, Università di Roma La Sapienza deluca@dis.uniroma.it Lucidi tratti dal libro C. Bonivento, C. Melchiorri,

Dettagli

Differenziazione sistemi dinamici

Differenziazione sistemi dinamici Il controllo di sistemi ad avanzamento temporale si basa sulle tecniche di controllo in retroazione, ovvero, elabora le informazione sullo stato del processo (provenienti dai sensori) in modo sa inviare

Dettagli

CONTROLLORI STANDARD PID. Guido Vagliasindi Controlli Automatici A.A. 06/07 Controllori Standard PID

CONTROLLORI STANDARD PID. Guido Vagliasindi Controlli Automatici A.A. 06/07 Controllori Standard PID ONTROLLORI STANDARD PID Guido Vagliasindi ontrolli Automatici A.A. 6/7 ontrollori Standard PID MODELLO DEI REGOLATORI PID Tra le ragioni del vastissimo utilizzo dei regolatori PID nella pratica dell automazione

Dettagli

ISTITUTO D ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA

ISTITUTO D ISTRUZIONE SUPERIORE L. EINAUDI ALBA ISTITUTO D ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA CLASSE 5H Docenti: Raviola Giovanni Moreni Riccardo Disciplina: Sistemi elettronici automatici PROGETTAZIONE DIDATTICA ANNUALE COMPETENZE FINALI Al termine

Dettagli

Differenziazione sistemi dinamici

Differenziazione sistemi dinamici Obiettivo: analisi e sintesi dei sistemi di controllo in retroazione in cui è presente un calcolatore digitale Il controllo digitale è ampiamente usato, grazie alla diffusione di microprocessori e microcalcolatori,

Dettagli

Nome: Nr. Mat. Firma:

Nome: Nr. Mat. Firma: Controlli Automatici - A.A. 1/11 Ingegneria Gestionale 13 Settembre 11 - Esercizi Nome: Nr. Mat. Firma: Rispondere alle seguenti domande. a) Calcolare la trasformata di Laplace X(s) dei seguenti segnali

Dettagli

Fondamenti di Automatica - I Parte Il progetto del controllore

Fondamenti di Automatica - I Parte Il progetto del controllore Fondamenti di Automatica - I Parte Il progetto del controllore Antonio Bicchi, Giordano Greco Università di Pisa 1 INDICE 2 Indice 1 Introduzione 3 2 Approssimazioni della f.d.t. in anello chiuso 5 3 Metodi

Dettagli

MESSA IN SCALA DI ALGORITMI DIGITALI

MESSA IN SCALA DI ALGORITMI DIGITALI Ingegneria e Tecnologie dei Sistemi di Controllo Laurea Specialistica in Ingegneria Meccatronica MESSA IN SCALA DI ALGORITMI DIGITALI Cristian Secchi Tel. 0522 522235 e-mail: secchi.cristian@unimore.it

Dettagli

Prestazioni dei sistemi in retroazione

Prestazioni dei sistemi in retroazione Prestazioni dei sistemi in retroazione (ver..2). Sensitività e sensitività complementare Sia dato il sistema in retroazione riportato in Fig... Vogliamo determinare quanto è sensibile il sistema in anello

Dettagli

Sistemi di controllo industriali

Sistemi di controllo industriali Sistemi di controllo industriali Regolatori PID: funzionamento e taratura Modello, funzionamento e realizzazione pratica Metodi di taratura in anello chiuso Metodi di taratura in anello aperto Un esempio

Dettagli

Diagrammi di Bode. I Diagrammi di Bode sono due: 1) il diagramma delle ampiezze rappresenta α = ln G(jω) in funzione

Diagrammi di Bode. I Diagrammi di Bode sono due: 1) il diagramma delle ampiezze rappresenta α = ln G(jω) in funzione 0.0. 3.2 Diagrammi di Bode Possibili rappresentazioni grafiche della funzione di risposta armonica F (ω) = G(jω) sono: i Diagrammi di Bode, i Diagrammi di Nyquist e i Diagrammi di Nichols. I Diagrammi

Dettagli

Fondamenti di Automatica

Fondamenti di Automatica Fondamenti di Automatica Funzioni di trasferimento: robustezza e prestazioni Dott. Ing. Marcello Bonfè Dipartimento di Ingegneria - Università di Ferrara Tel. +39 0532 974839 E-mail: marcello.bonfe@unife.it

Dettagli

Considerazioni sulle specifiche.

Considerazioni sulle specifiche. # SINTESI PER TENTATIVI IN ω PER GLI ASSERVIMENTI # Considerazioni sulle specifiche. Come accennato in precedenza, prima di avviare la prima fase della sintesi di un sistema di asservimento, e cioe la

Dettagli

CONTROLLO NEL DOMINIO DELLA FREQUENZA

CONTROLLO NEL DOMINIO DELLA FREQUENZA SISTEMI DI CONTROLLO Ingegneria Meccanica e Ingegneria del Veicolo http://www.dii.unimore.it/~lbiagiotti/sistemicontrollo.html CONTROLLO NEL DOMINIO DELLA FREQUENZA Ing. Luigi Biagiotti e-mail: luigi.biagiotti@unimore.it

Dettagli

LA FUNZIONE DI TRASFERIMENTO

LA FUNZIONE DI TRASFERIMENTO LA FUNZIONE DI TRASFERIMENTO Può essere espressa sia nel dominio della s che nel dominio della j Definizione nel dominio della s. è riferita ai soli sistemi con un ingresso ed un uscita 2. ha per oggetto

Dettagli

SPECIFICHE DI PROGETTO DI SISTEMI DI CONTROLLO

SPECIFICHE DI PROGETTO DI SISTEMI DI CONTROLLO INGEGNERIA E TECNOLOGIE DEI SISTEMI DI CONTROLLO Laurea Specialistica in Ingegneria Meccatronica SPECIFICHE DI PROGETTO DI SISTEMI DI CONTROLLO Ing. Cristian Secchi Tel. 0522 522235 e-mail: secchi.cristian@unimore.it

Dettagli

LEZIONI DEL CORSO DI SISTEMI DEL QUINTO ANNO

LEZIONI DEL CORSO DI SISTEMI DEL QUINTO ANNO LEZIONI DEL CORSO DI SISTEMI DEL QUINTO ANNO MOD. 1 Sistemi di controllo e di regolazione. Si tratta di un ripasso di una parte di argomenti effettuati l anno scorso. Introduzione. Schemi a blocchi di

Dettagli

Sistema dinamico a tempo continuo

Sistema dinamico a tempo continuo Sistema dinamico a tempo continuo Un sistema è un modello matematico di un fenomeno fisico: esso comprende le cause e gli effetti relativi al fenomeno, nonché la relazione matematica che li lega. X INGRESSO

Dettagli

Prova scritta di Controlli Automatici

Prova scritta di Controlli Automatici Prova scritta di Controlli Automatici Corso di Laurea in Ingegneria Meccatronica, AA 2011 2012 10 Settembre 2012 Domande a Risposta Multipla Per ognuna delle seguenti domande a risposta multipla, indicare

Dettagli

La trasformata Zeta. Marco Marcon

La trasformata Zeta. Marco Marcon La trasformata Zeta Marco Marcon ENS Trasformata zeta E l estensione nel caso discreto della trasformata di Laplace. Applicata all analisi dei sistemi LTI permette di scrivere in modo diretto la relazione

Dettagli

Spiegare brevemente il principale beneficio del controllo in cascata (per sistemi a fase non minima).

Spiegare brevemente il principale beneficio del controllo in cascata (per sistemi a fase non minima). Spiegare brevemente il principale beneficio del controllo in cascata (per sistemi a fase non minima). Il controllo in cascata si usa per migliorare la risposta al setpoint, e soprattutto al disturbo di

Dettagli

Specializzazione Elettronica ed Elettrotecnica Articolazione Automazione. Elettronica ed Elettrotecnica - Classe 3^

Specializzazione Elettronica ed Elettrotecnica Articolazione Automazione. Elettronica ed Elettrotecnica - Classe 3^ Specializzazione Elettronica ed Elettrotecnica Articolazione Automazione Elettronica ed Elettrotecnica - Classe 3^ Elettrotecnica Tipologie di segnali Unità di misura delle grandezze elettriche Simbologia

Dettagli

Lezione2 Ricerca di zeri. http://idefix.mi.infn.it/~palombo/didattica/lab-tnds/corsolab/lezionifrontali. Fernando Palombo

Lezione2 Ricerca di zeri. http://idefix.mi.infn.it/~palombo/didattica/lab-tnds/corsolab/lezionifrontali. Fernando Palombo Lezione2 Ricerca di zeri http://idefix.mi.infn.it/~palombo/didattica/lab-tnds/corsolab/lezionifrontali Fernando Palombo Aritmetica Finita nel Computer Nel computer l aritmetica è a precisione finita cioè

Dettagli

Nome: Nr. Mat. Firma:

Nome: Nr. Mat. Firma: Fondamenti di Controlli Automatici - A.A. 7/8 4 Dicembre 7 - Esercizi Compito A Nr. Nome: Nr. Mat. Firma: a) Determinare la trasformata di Laplace X i (s) dei seguenti segnali temporali x i (t): x (t)

Dettagli

Il motore a corrente continua, chiamato così perché per. funzionare deve essere alimentato con tensione e corrente

Il motore a corrente continua, chiamato così perché per. funzionare deve essere alimentato con tensione e corrente 1.1 Il motore a corrente continua Il motore a corrente continua, chiamato così perché per funzionare deve essere alimentato con tensione e corrente costante, è costituito, come gli altri motori da due

Dettagli

Modellazione e Analisi di Reti Elettriche

Modellazione e Analisi di Reti Elettriche Modellazione e Analisi di eti Elettriche Modellazione e Analisi di eti Elettriche Davide Giglio Introduzione alle eti Elettriche e reti elettriche costituite da resistori, condensatori e induttori (bipoli),

Dettagli

Capitolo 7 Analisi di Sistemi a Dati Campionati

Capitolo 7 Analisi di Sistemi a Dati Campionati Capitolo 7 Analisi di Sistemi a Dati Campionati Un sistema di controllo digitale è costituito da elementi a tempo continuo (il processo da controllare, l attuatore, il trasduttore analogico, il filtro

Dettagli

Orlando Allocca Regolatori standard

Orlando Allocca Regolatori standard A09 159 Orlando Allocca Regolatori standard Copyright MMXII ARACNE editrice S.r.l. www.aracneeditrice.it info@aracneeditrice.it via Raffaele Garofalo, 133/A B 00173 Roma (06) 93781065 ISBN 978-88-548-4882-7

Dettagli

Fondamenti di Automatica

Fondamenti di Automatica Fondamenti di Automatica Analisi armonica e metodi grafici Dott. Ing. Marcello Bonfè Dipartimento di Ingegneria - Università di Ferrara Tel. +39 053 974839 E-mail: marcello.bonfe@unife.it pag. Analisi

Dettagli

13-1 SISTEMI A DATI CAMPIONATI: INTRODUZIONE. y(t) TMP. y k. Trasduttore. Schema di base di un sistema di controllo digitale

13-1 SISTEMI A DATI CAMPIONATI: INTRODUZIONE. y(t) TMP. y k. Trasduttore. Schema di base di un sistema di controllo digitale SISTEMI A DATI CAMPIONATI: INTRODUZIONE + e k u k u(t) r k C D/A P y k TMP A/D Trasduttore y(t) Schema di base di un sistema di controllo digitale A/D: convertitore analogico digitale C: controllore digitale

Dettagli

Controlli Automatici T. Trasformata di Laplace e Funzione di trasferimento. Parte 3 Aggiornamento: Settembre 2010. Prof. L.

Controlli Automatici T. Trasformata di Laplace e Funzione di trasferimento. Parte 3 Aggiornamento: Settembre 2010. Prof. L. Parte 3 Aggiornamento: Settembre 2010 Parte 3, 1 Trasformata di Laplace e Funzione di trasferimento Prof. Lorenzo Marconi DEIS-Università di Bologna Tel. 051 2093788 Email: lmarconi@deis.unibo.it URL:

Dettagli

Diagrammi di Bode. delle

Diagrammi di Bode. delle .. 3.2 delle Diagrammi di Bode La funzione di risposta armonica F(ω) = G(jω) può essere rappresentata graficamente in tre modi diversi: i Diagrammi di Bode, i Diagrammi di Nyquist e i Diagrammi di Nichols.

Dettagli

Introduzione al Campionamento e

Introduzione al Campionamento e Introduzione al Campionamento e all analisi analisi in frequenza Presentazione basata sul Cap.V di Introduction of Engineering Experimentation, A.J.Wheeler, A.R.Ganj, Prentice Hall Campionamento L'utilizzo

Dettagli

Introduzione. Margine di ampiezza... 2 Margine di fase... 5 Osservazione... 6 Margini di stabilità e diagrammi di Bode... 6

Introduzione. Margine di ampiezza... 2 Margine di fase... 5 Osservazione... 6 Margini di stabilità e diagrammi di Bode... 6 ppunti di Controlli utomatici Capitolo 7 parte II Margini di stabilità Introduzione... Margine di ampiezza... Margine di fase... 5 Osservazione... 6 Margini di stabilità e diagrammi di ode... 6 Introduzione

Dettagli

ANALISI FREQUENZIALE E PROGETTO NEL DOMINIO DELLE FREQUENZE

ANALISI FREQUENZIALE E PROGETTO NEL DOMINIO DELLE FREQUENZE CONTROLLI AUTOMATICI Ingegneria della Gestione Industriale e della Integrazione di Impresa http://www.automazione.ingre.unimore.it/pages/corsi/controlliautomaticigestionale.htm ANALISI FREQUENZIALE E PROGETTO

Dettagli

Un sistema di controllo può essere progettato fissando le specifiche:

Un sistema di controllo può essere progettato fissando le specifiche: 3. Specifiche dei Sistemi Un sistema di controllo può essere progettato fissando le specifiche: nel dominio del tempo (tempo di salita, tempo di assestamento, sovraelongazione, ecc.); nel dominio della

Dettagli

Fondamenti di Automatica

Fondamenti di Automatica Fondamenti di Automatica Progetto di controllo e reti correttrici Dott. Ing. Marcello Bonfè Dipartimento di Ingegneria - Università di Ferrara Tel. +39 053 974839 E-mail: marcello.bonfe@unife.it pag. 1

Dettagli

PROGRAMMA SVOLTO fino al 22-06-2015 Fine del corso

PROGRAMMA SVOLTO fino al 22-06-2015 Fine del corso PROGRAMMA SVOLTO fino al 22-06-2015 Fine del corso Prof. Bruno Picasso LEZIONI: Introduzione al corso. Introduzione ai sistemi dinamici. I sistemi dinamici come sistemi di equazioni differenziali; variabili

Dettagli

IL SAMPLE AND HOLD UNIVERSITÀ DEGLI STUDI DI MILANO. Progetto di Fondamenti di Automatica. PROF.: M. Lazzaroni

IL SAMPLE AND HOLD UNIVERSITÀ DEGLI STUDI DI MILANO. Progetto di Fondamenti di Automatica. PROF.: M. Lazzaroni UNIVERSITÀ DEGLI STUDI DI MILANO FACOLTÀ DI SCIENZE MATEMATICHE, FISICHE E NATURALI Corso di Laurea in Informatica IL SAMPLE AND HOLD Progetto di Fondamenti di Automatica PROF.: M. Lazzaroni Anno Accademico

Dettagli

E evidente che le carattteristiche dell OPAMP ideale non possono essere raggiunte da nessun circuito reale. Gli amplificatori operazionali reali

E evidente che le carattteristiche dell OPAMP ideale non possono essere raggiunte da nessun circuito reale. Gli amplificatori operazionali reali E evidente che le carattteristiche dell OPAMP ideale non possono essere raggiunte da nessun circuito reale. Gli amplificatori operazionali reali hanno però caratteristiche che approssimano molto bene il

Dettagli

2. SINCRONIZZAZIONE (CENNI)

2. SINCRONIZZAZIONE (CENNI) 2. SINCRONIZZAZIONE (CENNI) INTRODUZIONE AL PROBLEMA DELLA SINCRONIZZAZIONE SINCRONISMO DI BIT SCRAMBLING SINCRONISMO DI FRAME INTRODUZIONE Abbiamo visto diverse tecniche in grado di convertire e di trasmettere

Dettagli

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C Università di Roma Tre Dipartimento di Matematica e Fisica Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Prova scritta di Controlli Automatici - Compito A

Prova scritta di Controlli Automatici - Compito A Prova scritta di Controlli Automatici - Compito A 21 Marzo 27 Domande a Risposta Multipla Per ognuna delle seguenti domande a risposta multipla, indicare quali sono le affermazioni vere. 1. Si consideri

Dettagli

FONDAMENTI DI AUTOMATICA / CONTROLLI AUTOMATICI

FONDAMENTI DI AUTOMATICA / CONTROLLI AUTOMATICI FONDAMENTI DI AUTOMATICA / CONTROLLI AUTOMATICI Guida alla soluzione degli esercizi d esame Dott. Ing. Marcello Bonfè Esercizi sulla scomposizione di modelli nello spazio degli stati: Gli esercizi nei

Dettagli

Quando troncare uno sviluppo in serie di Taylor

Quando troncare uno sviluppo in serie di Taylor Quando troncare uno sviluppo in serie di Taylor Marco Robutti October 13, 2014 Lo sviluppo in serie di Taylor di una funzione è uno strumento matematico davvero molto utile, e viene spesso utilizzato in

Dettagli

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Università di Roma Tre Facoltà di Scienze M.F.N. Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Controlli Automatici prof. M. Indri Sistemi di controllo digitali

Controlli Automatici prof. M. Indri Sistemi di controllo digitali Controlli Automatici prof. M. Indri Sistemi di controllo digitali Schema di controllo base r(t) + e(t) {e k } {u k } u(t) Campionatore (A/D) Controllore digitale Ricostruttore (D/A) Sistema (tempo cont.)

Dettagli

Principi di Automazione e Controllo

Principi di Automazione e Controllo Principi di Automazione e Controllo Ing. Fabio Piedimonte Corso IFTS per Tecnico Superiore di Produzione Ver 1.0 Indice 1 Introduzione al problema dell automazione 4 1.1 I processi..................................

Dettagli

A.1 Rappresentazione geometrica dei segnali

A.1 Rappresentazione geometrica dei segnali Appendice A Rappresentazione dei segnali A.1 Rappresentazione geometrica dei segnali Scomporre una generica forma d onda s(t) in somma di opportune funzioni base è operazione assai comune, particolarmente

Dettagli

Modulo 8. Elettronica Digitale. Contenuti: Obiettivi:

Modulo 8. Elettronica Digitale. Contenuti: Obiettivi: Modulo 8 Elettronica Digitale Contenuti: Introduzione Sistemi di numerazione posizionali Sistema binario Porte logiche fondamentali Porte logiche universali Metodo della forma canonica della somma per

Dettagli

Funzioni di trasferimento. Lezione 14 2

Funzioni di trasferimento. Lezione 14 2 Lezione 14 1 Funzioni di trasferimento Lezione 14 2 Introduzione Lezione 14 3 Cosa c è nell Unità 4 In questa sezione si affronteranno: Introduzione Uso dei decibel e delle scale logaritmiche Diagrammi

Dettagli

PROGRAMMAZIONE DIDATTICA DISCIPLINARE

PROGRAMMAZIONE DIDATTICA DISCIPLINARE Pag 1 di 7 PROGRAMMAZIONE DIDATTICA DISCIPLINARE Disciplina a.s.2013/2014 Classe:4 Sez. 4AELT INDIRIZZO: Elettronica ed Elettrotecnica articolazione Elettrotecnica Docenti : Prof. Giovanni Antonio Fadda,

Dettagli

ISTITUTO D ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA ANNO SCOLASTICO 2015/2016

ISTITUTO D ISTRUZIONE SUPERIORE L. EINAUDI ALBA ANNO SCOLASTICO 2015/2016 ISTITUTO D ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA ANNO SCOLASTICO 2015/2016 CLASSE 5 I Disciplina: Sistemi automatici Docenti: Linguanti Vincenzo Gasco Giovanni PROGETTAZIONE DIDATTICA ANNUALE COMPETENZE

Dettagli

Criteri di stabilità (ver. 1.2)

Criteri di stabilità (ver. 1.2) Criteri di stabilità (ver. 1.2) 1 1.1 Il concetto di stabilità Il concetto di stabilità è piuttosto generale e può essere definito in diversi contesti. Per i problemi di interesse nell area dei controlli

Dettagli

L amplificatore operazionale 1. Claudio CANCELLI

L amplificatore operazionale 1. Claudio CANCELLI L amplificatore operazionale Claudio CANCELLI L amplificatore operazionale Indice dei contenuti. L'amplificatore...3. L'amplificatore operazionale - Premesse teoriche....5 3. Circuito equivalente... 5

Dettagli

REGOLATORI STANDARD PID

REGOLATORI STANDARD PID CONTROLLI AUTOMATICI Ingegneria Gestionale http://www.automazione.ingre.unimore.it/pages/corsi/controlliautomaticigestionale.htm REGOLATORI STANDARD PID Ing. Federica Grossi Tel. 059 2056333 e-mail: federica.grossi@unimore.it

Dettagli

Regolatori PID. Corso di Controllo Digitale. a cura di Simona Onori s.onori@disp.uniroma2.it

Regolatori PID. Corso di Controllo Digitale. a cura di Simona Onori s.onori@disp.uniroma2.it Regolatori PID Corso di Controllo Digitale a cura di Simona Onori s.onori@disp.uniroma2.it Novembre 2005 Introduzione I regolatori lineari più usati in ambito industriale sono certamente i PID, o regolatori

Dettagli

Fondamenti di Automatica

Fondamenti di Automatica Fondamenti di Automatica Funzioni di trasferimento Dott. Ing. Marcello Bonfè Dipartimento di Ingegneria - Università di Ferrara Tel. +39 0532 974839 E-mail: marcello.bonfe@unife.it pag. 1 Funzioni di trasferimento

Dettagli

REGOLATORI STANDARD PID

REGOLATORI STANDARD PID SISTEMI DI CONTROLLO Ingegneria Meccanica e Ingegneria del Veicolo http://www.dii.unimore.it/~lbiagiotti/sistemicontrollo.html Regolatore Proporzionale, Integrale, Derivativo - PID Tre azioni di combinate

Dettagli

Fondamenti di Automatica

Fondamenti di Automatica Fondamenti di Automatica Funzioni di trasferimento: stabilità, errore a regime e luogo delle radici Dott. Ing. Marcello Bonfè Dipartimento di Ingegneria - Università di Ferrara Tel. +39 0532 974839 E-mail:

Dettagli

Trasformate di Laplace

Trasformate di Laplace TdL 1 TdL 2 Trasformate di Laplace La trasformata di Laplace e un OPERATORE funzionale Importanza dei modelli dinamici Risolvere equazioni differenziali (lineari a coefficienti costanti) Tempo t Dominio

Dettagli

SISTEMI DIGITALI DI CONTROLLO

SISTEMI DIGITALI DI CONTROLLO Sistemi Digitali di Controllo A.A. 2009-2010 p. 1/45 SISTEMI DIGITALI DI CONTROLLO Prof. Alessandro De Luca DIS, Università di Roma La Sapienza deluca@dis.uniroma1.it Lucidi tratti dal libro C. Bonivento,

Dettagli

30 RISONANZE SULLE LINEE DI TRASMISSIONE

30 RISONANZE SULLE LINEE DI TRASMISSIONE 3 RISONANZE SULLE LINEE DI TRASMISSIONE Risuonatori, ovvero circuiti in grado di supportare soluzioni risonanti( soluzioni a regime sinusoidali in assenza di generatori) vengono largamente utilizzati nelle

Dettagli

ISTITUTO D ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA

ISTITUTO D ISTRUZIONE SUPERIORE L. EINAUDI ALBA ISTITUTO D ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA CLASSE 5H Docenti: Raviola Giovanni Moreni Riccardo Disciplina: Sistemi elettronici automaticih PROGETTAZIONE DIDATTICA ANNUALE COMPETENZE FINALI Al termine

Dettagli

Controllo di velocità angolare di un motore in CC

Controllo di velocità angolare di un motore in CC Controllo di velocità angolare di un motore in CC Descrizione generale Il processo è composto da un motore in corrente continua, un sistema di riduzione, una dinamo tachimetrica ed un sistema di visualizzazione.

Dettagli

Capitolo 2. Un introduzione all analisi dinamica dei sistemi

Capitolo 2. Un introduzione all analisi dinamica dei sistemi Capitolo 2 Un introduzione all analisi dinamica dei sistemi Obiettivo: presentare una modellistica di applicazione generale per l analisi delle caratteristiche dinamiche di sistemi, nota come system dynamics,

Dettagli

Controllori PID, metodi di taratura e problemi d implementazione

Controllori PID, metodi di taratura e problemi d implementazione Controllori PID, metodi di taratura e problemi d implementazione Prof. Luigi Glielmo Università del Sannio L. Glielmo 1 / 23 Contenuto della presentazione Controllori PID Metodi di taratura in anello aperto

Dettagli

Introduzione. Il principio di localizzazione... 2 Organizzazioni delle memorie cache... 4 Gestione delle scritture in una cache...

Introduzione. Il principio di localizzazione... 2 Organizzazioni delle memorie cache... 4 Gestione delle scritture in una cache... Appunti di Calcolatori Elettronici Concetti generali sulla memoria cache Introduzione... 1 Il principio di localizzazione... 2 Organizzazioni delle memorie cache... 4 Gestione delle scritture in una cache...

Dettagli

CORSO di AUTOMAZIONE INDUSTRIALE

CORSO di AUTOMAZIONE INDUSTRIALE CORSO di AUTOMAZIONE INDUSTRIALE (cod. 8469) APPELLO del 10 Novembre 2010 Prof. Emanuele Carpanzano Soluzioni Esercizio 1 (Domande generali) 1.a) Controllo Modulante Tracciare qualitativamente la risposta

Dettagli

Embedded Software Sviluppo di uno Scheduler di base per PIC18. Tutorial. Embedded Software. Sviluppo di uno Scheduler di base per PIC18.

Embedded Software Sviluppo di uno Scheduler di base per PIC18. Tutorial. Embedded Software. Sviluppo di uno Scheduler di base per PIC18. Tutorial Embedded Software Sviluppo di uno Scheduler di base per PIC18 Pagina 1 Sommario 1. INTRODUZIONE... 3 2. COSA CI SERVE?... 3 3. UN PO DI TEORIA... 4 4. DALLA TEORIA ALLA PRATICA... 5 5. IMPLEMENTAZIONE...

Dettagli

FEDELTÀ DELLA RISPOSTA DEI SISTEMI DI CONTROLLO IN RETROAZIONE: ANALISI DELLA PRECISIONE IN REGIME PERMANENTE

FEDELTÀ DELLA RISPOSTA DEI SISTEMI DI CONTROLLO IN RETROAZIONE: ANALISI DELLA PRECISIONE IN REGIME PERMANENTE FEDELTÀ DELLA RISPOSTA DEI SISTEMI DI CONTROLLO IN RETROAZIONE: ANALISI DELLA PRECISIONE IN REGIME PERMANENTE Nello studio dei sistemi di controllo in retroazione spesso si richiede che l uscita segua

Dettagli

Revisione dei concetti fondamentali dell analisi in frequenza

Revisione dei concetti fondamentali dell analisi in frequenza Revisione dei concetti fondamentali dell analisi in frequenza rgomenti: trasformazione in frequenza: significato e funzionamento; schemi di rappresentazione; trasformata discreta. 1 Rappresentazione dei

Dettagli

Esercizi proposti di Fondamenti di Automatica - Parte 4

Esercizi proposti di Fondamenti di Automatica - Parte 4 Esercizi proposti di Fondamenti di Automatica - Parte 4 2 Aprile 26 Sia dato il sistema di controllo a controreazione di Fig. 1, in cui il processo ha funzione di trasferimento P (s) = 1 (1 +.1s)(1 +.1s).

Dettagli

Fondamenti di Automatica

Fondamenti di Automatica Fondamenti di Automatica Analisi dei sistemi dinamici Dott. Ing. Marcello Bonfè Dipartimento di Ingegneria - Università di Ferrara Tel. +39 0532 974839 E-mail: marcello.bonfe@unife.it pag. 1 Analisi dei

Dettagli

Il Campionameto dei segnali e la loro rappresentazione. 1 e prende il nome frequenza di

Il Campionameto dei segnali e la loro rappresentazione. 1 e prende il nome frequenza di Il Campionameto dei segnali e la loro rappresentazione Il campionamento consente, partendo da un segnale a tempo continuo ovvero che fluisce con continuità nel tempo, di ottenere un segnale a tempo discreto,

Dettagli

STUDIO DI UNA FUNZIONE

STUDIO DI UNA FUNZIONE STUDIO DI UNA FUNZIONE OBIETTIVO: Data l equazione Y = f(x) di una funzione a variabili reali (X R e Y R), studiare l andamento del suo grafico. PROCEDIMENTO 1. STUDIO DEL DOMINIO (CAMPO DI ESISTENZA)

Dettagli

Elettronica e Telecomunicazioni Classe Quinta. La trasformata di Laplace

Elettronica e Telecomunicazioni Classe Quinta. La trasformata di Laplace Elettronica e Telecomunicazioni Classe Quinta La trasformata di Laplace ELETTRONICA E TELECOMUNICAZIONI CLASSE QUINTA A INFORMATICA INDICE Segnali canonici Trasformata di Laplace Teoremi sulla trasformata

Dettagli

Comportamento a regime dei sistemi di controllo in retroazione Appunti di Controlli Automatici

Comportamento a regime dei sistemi di controllo in retroazione Appunti di Controlli Automatici Comportamento a regime dei sistemi di controllo in retroazione Appunti di Controlli Automatici Versione 1.0 Ing. Alessandro Pisano SOMMARIO Introduzione 3 1. Stabilità a ciclo chiuso e teorema del valore

Dettagli

Articolazione Elettronica. Specializzazione Elettronica ed Elettrotecnica Articolazione Elettronica. Elettronica ed Elettrotecnica - Classe 3^

Articolazione Elettronica. Specializzazione Elettronica ed Elettrotecnica Articolazione Elettronica. Elettronica ed Elettrotecnica - Classe 3^ Articolazione Elettronica Specializzazione Elettronica ed Elettrotecnica Articolazione Elettronica Elettronica ed Elettrotecnica - Classe 3^ Elettrotecnica Tipologie di Segnali Unità di misura delle grandezze

Dettagli

Conversione A/D. Corso di Misure Elettriche http://sms.unipv.it/misure/

Conversione A/D. Corso di Misure Elettriche http://sms.unipv.it/misure/ Conversione A/D Corso di Misure Elettriche http://sms.unipv.it/misure/ Piero Malcovati Dipartimento di Ingegneria Industriale e dell Informazione Università di Pavia piero.malcovati@unipv.it Piero Malcovati

Dettagli

Dispense del corso di Elettronica Ls Prof. Guido Masetti

Dispense del corso di Elettronica Ls Prof. Guido Masetti Dispense del corso di Elettronica Ls Prof. Guido Masetti Elaborazione dei segnali 1 Sommario Elaborazione del segnale Sistemi lineari tempo invarianti (LTI), tempocontinui e tempo-discreti Analisi di Fourier

Dettagli

Codifica binaria dei numeri

Codifica binaria dei numeri Codifica binaria dei numeri Caso più semplice: in modo posizionale (spesso detto codifica binaria tout court) Esempio con numero naturale: con 8 bit 39 = Codifica in virgola fissa dei numeri float: si

Dettagli

Manuale programmazione ISO

Manuale programmazione ISO DOCUMENTAZIONE PER L UTENTE Manuale programmazione ISO SIDAC S.r.L 21017 Samarate (Varese) Via Acquedotto, 111 E_Mail info@sidaccnc.it Tel. 0331.22.30.19 r.a. Fax. 0331.22.30.78 1 Ver. 1.0 - Aggiornamento

Dettagli

Accuratezza di uno strumento

Accuratezza di uno strumento Accuratezza di uno strumento Come abbiamo già accennato la volta scora, il risultato della misurazione di una grandezza fisica, qualsiasi sia lo strumento utilizzato, non è mai un valore numerico X univocamente

Dettagli

Applicazioni dell amplificatore operazionale

Applicazioni dell amplificatore operazionale Capitolo 10 Applicazioni dell amplificatore operazionale Molte applicazioni dell amplificatore operazionale si basano su circuiti che sono derivati da quello dell amplificatore non invertente di fig. 9.5

Dettagli

1 Massimi e minimi liberi 1. 2 Massimi e minimi vincolati 7. 3 Soluzioni degli esercizi 12

1 Massimi e minimi liberi 1. 2 Massimi e minimi vincolati 7. 3 Soluzioni degli esercizi 12 UNIVR Facoltà di Economia Sede di Vicenza Corso di Matematica 1 Massimi e minimi delle funzioni di più variabili Indice 1 Massimi e minimi liberi 1 Massimi e minimi vincolati 7 3 Soluzioni degli esercizi

Dettagli

L espressione torna invece sempre vera (quindi la soluzione originale) se cambiamo contemporaneamente il verso: 1 < 0.

L espressione torna invece sempre vera (quindi la soluzione originale) se cambiamo contemporaneamente il verso: 1 < 0. EQUAZIONI E DISEQUAZIONI Le uguaglianze fra espressioni numeriche si chiamano equazioni. Cercare le soluzioni dell equazione vuol dire cercare quelle combinazioni delle lettere che vi compaiono che la

Dettagli

Introduzione. Classificazione delle non linearità

Introduzione. Classificazione delle non linearità Introduzione Accade spesso di dover studiare un sistema di controllo in cui sono presenti sottosistemi non lineari. Alcuni di tali sottosistemi sono descritti da equazioni differenziali non lineari, ad

Dettagli

Microcontrollore. Ora invece passiamo a spiegare come funzionano i convertitori A/D interni ai microcontrollori

Microcontrollore. Ora invece passiamo a spiegare come funzionano i convertitori A/D interni ai microcontrollori Microcontrollore Il microcontrollore è un sistema a microprocessore completo,integrato in un unico chip, progettato per avere la massima autosufficienza e versatilità. Infatti visto il loro prezzo esiguo,

Dettagli

Esercizi svolti. 1. Si consideri la funzione f(x) = 4 x 2. a) Verificare che la funzione F(x) = x 2 4 x2 + 2 arcsin x è una primitiva di

Esercizi svolti. 1. Si consideri la funzione f(x) = 4 x 2. a) Verificare che la funzione F(x) = x 2 4 x2 + 2 arcsin x è una primitiva di Esercizi svolti. Si consideri la funzione f() 4. a) Verificare che la funzione F() 4 + arcsin è una primitiva di f() sull intervallo (, ). b) Verificare che la funzione G() 4 + arcsin π è la primitiva

Dettagli

Segnali e Sistemi. Dispensa integrativa per l insegnamento di Elementi di Controlli Automatici. Gianni Borghesan e Giovanni Marro

Segnali e Sistemi. Dispensa integrativa per l insegnamento di Elementi di Controlli Automatici. Gianni Borghesan e Giovanni Marro Segnali e Sistemi Dispensa integrativa per l insegnamento di Elementi di Controlli Automatici Gianni Borghesan e Giovanni Marro Indice Introduzione 2. Notazione............................. 2 2 Classificazione

Dettagli

Revisione dei concetti fondamentali

Revisione dei concetti fondamentali Revisione dei concetti fondamentali dell analisi in frequenza Argomenti: trasformazione in frequenza: significato e funzionamento; schemi di rappresentazione; trasformata discreta. 1 Rappresentazione dei

Dettagli

Controllo di motori in corrente continua. A cura di: Ing. Massimo Cefalo Ing. Fabio Zonfrilli

Controllo di motori in corrente continua. A cura di: Ing. Massimo Cefalo Ing. Fabio Zonfrilli Controllo di motori in corrente continua A cura di: Ing. Massimo Cefalo Ing. Fabio Zonfrilli Sistema di Controllo d rif - C(s) P(s) y T(s) n C(s) P(s) Controllore Sistema d n Disturbo Rumore T(s) Trasduttore

Dettagli

LUOGO DELLE RADICI. G(s) H(s) 1+KG(s)H(s)=0

LUOGO DELLE RADICI. G(s) H(s) 1+KG(s)H(s)=0 LUOGO DELLE RADICI Il progetto accurato di un sistema di controllo richiede la conoscenza dei poli del sistema in anello chiuso e dell influenza che su di essi hanno le variazioni dei più importanti parametri

Dettagli