Подобрать параметры PID
- Войдите на сайт для отправки комментариев
Здравствуйте. На просторах интернета нашёл (не сам написал) функцию PID регулирования.
// (вход, установка, п, и, д, период в секундах, мин.выход, макс. выход) int computePID(float input, float setpoint, float kp, float ki, float kd, float dt, int minOut, int maxOut) { float err = setpoint - input; static float integral = 0, prevErr = 0; integral = constrain(integral + (float)err * dt * ki, minOut, maxOut); float D = (err - prevErr) / dt; prevErr = err; return constrain(err * kp + integral + D * kd, minOut, maxOut); }
Функция вызывается раз в 2 секунды
digitalWrite(tenpin, computePID(steinhart, brewtemp, PP, II, DD, 2, 0, 1)); // (вход, установка, п, и, д, период в секундах, мин.выход, макс. выход)
и подаёт сигнал на твердотельное реле, которое коммутирует ТЭН в бойлере. На всякий случай скажу, что ТЭН на 1500 Вт, объём воды в бойлере - 300 мл, теплопотери назвать не могу, стоит задача поддерживать температуру 94С. На 100% мощности (исключительно пропорциональное регулирование) система выходит на заданную температуру за 200-240 секунд, но за счёт инертности поддерживать P-регулированием такую систему невозможно - колебания будут очень большими.
Подбираю параметры P,I,D уже не первый день. По моему опыту коэффициент P в таких системах должен находиться на уровне 0.1 - 1, я его установил на 0.4, а вот с I и D мучаюсь долго.
При установке I и D 1 и 4 соответственно, идут колебания от 91.8 до 100 с затуханиями, однако, и с всплесками до 97С
Просто спросить хочу: Почему PID? Не проще ли использовать два/три термодатчика и греть/не греть используя их показания?
В условиях 300 мг на 1500 ватт и системой вкл откл очень важно становится как это вкл откл осуществляется. Если это 50 Гц через реле или тиристор то ПИД можно настраивать до маланиной свадьбы и не настроить. Слишком большая ошибка может случиться, если команда на отключение придёт в начале полупериода сети.
В условиях 300 мг на 1500 ватт и системой вкл откл очень важно ...
300 миллилитров это порядка 300 грамм однако
Просто спросить хочу: Почему PID? Не проще ли использовать два/три термодатчика и греть/не греть используя их показания?
Потому что этот метод уже зарекомендовал себя на бойлерах с ТЭНом. В другом месте (бойлер 1500 мл) отлично справляется.
В условиях 300 мг на 1500 ватт и системой вкл откл очень важно ...
300 миллилитров это порядка 300 грамм однако
мой пид регулятор в мозгу выдал такую формулу
мощность тена 1 : обьем 1 = мощность тена 2 : обьем 2
мощность тена 2 = 0.5 кВт, пошел я заварю себе кофейку... у меня там простой термостат...
Опытным путём прихожу к следующему (вдруг кто будет искать, это относится к коду в первом сообщении, в других PID-регуляторах P-коэффициент может быть обратнопропорциональным):
1. Ставим всё в ноль.
2. Коэффициент P нужно поставить такой, чтоб он не раскачивал систему сильно. Ставлю 2 - температура прёт без остановки до целевого показателя, следовательно, наблюдается жуткий перебег, ставлю 0.4 - температура растёт почти до целевого значения, но приближаясь к нему, ТЭН всё чаще отключается, ставлю 0.05 - растёт ооочень медленно. Опытным путём прихожу к значению 0.3 +/- 0.1
3. D - это демпфер. Пока мне сложно объяснить его воздействие, но интуитивно понимаю, что он сглаживает колебания.
D производная. Она реагирует на резкие скачки, которых в нагревных системах можно получить только плеснув холодной воды в горячий бойлер.
Твердотелка какая? С z ?
вообще то при такой малоинерционности лучше иметь хотяббы пару тэнов (например 1+0.5) и при приближении к уставке выключать мощный и доводить температуру числоимпульным способом менее мощным тэном.
я когдато делал такую бяку на 4х тэнах для какого то хим.реактора- 3 вкл/выкл один регулирующий не фазоимпульсным а числоимпульсным способом
Твердотелка какая? С z ?
Везде пишут, что с zero-cross, но я сам не разбирал, поэтому верю на слово. Я уже подобрал коэффициенты, с которыми есть выход на заданную температуру, но минут 5-10 она колеблется в пределах 1-2 градусов от целевой, потом устаканивается. Всё работает, но только спустя 10 минут. Хотелось бы колебания раньше укротить. И "слабый" ТЭН тут не нужен - мощный можно включать раз в 10 секунд на 1 секунду для поддержания температуры.
Повторюсь, я уже делал подобное, но там объём в 6 раз больше.
Повторюсь, я уже делал подобное, но там объём в 6 раз больше.
Опытным путём прихожу к следующему
Адррей, про принципы ручного подбора коэф почитайте тут:
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/etyudy-dlya-pesochnitsy-teoriya-upravleniya-i-regulyatory#comment-512055
например, то что у вас при Kp = 2 наблюдается "жуткий перебег" - это абслютно нормально, так и должно быть. Это не обязательно означает, что Kp надо уменьшать - этот перебег устраняется подбором других коэффициентов
пример подбора:
как видите. сначала по Kp есть перебег, но потом его убирают подбором Kd
Спасибо. Собственно, так и делаю. Но коэффициент I вообще не трогаю - и без него колебания около уровня установки, а когда менял - был перебег.
Буду повышать P и сглаживать с помощью D. Ещё раз спасибо.
Странно. Только с помощью I можно точно держать уставку. Надо только без фанатизма этот коэффициент увеличивать. Дело в том что у P и D есть зона не чувствительности около уставки. При Ваших кр 0.3 это 3 градуса. При малых отклонениях нужно время, чтобы набрать ошибку. Именно это делает интегральная составляющая.
Странно. Только с помощью I можно точно держать уставку. Надо только без фанатизма этот коэффициент увеличивать. Дело в том что у P и D есть зона не чувствительности около уставки. При Ваших кр 0.3 это 3 градуса. При малых отклонениях нужно время, чтобы набрать ошибку. Именно это делает интегральная составляющая.
Возможно, I должна быть очень маленькой. Например, 0.05.
Нашёл вот такой способ:
1. Выставляем все коэффициенты (Kp, Ki, Kd) в 0.
2. Начинаем постепенно увеличивать значение Kp и следим за реакцией системы. Нам нужно добиться, чтобы в системе начались устойчивые колебания (вызванные перерегулированием). Увеличиваем Kp, пока колебания системы не стабилизируются (перестанут затухать). У меня это значение около 1.
3. Запоминаем текущее значение (Ku = 1) и замеряем период колебаний системы, у меня оно около 120 с. (Tu = 120).
Теперь используем полученные значения Ku и Tu для расчета всех параметров ПИД регулятора по формулам:
Kp = 0.6 * Ku = 0.6
Ki = 2 * Kp / Tu = 0.01
Kd = Kp * Tu / 8 = 9
Методом подбора приходил к подобным результатам (0 и 0.01 почти одно и то же), но D в 2 раза выше.
Если про I - 0 и 0.01 , то это кардинально разные вещи. При нуле интегральный компонент не работает. При любом отличном от нуля значении происходит интегрирование. В отличии от P D, I суммируется на каждом шаге. За 10 шагов можно считать что Кi из 0.01 превратился в 0.1 и чем больше шагов ПИД провернулось, тем больше. Именно это свойство I канала ПИД удерживает точку уставки.
Добился минимальных колебаний (при установленном значении 94 очень медленно колеблется от 93.5 до 95), по сути помогла формула. Но отчего-то бывают редкие всплески до 96+.
Добился минимальных колебаний (при установленном значении 94 очень медленно колеблется от 93.5 до 95), по сути помогла формула. Но отчего-то бывают редкие всплески до 96+.
для 300 грамм сильно большая мощность, на подходе к заданной температуре надо снизить раз в пять, если потери невелики, я бы поинтересовался у тех, кто делал инкубаторы, там удержание в пределах десятых градуса
Добился минимальных колебаний (при установленном значении 94 очень медленно колеблется от 93.5 до 95), по сути помогла формула. Но отчего-то бывают редкие всплески до 96+.
для 300 грамм сильно большая мощность, на подходе к заданной температуре надо снизить раз в пять, если потери невелики, я бы поинтересовался у тех, кто делал инкубаторы, там удержание в пределах десятых градуса
На подходе к целевой как раз мои коэффициенты (0.4/0.01/20, уже наизусть выучил) и снижают мощность раз в 5 (субъективно), снижая время включения ТЭНа. Но выйти к таким значениям,чтобы колебания были в пределах пары десятых, увы, не получилось.
Субъективно это знатный критерий. Скажу не очевидную вещь. Ваш расчёт даёт средние по больнице параметры. Это я про 120 секунд - найденное Вами постоянная времени системы. В Вашем случае у ПИД должно быть два канала управления, потому что постоянные времени реакции системы существенно различаются для подъёма и спада температуры. И коэффициенты будут разные, но при усреднении давать то, что рассчитали Вы. И подводя итог, если действительно нужно держать температуру, то надо уходить от зерокросс и вводить два канала ПИД. Иначе от выбросов не избавиться.
Всё сделал, но температура как вкопанная стоит на 3.5 градуса выше.
Это очень близко к зоне нечувстсвительности пропорционального канала. Выведите в сериал значение ПИД. Если оно равно нулю при этом. Значит оно. Вообще при настройке ПИД на каждом шаге выводить значение каждого канала и текущую ошибку, что бы видеть, как каналы реагируют на величину ошибки. Очень полезно для внутреннего понимания. Через какое то время, когда наберётся собственный экспириенс , по данным каналов настройка ПИД будет занимать очень короткое время.
Это очень близко к зоне нечувстсвительности пропорционального канала. Выведите в сериал значение ПИД. Если оно равно нулю при этом. Значит оно. Вообще при настройке ПИД на каждом шаге выводить значение каждого канала и текущую ошибку, что бы видеть, как каналы реагируют на величину ошибки. Очень полезно для внутреннего понимания. Через какое то время, когда наберётся собственный экспириенс , по данным каналов настройка ПИД будет занимать очень короткое время.
Попробую. Не претендую на истину, но мне кажется, что "перелёт" может быть следствием высокого коэффициента Ki.
Вот и посмотрите, как ведёт себя Кi. Он вообще должен работать в отрицательную сторону к ошибке и при уменьшении ошибки обнуляться. Его сущность такая. Я чаще всего использую ПИ регулятор. Д канал с очень маленьким коэффициентом, чтобы реагировать на очень большие скачки ошибки.
Вот и посмотрите, как ведёт себя Кi. Он вообще должен работать в отрицательную сторону к ошибке и при уменьшении ошибки обнуляться. Его сущность такая. Я чаще всего использую ПИ регулятор. Д канал с очень маленьким коэффициентом, чтобы реагировать на очень большие скачки ошибки.
Не знаю, как правильнее написать, но вывел в порт значения так
во время разогрева значения сильно меняются, при достижении целевого, например, так
Что это может мне дать, понятия не имею. Хотя... понаблюдал и подумал, что надо P-коэффициент увеличить хотя бы с 1.2 до 2.0. Пробую - и при целевом 90С вижу на экране значения от 90.4 до 92. В правильном ли направлении иду, пока неясно: значение температуры снизилось, но колебания возросли.
Как минимум интеграл надо вывести из кострайн. Иначе он не будет давать отрицательных значений и соответственно не будет подтягивать к уставке при переборе. Или заменить в кострайн минаут на минус махаут. После этого температура должна встать на место.
Правильно ли то, что I-составляющая не может воздействовать в отрицательную сторону?
То есть, ошибка ограничена значениями 0 и 1, а значит, работает только "в плюс".
О том же самом подумал. Писал не видя ваш ответ. Спасибо, значит, мыслю в нужном направлении.
Это часто бывает, когда из просторов интернета непонятный код. В этом явная ошибка.
Дубль. Удалил.
Верно, код скопировал не вникая, и только когда вы написали про вывод в порт, наблюдая за изменением значений, понял что куда. Спасибо за это.
Собственно, i-составляющую надо ограничивать значениями -1...+1, она вкупе с коэффициентом 0.006 за пару сотен проходов может достичь даже крайних значений, что вносит коррективы в итоговый сигнал.
Подбор по формуле неплох, по крайней мере показывает примерные значения, от которых уже можно "плясать".
Тему можно закрывать.
Для тех, кто захочет регулировать с помощью PID температуру котла:
При такой высокой удельной мощности можно намерять что угодно. Вы уверены что температура по объему не гуляет несколько градусов.
Частота вызова регулятора играет роль, помоему секунда это много на такой мощности, надо чаще.
При такой высокой удельной мощности можно намерять что угодно. Вы уверены что температура по объему не гуляет несколько градусов.
Ещё как гуляет! Но, во-первых, вода циркулирует (теплая поднимается вверх, холодная - вниз), а замер происходит всегда в одной точке. И условия не меняются, поэтому и решил использовать PID.
По другому опыту: ведётся замера температуры корпуса бойлера, но там готовое устройство с AliExpress с автоподбором коэффициентов (XMT7100). Всё успешно работает.
Добавлю. У меня всё получилось, правда, "железобетонное устаканивание температуры" происходит только через полчаса, до этого температура гуляет на +1/-1С
Частота вызова регулятора играет роль, помоему секунда это много на такой мощности, надо чаще.
Возможно.
Частота вызова регулятора играет роль, помоему секунда это много на такой мощности, надо чаще.
Частота вызова регулятора играет роль, помоему секунда это много на такой мощности, надо чаще.
Щас глянул первое сообщение, действительно не обратил внимание, но извольте откуда 120? (видимо имеется ввиду период колебаний при К=1). Короче дальше первого поста осилил прочитать , действительно так и получается, но для такого объёма, странно как то...
Внесу свою поправку. Получаемые данные не писал в тему, думал, никто и не обратит внимание, а потом забыл. При K=1 период колебаний был около 7 минут (точное значение не помню, за это время было много данных, в памяти всё не держал), из чего следует вывод, что время опроса может быть хоть 5 хоть 10 секунд, ki должен быть очень мал (0.001 - 0.1), kp в пределах пяти, а вот kD - очень большим (у меня в итоге 30).
Короче, система стабилизировалась, всё работает.
Выше то по другому написано ж было. Ну а если так, то с таким временем конечно...
Так если температура гуляет( как по времени, так и по месту)- какую принимаете за истину?
еще и инерционность датчика температуры имеет место быть.
Так если температура гуляет( как по времени, так и по месту)- какую принимаете за истину?
еще и инерционность датчика температуры имеет место быть.
За истину принимаю ту, что показывает датчик. Его положение и инерционность неизменны, а система умеет "предсказывать" температуру в будущем.
Так если температура гуляет( как по времени, так и по месту)- какую принимаете за истину?
еще и инерционность датчика температуры имеет место быть.
За истину принимаю ту, что показывает датчик. Его положение и инерционность неизменны, а система умеет "предсказывать" температуру в будущем.
допустим по времени попали, а по месту- тоже постоянно? Может выбросы из-за этого? Тогда никакой пид не поможет.
Так если температура гуляет( как по времени, так и по месту)- какую принимаете за истину?
еще и инерционность датчика температуры имеет место быть.
За истину принимаю ту, что показывает датчик. Его положение и инерционность неизменны, а система умеет "предсказывать" температуру в будущем.
допустим по времени попали, а по месту- тоже постоянно? Может выбросы из-за этого? Тогда никакой пид не поможет.
Конструкция бойлера такая, что в трубке, где установлен датчик, постоянно циркулирует вода за счёт конвекции. (Хотя, думаю, в любом бойлере вода точно так же будет циркулировать).
Очень грубо смоделирую ситуацию: если температура упадёт на полградуса, PID включит ТЭН на 3 секунды, вода вокруг ТЭНа на некоторое время поднимется на 2 градуса, а за следующие 10 секунд эта же вода смешается с остывшей и общий объём воды вернётся к целевой температуре. Вот так и происходит поддержание заданной температуры. На практике это работает.
А как это стыкуется с моментами замера температуры: можете замерить в момент включения ТЭНа, а можете через 10 секунд. Это просто пример, что не все так просто. А еще и инерционность датчика накладывается. Понятно что работает. Вопрос только к точности поддержания температуры. Насколько адекватно требование такой точности.
можете замерить в момент включения ТЭНа, а можете через 10 секунд.
Замер происходит раз в секунду.