3 Regolatori discretizzati

In questo capitolo sarà analizzata la tecnica per implementare un regolatore P.I.D. discretizzato; saranno esaminati anche gli accorgimenti pratici che permettono di ottenere buoni risultati applicativi.

Nel capitolo precedente abbiamo esaminato un regolatore impiegante la classica tecnologia analogica. Questo tipo di regolatore è ancora ben presente sul mercato; sono ancora prodotti e venduti numerosi dispositivi che impiegano esclusivamente tecnologia analogica. Questi prodotti funzionano egregiamente con prestazioni che, in alcuni casi, sono anche migliori dei regolatori che impiegano tecnologia numerica. Il maggior limite di un regolatore analogico è la difficoltà delle operazioni d’ottimizzazione, e la non ripetibilità delle medesime.

Ipotizziamo di dover ottimizzare una serie di regolatori tutti uguali; nel caso di regolatori numerici sarà sufficiente ottimizzare il primo, annotarsi i coefficienti numerici e scrivere i medesimi in tutti gli altri regolatori. Nel caso di regolatori analogici le ottimizzazioni si ottengono modificando il valore di resistori e condensatori, per le variazioni grossolane, ed aggiustando il cursore di potenziometri per regolazioni fini. E’ abbastanza evidente la diversa difficoltà delle due operazioni. Addirittura molti regolatori basati su tecnologia numerica prevedono funzioni auto ottimizzanti.

Inoltre, con le tecniche numeriche ed i moderni dispositivi di elaborazione, è possibile implementare regolatori con funzioni complesse e sofisticate che permettono di raggiungere prestazioni elevate.

3.1 Criteri generali dei regolatori discretizzati nel tempo.

Un regolatore analogico, come quello analizzato in precedenza, lavora in modo continuo nel tempo. In altri termini la regolazione fluisce senza soluzione di continuità. Al contrario, un regolatore con tecnica numerica, funziona in modalità campionata.

La figura a lato esemplifica il campionamento di una variabile continua nel tempo. Con un tempo pari a ts sono prelevati n campioni. L’ampiezza di ogni campione, debitamente convertita in un valore numerico, sarà successivamente elaborata.

Il primo quesito da risolvere è il numero di campionamenti per secondo o, se preferite, il periodo di campionamento. Il teorema di Shannon ci può aiutare a stabilire il periodo di campionamento.

Il sopraccitato teorema stabilisce che si può riprodurre un segnale sinusoidale, avente frequenza “f” campionandolo con numero di campioni per secondo “N” dove N > 2f. Presumendo di riprodurre un segnale avente come massima frequenza 2000 Hz, dovremo effettuare almeno 4001 campioni ogni secondo. Con questo numero di campioni è possibile riprodurre qualsiasi forma di segnale, purché il contenuto armonico non superi i 2000 Hz. Un altro parametro da considerare è che il tempo di campionamento deve essere rigorosamente costante. Qualsiasi variazione del tempo di campionamento (fenomeno conosciuto anche con il nome di jitter) produrrà un disturbo sulla variabile controllata. Per esempio se si controlla una velocità, ed il tempo di campionamento non è costante, la velocità sarà affetta da variazioni dipendenti dall’errore del periodo di campionamento. Molti, quando affrontano l’analisi di un sistema discreto, commettono l’errore di applicare le medesime regole di un sistema continuo. L’errore è motivato dal fatto che, essendo il tempo di campionamento talmente veloce rispetto alla variabile da controllare, si possa considerare il controllo come continuo nel tempo. Dal punto di vista del tempo l’approssimazione è plausibile, ma ci si dimentica che la conversione è effettuata su di un numero finito di bit, pertanto il processo non può essere considerato continuo. Chi volesse approfondire l’argomento può consultare testi specifici come Digital controls using microprocessor (autore Katz), è un po’ vecchio ma è sempre valido.

Fig. 3.1 Catena di elaborazione di un processo quantizzato

La figura 3.1 schematizza la catena d’elaborazione di un processo discreto nel tempo. L’architettura è valida anche nel caso in cui la variabile d’ingresso non sia un segnale analogico. Ammettiamo di leggere il valore di un contatore che rappresenta una frequenza od una posizione. Il contatore sarà letto con periodo costante. Il medesimo ragionamento può essere fatto per la variabile d’uscita. Caso abbastanza comune è l’aggiornamento del set point di velocità di un motore tramite bus di campo o linea seriale veloce. L’aggiornamento dovrà essere effettuato con periodo costante ed il bus di campo non dovrà introdurre ritardi apprezzabili. Per esempio se il tempo di campionamento è pari a 10 msec. Il ritardo introdotto dal bus di campo non dovrà superare i 10 microsec. Il ritardo introdotto dal bus di campo, può anche essere maggiore, ma deve essere rigorosamente costante!

3.2 Regolatore P.I.D.

Fig. 3.2.1 Schema a blocchi di un regolatore discretizzato

La figura 3.2.1 riprende lo schema di principio della figura 1.1 ed introduce il campionamento della misura della variabile controllata.

La figura 2.5.1 schematizza un regolatore P.I.D. continuo nel tempo e la formula 2.5.1 ne rappresenta la f.d.t. (funzione di trasferimento). Analogamente possiamo rappresentare un blocco funzionale P.I.D. con regolazione campionata.

 


Fig. 3.2.2 Regolatore P.I.D. discretizzato

Osservando lo schema a blocchi raffigurato si nota un nuovo operatore: l’operatore “z”. Per una trattazione teorica si rimanda ad uno dei testi citati in precedenza od alla bibliografia essenziale riportata in appendice. Per i nostri scopi è sufficiente sapere che:

 dove ts è il tempo di campionamento.

Di seguito si costruirà, passo per passo, un regolatore P.I.D. con tecnica numerica e campionamento.

Supponiamo, per comodità, che il valore di consegna sia espresso in forma numerica e, sempre per comodità, supponiamo che l’uscita del nostro regolatore sia convertita in un segnale analogico. Questo segnale analogico sarà inviato come riferimento ad un attuatore. Sempre per comodità supponiamo di voler realizzare un anello di velocità con regolazione digitale. Dovremo disporre di un alimentatore di potenza regolabile, dispositivo che normalmente è denominato convertitore, di un motore in c.c., di un trasduttore di velocità, e di un apparato hardware su cui implementare la nostra regolazione. Sempre per semplicità supponiamo che il trasduttore di velocità sia una dinamo tachimetrica (in seguito affronteremo anche applicazioni con encoder); il nostro dispositivo d’elaborazione può essere un PLC, una scheda con microcontrollore, un PC dotato d’interfaccie A/D e D/A, insomma non è importante il tipo di hardware impiegato; è importante, invece, che il nostro dispositivo sia dotato di convertitore A/d e D/A con risoluzione e velocità di conversione sufficienti e, naturalmente, che il nostro processore sia in grado di effettuare l’elaborazione dell’algoritmo in tempo utile.

3.2.1 Esempio di regolatore di velocità con P.I.D. numerico

Cominciamo con lo stendere le specifiche generali del nostro sistemino.

1.     Motore: motore in c.c., magneti permanenti, Tensione di armatura Va = 200v, Velocità nominale 3000 r.p.m. @ 200v di Va

2.     Dinamo tachimetrica con tensione di uscita normalizzata per 10v/3000 r.p.m.

3.     Convertitore: tipo chopper a transistor in grado di fornire la tensione di 200v con tensione di riferimento pari a 10v

4.     Sistema d’elaborazione digitale dotato d’interfaccia HMI (Human Machine Interface) per inserire direttamente: il valore di velocità richiesto, i parametri di taratura del regolatore. Interfaccia A/D e D/A, con convertitori a 12 bits per ingresso (A/D), e uscita (D/A) previsti per tensioni di +/-10v, equivalenti a 2047 campionamenti positivi e 2047 negativi. Tempo di conversione dell’A/D <100 microsec. Elaborazione con virgola mobile, interrupt legato al timer di sistema con risoluzione pari ad 1msec.

5.     Errore di regolazione <0.5% del fondo scala

E’ evidente che una regolazione digitale di velocità, che impieghi come trasduttore di misura una dinamo tachimetrica, ha poco senso, ma a noi serve per scopi didattici.

Dall’analisi della mini specifica, si devono notare alcuni particolari relativi al sistema di controllo digitale:

1.     La richiesta di virgola mobile: anche se l’errore di regolazione ammesso equivale a 10 volte la risoluzione del convertitore, è comunque necessario evitare che frazioni di count si accumulino e, con il trascorrere del tempo, possano raggiungere valori non trascurabili.

2.     La richiesta di un timer di sistema, con risoluzione di almeno 1 msec., cui legare l’interrupt di regolazione, è necessaria per evitare eventuali jitter.

3.     Si richiede un tempo massimo di conversione per l’A/D, non è specificato un tempo massimo per il D/A perché di regola sono molto più veloci.

4.     i 4096 campionamenti totali (2047 + 2047+gli zeri) garantiscono una risoluzione pari allo 0.05% del fondo scala che più che sufficiente per le prestazioni richieste.

Per prima cosa dobbiamo stabilire il periodo di campionamento, in altre parole ogni quanto tempo viene effettuata la regolazione, “z-1”. Bene l’unico criterio di scelta è la velocità con cui la variabile da controllare può variare. Per controllare la temperatura di un locale di 300 m3, per esempio, il tempo di campionamento sarebbe dell’ordine dei minuti; dovendo controllare la velocità di un motore elettrico a magneti permanenti bisogna pensare in termini di msec.

Per il nostro esempio stabiliamo un periodo di 10 msec. Quasi certamente l’anello di velocità del convertitore chopper sarà più veloce, 10 msec. sono più congrui ad un convertitore a SCR, funzionante con rete elettrica a 50Hz, ma per il nostro scopo possiamo ritenerlo un tempo adeguato. E’ utile sapere, magari solo per curiosità, che un convertitore a SCR degno di questo nome, alimentato con rete trifase a 50Hz, se ben ottimizzato può far variare la corrente d’armatura ogni 3.3 msec., pertanto il suo anello di velocità è in grado di rispondere in un tempo di circa 10 msec; l’anello di velocità di un buon chopper a transistori è in grado di rispondere in tempi inferiori ai 3 msec.

Stabilito il tempo di campionamento bisogna verificare che il nostro sistema sia in grado di rispettarlo. Consideriamo di effettuare la regolazione con un PLC di vecchia generazione, non molto veloce; questo dispositivo impiega 8-9 msec. solo per elaborare la regolazione; bene o il dispositivo è impiegato solo per questa regolazione, oppure si sceglie un dispositivo diverso!

Sempre per evitare disturbi (variazioni) di regolazione è necessario che non solo la misura avvenga ad intervalli costanti, ma anche l’aggiornamento dell’uscita avvenga ad intervalli costanti. Il tempo d’elaborazione non sarà sicuramente costante, pertanto si usano alcuni accorgimenti per rendere costante l’aggiornamento dell’uscita; il metodo più semplice consiste nel ritardare l’aggiornamento dell’uscita di un ciclo. In altri termini si legge la misura, si aggiorna l’uscita con il frutto dell’elaborazione precedente, si procede ad una nuova elaborazione e si memorizza il risultato. Questo comporta in ulteriore blocco z-1 inserito nella catena di regolazione, ma l’influenza pratica di questo ritardo è nulla.

La nostra regolazione potrà essere schematizzata nel modo seguente.

Fig. 3.2.1.1 Schema a blocchi del regolatore di velocità

Analizziamo ora lo schema a blocchi della regolazione com’è raffigurato. Il periodo ts è posto a 10 msec., quindi ogni 10 msec. si legge il valore di velocità convertito dall’A/D Converter, si somma algebricamente con il valore di consegna ricavandone l’errore. L’errore sarà un numero compreso tra 0 e 2047, di segno positivo o negativo.

L’errore così ottenuto sarà elaborato dai tre blocchi, i tre risultati sommati, convertiti in un livello analogico di tensione, ed inviati come riferimento al convertitore.

Affinché il regolatore sia effettivamente funzionante mancano ancora alcuni particolari che saranno aggiunti; per il momento analizziamo le tre componenti della regolazione.

La prima componente è la parte proporzionale. L’errore è moltiplicato per un coefficiente Kp che può assumere qualsiasi valore. Ovviamente, facendo uso di aritmetica a virgola mobile, il suo valore può essere minore di uno senza perdere di efficacia.

Per ottimizzare il regolatore poniamo a zero i coefficienti Ki e KD, aumentiamo gradatamente il valore di Kp ed osserviamo la risposta al gradino; tutto come per il regolatore analogico, ovviamente invece di cambiare il valore di una resistenza, si scriverà un numero tramite l’interfaccia HMI ed è già una notevole semplificazione.

Prima di passare all’ottimizzazione delle altre due parti vediamo come sono costituite.

L’integratore.

Un integratore è fondamentalmente un sommatore. Vediamo ora come può essere meccanizzato un simile dispositivo.

 


t

 
 


Fig. 3.2.1.2.a Integratore semplice           Fig. 3.2.1.b Andamento ingresso – uscita dell’integratore

La figura 3.2.1.a schematizza un integratore semplice mentre la figura 3.2.1.b esemplifica la funzione di trasferimento del medesimo. Ad ogni periodo di campionamento il valore in uscita equivale al valore d’ingresso sommato al precedente valore d’uscita. Con il tempo di campionamento uguale a 10 msec., ogni 10 msec sarà effettuata la somma tra il valore di in ingresso ed il precedente valore memorizzato.

Aumentando o diminuendo il coefficiente Ki si diminuirà o si aumenterà il tempo d’integrazione (c.f.r. 2.3).

Il derivatore.

Per ricavare la derivata si effettua il confronto tra il valore di due differenziali contigui.

 


Fig. 3.2.2 Schematizzazione del differenziatore

Similmente all’integratore, il differenziatore confronta il valore attuale della variabile, con il valore della medesima riferito al precedente campionamento; la differenza tra i due valori rappresenta la derivata prima della variabile. Con il periodo di campionamento corrispondente a 10 msec., ogni 10 msec. si effettuerà la differenza tra il valore attuale e la memoria del valore del campione precedente. Il coefficiente KD varia l’influenza della derivata sulla globalità della regolazione.

Prima di scrivere la funzione di esempio, tramite uno pseudo codice “C”, saranno introdotti alcuni blocchi che, sebbene non siano parte integrante della funzione, sono indispensabili per un corretto funzionamento pratico.

Fig. 3.2.3 Schematizzazione del regolatore P.I.D. discretizzato

Analizzando i blocchi che compongono il regolatore schematizzato in figura 3.2.3, si notano i quattro limitatori posti all’uscita delle tre componenti, ed all’uscita del regolatore stesso. Il limitatore finale, deve impedire che il livello dell’uscita del regolatore superi o il valore massimo previsto per il convertitore D/A, o per l’ingresso di riferimento dell’attuatore.

Di seguito è riportato un regolatore scritto in pseudo codice “C”, in modo da svincolare l’applicazione dalla piattaforma Hardware.

3.2.2 Funzione d’esempio in pseudo “C”

int PID (int val_cons)

{

/*La funzione PID è richiamata dall’interrupt del timer di sistema; la chiamata avviene ogni 10                                     msec., pertanto z-1 = 10 msec. La funzione PID riceve un valore intero che rappresenta il valore di consegna “val_cons “, la funzione restituisce un valore intero “DA_conv” che rappresenta il valore di riferimento per l’attuatore.

  Le variabili:

    float Upper_P_limit, Upper_I_limit, Upper_D_limit, Upper_Total_limit

  float Lower_P_limit, Lower _I_limit, Lower _D_limit, Lower _Total_limit

  float Kp, Ki, Kd

sono globali; sono introdotte e modificate tramite interfaccia HMI

*/

            static int AD_Conv = 0;     /*Lettura convertitore A/D: acquisisce la variabile di ingresso*/

            static int DA_Conv = 0;     /*Scrittura convertitore D/A: scrive la variabile di uscita*/

            static int error = 0;              /*differenza tra valore di consegna e valore reale */

            static int old_error = 0;       /*differenza tra valore di consegna e valore reale @ z-1 */

            float P=0;                            /* componente proporzionale */

            float I=0;                             /* componente integrale */

            float D=0;                           /* componente differenziale */

            float i_inst = 0;                   /* parte istantanea del processo di integrazione*/

            float Out = 0;                      /* Totale regolazione */

error = val_cons - AD_Conv;

P = error * Kp;

if (P > Upper_P_Limit) P = Upper_P_Limit;

if (P < Lower_P_Limit) P = Lower_P_Limit;

if Ki > 0 {

i_inst = error * Ki;

I = I + i_inst;

if (I > Upper_I_Limit) I = Upper_I_Limit;

if (I < Lower_I_Limit) I = Lower_I_Limit; }

else

I = 0;

if Kd > 0 {

D = Kd * (error – old_error);

old_error = error;

if (D > Upper_D_Limit) D = Upper_D_Limit;

if (D < Lower_D_Limit) D = Lower_D_Limit;}

else

D = 0;

Out = P + I + D;

if ( Out > Upper_Total_limit) Out = Upper_Total_limit;

if (Out < Lower_Total_limit) Out = Lower_Total_limit;

DA_Conv = Out;

Return (DA_Conv);

}

La routine di gestione dell’interrupt, legata alla scadenza del System Timer, che richiama PID sarà simile a:

void RT_G( )

  {

            static int Out_DA = 0;            /*uscita D/A per riferimento)

            static int valore_di_consegna = 0;

            valore_di_consegna = act_val;

            Out_DA  = act_ref_val;

            act_ref_val = PID(valore_di_consegna);

}

Come si può facilmente notare, alla scadenza del timer, con il solo ritardo dovuto alla latenza dell’interupt, sono effettuate le seguenti operazioni:

1.     aggiornamento del valore di consegna

2.     aggiornamento del valore di riferimento con l’ultimo valore calcolato

3.     chiamata della funzione di regolazione.

In questo modo si rispetta l’assunto che la lettura della variabile da controllare, e l’aggiornento del comando per l’attuatore, devono avvenire ad intervalli regolari.

La figura a lato  mostra l’equivalenza del blocco di uscita “U”, con schema reale in cui è inserito un ritardo equivalente ad un campionamento. Scopo di questo ritardo, è sincronizzare l’aggiornamento del valore di riferimento per l’attuatore, con la lettura della variabile sotto controllo.

Considerazioni sui limitatori.

L’azione del limitatore finale è abbastanza evidente. Non ha scopo saturare il convertitore D/A con valori che eccedono il limite di conversione del medesimo. Anzi, per alcune piattaforme hardware, eccedere i limiti di conversione causa errori anche catastofici; per esempio superarando il massimo valore positivo, il segnale convertito risulta essere negativo. Infatti in un convertitore D/A binario i valori negativi eqiuvalgono al complemento a 2 dei valori positivi. Si consideri un classico D/A a 12 bits: i valori compresi tra 0 e 7FFH equivalgono ai 2047 livelli positivi; basta incrementare di 1 count il massimo valore positivo, cioè passare da 7FFH a 800H, per avere o il massimo valore negativo od il valore di zero. La differenza dipende dall’aritmetica del convertitore.

Su alcune piattaforme hardware il sistema provvede a limitare intrinsecamente l’ingresso dei convertitori D/A, onde evitare gli errori di overflow sopra descritti, ma è comunque buona regola impedire che il regolatore lavori in condizione di errore.

Inoltre può essere conveniente, per motivi legati all’applicazione, generare un riferimento limitato ad una frazione del massimo consentito.

Gli altri limitatori hanno scopi diversi.

Il limitatore sulla funzione integrale ha lo scopo di evitare che l’integratore stesso si carichi inutilmen-te oltre il limite utile. Bisogna sempre tenere presente che l’integratore impiega del tempo per caricar-si, e ne impiega altrettanto per scaricarsi. Quindi se il livello di saturazione è troppo elevato si rallenta il sistema senza trarne beneficio. Nel capitolo seguente verranno esaminate le tecniche per ridurre al minimo il valore di correzione integrale.

I limiti sulle funzioni proporzionale e derivativa hanno lo scopo di ridurne l’influenza onde evitare correzioni troppo violente. Per esempio si può assegnare un valore relativamente alto al coefficiente KD e, contemporaneamente, posizionare i limiti della funzione derivativa a livelli relativamente bassi. In questo modo la funzione avrà un comportamento lineare per piccoli valori di ingresso, per poi saturare.

In questa funzione non è stato implementato il limite sull’errore in modo da realizzare una banda morta di regolazione.

Questa tipologia di regolazione è particolarmente utile quando si controlla una posizione, per esempio, perché evita al sistema di tentare di correggere errori ininfluenti.

La banda morta può essere imposta con una soglia fissa o con una soglia proporzionale al valore di consegna.

Per introdurre questa soglia nel codice scritto in precedenza è sufficiente, oltre a prevedere l’opportuna variabile, inserire un test sull’errore immediataamente seguente il calcolo dell’errore stesso. In funzione del risultato verrà eseguita tuta la funzione, oppure verrà restituito un valore uguale al precedente.

3.2.3 Varianti per l’azione derivativa

Nel regolatore studiato nei capitoli precedenti l’azione derivativa si esplica analizzando l’andamento dell’errore. Non sempre questa strategia è la più adatta. Molto spesso si ottengono risultati migliori adottando un anticipo sulla reazione, anziché sull’errore.

In pratica se si sta effettuando un controllo di velocità, s’introduce una correzione basata sull’ac-celerazione, mentre se si sta effettuando un posizionamento, la correzione sarà influenzata dalla velocità; in pratica il regolatore appesaantirà o alleggerirà la correzione in funzione della derivata della variabile da controllare e non in funzione dell’andamento dell’errore.

Analizzando un regolatore di posizione i benefici introdotti da questa variante, appaiono evidenti. A parità dell’errore la correzione è minore se la velocità di accostamento è bassa. Normalmente, mano a mano che si avvicina il traguardo, oltre a diminuire l’errore diminuisce anche la velocità. Applicando questa correzione la posizione sarà raggiunta rapidamente senza sovraelongazioni.

Le figure che seguono esemplificano le varianti.

Nella figura  3.2.3.1 viene schematizzata una regolazione dove la derivata della variabile sotto controllo influenza l’azione proporzionale. In altri termini l’errore sarà diminuito od aumentato proporzionalmente alla tendenza assunta dalla variabile. Veloci variazioni in positivo o negativo, incrementeranno o diminuiranno l’influenza dell’azione proporzionale. Questo tipo di regolazione è particolarmente efficace per alcuni controlli di posizione.

Fig. 3.2.3.1 Azione derivativa basata sulla reazione

Fig. 3.2.3.2 Regolatore con anticipo sulla reazione

La figura 3.2.3.2 schematizza un regolatore con anticipo sulla reazione o derivativo sulla correzione totale. Questo tipo di regolatore si adatta meglio su alcuni casi di controlli di velocità.

L’uso della tecnica numerica per l’elaborazione ha permesso la realizzazione di topologie particolari per esaltare o deprimere alcuni fenomeni. Per esempio è possibile realizzare l’azione proporzionale con guadagno variabile in funzione dell’errore rilevato, com’è anche possibile realizzare funzioni integrali con tempo d’integrazione variabile in funzione dell’errore.

In alcuni casi si inserisce il regolatore solo in condizioni di errore minore di un valore prefissato.

Tutte queste variazioni sul tema del regolatore di tipo PID servono per minimizzare i difetti di questa tipologia di regolazione.

Il regolatore perfetto non esiste!

Alcune tipologie di regolatori si adattano meglio di altre per controllare particolari processi; altre, come il regolatore PID, sono più versatili e più facili da dominare.

Il compito più importante per il progettista è scegliere, per ogni applicazione, la tipologia di regolatore più ottimizzata per il problema da risolvere.