Il controllore PID: taratura e realizzazione
Azioni proporzionale, integrale e derivativa, confronto delle risposte, taratura di Ziegler-Nichols con esempio, filtro sulla derivata, anti-windup e codice per microcontrollore.
Il controllore PID (proporzionale, integrale, derivativo) è di gran lunga il più usato nell’industria: regola temperature, pressioni, portate, velocità di motori, posizioni dei bracci robotici, la quota dei droni. Ha solo tre parametri, si può tarare anche senza un modello accurato del processo e funziona bene nella maggior parte dei casi. In questa lezione vediamo il significato delle tre azioni, i metodi di taratura e i dettagli pratici che fanno funzionare un PID reale.
Le tre azioni
![Rendered by QuickLaTeX.com \[ u(t) = K_p\,e(t) + K_i\int_0^t e(\tau)\,d\tau + K_d\,\frac{de}{dt},\qquad C(s) = K_p + \frac{K_i}{s} + K_d s \]](https://www.electronics-engineering.com/wp-content/ql-cache/quicklatex.com-f5dec1315fddfbe9b57fbf4e183e6679_l3.png)
Spesso si scrive nella forma con le costanti di tempo,
.
- Proporzionale: reagisce all’errore attuale. Più
è grande, più la risposta è pronta e l’errore a regime piccolo, ma meno smorzato è l’anello. Da sola lascia un errore a regime sui processi di tipo 0. - Integrale: reagisce all’errore accumulato nel passato. Elimina l’errore a regime sui riferimenti e i disturbi costanti (lezione sugli errori), ma aggiunge ritardo di fase e tende a far oscillare.
- Derivativa: reagisce alla velocità con cui l’errore cambia, cioè “prevede” dove sta andando. Aggiunge anticipo di fase e smorzamento, ma amplifica il rumore ad alta frequenza.

La figura mostra il comportamento tipico su un processo
. Con il solo P (
) l’uscita si ferma a
: l’errore a regime è
. Con il PI arriva a 1 ma più lentamente. Con il PID arriva a 1, più in fretta e con oscillazioni contenute.
La taratura con Ziegler-Nichols
Il metodo classico, del 1942, si applica direttamente sull’impianto:
- si toglie l’azione integrale e derivativa e si aumenta
fino a quando l’anello oscilla in modo persistente; - si annotano il guadagno critico
e il periodo dell’oscillazione
; - si scelgono i parametri dalla tabella.
| Controllore | |||
|---|---|---|---|
| P | |||
| PI | |||
| PID |
Esempio. Per
il guadagno critico si trova con Routh: l’equazione caratteristica è
, stabile per
, cioè
. Al limite l’equazione ausiliaria
dà
, quindi
s. Il PID di Ziegler-Nichols è
,
s,
s.
Le regole di Ziegler-Nichols danno una risposta pronta ma piuttosto oscillante (sovraelongazione spesso del 30-50%): sono un buon punto di partenza da rifinire. Portare un impianto reale al limite di stabilità può essere pericoloso; esistono varianti che usano la risposta al gradino in anello aperto, e i regolatori industriali moderni hanno una funzione di autotaratura che esegue una prova controllata e calcola i parametri da soli.
I dettagli che contano
Un PID scritto come nella formula funziona male nella realtà. Le correzioni standard sono:
- Filtro sulla derivata. La derivata pura amplifica il rumore del sensore. Si usa
, con
circa un decimo di
, che limita il guadagno alle alte frequenze. - Derivata sulla misura. Quando il riferimento cambia a gradino, la derivata dell’errore è un impulso che dà un colpo violento all’attuatore (il “derivative kick”). Si deriva allora solo l’uscita misurata,
: per i disturbi l’effetto è lo stesso. - Anti-windup. Ogni attuatore ha dei limiti: una valvola non si apre più del 100%, un motore ha una tensione massima. Se l’attuatore è saturo l’errore non si riduce, ma l’integrale continua a crescere (windup); quando l’errore finalmente cambia segno, l’integrale enorme impiega molto tempo a scaricarsi e l’uscita supera di molto il riferimento. La soluzione è fermare l’integrazione quando il comando è saturo.
Il PID in un microcontrollore
In pratica il PID è un programma eseguito a intervalli regolari
, molto più brevi delle costanti di tempo del processo. L’integrale diventa una somma e la derivata una differenza:
/* PID a tempo discreto con derivata filtrata sulla misura e anti-windup */
float kp = 4.8f, ki = 4.8f / 1.81f, kd = 4.8f * 0.45f;
float Ts = 0.01f, a = 0.1f; /* passo di campionamento e filtro */
float integ = 0, d = 0, y_prec = 0;
float pid(float r, float y) {
float e = r - y;
d = (1 - a) * d - a * kd * (y - y_prec) / Ts;
y_prec = y;
float u = kp * e + integ + d;
if (u > 10.0f) u = 10.0f; /* saturazione dell'attuatore */
else if (u < -10.0f) u = -10.0f;
else integ += ki * e * Ts; /* integra solo se non saturo */
return u;
}
È tutto qui: poche moltiplicazioni per ciclo. Per questo un PID gira su qualsiasi microcontrollore, anche il più piccolo, e si trova dentro gli elettrodomestici, i droni, le stampanti 3D e gli alimentatori digitali.





