Я намагаюся реалізувати базовий алгоритм PID на Arduino Leonardo для змішування гарячої та холодної води з водопровідної арматури, використовуючи клапани, що управляються сервоприводом. Мета - підтримувати температуру якомога ближче до заданої точки. Особливо важливим є запобігання вихідної температури від перевищення заданої точки, щоб захистити користувача від опіків. Важливе значення - максимально швидко досягти температури біля заданої температури.
Для невеликих змін температури, здається , стандартна реалізація алгоритму PID працює нормально. Але я не знаю, як враховувати довгі затримки, які можуть виникнути під час очікування, коли гаряча вода досягне клапана, оскільки ці затримки значно довші, ніж стандартні затримки після зміни положень клапана.
Очевидно, що залежно від тривалості лінії гарячої води та часу з моменту останнього використання гарячої води, до гарячого водопостачання може знадобитися кілька десятків секунд, тому протягом цієї температури температура води залишається досить постійною при низькій температурі і клапан гарячої води незабаром відкривається на 100%. Цілісний компонент починає накопичувати велике значення помилки.
Коли гаряча вода нарешті досягне клапана, виявлена температура дуже швидко піднімається до максимальної температури гарячої води. Через велику інтегральну похибку клапан гарячої води утримується на 100% протягом тривалого часу після того, як температура перевищить задану, через очікування зниження інтегрального значення до нормального рівня. Таким чином, результат - максимальна температура води протягом декількох (десятків) секунд.
Я не впевнений, як пояснити цю можливу велику затримку. У такому випадку було б розумно встановити верхню (і нижню) межу інтегрального значення помилки, щоб обмежити максимальний час відгуку? Це, здається, перешкоджає призначенню цілісного компонента, а також все ще накладе деякий відставання після досягнення заданої точки.
Або є кращий спосіб вирішити швидкі зміни вводу після тривалої затримки?
Дякую за будь-яку пораду!