Я пытаюсь реализовать базовый алгоритм PID на Arduino Leonardo для смешивания горячей и холодной водопроводной воды с использованием сервоуправляемых клапанов. Цель состоит в том, чтобы поддерживать температуру как можно ближе к заданному значению. Особенно важно предотвратить превышение заданной температуры выходной температуры, чтобы защитить пользователя от ожогов. Во-вторых, важно как можно быстрее получить температуру около заданного значения.
При небольших изменениях температуры стандартная реализация алгоритма ПИД работает нормально. Но я не знаю, как объяснить длительные задержки, которые могут возникнуть при ожидании горячей воды, чтобы достичь клапана, так как эти задержки намного больше, чем стандартные задержки после изменения положения клапана.
Очевидно, что в зависимости от длины линии горячей воды и времени, прошедшего с момента последнего использования горячей воды, может потребоваться несколько десятков секунд, чтобы горячая вода достигла клапана, поэтому в течение этого времени температура воды остается довольно постоянной при низкой температуре. и клапан горячей воды скоро открывается на 100%. Интегральный компонент начинает накапливать большое значение ошибки.
Когда горячая вода наконец достигает клапана, обнаруженная температура очень быстро повышается до максимальной температуры горячей воды. Из-за большой интегральной погрешности клапан горячей воды удерживается на уровне 100% в течение длительного времени после того, как температура превысит заданное значение, вследствие ожидания того, что интегральное значение будет снижено до нормального уровня. Таким образом, результатом является максимальная температура воды в течение нескольких (десятков) секунд.
Я не уверен, как объяснить эту возможную длительную задержку. В таком случае, было бы разумно установить верхнюю (и нижнюю) границу значения интегральной ошибки, чтобы ограничить максимальное время отклика? Похоже, что это противоречит цели интегрального компонента, а также приведет к некоторому отставанию после достижения заданного значения.
Или есть лучший способ обработать быстрые изменения ввода после большой задержки?
Спасибо за любой совет!
источник
Ответы:
Ваша проблема называется Integral Windup , это общая проблема контроля. В нелинейной или иным образом ограниченной области контроллер не может отслеживать заданное значение, и интеграл увеличивается до большого значения. Это приводит к значительному перерегулированию при достижении заданного значения, которое является именно той проблемой, которую вы вывели.
Самое простое решение - ограничить само значение Интегратора разумным максимумом. Ограничение интегрального вклада также не сработает, потому что интегратор все равно будет увеличен до некоторой большой величины.
У Mathworks есть страница с некоторыми другими решениями для интегрального windup.
В ПИД-контроллере обычно требуется как можно меньше интегральных терминов. В стандартном механическом клапане контроля температуры используется только пропорциональный контроль, и они работают нормально. Сохраняйте интегральное слагаемое как можно меньше - пользователь не заметит небольшую ошибку в конечной температуре. Вы можете обнаружить, что вы получаете приемлемую производительность только с PD.
Поскольку это очень особый, известный случай, вы можете рассмотреть возможность использования другого режима для контроллера. Измерьте температуру горячего воздуха на входе, и пока она ниже заданного значения, просто прогрейте 100%, а холодные 20%. Когда он прогреется, переключитесь на PID с хорошими начальными условиями.
источник
Ключом к эффективному управлению этим процессом является осознание того, что горячие и холодные ответвления не работают симметрично, и любой оптимальный алгоритм должен учитывать это.
Когда вы некоторое время не пользуетесь горячей водой, она остывает в трубе.
Когда вы не пользуетесь холодной водой какое-то время, она остается такой же, какой была когда-либо (если только холодная вода не поступает из резервуара с холодной водой с чиллером, что было бы здорово в жаркие летние дни, но я ставки на практике довольно редки).
Таким образом, мы предполагаем, что не знаем, что получаем от трубы с горячей водой, но мы можем зависеть от того, что труба с холодной водой в значительной степени постоянна на протяжении всего цикла.
Таким образом, исходя из температуры смешанной воды, а также из знания настройки клапана и из оценки температуры холодной воды, мы можем оценить, насколько горячей является вода, поступающая в настоящее время из трубы горячей воды. Затем вы можете отрегулировать клапан, чтобы получить правильную температуру на выходе без ПИД-регулятора, основываясь только на оценке термодинамической формулы.
Чтобы получить «оценку температуры холодной воды», вы можете запустить холодную воду в течение короткого времени (возможно, несколько секунд) в начале цикла и прочитать температуру. Затем предположим, что после этого он не изменится, поскольку у вас недостаточно данных для определения обеих температур.
Эта схема не будет абсолютно точной, но я полагаю, что она надежно попадет в стадию без возможности резкого превышения. Затем вы запускаете PID поверх этой схемы для точной настройки результатов, но ограничиваете изменение настройки клапана, которую разрешено производить PID. И, возможно, сбросьте состояние ПИД-регулятора при значительных изменениях входной температуры горячей воды.
Любые решения возможны с несколькими датчиками температуры.
источник
Я просто хотел добавить одну деталь к хорошим ответам выше о том, что делают инженеры управления для встроенных возможностей запуска. Это также происходит во многих промышленных процессах, и это искусство, а не наука.
Есть типичные действия учебника против этого, не жертвуя интегральным усилением, которое могло бы действительно потребоваться для спецификации производительности.
Каждый раз, когда вы пересекаете нулевой уровень ошибок, вы сбрасываете интегратор. Это делает интегратор интегратором по требованию типа нелинейного элемента вместо слепого аккумулятора.
Вы в основном подключаете входной блок интегрального действия к показательному элементу в цикле. Это может быть либо выходом интегратора, чтобы судить , начал ли он сборку (что требует правильного понимания процесса). Или вы проверяете, насыщены ли ваши приводы или нет, и формируете петлю обратной связи на основе этой информации. Я просто случайно выбрал первую ссылку, которая вышла из Google, и в конце этого видео есть графическое объяснение моей последней точки. https://www.youtube.com/watch?v=H4YlL3rZaNw
источник
Иногда может быть полезно иметь несколько наборов параметров ПИД для грубых этапов диапазона работы системы, которые вы изменяете на лету, когда система переходит от одной стадии поведения к другой. Например, один набор Kp, Ki и Kd, когда вы включаете горячий кран и получаете только холодную воду; затем, как только вы начнете видеть повышение температуры, переключитесь на другой набор Kp, Ki и Kd. Затем настройте два соответственно.
Вы используете библиотеку PID на игровой площадке Arduino Бретта Борегара? Это довольно мило. И там есть «адаптивный» пример этого.
источник
Вы смоделировали систему?
Есть ли у вас какие-то временные данные, показывающие перерегулирование - особенно частоту
Это два вопроса, которые следует задавать с помощью любого контрольного запроса.
Из того, что вы описали, ваш интегральный выигрыш слишком высок, вплоть до высокого. Это может быть связано с windup интегратором: у показанного кода есть некоторые реальные практические проблемы, одна из которых - это не самый большой из дискретных интеграторов
Это в равной степени может быть потому, что оно очень высокое и требуется время, чтобы уменьшить его.
Так что да, значение, хранящееся в регистре I, могло бы сказать ... 1000C, потому что P + I не был настроен на отклик системы, а затем он должен был свернуться.
Первое, что я хотел бы сделать, это захватить данные в реальном времени для последующей обработки. Далее я бы запустил P-only и обеспечил, чтобы пропорциональный коэффициент усиления ПОЛУЧИЛ желаемую температуру (теория управления утверждает, что это не так). В зависимости от того,
Я бы начал с изменения кода PID для лучшей реализации, а затем добавил бы немного I, чтобы доказать свою точку зрения.
Вы действительно должны определить, против чего эти выгоды предназначены. Вход - это температура, выход - поток? поэтому должна быть передача Flow / C и функция Flow / Cs.
источник
Один из способов, который мне нравится решать Integral Windup - это перестать накапливать ошибку, когда ваш управляющий выход имеет максимальное отклонение . Или масштабируйте его, насколько это далеко от максимального отклонения. Поэтому, когда ваш контроллер выдает «горячая вода 100%, холодная вода 0%», просто не накапливайте ошибку, но и не сбрасывайте ее до нуля.
Мне не нравится ограничивать интеграл максимумом, потому что есть предел тому, какую систематическую ошибку может компенсировать ваш PID.
Я бы также предположил, что вместо создания «тупого» ПИД-регулятора, который имеет только один параметр, который он пытается контролировать без знания базовой системы, вы устанавливаете два дополнительных температурных датчика, как на горячий, так и на холодный вход. Затем вы пытаетесь найти функцию, которая приближает желаемое положение на основе входных температур, и вы используете только ПИД-регулятор, чтобы скорректировать погрешность на выходе этой функции.
Ошибка будет существенной, потому что вы не измеряете расход (ну, конечно, если вы этого не делаете), который зависит не только от положения клапана (известно), но и от давления воды (неизвестно).
Тем не менее, это должно очень помочь с проблемой того, что горячая вода в конце концов достигнет крана, потому что в хорошо затухающем контуре ПИД-регулятора необходимо полагаться на то, что элемент D хорошо откалиброван для быстрого уменьшения потока горячей воды. В моем опыте получить правильный производный коэффициент обычно труднее всего. Но если бы у вас было два дополнительных датчика, основной выход изменился бы точно так же быстро, как и температура воды на входе, поэтому в основном мгновенный, без какой-либо необходимости в производном элементе.
источник