Controllo PID e autotune

Salve a tutti, ho messo su un controller pid con arduino nano , che dovrebbe controllare la resistenza dal mio dissaldatore, ho trovato un buon progetto sulla rete ed ho deciso di costruirlo , dopo aver settato tutto come da codice, sono riuscito a far funzionare il tutto o quasi, le temperature vengono lette quasi precise come il mio termometro laser , la resistenza va a riscaldarsi , ma la blocco per non farla surriscaldare visto che non ho un controllo preciso della temperatura, anche richiamando la funzione autotune, questa non va a bloccarsi , al setpoint impostato che è di 150°C ma continua e non spegne mai l’uscita che va alla resistenza , posto il codice, perchè non riesco a venirne a capo, probabilmente ci sarà qualche errore nelle letture ma mi sfugge , sperando che sarà anche di aiuto ad altri che vorranno costruire questo tipo di controller.
Grazie a chi vorrà e potrà aiutarmi .

provvisorio_4k7.ino (9.04 KB)

ma..l'hardware dov'è, con cosa leggi la temperatura della punta per avere un feedback (si scrive cosi?) per la regolazione?
al nodo dell'errore, devono arrivare, set impostato, temperatura rilevata, come minimo, poi da questi due parametri nasce l'errore il quale sara' processato dal sistema, nel tuo caso pid.
il quale provvedera', una volta che hai settati i guadagni delle varie azioni, a tenerti la temperatura della tua punta, il piu' vicina possibile a quella che hai impostato.
il software è importante, ma se non c'è un hardware adeguato........
ad esempio cosa è che legge la temperatura della punta?
importante perchè da questo sensore dipende buona parte della bonta' della regolazione.

ciao.

Ciao e grazie per la risposta , per leggere la temperatura uso un op-amp mcp6002 , e per attivare la resistenza collegato al pin pwm di arduino uso un mosfet irlz44 , Per calcolare la tensione di uscita dell' op-amp ho usato questa formula: Vout= Gain5V(Rsens/Rgain+Rsens) , dove Gain è 48 , Rsens è la resistenza alla massima temperatura (55.86OHM) ed Rgain è la resistenza di gain in questo caso nel mio circuito è 4k7 .

scusa , ma con un amplificatore operazionale come fai a leggere la temperatura della punta?.
al massimo processerai, ma l’elemento a contatto della punta , cosè, una ntc, una ptc, una termocoppia, o quale altro sensore?

Scusa avevo dimenticato a specificarlo, è una PTC

a ok , poi presumo che avrai sull'ardware tre potenziometri (o cosa?) per poter dosare la quantita' di azione proporzionale, integrale e derivata della regolazione o è tutto preimpostato fisso.

No ho due opzioni , o preimpostare il tutto o effettuare tramite la libreria autotune, una autoconfigurazione dei parametri PID

prova allora a variare il gain, con molta calma, perchè la temperatura di per se è un parametro che cambia molto lentamente.
puo' succedere, come succede, che prima di stabilizzarsi abbia dei sopralzi dal set impostato,per poi ridiscendere un poco piu' sotto fino a risalire e stabilizzarsi.
non devi avere fretta, solo se vedi che supera ogni ragionevole limite allora devi intervenire.
in fase di inizio della regolazione è normale che sopraalzi un po'.
per capirci, all'inizio ci gira un po' intorno, un po' piu' su, un po' piu' giu' fino a stabilizzarsi dove deve (spiegazione poco tecnica, ma rende l'idea.)
affinche' la regolazione possa lavorare ha sempre bisogno dell'errore positivo o negativo, naturalmente deve essere piccolo.

un'ultima cosa se il guadagno dell'anello è troppo elevato, corri il rischio che il sistema entri in pendolazione ed allora addio regolazione.

Effettivamente quando imposto un Setpoint la temperatura misurata a display, non è mai stabile ma oscilla avanti e indietro.
Il calcolo che ho postato prima, per il gain mi sa con la mia configurazione in uscita mi da 2.76v alla massima temperatura. Alzando questo valore di Vout e abbassando il Gain a 10 potrei avere più stabilità?
Grazie per l'aiuto , molto gentile

secondo me, bisogna lavorare sui valori di kp, ki, kd
sempre piano,ed osservare come reagisce.
uno alla volta.
ki e kd sono i piu' critici percio' inizierei con valori bassi.
non è facile la messa a punto di una regolazione pid, bisogna andare con calma ed osservare come reagisce.

Con quali valori è opportuno iniziare per kp ki e kd secondo te? Conviene iniziare anche solamente con il proporzionale?

io farei così, metterei a zero l’integrale e la derivata.
con la proporzionale ti avvicini ma non riuscirai a copiare il set.
poi pian piano cominci con la integrale e gia’ dovresti andare meglio, per ultima la derivata per affinare.
sempre piano, non si deve avere fretta, altrimenti non cavi il ragno dal buco :slight_smile:
comunque, io dico sempre che è come andare in bicicletta, puoi leggere tutti tutorial che vuoi, e va bene, ma alla fine per imparare devi smanettarci tu.
ciao.

Ok farò come da tuo consiglio, un ultima cosa con quale guadagno potrei iniziare? Eventualmente mi converrebbe partirà da 1 e andare a salire?

Ho fatto alcune prove impostando dapprima un set point che è 150°C e dopo impostando KP a 10 , riesco ad arrivare a 158°C e poi oscilla un po, impostando la integrale , ho uno sbalzo notevole di circa 30-40°C con tutti i valori che imposto , lasciando l'integrale a 0 e inizio a regolare la derivata va meglio ma non riesco ad avere una precisione maggiore della sola KP, ma il problema maggiore è dovuto quando aumento il setpoint tipo a 300°C inizia ad aumentare la temperatura ma in uscita , mantiene sempre il valore massimo di tensione portando la resistenza all'incandescenza , non riesco proprio a capire il motivo...

non so cosa potrei dirti, l'ambaradam, l'hai li tu, come è fatto, lo sai tu.
io ho cercato di spiegare a grandi linee la filosofia che sta dietro a quel tipo di regolazione.
adesso come dicevo al mio post precedente devi smanettarci tu.

ciao.

Grazie sei stato gentilissimo, in generale ho capito il funzionamento, ma adesso il problema mi sa che sta nel pwm, vedremo come si svolge la cosa , grazie ancora

tix88:
Ho fatto alcune prove impostando dapprima un set point che è 150°C e dopo impostando KP a 10 , riesco ad arrivare a 158°C e poi oscilla un po, impostando la integrale , ho uno sbalzo notevole di circa 30-40°C con tutti i valori che imposto , lasciando l'integrale a 0 e inizio a regolare la derivata va meglio ma non riesco ad avere una precisione maggiore della sola KP, ma il problema maggiore è dovuto quando aumento il setpoint tipo a 300°C inizia ad aumentare la temperatura ma in uscita , mantiene sempre il valore massimo di tensione portando la resistenza all'incandescenza , non riesco proprio a capire il motivo...

Ciao, premetto che ho una preparazione più teorica che pratica sui pid, avendoli studiati all'università.
L'azione integrale è fondamentale per avere errore nullo a regime (ovvero avere la temperatura desiderata) senza dover eccedere con il guadagno proporzionale che potrebbe portarti a rompere anche il sistema. Per regolare i parametri io utilizzerei il metodo di ziegler nichols ad anello chiuso (se disponi di qualche programma come matlab o uno sketch in processing per graficare l'uscita del sistema, ovvero la temperatura): inizi con un guadagno Kp basso e lo aumenti poco a poco fino a quando non avrai un oscillazione perenne (cioè aumentando Kp arriverai ad un certo punto in cui la temperatura va su e giù senza mai fermarsi al setpoint); dopodiché avrai che Kp è uguale all'ultimo valore inserito, inoltre ti serve il periodo dell'oscillazione (puoi prenderlo semplicemente dal grafico dell'uscita), con questi due parametri puoi trovare Ki e Kd tramite le tabelle di ziegler nichols.
Teoricamente è applicabile dato che hai un sistema ad anello chiuso, ma se ho detto castronate perdonatemi.

Per quanto riguarda il problema con i 300°C potrei sbagliarmi ma mi sembra un problema di windup, potresti provare ad utilizzare il pid con anti windup e vedere se risolvi il problema.
Ricorda sempre di limitare l'azione derivativa perché nonostante velocizzi la risposta, per valori elevati ti porta all'instabilità e ad avere una sovraelongazione maggiore (cioè all'inizio invece di arrivare a 150°, arriva a 180° per fare proprio un esempio)

Come devo impostare il pid per farlo in anti windup?

Scusa ma la mia era una ipotesi, dovresti verificarla tu perché io non so che cosa usi per aumentare la temperatura, cosa usi per comandare questo attuatore e in generale diciamo non so che hardware hai. In ogni caso si ha la saturazione quando il regolatore cerca di aumentare sempre di più l'uscita di controllo ma questa non può andare oltre il suo valore massimo. Il problema non è l'implementazione ( che sono semplici if else) ma più che altro capire cosa succede al circuito che hai.

Credo che il problema principale, sia dovuto al codice , che non regola bene il pwm per la mia resistenza, invece con un'altro tipo di resistenza che è quella nativa di questo progetto funziona bene , dovrei solo capire come far capire al controllore di aggiustare il pwm in base alla temperaura e al controller pid, grazie comunque , mi sei stato d'aiuto