CONTROLLO PID e PI CON MICROCONTROLLORE

Tutorial su come Implementare un Sistema di Controllo Retroazionato di tipo PID o PI con Microcontrollore e breve Teoria sul loro Funzionamento…

 
 
 
 



 

INTRO

La sigla PID sta per Proporzionale-Integrale-Derivativo ed è un sistema di controllo in retroazione negativa molto usato per controllo di temperatura, velocità motori, e molte altre grandezze fisiche. Questo sistema calcola l’errore tra la grandezza di ingresso misurata e il valore che questa grandezza deve raggiungere  e da questo errore genera un segnale di controllo per aggiustare il sistema. PI sta semplicemente per Proporzionale-Integrale ed è una versione semplificata del PID. Il sistema può semplice ad esempio è il controllo di una temperatura con una resistenza elettrica e un segnale PWM regolato dal PID che alimenta questa resistenza.

Il PID regola l’uscita del sistema in base a tre valori:

  • Valore del segnale di errore (azione proporzione “P”)
  • Valore passato del segnale di errore (azione integrale “I”)
  • Valore velocità variazione segnale di errore (azione derivativa “D”)

Molto spesso l’azione derivativa non è necessaria e viene rimossa ottenendo un controllo PI.

Le tre funzioni di un PID vengono calcolate separatamente in funzione dell’errore, ognuna di essa con una ben definita costante K, e poi vengono sommate per ottenere il segnale di controllo che va ad influenzare il sistema.

  • Azione proporzionale: è data dall’errore moltiplicato per una costante Kp. Questa azione permette al segnale di controllo di variare molto se siamo lontani dal valore desiderato. Molti sistemi possono anche essere regolati usando solo l’azione proporzionale, il problema però è che il sistema potrebbe oscillare intorno al valore desiderato.
  • Azione integrale: questo controllo racchiude gli errori negli istanti di tempo precedente, in questo modo questa azione non è nulla o molto piccola se il nostro sistema si trova vicino al punto desiderato dando la possibilità di raggiungere esattamente il valore desiderato al sistema
  • Azione derivativa: Tiene conto della velocità di variazione del segnale di errore. Se l’errore varia molto velocemente l’azione derivativa tende a compensare questa brusca variazione. Questo permette di aggiustare l’errore prima che diventi molto grande. In molti sistemi non viene usata perché questa azione potrebbe tendere all’infinito.

 



 
LE COSTANTI KP, KI E KD NEI PID E PI

Queste costanti servono a regolare correttamente il nostro sistema di controllo. Se le costanti non sono ben scelte o calcolate il sistema potrebbe raggiungere il punto di equilibrio molto lentamente oppure potrebbe oscillare intorno al punto desiderato senza mai stabilizzarsi.

Queste tecniche sono ben documentate e illustrate in libri e molti altri siti, quindi non staremo qui a parlarne. Concentriamoci su sistemi di controllo dove non siamo a conoscenza della funzione di controllo.

Le costanti Kp, Ki e Kd vanno trovate sperimentalmente, ovvero si parte da valori base ad esempio tutti e 3 uguali a 1 e poi si variano fino a quando non si ottiene la funzione desiderata. Una comoda tabella per capire come variare queste 3 variabili oppure come scegliere i valori di partenza è la seguente:

Quindi aumentando Kp diminuisce il tempo di salita e l’errore stazionario mentre aumenta la sovraelongazione  e non si hanno variazione nel tempo di assestamento che dipende maggiormente da Ki e Kd. Con questa tabella e prove sperimentali si dovrebbe essere in grado di settare il sistema di controllo.
 

CODICE C PER REALIZZARE CONTROLLO PID o PI

Di seguito troverete un esempio di codice scritto in linguaggio C, adattabile per ARDUINO o MIKROC che illustra come realizzare un controllo di tipo PID. Per realizzare un controllo di tipo PI basterà settare Kd=0.

#define DT 0.1          //Tempo di ripetizione PID
#define Kp 5            //Costante proporzionale
#define Ki 1            //Costante integrale
#define Kd 1            //Costante derivativa
#define MAXout 255      //Massimo valore uscita
#define MINout 0        //Minimo valore uscita
#define Epsilon 1     //Errore massimo tra setpoint e input

int  prev_error = 0;    //Variabile errore iterazione precedente
int  integrale = 0;     //Variabile azione integrale
int  error, derivata, output, abserror, input;   //Variabili utili

int PID(int setpoint, int input){          //Funzione PID

  error = setpoint - input;                              //calcola l'errore tra input e setpoint

  if(abs(error) > Epsilon){                              //Se l'errore è maggiore di epsilon
    integrale = integrale + error*DT;                    //Calcola l'azione integrale
  }
   derivata = (error - prev_error)/DT;                   //Calcola l'azione derivativa
   output = Kp*error + Ki*integrale + Kd*derivata;       //Calcola output PID

   if(output > MAXout) {                      //Se l'uscita supera il valore massimo
     output = MAXout;                         //Satura l'uscita
     integrale=0;                             //Azzera l'azione integrale
   }
   else if(output < MINout) {                 //Se l'uscita invece è troppo piccola
     output = MINout;                         //Satura alla minima uscita
     integrale=0;                             //Azzera anche in questo caso l'azione integrale
   }

   prev_error = error;                        //Salva il valore dell'uscita
   return output;                             //Restituisci uscita PID
}

void main(){
  input = read.sensor();
  output = PID(200, input);
  Delay_ms(100);
}

Prima di tutto vado a definire le costanti. Kp, Ki e Kd le abbiamo già illustrate, MAXout and MINout è il valore massimo dell’uscita e nel caso di PWM avremo 0 e 255. DT è il tempo che intercorre tra le chiamate alla funzione PID. Ad esempio se il valore dell’uscita viene aggiornato ogni 100mS avrò 0.1. Questo valore può essere approssimato. Ad esempio se tra una chiamata e l’altra della funzione PID ho varie stringhe (leggo ADC, leggo pulsanti ecce cc) ma alla fine ho un delay di 100mS posso considerare solo il delay.

Epsilon è una variabile che indica quanto piccolo deve essere l’errore. Questa variabile serve a non mandare in overflow l’azione integrativa e attivarla solo quando necessaria. Inizializzo inoltre alcune variabili che serviranno per l’esecuzione del codice.

La funzione PID riceve il valore letto dal sensore e il valore che vogliamo ottenere per l’uscita del nostro sistema. Calcolo prima di tutto l’errore, poi controllo se il modulo è minore di epsilon e in caso incremento l’azione derivativa. Calcolo l’azione derivativa e calcola l’output grazie all’errore, l’azione integrativa e l’azione derivativa.

Successivamente controllo se l’uscita del PID è nel range di valori voluto, in caso non lo è azzero l’azione integrativa che fa divergere l’uscita e limito l’uscita.

Nel MAIN vado a leggere il valore del sensore, invio questo valore e il valore che si vuole ottenere per il sistema alla funzione PID e infine con l’uscita della funzione PID ad esempio controllo il PWM.
 

DOWNLOAD

Potete scaricare il codice realizzato con MIKROC al seguente LINK!!!

 



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *