Come implementare un controller simile al PID auto-tuning


15

Sto cercando di scrivere un programma di microcontrollore per il controllo della temperatura in un sistema con le seguenti caratteristiche:

  • l'uscita può essere solo On o Off, con frequenze di ciclo fisse (~ 2-10 all'ora)
  • L'impianto risponde lentamente (i cambiamenti misurabili della temperatura richiedono molto tempo> 10 minuti).
  • L'impianto perde temperatura in base alle condizioni ambientali.
  • il set-point può variare a grandi passi in base alla domanda dell'utente.

Sto scrivendo un controller che mira a minimizzare l'errore, oltre ad aderire alla frequenza di ciclo fornita come input.

Questo potrebbe essere fatto facilmente con un controller PI e la sua uscita viene convertita nel duty-cycle. Il problema è che il programma deve sintonizzarsi automaticamente e scegliere le costanti Kp, Ki corrette e adattarsi alle diverse condizioni ambientali e ai cambiamenti nella capacità di riscaldamento. Pertanto, la regolazione anticipata del controller PI non è troppo utile.

L'uso di un PI o PID effettivo non è un requisito. Sono aperto all'uso di Fuzzy-Logic se aiuta, ho anche un algoritmo di apprendimento automatico sul chip che modella la risposta del sistema e la perdita di calore (lineare circa) che suggerisce informazioni sulla risposta del passo misurata . Non so cosa fare con queste informazioni.

Un paio di post suggeriscono che potrei usare i dati di modellazione per mettere a punto il PI online, così come il manuale di laboratorio che suggerisce che potrei usare Fuzzy-Logic per mettere a punto il PI.

La mia domanda è: qual è l'approccio migliore per questo tipo di scenario (ad esempio PID, fuzzy-pid, convoluzione, ecc.) E come potrei implementarlo effettivamente nel software / nella pratica.

Non sono un EE, quindi qualsiasi input sarebbe molto apprezzato.


1
Ho scritto una risposta sull'utilizzo di un algoritmo simplex per sintonizzare automaticamente i controller PID su Robotics SE che potrebbero essere di interesse.
embedded.kyle,

@ embedded.kyle great, capisco simplex / great-acent. Puoi dirci cosa faceva per x1, x2? Ho problemi a collegarli alle costanti PID.
MandoMando,

1
È passato un po 'di tempo, ma credo che abbiamo usato qualcosa come x1 = P, x2 = I, x3 = D. x0, il centro di gravità, è qualunque misurazione della stabilità sia più importante per te. Nella mia applicazione, il controllo del motore, avevamo due loop. L'x0 di uno era la velocità e l'x0 per l'altro era corrente. Vedi qui per di più.
embedded.kyle

@ embedded.kyle ti dispiace trasformare il tuo commento in una risposta? aggiungi ulteriori informazioni se lo desideri. -thx
MandoMando il

Una taglia? Oh ragazzo! Fatto e fatto.
embedded.kyle

Risposte:


7

Non vorrei andare fino a chiamare PID obsoleto. Ma c'è sicuramente spazio per miglioramenti. Un modo in cui ho i circuiti di controllo PID auto-sintonizzati è usare il metodo Nelder-Mead che è una forma di algoritmo simplex per l' arrampicata in collina . Ha il vantaggio di poter convergere e riconvertire su un parametro target che si sposta nel tempo.

Arrampicata in collina con metodo Nelder-Mead

Da questo documento :

Ad esempio nel nostro caso di regolazione dei parametri PID {K P , K I , K D } un simplex è tetraedro. Nelder-Mead genera una nuova posizione di test del simplex estrapolando il comportamento della funzione obiettivo misurata in ciascun punto di test disposto come simplex. L'algoritmo quindi sceglie di sostituire uno di questi punti di prova con il nuovo punto di prova e quindi la tecnica avanza.

La mia particolare applicazione era per il controllo del motore. Avevamo due loop, un loop di controllo corrente PID e un loop di controllo velocità PI. Abbiamo impostato i nostri vertici su P, I e D rispettivamente e abbiamo eseguito statistiche sull'output del loop. Abbiamo quindi eseguito la riflessione, l'espansione, la contrazione e la riduzione più e più volte fino a quando gli obiettivi di controllo della corrente o della velocità generati fossero entro alcune deviazioni standard.

Con il nostro prodotto, il VP si preoccupava molto di come "suonava" il motore. E come si è scoperto, "suonava" meglio quando il bersaglio attuale rimbalzava un po 'più di quanto fosse matematicamente ottimale. Quindi, la nostra messa a punto è stata "live" in quanto abbiamo lasciato che l'algoritmo cercasse mentre il motore era in funzione in modo da tenere conto anche della percezione dell'utente del suono del motore. Dopo aver trovato i parametri che ci sono piaciuti, sono stati codificati e non modificati.

Questo probabilmente non sarebbe l'ideale per te dal momento che affermi "mettere il sistema in oscillazione anche se una parte dell'autotuning non è accettabile per gli utenti". Il nostro sistema avrebbe sicuramente oscillato e fatto altre cose orribili durante l'autotuning.

Tuttavia, è possibile eseguire due copie del controller PID. Uno che era "live" e controllava effettivamente il processo. E un secondo che veniva costantemente auto-sintonizzato mentre veniva alimentato gli stessi ingressi del controller "live". Quando l'output del controller sintonizzato automaticamente diventa "migliore" o più stabile, è possibile scambiare i coefficienti nel controller "live". Il controller eseguirà quindi le correzioni al processo fino a quando non saranno raggiunte le prestazioni desiderate. Ciò impedirebbe le oscillazioni che possono essere percepite dall'utente durante l'autotuning. Ma se gli ingressi cambiano drasticamente e il controller PID non è più ottimale, l'autotuning può scambiare nuovi coefficienti quando diventano disponibili.


Il metodo NM richiede di eseguire i suoi punti selvaggi sulla funzione obiettivo (cioè il mondo reale dell'utente). Tuttavia, credo che un modello grezzo (spazio-stato?) Possa essere costruito sul microcontrollore stesso sulla base delle misurazioni del sensore. Avrebbe quindi eseguito il controller PI 'ombra' proposto mentre ottimizza. Non sono sicuro di questo un over-kill poiché potrebbe essere possibile sintonizzare un PI su un'impostazione nota e quindi ridimensionare Kp e Ki in base alle letture del sensore e alla risposta del sistema. Ad ogni modo, ben fatto signore.
MandoMando,

@MandoMando Grazie mille! E mi piace molto il termine controller PI "ombra".
embedded.kyle

3

Un controller PID è utile in situazioni in cui il comportamento del sistema da controllare può essere ragionevolmente approssimato come una somma dello stimolo di controllo, l'integrale dello stimolo di controllo e l'integrale di quel primo integrale. Alcuni sistemi di controllo della temperatura possono soddisfare tale criterio, se esiste un oggetto che viene riscaldato uniformemente dallo stimolo e se tale oggetto trasferisce il calore uniformemente ad un altro oggetto ad una velocità proporzionale alla differenza di temperatura tra di essi. Ad esempio, il primo oggetto potrebbe essere un elemento riscaldante e il secondo oggetto potrebbe essere l'aria che circola in una stanza, se c'è abbastanza circolazione d'aria da considerare l'aria con una sola temperatura uniforme. Per i modelli termici più complicati di così (ad esempio quelli che possono comportare gradienti termici all'interno di un mezzo solido),

Suggerirei che un buon approccio potrebbe essere quello di avere il controller, quando il riscaldatore è acceso, stimare continuamente quanto sarebbe caldo il dispositivo regolato se l'uscita fosse disattivata immediatamente e la temperatura alla quale finirebbe per raffreddarsi se il riscaldamento è stato acceso non appena consentito dopo. Stima anche quali sarebbero questi valori se il riscaldatore fosse lasciato acceso per un altro secondo, due secondi, tre secondi, ecc. Spegni il riscaldatore quando quei valori sono buoni come stanno per ottenere. Quindi, una volta spento il riscaldatore, iniziare a eseguire calcoli simili, ma scambiando i ruoli di acceso / spento, caldo / freddo, ecc., Per decidere quando riaccendere. A seconda del comportamento termico del sistema, potrebbe essere necessario utilizzare una strategia "min / max" per guardare avanti o due.


1

Essere in grado di cambiare lo stato del controllo (acceso o spento) 2-10 volte all'ora non si presta al controllo del ciclo di lavoro. L'uscita di un loop PI sarà un segnale di controllo che varia in ampiezza in funzione dell'errore e il tuo impianto può (realisticamente) accettare solo un input binario (off o on), poiché la 'frequenza' del controllo ciclo di lavoro che può essere accettato è una frazione di un hertz.

Potresti voler semplificare le cose e andare con il controllo isteretico:

  • il sistema si accende quando la temperatura supera un limite inferiore
  • il sistema si spegne quando la temperatura supera un limite superiore
  • c'è una distanza sufficiente tra i limiti superiore e inferiore per evitare il rimbalzo dell'uscita di controllo

l'idea è di fare in modo che l'uscita PI indichi: 60% e conversione in tempo di attivazione = 60% del ciclo -> 0,6 x 30 minuti -> 18 minuti e 12 minuti di spegnimento durante il ciclo di 30 minuti. il controller bang-bang che suggerisci non garantisce il mantenimento della frequenza di ciclo richiesta (ad esempio accensione, non più di n volte all'ora) e il mantenimento di un errore basso allo stesso tempo. potrebbe essere necessario che il sistema superi temporaneamente per un periodo di tempo per bilanciare la perdita durante il tempo di inattività.
MandoMando

1

Un modo tipico (sebbene certamente semplicistico di farlo) si chiama pianificazione del guadagno. È un approccio classico al controllo non lineare quando si dispone di una variabile (o variabili) osservabile con cui il sistema cambia (parametro di pianificazione). Nel tuo sistema quella variabile sarebbe molto probabilmente la temperatura. L'idea è che si crea un elenco di guadagni del controller a diversi valori del parametro di pianificazione (temperatura) e quando il parametro di pianificazione cambia, si utilizzano tali guadagni nel proprio controller (sia PI, PID, feedback di stato o altro). Se questo sembra davvero semplice, è perché lo è. Tuttavia funziona e viene utilizzato in alcuni sistemi molto complicati.

Se vuoi essere sofisticato, potresti implementare un algoritmo di apprendimento automatico per generare la tua matrice di guadagno. Ciò comporterebbe il controller in evoluzione e di apprendimento che sembra descrivere. Tuttavia, potrebbe essere eccessivo se il sistema può essere completamente caratterizzato.

Modifica: mi dispiace, ho letto male un po '. Stai cercando di controllare la temperatura in modo che le "condizioni ambientali" di cui hai parlato siano il tuo parametro di programmazione.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.