Sto cercando di implementare un algoritmo PID di base su un Arduino Leonardo per miscelare acqua di rubinetto calda e fredda utilizzando valvole servocontrollate. L'obiettivo è mantenere la temperatura il più vicino possibile a un setpoint. Particolarmente importante è impedire che la temperatura di uscita superi il setpoint per proteggere l'utente dalle ustioni. Secondariamente importante è far arrivare la temperatura vicino al setpoint il più rapidamente possibile.
Per piccoli cambiamenti di temperatura, un'implementazione standard dell'algoritmo PID sembra funzionare correttamente. Ma non so come spiegare i lunghi ritardi che possono verificarsi quando si attende che l'acqua calda raggiunga la valvola, poiché questi ritardi sono molto più lunghi dei ritardi standard dopo aver cambiato le posizioni della valvola.
Ovviamente a seconda della lunghezza della linea dell'acqua calda e del tempo dall'ultimo utilizzo di acqua calda, possono essere necessarie più decine di secondi affinché l'acqua calda raggiunga la valvola, quindi durante questo periodo la temperatura dell'acqua rimane abbastanza costante a bassa temperatura e la valvola dell'acqua calda si apre presto al 100%. Il componente integrale inizia ad accumulare un valore di errore elevato.
Quando l'acqua calda raggiunge finalmente la valvola, la temperatura rilevata aumenta molto rapidamente fino alla temperatura massima dell'acqua calda. A causa del grande errore integrale, la valvola dell'acqua calda viene mantenuta al 100% per lungo tempo dopo che la temperatura supera il setpoint, a causa dell'attesa sul valore integrale ridotto a livelli normali. Pertanto il risultato è acqua a temperatura massima per diversi (decine) di secondi.
Non sono sicuro di come spiegare questo possibile lungo ritardo. In tal caso, sarebbe saggio impostare un limite superiore (e inferiore) sul valore di errore integrale, al fine di limitare il tempo massimo di risposta? Questo sembra vanificare lo scopo del componente integrale e imporrebbe comunque un certo ritardo dopo aver raggiunto il setpoint.
Oppure esiste un modo migliore per gestire le modifiche di input veloci dopo un lungo ritardo?
Grazie per qualsiasi consiglio!