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.
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:
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.
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.
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 […]