Arrow Electronic Components Online

Nozioni base sul controllo PID e tutorial: Implementazione PID in Arduino

Arduino01 nov 2023
Soluzioni di connettività automobilistica più intelligenti e sicure
AuthorJeremy S Cook
Visualizza tutti gli articoli

Per coloro che lavorano nei controlli industriali, la teoria del proporzionale, integrale, derivato (PID) è probabilmente un concetto familiare. Per la maggior parte delle persone, il termine è completamente sconosciuto, ma potresti essere più familiare con esso di quanto pensi. Quando si preme il pedale del gas in un'auto, non si considera solo quanto si è lontani dalla velocità ideale—la parte proporzionale del PID—ma si tiene anche conto di come il proprio veicolo accelera e delle condizioni come le salite.
 
Per coloro che lavorano nei controlli industriali, la teoria del proporzionale, integrale, derivato (PID) è probabilmente un concetto familiare. Per la maggior parte delle persone, il termine è completamente sconosciuto, ma potresti essere più familiare con esso di quanto pensi. Quando si preme il pedale del gas in un'auto, non si considera solo quanto si è lontani dalla velocità ideale—la parte proporzionale del PID—ma si tiene anche conto di come il proprio veicolo accelera e delle condizioni come le salite.
 
Questi effetti più sottili sono ciò che i termini I e D considerano matematicamente. In questo esempio, impedirebbero alla velocità di un'auto di oscillare da un limite superiore a uno inferiore e possiamo applicare lo stesso concetto a una varietà di situazioni di controllo. Mentre il controllo basato sui limiti può portarti in linea di massima, il tuo sistema tenderà ad agire in modo alquanto irregolare.

Equazione PID

Possiamo esprimere il controllo PID matematicamente con la seguente equazione. P, I e D sono rappresentati dai tre termini che si sommano qui. Kp, Ki e Kd sono costanti che regolano la reazione del sistema a ciascun fattore:

PID Equation

Possiamo anche sostituire Ki e Kd con 1/Ti e Td, rispettivamente. Questa modifica conferisce all'equazione una migliore relazione con il suo significato fisico e permette alle unità di risultare correttamente in un numero senza unità:

PID Equation Replacement

Possiamo anche trasporre l'equazione per estrarre il valore di Kp e applicarlo all'intera equazione, in quella che è nota come forma standard. Un vantaggio di questa forma è che possiamo regolare la costante complessiva di Kp per l'intera equazione in una sola volta:

PID Transpose

Tutto questo può sembrare un po’ intimidatorio, forse anche per chi ha una laurea in ingegneria. La buona notizia è che non è necessario tirare fuori il manuale di “Modeling and Analysis of Dynamic Systems” per capire cosa sta succedendo. E, anche se può aiutare, non è nemmeno indispensabile saper fare calcolo differenziale.
 
Analizzando la prima equazione, otteniamo u(t)—l’uscita del controllore (senza unità) sul lato sinistro—sommando tre elementi matematici sul lato destro del segno di uguale: P, I e D. Ogni elemento ha davanti un valore costante K (Kp, Ki e Kd), che rappresenta il peso di ciascun termine nella formazione di u(t), ovvero l’uscita del controllo in un determinato istante. Possiamo regolare singolarmente ciascun valore K per migliorare le prestazioni del sistema, come spiegheremo più avanti:
 
Proportional (P—Kp)
 
Il primo e più importante termine in questa equazione è e(t). Per questo motivo, il valore Kp che lo precede è generalmente maggiore rispetto agli altri valori K nell’equazione. Qui, e(t) rappresenta semplicemente l’errore istantaneo in un dato momento: il valore reale del dispositivo controllato meno il valore desiderato. Moltiplicando questo per Kp si ottiene il contributo di questo termine all’uscita complessiva del controllore.
 
Integral (I—KI)
 
Il secondo termine in questa equazione riguarda l’errore accumulato nel tempo. È la somma di tutti gli errori sperimentati dal dispositivo:
 
Ogni volta che un controllore calcola u(t), aggiunge l’errore istantaneo a un totale progressivo.
 
Questo valore viene poi moltiplicato per Ki e aggiunto a u(t).
 
Considera una situazione in cui una forza mantiene un motore in posizione e non gli permette di tornare al setpoint in condizioni normali. Più a lungo il sistema resta fuori specifica, più il termine I continuerà a crescere, fino a superare questa forza o a raggiungere i limiti delle capacità del motore.
 
Derivative (D—Kd)
 
Il terzo termine in questa equazione riguarda la velocità con cui cambia l’errore:
 
In teoria, se in questa equazione fosse presente solo il termine D e il processo mantenesse stabilmente un valore errato, questo termine resterebbe pari a zero e non contribuirebbe all’uscita corretta. D’altra parte, se uno degli altri due termini cerca di riportare il dispositivo al valore corretto troppo rapidamente, il termine derivativo può aiutare a smorzare l’effetto.
 
Sebbene l’espressione basata sul calcolo differenziale di questo concetto possa essere utile, nella pratica il controllo PID è molto meno “magico” di quanto possa sembrare inizialmente. In termini pratici, calcoliamo l’uscita utilizzando solo addizioni, sottrazioni e moltiplicazioni, tenendo conto dell’errore e del tempo tra le letture. In effetti, nelle prime implementazioni del controllo PID si utilizzavano sistemi pneumatici, con mezzi meccanici per introdurre ciascun “termine”.

  1. I controllori effettuano una lettura istantanea dell’errore.
  2. Sottraggono da essa la lettura istantanea precedente.
  3. Moltiplicano il valore risultante per Kd per calcolare il suo contributo a u(t).

Tutorial sul controller PID di Arduino

In molte situazioni è conveniente collegare un controller PID dedicato al proprio processo, ma è anche possibile realizzarne uno autonomamente utilizzando un Arduino o una scheda di sviluppo simile. Si può persino scrivere il proprio algoritmo PID. Nel codice, ciascun termine può essere espresso in modo simile a quanto segue:

  • P:instanteneousError = setpoint – input;
  • I:cumulativeError = += error * elapsedTime;
  • D:rateOfError = (error – errorLastCalculation)/elapsedTime

Per ottenere l’uscita necessaria, moltiplica ciascuno di questi termini per il rispettivo valore K e somma i risultati. D’altra parte, se vuoi evitare di reinventare la ruota, puoi utilizzare la libreria PID di Brett Beuregard. Questa libreria si occupa dei dettagli per te e ti permette di concentrarti sulla regolazione delle costanti P, I e D secondo le necessità.

Arduino Nano

Per dimostrare la teoria PID in azione, ho tirato fuori un Arduino Nano Every dalla mia cassetta degli attrezzi, insieme a:

  • Scheda driver motore
  • Sensore infrarossi
  • Motore recuperato da un drone Hubsan H107C

Ho stampato un supporto per breadboard per il motore insieme a una "ventola" che blocca la luce il 50% del tempo per evitare di perdere impulsi mentre gira. Il driver motore è l'ingresso al motore (altrimenti non controllato), e il feedback si basa sul tempo tra gli impulsi.
 
Quando finalmente ho risolto il codice e ottenuto le parti stampate in 3D, sono stato in grado di controllare il motore in modo più sofisticato rispetto all'azionamento del pulsante di accensione con uscita PWM (modulazione della larghezza degli impulsi) costante.

PID Routine Code

Parti di codice notevoli includono l'utilizzo di una routine di interrupt per registrare ogni impulso mentre il dispositivo di blocco gira e calcolare il tempo tra gli impulsi usando millis(). Ho impostato il PID nella prima parte del codice al di fuori delle funzioni con:
 
PID myPID (&difference, &driverOut, &setPoint, Kp, Ki, Kd, DIRECT)
 
Kp, Ki e Kd sono definiti prima di questa linea nel codice, e &difference controlla &driverOut, con &setPoint modificato dal monitor seriale. Possiamo manipolare questa matematica per trasformare questa differenza di tempo in RPM, ma le impostazioni del PID funzionano come uscite DIRECT perché questo particolare driver si attiva quando l'ingresso è messo a bassa tensione. Quando l'uscita analogica aumenta (motori spenti), il ritardo tra gli impulsi aumenta anch'esso.

PID Routine OLD

Una versione precedente della routine PID. Nota che CH1 legge gli impulsi di ingresso, mentre CH2 è l'uscita calcolata utilizzando la routine PID—gli impulsi bassi sono ingressi per il motore.
 
Questo semplice esempio di controller PID è stato realizzato con i componenti disponibili (incluso il nuovo Arduino Nano Every) e un motore con il quale avevo una conoscenza approssimativa. Sono comunque riuscito a dimostrare come applicare il controllo PID in una vasta gamma di situazioni, anche senza conoscere tutti i dettagli. Che si tratti del controllo di un motore, del controllo della temperatura di un forno o dell'equilibrio di un robot, una piccola configurazione e regolazione PID ti offre infinite opzioni di sperimentazione.

Tag articolo

Articolo
Globale
Arduino S.r.l.

Articoli di notizie correlati