Què és un control PID i com implementar-lo en firmware
Si el teu producte ha de mantenir una variable en un valor objectiu —la velocitat d'un motor, la temperatura d'un forn, la posició d'un braç, la pressió d'una bomba— tard o d'hora et trobaràs amb el control PID. És l'algorisme de control més utilitzat de la indústria, i entendre'l bé marca la diferència entre un producte que respon amb suavitat i un altre que oscil·la, se'n passa o reacciona tard.
Què és un control PID
Un controlador PID (Proporcional-Integral-Derivatiu) és un algorisme que ajusta de manera contínua una sortida perquè una mesura real s'acosti a un valor desitjat, anomenat referència o setpoint. Ho fa calculant l'error (la diferència entre el que vols i el que hi ha) i corregint-lo a partir de tres components que treballen juntes.
Les tres components: P, I i D
- Proporcional (P): reacciona a l'error actual. Com més lluny estàs de l'objectiu, més fort corregeix. Augmenta la velocitat de resposta, però tota sola deixa un petit error permanent i, si és molt alta, provoca oscil·lacions.
- Integral (I): acumula l'error passat. És la que elimina aquest error permanent: mentre quedi diferència, segueix empenyent fins a clavar el valor. A canvi, si te'n passes, alenteix i pot provocar sobreoscil·lació (overshoot).
- Derivativa (D): anticipa l'error futur mirant amb quina rapidesa canvia. Actua com un fre que suavitza la resposta i redueix l'overshoot, però amplifica el soroll del sensor, així que cal fer-la servir amb compte.
La sortida del controlador és la suma de les tres: u(t) = Kp·e + Ki·∫e·dt + Kd·de/dt. Ajustar els guanys Kp, Ki i Kd és el que defineix el caràcter del sistema.
Un exemple senzill: la velocitat d'un motor
Imagina un motor que ha de girar a 1.000 rpm. Mesures les rpm reals amb un encoder, les restes a les 1.000 desitjades i obtens l'error. El PID converteix aquest error en un senyal PWM que alimenta el motor: si va lent, puja el PWM; si se'n passa, el baixa. L'encoder torna a mesurar i el cicle es repeteix desenes o centenars de vegades per segon. El resultat és un motor que manté la velocitat encara que canviï la càrrega —exactament el mateix que fa el control de creuer d'un cotxe en una pujada—.
Com s'implementa en firmware
En un microcontrolador, el PID es calcula en un bucle a interval fix (per exemple, cada 10 ms des d'una interrupció de temporitzador). Una implementació discreta bàsica en C és així:
typedef struct {
float kp, ki, kd;
float integral, prev_error;
float out_min, out_max; // límites de la salida
} pid_t;
float pid_update(pid_t *pid, float setpoint, float measured, float dt) {
float error = setpoint - measured;
pid->integral += error * dt;
float derivative = (error - pid->prev_error) / dt;
pid->prev_error = error;
float out = pid->kp * error
+ pid->ki * pid->integral
+ pid->kd * derivative;
// Saturación + anti-windup: no dejes crecer la integral sin límite
if (out > pid->out_max) { out = pid->out_max; pid->integral -= error * dt; }
if (out < pid->out_min) { out = pid->out_min; pid->integral -= error * dt; }
return out;
}
Els detalls que separen un PID de joguina d'un de professional són en allò que envolta aquesta fórmula: un dt constant i ben mesurat, la saturació de la sortida amb anti-windup (perquè la integral no es dispari quan l'actuador arriba al màxim), el filtratge del terme derivatiu i l'ús d'aritmètica adequada (entera o de coma fixa) en MCU sense unitat de coma flotant.
Com ajustar (tunejar) un PID
- Comença només amb P: puja-la fins que el sistema respongui ràpid però just abans que comenci a oscil·lar.
- Afegeix I a poc a poc per eliminar l'error permanent, sense passar-te (provoca sobreoscil·lació).
- Fes servir D amb moderació per esmorteir, només si el soroll del sensor ho permet.
- Mètodes com Ziegler-Nichols donen un punt de partida, però l'ajust fi gairebé sempre és empíric i depèn del teu maquinari real.
Errors comuns
- Calcular el PID amb un
dtvariable (per exemple dins d'unloop()sense control de temps): els resultats es tornen impredictibles. - Oblidar l'anti-windup: el sistema respon amb un retard enorme després de saturar.
- Aplicar la derivada directament sobre un senyal sorollós, cosa que fica vibracions a l'actuador.
- Voler resoldre-ho tot amb PID quan el procés té grans retards o no linealitats: de vegades cal una altra estratègia.
Conclusió
Un control PID ben implementat és la diferència entre un producte que se sent sòlid i un que vibra, s'escalfa o respon tard. El concepte és senzill, però fer-lo robust en un microcontrolador real —amb la seva temporització, el seu soroll i els límits de l'actuador— és una feina de firmware fi. A Regular Solids dissenyem i implementem llaços de control per a motors, temperatura, potència i moviment en productes encastats. Si tens un producte que necessita controlar alguna cosa amb precisió, explica'ns-ho.