Nell’articolo precedente eravamo rimasti allo studio di un PID che soltanto a livello teorico può funzionare, a causa di elementi che nella realtà è impossibile realizzare (la trattazione di questo articolo è particolarmente semplificata).
Primo fra tutti, l’azione derivativa che deve essere per forza approssimanta, in quanto sistema non causale, aggiungendo un polo in alta frequenza, che nel gergo ingegneristico viene chiama: “derivata ingegneristica” in quanto stima la derivata effettiva usando soltanto le informazioni salvate precedentemente.

Real PID

Un altro modo di interpretare la derivata è vedere il blocco derivativo come una rete anticipatrice: con un

L’articolo CONTINUA (clicca qui)

Il controllore PID si può riscrivere, in forma compatta, nel seguente modo:
usando le dovute approssimazioni:
con e

E’ interessante vedere il diagramma di bode con i seguenti parametri: ed

quindi:

Bode PID

Dalla funzione continua a quella discreta

Prima di poter applicare in pratica un controllo PID su di un microcontrollore, il controllore va ancora analizzato e visto come si comporta una volta discretizzato.

Discrete PID

Partendo dalla funzione di trasferimento analizzata prima e traformata la funzione di traferimenti in forma dicreta con un tempo di campionamento pari a 10.

Analizzando  la funzione di trasferimento si giunge alla seguente funzione di trasferimento

che è pressocché uguale alla forma approssimata:

L’integratore è in forma di eulero, e l’azione derivativa è una approssimazione del primo ordine. Sono presenti i seguenti guadagni: Kp, Ki, Kd ed il tempo di campionamento Tc.

Lo pseudo codice

Il modello utilizzato è quindi perfettamente utilizzabile all’interno di un microcontrollore, infatti l’equazione di stato associata alla funzione di trasferimento è:

leggibile nel seguente modo:

Si può riutilizzare la rappresentazione per scrivere un codice funzionante di PID da usare sul robot.

Questo è un esempio in pseudo-codice relativo alla rappresentazione di stato:

int xi, xd;     //Variabili temporanee
int err;        //err = y - u
                //y = uscita, u = ingresso
int contr;      //Uscita di controllo
int Kp,Ki,Kd;   //Guadagni controllo PID
int Tc;         //Tempo di campionamento
...
//Inizializzazione controllo PID
...
while(true)
{
//Le operazioni devono essere temporizzate con un preciso passo di campionamento Tc
err = ... ;                            //acquisizione errore

contr = (Ki*Tc)xi-(Kd/Tc)*xd+(Kp+(Ki*Tc)+(Kd/Tc))*err;    //uscita di controllo

//Salvataggio dei nuovi valori dell'azione integrale e derivativa
xi = xi + err;                         //Azione integrale
xd = err;                              //Azione derivativa

//Adattamento segnale di controllo ed invio all'attuatore
}

Copyright © 2009. All Rights Reserved.

Categories: Control

Raffaello Bonghi

I'm a System Engineer and I was born in 1986 in Rome, Italy. I've long experience in robotics, both for academic carrier and hobby, let I've gained a significant skill in this field from my experiences in different kind of robotics.

2 Comments

PID digitale (parte 3) · April 27, 2009 at 10:13

[…] un regolatore PID partito da una discretizzazione semplice che non teneva conto di molti vincoli, (regolatore PID parte 2).Il primo modello di approssimazione si basa su una trasformazione rettangolare o metodo delle […]

PID digitale (parte 3) | Officine Robotiche · December 14, 2012 at 20:32

[…] un regolatore PID partito da una discretizzazione semplice che non teneva conto di molti vincoli, (regolatore PID parte 2).Il primo modello di approssimazione si basa su una trasformazione rettangolare o metodo delle […]

Leave a Reply