Снова про настройку PID

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Здравствуйте. 400 мл воды в герметичной ёмкости из нержавейки подогреваются 1.5 КВт ТЭНом и поддерживается температура 95С. Написал я это, чтоб было понятно, что вслепую "крутить" параметры не получится - слишком длинный период колебания.

Пытаюсь подобрать по следующему принципу:

Ставлю коэффициенты P,I,D в ноль и увеличиваю значение коэффициента пропорциональной составляющей, пока не увижу незатухающие колебания. Получаю их при P=2 (далее - Ku=2) и периоде в Tu=300 сек. (забегая дальше, и при более низких значениях тоже получаются незатухающие колебания)

Используя формулы Kp = 0.6 * Ku,  Ki = 2 * Kp / Tu, Kd = Kp * Tu / 8

получаю значения 1.2 - 0.0072 - 49.5. Также система неплохо работает при 0.5 - 0.006 - 12 и при 0.5 - 0.0032 - 12, однако, температура бегает от 94 до 96, что неприемлимо в моём случае. Уже устал подбирать коэффициенты. Может, посоветуете, что ещё сделать, чтобы убрать колебания +- градус.

P.S. Все полученные значения - это сверхнизкий коэффициент Ki и низкий (0.5 - 1.2) Ki.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Поскольку у меня довольно большой объём, время можно установить в 1 секунду и спокойно отслеживать все значения регулятора. Что я и сделал.

Вижу, что при приближении к целевому значению пропорциональная составляющая стремится к нулю (логично), интегральная также по прошествии некоторого времени стремится к нулю, а вот дифференциальная сильно скачет. Тут либо снижать коэффициент Kd, либо увеличивать Kp. Пока попробовал первое.

nik182
Offline
Зарегистрирован: 04.05.2015

А в скольки точках измеряется температура воды и как усредняется? По высоте бака или по ширине? Есть ли устройство перемешивания воды? Смотрели ли тепловизором на поверхность воды, что бы увидеть неравномерность прогрева? Иначе требование 95 градусов выглядит просто смешно. Такой объём таким теном равномерно прогреть невозможно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

andreykrasnodar пишет:

Здравствуйте. 400 л воды в герметичной ёмкости из нержавейки подогреваются 1.5 КВт ТЭНом и поддерживается температура 95С.

...

...убрать колебания +- градус.

Это абсолютно бессмысленно.

Какой смысл "убирать колебания", когда их величина заведомо меньше погрешности измерения (включая как погрешность датчика, так и неравномерность температуры в объеме)?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:
А в скольки точках измеряется температура воды и как усредняется? По высоте бака или по ширине? Есть ли устройство перемешивания воды? Смотрели ли тепловизором на поверхность воды, что бы увидеть неравномерность прогрева? Иначе требование 95 градусов выглядит просто смешно. Такой объём таким теном равномерно прогреть невозможно.

Спасибо, что откликнулись.

Нет ничего невозможного - люди в космос летают, а тут всего лишь поддержание заданной температуры. Практика показывает, что это возможно - на другом бойлере стоит XMT7100, имеющий кнопку "авторюна" - температуру держит "жёстко" и адекватно реагирует на возмущения. Плюс с ТЭНом на 1 квт и бойлером в 300 мл. настроить почти получилось - колебания стали +-0.5С.

Измерения в трех случаях проводятся в одной точке - сверху. Собственно, поддерживать заданную температуру и нужно в этой точке. Отклик на воздействие проявляется примерно через 20 секунд. Перемешивание воды происходит за счёт конвекции. Неравномерность прогрева замерял, но не тепловизором: снизу вода заметно холоднее, но это сейчас не столь важно, т.к. интересует только вода в верхней точке, от неё и "пляшем".

Наблюдал за воздействием. Возникло субъективное ощущение, что пропроциональная составляющая недостаточна, а интегральную лучше вообще отключить - при нагреве копится ошибка, которая "толкает" температуру дальше за счёт чего наблюдается сильный перебег, а стабилизация температуры происходит очень поздно.

Также есть ощущение, что надо уменьшить время итерации.

nik182
Offline
Зарегистрирован: 04.05.2015

Поставь второй датчик на поверхности, но максимально удаленный от первого. Будешь очень удивлён результатом.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Практика показывает, что без внешних возмущений реально добиться колебаний +-0.2С. Просто нужно подводить тепла ровно столько же, сколько бойлер теряет в атмосферу (грубо говоря, раз в 15 секунд включать ТЭН на секунду), а то, как я буду распоряжаться этой водой, это уже другой вопрос.

Пока просто решил отказаться от интегральной составляющей. Всем спасибо за советы, буду подбирать коэффициенты дальше.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

andreykrasnodar пишет:

Плюс с ТЭНом на 1 квт и бойлером в 300 мл. настроить почти получилось - колебания стали +-0.5С.

Не то, чтобы это так важно, но просто интересно - бойлер на 300 миллилитров воды?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

v258 пишет:

andreykrasnodar пишет:

Плюс с ТЭНом на 1 квт и бойлером в 300 мл. настроить почти получилось - колебания стали +-0.5С.

Не то, чтобы это так важно, но просто интересно - бойлер на 300 миллилитров воды?

Да. Бойлер делал сам из пищевой нержавейки.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Кружка воды и киловатный тэн... Ну, надо - так надо ))

nik182
Offline
Зарегистрирован: 04.05.2015

А в первом сообщении 400 литров?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Дык, в моем понимании бойлер - это нечто более емкое. Думал, уж не опечатка ли, вот после второй и уточнил ))

SLKH
Offline
Зарегистрирован: 17.08.2015

andreykrasnodar пишет:

Наблюдал за воздействием. Возникло субъективное ощущение, что пропроциональная составляющая недостаточна, а интегральную лучше вообще отключить - при нагреве копится ошибка, которая "толкает" температуру дальше за счёт чего наблюдается сильный перебег, а стабилизация температуры происходит очень поздно.

Включай интегральную не с нуля, а в конце нагрева, когда она нужна для _поддержания_ температуры. 

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:
А в первом сообщении 400 литров?

Опечатка, которая меняет весь смысл. Действительно, 400 мл.

Araris
Offline
Зарегистрирован: 09.11.2012

andreykrasnodar пишет:

Опечатка, которая меняет весь смысл. Действительно, 400 мл.

Исправил.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Снизил время итерации до 0.1 сек, подобрал вручную новые параметры, теперь колебание в районе +-0.4С с редкими всплесками +-0.8. Что-то недокрутил. Но при 0.1 сек. настраивать проще.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну тогда совсем другой разговор. А так пропорциональная составляющая должна быть кратна постоянной времени системы. Здесь постоянные времени системы нагрева и охлаждения разные. Соответственно каналы регулирования на нагрев и охлаждение надо разделить или применять разные коэффициенты. Без интегральной составляющей не будет точного значения при плавном изменении разных параметров - типа напряжения питания и внешней температуры. Диф канал нужен только если предполагается резкое изменене - например долив холодной воды. В других случаях он не работает.
Постоянную времени нагрева легко прикинуть исходя из мощности нагревателя и теплоемкости воды. Постоянную охлаждения можно измерить по кривой температуры при охлаждении термостата. Получить при этом точные значения пропорционального коэффициента ПИД.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

У меня значения P, I, D получились 0.5, 0, 1.75 соответственно. Вводя I (даже 0.0001), всё портится. 

nik182
Offline
Зарегистрирован: 04.05.2015

Коэффициенты вещь абстрактно относительная. Они зависят от конкретной математической реализации ПИД. И от типа переменных, которые используются. Особенно интегральная сотавляющая, которая ещё требует шаг по времени, который может быть разным, соответственно и коэффициент по разному будет влиять на результат. Попробуй выводить промежуточные значения трех каналов на каждом шаге ПИД и посмотри как влияет разность между заданной и текущей температурой на отдельные каналы и результат ПИД в целом. При каких разностях результат обнуляется. Если расчёт в целых числах, то при коэффициенте 0.5 точнее чем +- 2 градуса получить регулирование не получится, потому что разность меньше 2 градусов помноженная на 0.5 даст 0 в целых числах. Ну так далее. А про D вообще забавно видеть 1.75 . Это какой шаг по времени надо иметь, чтобы получить разность температур больше 0.6 градуса, что бы этот канал выдал не нулевой результат?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:
Это какой шаг по времени надо иметь, чтобы получить разность температур больше 0.6 градуса, что бы этот канал выдал не нулевой результат?

0.1 сек. Да и с интегральной составляющей понятно: при времени итерации 0.1с он должен быть очень маленьким, при 1с - ещё меньше.

Подбирал исключительно вручную, глядя на влияние каждого коэффициента.

nik182
Offline
Зарегистрирован: 04.05.2015

Покажи как считается ПИД со всеми типами переменных. Как управляется ТЭН? Вкл-откл или ШИМ?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

вводные данные

#define PP 0.133
#define II 0
#define DD 1.75

раз в 0.1 сек. вызываю функцию

digitalWrite(tenpin, computePID(steinhart1, st1, PP, II, DD, 0.1));

то есть, да, вкл/выкл SSR-реле, находящееся на "цифровом" пине.

сама функция
// (вход, установка, kP, kI, kD, период в секундах)
int computePID(float input, float setpoint, float kp, float ki, float kd, float dt) {
  float err = setpoint - input;
  static float integral = 0, prevErr = 0;
  integral = constrain(integral + (float)err * dt * ki, -1, 1);
  float D = (err - prevErr) / dt;
  prevErr = err;  
  return constrain(err * kp + integral + D * kd, 0, 1);
} 

Умом понимаю, что результатом вычисления (err - prevErr) / dt скорей всего будет ерунда (слишком малый промежуток времени, за который теоретически разность двух значений датчика будет рэндомным значением и надо брать период хотя бы в секунду, с другой стороны, за секунду при нагреве температура увеличивается на градус-полтора), однако, вкупе с подобранным коэффициентом kD это работает.

nik182
Offline
Зарегистрирован: 04.05.2015

Что бы интегральный нормально заработал его надо обнулять если ошибка больше двух градусов. Диф канал здесь не нужен совсем. Нагрев где то 1 гдадус в секнду. Соответственно при опросе 0.1 сек и деление на 0.1 получим ту же единицу, которую множим на кд. Или просто в формулу ПИД добавляем постоянную при нагреве и ноль при охлаждении. Пропорциональный канал при коэффициенте 0.5 регулирует +- 2 градуса.
Не понятно при каком условии или при каком значении ПИД включается выключается нагрев. Выход либо 0 либо 1, если значение ПИД равно или больше единицы. Должно быть единица если больше нуля и ноль если значение ПИД ноль или меньше нуля.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:
Не понятно при каком условии или при каком значении ПИД включается выключается нагрев. Выход либо 0 либо 1, если значение ПИД равно или больше единицы. Должно быть единица если больше нуля и ноль если значение ПИД ноль или меньше нуля.

При единице включается, при значении ниже единицы выключается.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:
Нагрев где то 1 гдадус в секнду. Соответственно при опросе 0.1 сек и деление на 0.1 получим ту же единицу, которую множим на кд.

Вы не учли погрешность измерения. 1 градус за секунду можно довольно точно идентифицировать, а вот 0.1 градуса за 0.1 сек - задача довольно непростая. Да, в итоге при делении 0.1 на 0.1 я получу ту же единицу, но уже с очень большой погрешностью.

Спасибо за советы.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:
Что бы интегральный нормально заработал его надо обнулять если ошибка больше двух градусов.

Вот тут непонятно. А где-то про обнуление I-компоненты можно почитать?

nik182
Offline
Зарегистрирован: 04.05.2015

Что бы ПИД нормально работал его конечное значение должно быть ноль. При регулировании около точки уставки ПД каналы обнуляются работает только И канал. Он, по своей сути, интегрирует около нуля. Соответственно если регулирование установило точное значение то выход ПИД будет Ноль. Дальше задача проектировщика установить ворота, которые будут являться по сути величиной в пределах которой будет колебаться регулируемая величина. Эти ворота должны быть шире ошибки измерения. Включение выключение исполнительного механизма должно производиться при выходе за верхнюю - нижнюю кромки ворот. Как переобразовать выход за кромки вворот в сигнал исполнительного механизма - задача программиста. Ваш ПИД запрограммирован не правильно.
Про обнуление интегральной составлыющей попробуйте поискать со словом "со сбросом".

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:
Что бы ПИД нормально работал его конечное значение должно быть ноль.

Наверное, P и D должны быть нулевыми, нет?

При выходе температуры на заданное значение, P-составляющая точно будет равна нулю.

nik182
Offline
Зарегистрирован: 04.05.2015

Они множаться на ошибку и её приращение соответственно. Если вышли на уставку, то ошибка ноль. Соответственно и умножение на ноль даст ноль.
Сам расчёт ПИД нормальный. Последний constrain должен делать сигнал для нагревателя. Он делает сигнал, но результат смещён относительно выхода ПИД. Переключение происходит когда значение равно 1.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:
Переключение происходит когда значение равно 1.

Да. А когда должно происходить включение?

nik182
Offline
Зарегистрирован: 04.05.2015

Пока результат расчёта ПИД положительный нагреватель должен быть включен.
А в общем я не понимаю как в такой схеме можно отрегулировать. . Расчёт простой. Пока растёт температура значение И равно 1. Плюс помним о тепле запасённом в нагревателе, он же работает на полную мощность и после отключения ещё несколько секунд будет отдавать тепло. При этом И канал будет конкретно колбасить. Он очень бысро наберёт -1 . И регурирования по И каналу не будет. Будут метания от -1 до 1.
Писал раньше - коэффициенты на нагрев и охлаждение должны быть разные, соласованные с постоянными времени нагрева и охлаждения системы.
Отключать нагреватель для релейной схемы нужно раньше так, чтобы заброс температуры после выключения как раз подходил к уставке. При ШИМ регулировании уменьшение значения ШИМ при подходе к уставке в конце концов приводит к тому что тепло нагревателя становится равным потерям и колебания температуры становятся существенно меньше чем в релейной схеме.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182, спасибо за ваши советы.

Вот так бывает, когда пишу программу сам, а одну функцию беру из интернета и, не разобравшись, использую. И функция, вроде, простейшая... ан нет. Интегральный канал не надо было ограничивать значениями -1 и 1 с двух сторон - пусть себе снижается или увеличивается хоть до -100.

Убрал constrain для integral

теперь ПИД-регулирование происходит на ура: интегральная часть растёт, температура "перепрыгивает" уставку, затем интегральная составляющая снижается, в итоге, после 3 колебаний вкупе с коэффициентом устаканивается на отметке -5 или -2 и колебания затухают, правда, происходит это минут через 15 после включения. Ну очень уж велик период колебаний в моей системе.

Пропорциональная составляющая в этом случае не вносит коррективы в управление, а работают только И и Д компоненты.

В итоге вся настройка ПИД (в моём случае) сводится к подбору И и Д компонент. Пропорциональная отвечает лишь за скорость набора (и велечину перелёта) заданной температуры.

Собственно, всё работает чуть ли не с любыми коэффициентами (в разумных пределах, разумеется). Остаётся только лишь подобрать такие коэффициенты, которые максимально быстро снизят колебания.

А вот тут вариант один - подстраивать и наблюдать.

Пока, к сожалению, перебег выше уставки аж 16...20 градусов. Причём не всегда виной всему пропорциональная составляющая - зачастую интегральная при нагреве сильно уходит вверх и далее тянет нагрев выше уставки. Без этого перебега не начнётся снижение интегральной составляющей, что необходимо для ПИД в моём случае.

Можно попробовать установить Kp ближе к нулю - 0.1, например, что даст торможение на раннем этапе.

Также пробовал обнулять Ki при включении и "включать" Kp только при подходе к уставке. Это дало некоторые плоды.

Прошу прощения, что долго вас мучал своими вопросами. Не надо копировать функции из интернета.

nik182
Offline
Зарегистрирован: 04.05.2015

И канал не надо отпускать на волю. Он должен работать только вблизи точки уставки. Поэтому делают разные дополнения типа сброса или ограничения, как было в программе. Вот только диапазон регулирования И канала должен перекрывать зону нечувствительности других каналов. Если Кп 0.5 то зона нечувствительности П канала 2 градуса. Значит ограниченияя И канала должны быть шире - минимум 2.1 , а в программе было 1. В случае релейного регулирования Д канал не нужен совсем! Скорость нарастания температуры константа. Приращение тоже константа, потому ничем не отличается от П канала. В этих условиях нужно рассмотреть вариант программы с отказом от ПИД регулирования в дали от точки уставки. Т.к. мощность нагревателя и объём воды известны, то по разности температур текущей и уставки можно точно рассчитывать время включения нагревателя для достижения необходимой температуры и только потом переходить к ПИД для удержания. В этом случае первого заброса не будет и выход на стационар будет существенно быстрее.

WADDAW
Offline
Зарегистрирован: 13.04.2019

Здравствуйте всем!

Могу предложить свой вариант регулятора ( типа ПИД) отличающийся от стандартного типа. Сам его разработал и использую. Работает вроде неплохо. Несильно критичен к внешним воздействиям и условиям регулирования. Для вашего варианта регулирования должен подойти. Попробуте его и поделитесь качеством его регулирования. 

Выходная мощность Р.вых будет рассчитываться через каждый интервал времени интегрироования, в нашем случае это 10 сек. или любое другое. Она будет равна приращению пропорциональной составляющей – П и вычитанию интегральной составляющей – И. 

Полная формула расчета будет выглядеть следующим образом: 

Р.вых = Р.вых + (Т.зад-Т.реал)*П.коэф – (Т.нач.изм. - Т.кон.изм.)*И.коэф

При превышении выходной мощности Р.вых установленного максимального значения, оно приравнивается максимальному значению (при Р.вых > 100 тогда Р.вых = 100). При уменьшении выходной мощности Р.вых меньше минимального значения, оно приравнивается минимальному значению (при Р.вых < 0 тогда Р.вых = 0). Таким образом ограничивается минимальная и максимальная мощность.

Предварительные испытания с различными мощностями нагрева и разными объёмами нагреваемого тела, показали, что регулятор настраивается один раз. Коэффициенты были взяты следующим образом П.коэф –  0,21  И.коэф – 2,9 . Коэффициенты были выбраны таким образом, чтобы обеспечить приемлемую скорость нарастания при относительно большой разнице между реальной и заданной температурой, а также примерно одинаковую компенсацию параметров «П» и «И» в диапазоне примерно равных значений между реальной и заданной температурой.   

 Был применен следующий метод дискретным регулированием нагрева. Общий интервал сигнала был выбран равным 10 сек. Общий интервал сигнала был приравнен к времени интегрирования, так, как за это время были произведены замеры по изменению температуры. Общий интервал делился на количество сегментов равное количественно выходу регулятора. По таймеру имеющему длительность времени равную одному сегменту происходило суммирование этих интервалов. В начале общего интервала интегрирования выход включался на нагрев. При равенстве количества сегментов и значения выхода регулятора происходит отключение нагрева. Так например при выходе регулятора 30% , нагреватель сначала будет включенным 30 временных сегментов, а 70 временных сегментов будет выключен. При повторном интервале интегрирования процесс повторится. Если на выходе регулятора будет 0%, то не успев включится, нагреватель будет включенным 0 временных сегментов, а 100 временных сегментов будет выключен. Если на выходе регулятора будет 100%, то включившись, нагреватель будет постоянно включенным 100 временных сегментов, а 0 временных сегментов будет выключен.

 

// Глобальные переменные
float PID_T = 0;                       // Интегрируемая составляющая по разнице температур
float PID_D = 0;                      // Интегрируемая составляющая по времени нарастания
float PID_Kt = 0.21;               // Коэффициент составляющей по времени нарастания
float PID_Kd = 2.9;                // Интегрируемая составляющая по разнице температур
unsigned long endmillis = 0;       // осчет милисек интегрированного времени
float PID_Out = 0;                  // Выход ПИД
int PID_Time = 10;                   // Время интегрирования заданное в секундах, меняется по усмотрению пользователя
float TempPID_1 = 0;            // Значение температуры в конце интегрирования
float TempPID_2 = 0;            // Значение температуры в начале интегрирования
float SetTempProdukt = 95;      // Уставка температуры
float TempReal = 0;             // реальная температура

void loop()   //*************************** общий цикл программы
{
    if (( millis() - endmillis) > (1000* PID_Time))
   {                                                                   // проверяем интервал интегрирования в секундах
     endmillis = millis();                                 // время начала интегрирования
    TempPID_2 = TempPID_1;    // Значение начальной температуры равно конечной предыдущей
     TempPID_1 = TempReal;     // Значение конечной температуры равно текущей конечной
     PID_Count();                                          // вызов функции по расщету ПИД
   }
   PID_Output();                                         //  вызов функции по выходу регулятора ПИД
}


void PID_Output() //************************************* выход пид
{
     int PID_Long_Time = 0;
     
     // так как PID_Out в максимуме =100 то умножаем его на 10 , чтоб довести до 1000 мСек. 
     // и умножаем на время интегрирования в секундах 

      PID_Long_Time = PID_Out * 10 * PID_Time;  // получаем время работы выхода в мСек.
     
      //  на вход реле надо подавать сигнал HIGH, чтобы его выключить и LOW, чтобы включить
      //  если с начала интегрирования прошло времени меньше работы выхода в мСек. 
      //  то не включаем выход 

       if (PID_Long_Time < (millis()- endmillis) ) { digitalWrite(OutPower, HIGH); }

      //  если с начала интегрирования прошло времени больше работы выхода в мСек. 
      //  то включаем выход 

       if (PID_Long_Time > (millis()- endmillis) ) { digitalWrite(OutPower, LOW); } 

 }  //************************************* выход пид


void PID_Count() //************************************* расчет пид
{
 PID_T = (SetTempProdukt  - TempPID_1) * PID_Kt; // расчет пропорциональной составляющей
  
 PID_D = (TempPID_1 - TempPID_2) * PID_Kd;          // расчет интегральной составляющей
 PID_Out = PID_Out + PID_T - PID_D ;     // расчет выхода регулятора
 
 if (PID_Out  > 100) { PID_Out  = 100; }   // ограничение ПИД по максимальному значению
 if (PID_Out  < 0) { PID_Out  = 0; }            // ограничение ПИД по минимальному значению
 
} //************************************* расчет пид

Будет интересно, если вы протестируете этот алгоритм.

 

nik182
Offline
Зарегистрирован: 04.05.2015

А может сначала какой нибудь вузовский учебник почитать типа основы автоматического регулирования?

rkit
Offline
Зарегистрирован: 23.11.2016

WADDAW пишет:

 (Т.нач.изм. - Т.кон.изм.)*И.коэф

шиза какая

WADDAW
Offline
Зарегистрирован: 13.04.2019

Шиза не шиза, а работает. И по моему опыту лучше чем класический ПИД. И коэфиценты подбирать легче. Вообще я их один раз подбирал. Класический ПИД тоже пробобовал ставить на регулятор. Подбирать сложнее, практически методом тыка. Да и когда условия хоть чуть меняются... Начинает плохо регулировать, опять надо подгонять коэффиценты. Нестабилный этот класический ПИД. много костылей надо...

WADDAW
Offline
Зарегистрирован: 13.04.2019

nik182 пишет:
А может сначала какой нибудь вузовский учебник почитать типа основы автоматического регулирования?

Эти учебники небоги составляли, а людям свойственно заблуждаться. 

Что плохого, если я смотрю на эту проблему сдругой стороны?

nik182
Offline
Зарегистрирован: 04.05.2015

Это не смотрения на проблему с другой стороны. Все вопросы регуляторов изучение подробно. PID это общий вид. Как любое универскльное средство под конкретное приложение настраивается трудно. Искусство инженерного проектирования регуляторов как раз и заключается в правильном начальном выборе необходимых каналов регулирования и коэффициентов, соответствующих параметрам системы. В любом случае так спроектированные регуляторы являются частными случаями под конкретную задачу. И даже если они работают хорошо в частном случае совершенно не значит что это униаерсальное новое средство. И что они будут работать хорошо на других системах.
Предлагая новый алгоритм регулирования надо как минимум объяснить чем он он отличается от стандартного. Да и реализация выполнена без понимания физики процессов. Например выбор времени дискретизации должен быть связан с постоянной времени системы. Можете объяснить с чем связан выбор 10 сек? Интегральная составляющая должна где то накапливаться. Может быть не увидел где?

b707
Offline
Зарегистрирован: 26.05.2017

даже судя по выбранным именам переменных

 PID_D = (TempPID_1 - TempPID_2) * PID_Kd;          // расчет интегральной составляющей

автор путает дифференциалы и интегралы или, что более вероятно, просто списал код где-то в инете

WADDAW
Offline
Зарегистрирован: 13.04.2019

Уважаемый nik182, 10 сек. были выбраны просто из соображения, что за более короткое время, мой процесс (нагрева) просто неуспевал сколь значительно меняться. Время контроля можно менять произвольно, на лету. Просто это-же логично, что проверяя, за какое время что поменяется, то регулировать за это-же время.  Регулятор придумывал сам, исходя из логики - как бы я сам регулировал и перевел в формулы. Код предоставил, чтоб было понятно что делает регулятор. Способ регулирования дискретным сигналом аналоговую величину тоже придумал сам, хотя вроде похожее регулирование слышал, что кто-то уже применял. 

Чем предложенный способ регулирования (ПИД) лучше или хуже классического, сказать немогу. Поэтому и предлагаю автору ветки попробовать и может дать свое мнение. Так как с классическим регулятором он уже наигрался и вроде даже подобрал режимы. Что ему стоит просто добавить в свой код дополнительный регулятор и выбор регулирования то по 1, то по 2.  Я кстати так пробовал и  по качеству регулирования больших различий невидел. Но все таки  оставил регулирование на своем регуляторе. Так как во первых долго и муторно подбирать коэффиценты, а при изменении внешних воздействий и изменении начальных условий ( обьем, масса, теплопотери, подводимая мощность) класический ПИД сразу пасует.

WADDAW
Offline
Зарегистрирован: 13.04.2019

А что мешает просто попробовать? 

nik182
Offline
Зарегистрирован: 04.05.2015

Ну наверно то, что курс автоматического регулирования в институте был и мы делали лабы и  сдавали экзамены. Кроме того по жизни пришлось не однократно проектировать и настраивать ПИД для самых разных применений и я вполне представляю, что должно получиться в конце концов. Судя по тексту программы ни к ПИД ни к автоматическому регулированию она не имеет никакого отношения. Они именно делает как сказано - как бы я делал сам. Смысла тестировать нет, потому что воспроизвести Ваши условия эксперимента не возможно, на другом оборудовании будет работать кое как.  

b707
Offline
Зарегистрирован: 26.05.2017

WADDAW пишет:

Способ регулирования дискретным сигналом аналоговую величину тоже придумал сам

поздравляю, вы изобрели ШИМ :)

"О сколько нам открытий чудных..." ...особенно тем, кто сразу хватается что-то выдумывать. не читая книжек. Ну да, "книжки ведь писали не боги...", чего ж их читать, верно?

Так каким фактором является вторая переменная в вашей формуле - интегральным или дифференциальным?

b707
Offline
Зарегистрирован: 26.05.2017

WADDAW пишет:

что мешает просто попробовать? 

заглянул в архивы и обнаружил, что вы уже предлагали свой регулятор три года назад

http://arduino.ru/forum/obshchii/sobstvennyi-algoritm-raboty-pid-regulyatora

и вам уже тогда говорили ровно тоже самое, что и сейчас - что в предложенном нет ничего нового, что перепутан дифференциал с интегралом и что без знаний не стоит рассчитывать создать что-то сколь-нибудь полезное для других участников. Даже замечания уважаемого nik182 тогда и сейчас повторяются почти слово в слово :)

Судя по всему, никаких выводов вы не сделали и книжки читать и не думали. Даже поленились переписать комментарии в коде, чтобы параметр Kd назвать дифференциальным коэффициентом ... Или может вы реально не понимаете разницы между "И" и "Д" компонентами регулятора?

Стоит ли вторично тратить время на эту "шляпу"?

nik182
Offline
Зарегистрирован: 04.05.2015

b707 спасибо за напоминание. Забавно было почитать старые посты. Действительно за 3 года ничего не поменялось. 

WADDAW
Offline
Зарегистрирован: 13.04.2019

Уважаемый b707, такой способ регулирования мощности можно назвать ШИМ наверное с натяжкой, так как в классическом ШИМ частота дискретизации намного превышает период регулирования. Поэтому ШИМ наверное и не реализовывают на простых пускателях и реле. В моем случае такой способ регулирования был выбран именно для небыстрой аппаратной части. Но так, что-бы точность регулирования оставалас на неплохом уровне, соизмеримом с аналоговым управлением.

WADDAW
Offline
Зарегистрирован: 13.04.2019

Так же хочу заметить, что вместо конструктивных ответов и вопросов заданных форуму ранее, вы задрав нос послали меня лесом учить матчасть. Так, что спасибо, что я всё-таки разобрался с практической реализацией классического ПИД регулятора. Поэтому реализовал и сравнил работу обоих регуляторов, о чем и заметил выше.
Мне грустно, что нет помощи и конструктивного диалога. А я хотел услышать мнение компетентных форумчан не про реализацию кода и название переменных, а по поводу самой идеи. Вот и уважаемый nik182, пишет, что знает о регулировании ПИД все вдоль и поперек, так что, жалко чиркануть 2 строчки кода, практической реализации? В нете много информации реализации ПИД , но без опытного наставника в ней сложно разобраться... Поэтому, я сечас хотел помочь человеку в его проекте, правда со своим знанием и пониманием. Но не для того-ли сделанны эти форумы?

b707
Offline
Зарегистрирован: 26.05.2017

WADDAW пишет:
Сорри, повтор

по ШИМ - это называется "медленный ШИМ", почитайте. Писать, что вы его сами придумали - так же смешно, как утверждать что вы написали " я помню чудное мгновенье...".

А что до "имен переменных" - вы так и не поняли, что дело не в именах, а в том что вы путаете дифференциал и интеграл, что показывает вашу полную дремучесть в теории ПИД. Прежде чем изобретать новое - изучи старое.

И не надо теперь делать вид, что вы пришли за советом, а вас не поняли. Вы пришли хвастать своим гениальным алгоритмом, что отлично видно по теме трехлетней давности. Три года назад вам уже дали кучу советов, что не так с вашим кодом. Вы что-нибудь учли из замечаний той дискуссии? - нет!
Так какой смысл тратить на вас время, если вы не слушаете других?

nik182
Offline
Зарегистрирован: 04.05.2015

Что то я не понимаю. Я дал все начальные наводки. Надо оценить постоянную времени системы - время измерения параметров регулирования. Например для воды можно посчитать за сколько нагревается на 1 градус - известна теплоёмкость воды, объём воды и мощность нагревателя. Соответственно от этой цифры выбирать время оцифровки параметров и начальные значения постоянных ПИД. Об этом во всех книжках по ПИД написано и показано как выбирать параметры. Если нужно совсем хорошо сделать, то нужно оценить постоянную времени охлаждения, она обычно существенно больше. С помощью градусника и часов, при чём в нескольких точках температуры воды. Это нужно, что бы менять коэффициенты ПИД в зависимости от режима - нагрев или охлаждение. Для этих двух режимов коэффициенты разные! Дальше выбор необходимых каналов П И Д. Например, диф канал при условии отсутствия резких изменений температуры воды из за долива, или при релейном регулировании просто лишний, П И каналы вполне справляются. 

Это всё базовые вещи, которые описаны в книгах не богами написанных. Чем помочь человеку, который не имеет этих базовых знаний не понятно. Читать полный курс лекций на форуме не получится. Про саму идею я тоже писал. Нет её. Есть посконное применение импирических знаний, ни как не подкреплённых теорией и соответственно не имеющих широкого применения. У Вас работает - замечательно. Но себе я подобное брать не буду. Классическая реализация обычно работает стабильно. 

Что такое две строчки практической реализации вообще не понятно. Обычно ПИД пишется в 8 - 16 строк в зависимости от конкретных потребностей. И говорить можно о конкретной системе, о которой известно всё. Абстрактно можно взять ардуиновскую ПИД библиотеку. Ничего другого по абстрактным данным посоветовать трудно.