Я пытаюсь реализовать базовый алгоритм PID на Arduino Leonardo для смешивания горячей и холодной водопроводной воды с использованием сервоуправляемых клапанов. Цель состоит в том, чтобы поддерживать температуру как можно ближе к заданному значению. Особенно важно предотвратить превышение заданной температуры выходной температуры, чтобы защитить пользователя от ожогов. Во-вторых, важно как можно быстрее получить температуру около заданного значения.
При небольших изменениях температуры стандартная реализация алгоритма ПИД работает нормально. Но я не знаю, как объяснить длительные задержки, которые могут возникнуть при ожидании горячей воды, чтобы достичь клапана, так как эти задержки намного больше, чем стандартные задержки после изменения положения клапана.
Очевидно, что в зависимости от длины линии горячей воды и времени, прошедшего с момента последнего использования горячей воды, может потребоваться несколько десятков секунд, чтобы горячая вода достигла клапана, поэтому в течение этого времени температура воды остается довольно постоянной при низкой температуре. и клапан горячей воды скоро открывается на 100%. Интегральный компонент начинает накапливать большое значение ошибки.
Когда горячая вода наконец достигает клапана, обнаруженная температура очень быстро повышается до максимальной температуры горячей воды. Из-за большой интегральной погрешности клапан горячей воды удерживается на уровне 100% в течение длительного времени после того, как температура превысит заданное значение, вследствие ожидания того, что интегральное значение будет снижено до нормального уровня. Таким образом, результатом является максимальная температура воды в течение нескольких (десятков) секунд.
Я не уверен, как объяснить эту возможную длительную задержку. В таком случае, было бы разумно установить верхнюю (и нижнюю) границу значения интегральной ошибки, чтобы ограничить максимальное время отклика? Похоже, что это противоречит цели интегрального компонента, а также приведет к некоторому отставанию после достижения заданного значения.
Или есть лучший способ обработать быстрые изменения ввода после большой задержки?
Спасибо за любой совет!