Принцип работы пид регулятора. Термоконтроллер с PID-регулированием в мирно-хозяйственных целях. Что такое ПИД регулятор

ПИД (от англ. P-proportional, I-integral, D-derivative) — регулятором называется устройство, применяемое в контурах управления, оснащенных звеном обратной связи. Данные регуляторы используют для формирования сигнала управления в автоматических системах, где необходимо достичь высоких требований к качеству и точности переходных процессов.

Управляющий сигнал ПИД-регулятора получается в результате сложения трех составляющих: первая пропорциональна величине сигнала рассогласования, вторая — интегралу сигнала рассогласования, третья — его производной. Если какой-то из этих трех компонентов не включен в процесс сложения, то регулятор будет уже не ПИД, а просто пропорциональным, пропорционально-дифференцирующим или пропорционально-интегрирующим.

Первый компонент — пропорциональный

Выходной сигнал дает пропорциональная составляющая. Сигнал этот приводит к противодействию текущему отклонению входной величины, подлежащей регулированию, от установленного значения. Чем больше отклонение — тем больше и сигнал. Когда на входе значение регулируемой величины равно заданному, то выходной сигнал становится равным нулю.

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

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

Больше коэффициент усиления между входом и выходом — меньше статическая ошибка, но если коэффициент усиления (по сути — коэффициент пропорциональности) будет слишком большим, то при условии наличия задержек в системе (а они зачастую неизбежны), в ней вскоре начнутся автоколебания, а если увеличить коэффициент еще больше — система попросту утратит устойчивость.

Или пример позиционирования двигателя с редуктором. При малом коэффициенте нужное положение рабочего органа достигается слишком медленно. Увеличить коэффициент — реакция получится более быстрая. Но если увеличивать коэффициент дальше, то двигатель «перелетит» правильную позицию, и система не перейдет быстро к требуемому положению, как хотелось бы ожидать. Если теперь увеличивать коэффициент пропорциональности дальше, то начнутся осцилляции около нужной точки — результат снова не будет достигнут...

Второй компонент - интегрирующий

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

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

Третий компонент — дифференцирующий

Темпу изменения отклонения величины, подлежащей регулированию, пропорциональна третья — дифференцирующая составляющая. Она необходима для того, чтобы противодействовать отклонениям (вызванным внешними воздействиями или задержками) от правильного положения, прогнозируемого в будущем.

Как вы уже поняли, ПИД-регуляторы применяют для поддержания заданного значения х0 некоторой одной величины, благодаря изменению значения u другой величины. Есть уставка или заданное значение х0, и есть разность или невязка (рассогласование) е = х0-х. Если система линейна и стационарна (практически это вряд ли возможно), то для задания u справедливы нижеследующие формулы:

В этой формуле вы видите коэффициенты пропорциональности для каждого из трех слагаемых.

Практически в ПИД-регуляторах используют для настройки другую формулу, где коэффициент усиления применен сразу ко всем компонентам:

Практическая сторона ПИД-регулирования

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

Реально работающие ПИД-регуляторы всегда имеют ограничение рабочего диапазона снизу и сверху, это принципиально объясняет их нелинейность. Настройка поэтому практически всегда и везде производится экспериментальным путем, когда объект управления подключен к системе управления.

Использование величины, формируемой программным алгоритмом управления, обладает рядом специфических нюансов. Если речь, например, о регулировке температуры, то часто требуется все же не одно, а сразу два устройства: первое управляет нагревом, второе — охлаждением. Первое подает разогретый теплоноситель, второе — хладагент. Три варианта практических решений может быть рассмотрено.

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

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

Андрей Повный

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

Наиболее часто использующимся методом настройки коэффициентов является метод Циглера-Никольса. Заключается он в следующем…

Метод Циглера-Никольса.

Собственно, на этом практическая часть метода заканчивается) Из полученного коэффициента рассчитываем пропорциональный коэффициент ПИД-регулятора:

А из него получаем и остальные:

Метод довольно прост, но применить его можно далеко не всегда. Если честно, мне еще ни разу не приходилось настраивать регулятор таким образом 😉 Но тем не менее, этот метод является основным и, по большому счету, единственным широко известным. Просто подходит не всем и не всегда.

Что же делать, если метод Циглера-Никольса не сработал? Тут придет на помощь “аналитический” метод настройки =)

Опять же обнуляем все коэффициенты и начинаем увеличивать пропорциональный. Но теперь не ждем появления колебаний, а просто фиксируем поведение системы для каждого значения коэффициента (отличным вариантом будет построение графика величины, которую необходимо стабилизировать, для каждого значения коэффициента). Если видим, что, например, система очень медленно выходит на нужное значение, увеличиваем пропорциональный коэффициент. Система начинает сильно колебаться относительно нужной величины? Значит, коэффициент слишком велик, уменьшаем и переходим к настройке других составляющих.

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

Вот некоторые правила, которые могут помочь при настройке:

  • Увеличение пропорционального коэффициента приводит к увеличению быстродействия, но снижение устойчивости системы
  • Увеличение дифференциальной составляющей также приводит к значительному увеличению быстродействия
  • Дифференциальная составляющая призвана устранить затухающие колебания, возникающие при использовании только пропорциональной составляющей
  • Интегральная составляющая должна устранять остаточное рассогласование системы при настроенных пропорциональной и дифференциальной составляющих

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

На этом на сегодня все, возможно, как-нибудь рассмотрим практическую реализацию ПИД-регулятора 😉

Нужно держать температуру на заданном неком уровне и менять задание. Есть микроконтроллер, к которому прицеплены измеритель температуры, и симистор для управления мощностью. Не будем греть голову на ТАУ, ни , просто возьмём и сделаем «в лоб» ПИД-регулятор.

II. Теоретическая вводная

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

Чтобы компенсировать «внешние» воздействия на реактор, в цепь добавляют интегральную составляющую. Всё рассогласование, которое было в системе, идёт на интегратор (соответственно, как только мы перегрели - сумма уменьшается, пока недогрето - сумма увеличивается). И накопленный интеграл, со своим коэффициентом, даёт свою прибавку-убавку к мощности. В результате такого подхода, при стационарном процессе, через некоторое время интеграл подбирает такой вклад в сумму с мощностью, который компенсирует потери окружающей среды, и колебания исчезают - интеграл становится стабильным, поэтому величина выдаваемой мощности становится постоянной. Причем так как при этом держится нужная температура, рассогласование отсутствует, пропорциональная составляющая не работает вообще.

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

Итак, с физическим смыслом разобрались, перейдём к основым вопросам реализации.

III. Кому пользоваться регулятором?

- Техникам.

Что из этого следует? Из этого следует, что техники понимают физическую составляющую, и имеют опыт настройки аппаратных пид регуляторов. А значит, программная реализация должна исходить из удобства настройки техниками - повторяя физическую модель. И это крайне важно! Очень часто в угоду упрощения кода коэффициенты меняют, например, на обратные - чтобы избавиться от деления. В результате, настройка превращается в ад и кошмар, и требуется опыт настройки данного конкретного регулятора, вместо понимания процесса. Отсюда получаем, что наши коэффициенты - постоянная интегрирования и постоянная дифференцирования - должны иметь размерность времени, то есть задаваться в секундах, а никак не в «1/с», как это любят делать.

IV. Область функционирования.

Мы пытаемся сделать универсальный регулятор, а значит, он должен работать как на мелких быстрых объектах, так и на мощных большущих печах. Значит, следует исходить из того, что регулируемая температура ограничена в общем-то измерителем. Наиболее часто используемые - ХА(K) и ХК(L). Их область применимости - где-то до 1200°C. Охлаждение требует более сложного оборудования (криостаты), управление доп.охлаждением (вентиляторы и открываемые дверки термошкафов) также требуется редко - значит, пока исключаем из рассмотрения. Получаем, что управляемая температура от ~15°C до ~1200°C, управляется только подача мощности.

Точность управления определяется во-1х точностью измерения: градуировочные таблицы даны через 0.1 градуса; линейность внутри таблиц в принципе достойная, поэтому точность ограничена в первую очередь усилителем и измерителем тока. В моём случае, хотелось добиться точности поддержания 0.1 градуса, поэтому измеритель настроен на 1/32 градуса: это даёт ~3 кванта на 0.1 градуса, таким образом, имея нормальный «шум» регулирования +-1 квант мы остаёмся в пределах всё тех же 0.1 градуса. Использование 1/32 позволяет работать с фиксированной точкой - 5 бит = дробная часть, остальное - целая. В 16 бит это получается представить от 0 до 2047 °. Вместо работы с отрицательными числами, мы будем работать в кельвинах вместо цельсиев, таким образом - представляется от 0 до 2047 °K, что эквивалентно от -273 до 1775 °C; с шагом в 0,03125 °.

V. Диапазон настраиваемости.

Для управления микрореактором с мощной силовой установкой может оказаться что для нагрева на 10 градусов достаточно 1% мощности, в то время как для большой инертной печи для того чтобы подогреть на градус едва-едва хватает 100% мощности подогрева. (В реальной жизни, это выглядит так - есть несколько подогревателей с ручным управлением - они включаются отдельным рубильником и производят начальный нагрев, в дальнейшем поддержание рабочей точки обеспечивает терморегулятор, управляя еще одним подогревателем, который на полной мощности выдаёт максимум +10°C к тому, что нагрели постоянно включенные). Исходя из этого, предельным коэффициентом пропорциональности логично предположить 100% мощности на 1 градус. Больше не имеет смысла, так как мы хотим получить управляемость в 0.1 градуса. Минимальный, для простоты, я взял инверсным - 1% мощности на 100 градусов.

Диапазоны временных коэффициентов вычисляются просто исходя из наших условий работы регулятора. Так как мы управляем через мощностью симистор путём вычисления задержки момента включения после прохождения через 0, предельная частота работы регулятора - 50Гц. Если мы уверены, что управляем мощностью которой пофиг плюс или минус, мы можем работать на 100Гц, но это не всегда так, и потому лучше каждый раз дозировать равное количество как положительной так и отрицательной полуволны. Для упрощения жизни, я снизил время работы до 25Гц, тем самым любое вычисленное воздействие будет действовать в течение 4 полуволн, и за это время у меня будет возможность рассчитать новое воздействие.

Таким образом, постоянные времени задаются через 1/25 сек, от 0 до ~2000 сек (2000*25 = 50000, как раз в 16бит влазит).

Ну и еще у нас есть ограничение мощности минимальное и максимальное, от 0 до 100%.

VI. Управление мощностью.

Начиная с этого момента все теоретические выкладки заканчиваются, начинается горькая практика, привязанная к конкретной реализации.

Итак, мы уже решили что управляем задержкой открывания симистора после прохождения через 0. Таким образом, задержка в 0 означает 100% мощность, бесконечная задержка = 0% мощности.

Вопрос: с какой точностью мы можем управлять мощностью? Вообще, с точностью отсчета времени нашего таймера. С другой стороны, какая нужна мощность? Мы вычисляем какой % мощности нужно подать на 0.04сек. В принципе, по опыту, управления мощностью даже с точностью в 1% на частоте в 0.1сек хватает для поддержания температуры в 1 градус. У нас управление 0.04сек (в 2.5раза быстрее). Поэтому было принято решение рассчитать таблицу мощности через 1/250 от максимума (с шагом в 0.4%). Это позволяет таблицу иметь не сильно большую (500 байт), и при этом иметь точность выше 1%. Если ваш случай требует бОльшей точности - пересчитать не так сложно.

Теперь поговорим о расчете этой самой таблицы. Во-1х следует учесть, что есть момент срабатывания сигнала прохождения через ноль. В моем случае - 12В. То есть когда входное напряжение упадёт ниже 12В, я получу сигнал прохождения через 0.

Это означает, что для 100% мощности время запуска = времени прохождения 12В.

Решим систему уравнений

; IntMoment:= 12V ; Max:= sqr(220*sqrt(2)) ; { Sqr(Sin(Pi/2)*K) = Max ; { Sqr(Sin(X)*K) = IntMoment ; ; 2*k/MaxCode = 1 - cos(T*Pi) ; cos(T*Pi) = 1-2*k/MaxCode ; T*Pi = arccos(1-2*k/MaxCode) ; T = arccos(1-2*k/MaxCode) / Pi

Процессор у меня работает на частоте 32786, PLL настроен на 384/2, полуволна имеет 100Гц, откуда получаем, что код для загрузки константы в таймер для времени T имеет вид:

65536-(T*(32768*384/2)/100.0 + 773)

Нам нужно рассчитать время задержки, дающее равномерное увеличение площади включенной части синусоиды. То есть нам нужно иметь отсчеты времени, дающие равномерное увеличение мощности. Полная мощность, которую мы выдаём - это интеграл по всей синусоиде. [кто знает, как на хабре формулы вставлять? никак? пишу в maple-нотации тогда].

Max = int(sqr(sin(x)), x=0..Pi) int(sqr(sin(x)), x=0..T*Pi) = x/2 - sin(2*x)/4 + C | 0..T*PI = (T*Pi)/2 - sin(2*T*Pi)/4 (T*Pi)/2 - sin(2*T*Pi)/4 = Q*Pi/2

Таким образом, нам нужно пройтись по всем Q с заданной точностью, и для каждой из них найти T.

Я для себя это решил вот таким тупым способом:

Генератор на перле

#!/usr/bin/perl # (T*Pi)/2 - sin(2*T*Pi)/4 = Q*Pi/2 use constant PI => 4 * atan2(1, 1); $T = 1; for($i = 250; $i >= 0; $i--) { $int = $i*PI/2/250; $ev = ($T*PI)/2-sin(2*$T*PI)/4; while(abs($ev-$int) > 0.0005) { $T -= 0.0001; $ev = ($T*PI)/2-sin(2*$T*PI)/4; } #print $i."\t".$T."\n"; $code = 65536-($T*(32768*384/2)/100.0 + 773); printf "DB 0%02Xh, 0%02Xh ; %04Xh = $i/250 of power\n", $code%256, int($code/256), $code, $i; }

Всё, на выходе мы получили табличку в 250 значений, соответствующих константам загрузки таймера до момента поджига после получения сигнала о прохождении через 0 (точнее, через 12В, как я говорил выше).

VII. Измерение входных данных

Я пропускаю этот вопрос, потому как он достоен отдельной большой статьи. О том, как я решал вопрос с термосопротивлением, можно найти в архиве почившего в бозе моего блога.

Главное что нам надо знать, это что мы измеряем данные с нужной нам частотой (в данном случае - 25Гц), и нужной точностью (на выходе - число от 0 до 2048 градусов кельвина через 1/32 градуса). Данные предполагаются уже нормализованные для всех дальнейших расчетов.

Если будет кому интересно - пишите в комментах, распишу в следующий раз как это делается для термопар.

VIII. Вычисление воздействия

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

Вспомним еще раз формулу ПИД регулятора:

U = K * (Err + (1/Ti)*Int + Td*dErr)

  • U - мощность, которую следует выдать;
  • K - пропорциональный коэффициент (обратите внимание - вынесен за скобки, почему - чуть ниже опишу);
  • Ti - постоянная времени интегрирования. Обратите внимание - в расчетах используется обратная величина;
  • Td - постоянная времени дифференцирования
  • Err - текущее рассогласование (разница между уставкой и измеренной температурой
  • dErr - производная рассогласования (разница между текущей и прошлой ошибкой)
  • Int - накопленный интеграл рассогласования (сумма всех Err"ов, кои мы видели)

Мы снова пришли к вопросу, который поднимался в разделе III : этим будут пользоваться техники. Поэтомоу крайне важно не допустить классической ошибки всех реализаций - «размерности коэффициентов как получится». Мы делаем прибор для управления физическим процессом, а значит, модель должна соответствовать.

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

  • U - имеет величину в % мощности. Еще точнее - в 2/5 от % мощности, так как у нас таблица идёт через 1/250 от 100%.
  • Err - рассогласование, задаётся в градусах. Точнее - через 1/32 градуса.
  • Int - интеграл, представляет собой сумму градусов во времени - а значит, имеет размерность градус*сек. Точнее - (1/32 градуса)*(1/25 сек)
  • Ti - задаётся через 1/25 сек
  • (1/Ti)*Int - после вычисления даёт вклад, имеющий размерность (1/32 градуса).
  • dErr - производная, имеет размерность градус/сек, а точнее (1/32 градуса)/(1/25 сек)
  • Td - задаётся через 1/25 сек
  • Td*dErr - после произведения приводит вклад к размерности (1/32 градуса)
  • (...) - итак, все слагаемые под скобками приведены к размерности (1/32 градуса)
  • K - согласует U и (...) , а значит имеет размерность процента-на-градус, точнее (2/5)%/(1/32 градуса)

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

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

Кроме одного - у нас есть величина Ti , а для расчета требуется 1/Ti . Операция деления большой разрядности - очень дорогая. Операция умножения в разы дешевле, поэтому воспользуемся отличной статьёй Division by Invariant Integers using Multiplication . У нас ведь K / Ti / Td меняются крайне редко, а потому мы можем себе позволить как угодно извращаться с ними после их изменения, главное чтобы основной цикл расчетов работал быстро.

Таким образом, вместо Ti для расчетов мы раскладываем в набор Ti_m , Ti_sh1 , Ti_sh2 ; и на каждом цикле производим вычисление:
T1 = MULUH(Ti_m, Int) Q = SHR(T1+SHR(Int-T1, Ti_sh1), Ti_sh2)

Теперь производим расчет баланса разрядности. Для этого распишем полную формулу пошагово:

  1. Eo = E ; Нам нужна прошла ошибка. Ошибки - по 16бит
  2. E = Y-X ; Вычисляем новое рассогласование. 16bit
  3. Int = Int + (E+Eo)/2 ; Интегрируем ошибку. При этом считаем полусумму разности (разностная схема). 32bit = 32bit + 16bit
  4. cI = Int * (1/Ti) ; Считаем интегральный вклад - 32bit * 32bit => 32bit
  5. cD = Td * (E-Eo) ; Считаем диф вклад - 16*16 => 32bit
  6. PID = E + cI + cD ; Подскобочное; 16+32+32 => 32bit
  7. U = K*PID/256 ; Коэфф; 32*16/8 bit => 40bit.

При всех расчетах положение точки вплоть до 7го шага остаётся на 5м справа месте. В последний момент происходит интересный финт ушами. K задаётся через 1/256, соответственно, после умножения точка сдвигается влево до 5+8=13 места, поэтому мы должны у результата отбросить младшие 8 бит. И самый нижний байт результата - нужная нам мощность через 2/5%. Это - еще одна причина, по которой мощность выровнена по шагам в 1/250 - это позволяет результат уложить в один байт и получить легко по таблице нужный результат.

Дальше, помним, что нас интересует мощность только от 0 до 250 - поэтому 7й шаг вычислений идёт очень просто, как только мы получаем отрицательное число - сразу складываем uMin. Как только выяснили что любой старший байт не ноль - сразу складываем uMax. И только если мощность складывается в диапазоне - производим проверку на меньше uMin или больше uMax.

Если вдруг кому интересно:

полная портянка расчетов

; PID управление CalcMainEnd: ; Вычисления, Go-Go. CalcPid: ; 1. Eo = E | 16bit Pid1: MOV Err0H, ErrH MOV Err0L, ErrL ; 2. E = Y-X | 16bit Pid2: CLR C MOV A, SettingL SUBB A, ThermoL MOV ErrL, A MOV A, SettingH SUBB A, ThermoH MOV ErrH, A JNB OV, Pid2Ov JB ACC.7, Pid2Max Pid2Min: MOV ErrL, #LOW(-500*32) MOV ErrH, #HIGH(-500*32) SJMP Pid2End Pid2Max: MOV ErrL, #LOW(500*32) MOV ErrH, #HIGH(500*32) SJMP Pid2End Pid2Ov: JNB ACC.7, Pid2OvP Pid2OvN: ; Проверим на ограничение вниз CLR C MOV A, ErrL SUBB A, #LOW(-500*32) MOV A, ErrH SUBB A, #HIGH(-500*32) JNC Pid2End ; Если > -500 => всё ок SJMP Pid2Min Pid2OvP: CLR C MOV A, ErrL SUBB A, #LOW(500*32) MOV A, ErrH SUBB A, #HIGH(500*32) JNC Pid2Max ; Если < 500 => всё ок Pid2End: ; 3. Int = Int + (E+Eo)/2 | 32bit+16bit Pid3: JNB PowerReady, Pid3End ; Если нет сети -- интегральную часть не копим MOV A, ErrL ADD A, Err0L MOV R0, A ; временно MOV A, ErrH ADDC A, Err0H MOV C, ACC.7 ; Полусумма всегда влезает в 16 бит, поэтому при сдвиге надо сохранить знак RRC A ; Поделим без потери знака XCH A, R0 ; A= младшая часть, R0 - старшая часть полусуммы RRC A ; Доделили JNB IntS, Pid3IntPos ; Int отрицательный, изменим знак для R0:A, тем самым можно будет просто сложить с Int CLR C CPL A ADD A, #1 XCH A, R0 CPL A ADDC A, #0 XCH A, R0 Pid3IntPos: ; У Int и R0:A сейчас согласованы знаки, поэтому складываем обычным образом ADD A, IntLL MOV IntLL, A MOV A, IntLH ADDC A, R0 MOV IntLH, A MOV A, R0 JB ACC.7, Pid3Neg ; Прибавляли отрицательную разность? ; Если разность положительная, просто распространим перенос JNC jPid3End ; Если прибавили слово и переноса небыло -- делать нам ничего не требуется. INC IntHL ; Распространяем перенос выше MOV A, IntHL JNZ Pid3End ; Если перенос не ушел в 4й байт -- всё нормально INC IntHH ; Распространяем перенос на САМЫЙ старший байт MOV A, IntHH JNZ Pid3End ; Если перенос не ушел еще выше -- всё нормально MOV IntHH, #0FFh ; Если перенс был выше -- ограничиваем интеграл потолком MOV IntHL, #0FFh MOV IntLH, #0FFh MOV IntLL, #0FFh jPid3End: SJMP Pid3End Pid3Neg: ; Если разность отрицательная, то надо продолжать добавлять оба раза, но FFh MOV A, IntHL ADDC A, #0FFh MOV IntHL, A MOV A, IntHH ADDC A, #0FFh MOV IntHH, A JC Pid3End ; Если тут был перенос, значит знак интеграла не изменился CPL IntS ; Если переноса небыло, значит у интеграла изменился знак CPL C ; Обратим знак получившегося числа MOV A, #0 SUBB A, IntLL MOV IntLL, A MOV A, #0 SUBB A, IntLH MOV IntLH, A MOV A, #0 SUBB A, IntHL MOV IntHL, A MOV A, #0 SUBB A, IntHH MOV IntHH, A ; так как оно стало отрицательным -- то перенос тут будет всегда Pid3End: ; 5. cI = Int*(1/Ti) | 32*32=>32bit Pid5: ; R3:R2:R1:R0 = Int*(1/Ti) JB Ti_sh1, Pid5Calc ; если Ti_sh1=0, то 1/Ti=1 или Ti=0. и ничего делать не надо MOV A, Ti_mLL ORL A, Ti_mLH ORL A, Ti_mHL ORL A, Ti_mHH JZ Pid5Zero MOV R0, IntLL MOV R1, IntLH MOV R2, IntHL MOV R3, IntHH AJMP Pid5End Pid5Zero: MOV A, #0 MOV R0, A MOV R1, A MOV R2, A MOV R3, A MOV IntLL, A MOV IntLH, A MOV IntHL, A MOV IntHH, A AJMP Pid5End Pid5Calc: ; R7:R6:R5:R4[:R3] = MULUH(Int*Ti_m) // R3 считаем как часть для округления MOV R2, #0 ;; R7:R6 = IntHH*Ti_mHH MOV A, IntHH MOV B, Ti_mHH MUL AB MOV R7, B MOV R6, A ; R6:R5 += IntHL*Ti_mHH MOV A, IntHL MOV B, Ti_mHH MUL AB MOV R5, A MOV A, R6 ADD A, B MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R5:R4 += IntLH*Ti_mHH MOV A, IntLH MOV B, Ti_mHH MUL AB MOV R4, A MOV A, R5 ADD A, B MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntLL*Ti_mHH MOV A, IntLL MOV B, Ti_mHH MUL AB MOV R3, A MOV A, R4 ADD A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R6:R5 += IntHH*Ti_mHL MOV A, IntHH MOV B, Ti_mHL MUL AB ADD A, R5 MOV R5, A MOV A, R6 ADDC A, B MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R5:R4 += IntHL*Ti_mHL MOV A, IntHL MOV B, Ti_mHL MUL AB ADD A, R4 MOV R4, A MOV A, R5 ADDC A, B MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntLH*Ti_mHL MOV A, IntLH MOV B, Ti_mHL MUL AB MOV A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R5:R4 += IntHH*Ti_mLH MOV A, IntHH MOV B, Ti_mLH MUL AB ADD A, R4 MOV R4, A MOV A, R5 ADDC A, B MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntHL*Ti_mLH MOV A, IntHL MOV B, Ti_mLH MUL AB ADD A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R4:R3 += IntHH*Ti_mLL MOV A, IntHH MOV B, Ti_mLL MUL AB ADD A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;;; Если R3 > 7F -- MOV A, R3 JNB ACC.7, Pid5Shift ; Если R3<80 -- округление не надо ANL A, #7Fh JZ Pid5Round ; Если = 80 -- округляем до нечетного MOV A, #1 ADD A, R4 MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A SJMP Pid5Shift Pid5Round: MOV A, R4 ORL A, #01h MOV R4, A ;JMP Pid5Shift Pid5Shift: ; R3:R2:R1:R0 = (Int-R7:R6:R5:R4) >> 1 CLR C MOV A, IntLL SUBB A, R4 MOV R0, A MOV A, IntLH SUBB A, R5 MOV R1, A MOV A, IntHL SUBB A, R6 MOV R2, A MOV A, IntHH SUBB A, R7 RRC A ; >>1 без потери переноса MOV R3, A MOV A, R2 RRC A MOV R2, A MOV A, R1 RRC A MOV R1, A MOV A, R0 RRC A ;MOV R0, A ; R3:R2:R1:R0 += R7:R6:R5:R4 ;MOV A, R0 ADD A, R4 MOV R0, A MOV A, R1 ADDC A, R5 MOV R1, A MOV A, R2 ADDC A, R6 MOV R2, A MOV A, R3 ADDC A, R7 MOV R7, A ; Теперь сдвинуть вправо на sh2. ; sh2 может быть до 16 (так как у нас Ti 16разрядный; проверим необходимость сдвига на 16 бит) MOV A, Ti_sh2 JNB ACC.4, Pid5ShiftUnder16 ; Надо сдвинуть >=16 -- 2 байта сдвинем mov"ами MOV R0, 18h+2; R2, bank 3 MOV R1, 18h+3; R3, bank 3 MOV R2, #0 MOV R3, #0 Pid5ShiftUnder16: JNB ACC.3, Pid5ShiftUnder8 ; Надо сдвинуть на >=8 -- 1 байт сдвигаем mov"ами MOV R0, 18h+1; R1, bank 3 MOV R1, 18h+2; R2, bank 3 MOV R2, 18h+3; R3, bank 3 MOV R3, #0 Pid5ShiftUnder8: ANL A, #07h JZ Pid5End ; Если внутри байта двигать не надо -- всё MOV R4, A SJMP Pid5ShiftRight Pid5NextShift: CLR C ; К этому моменту C у нас еще возможнозначимый старший бит! Pid5ShiftRight: MOV A, R3 RRC A MOV R3, A MOV A, R2 RRC A MOV R2, A MOV A, R1 RRC A MOV R1, A MOV A, R0 RRC A MOV R0, A DJNZ R4, Pid5NextShift ; Всё, после всех сдвигов получили результат; Не забываем, что у вычисленного в R3:R2:R1:R0 ; сейчас число положительное, а знак его в IntS Pid5End: ; 4. PID += [ cD = Td * (E-Eo) ] | 16*16=>32bit Pid4: ; cD = R7:R6:R5:R4; ErrD = E-Eo CLR C MOV A, ErrL SUBB A, Err0L MOV DiffL, A MOV A, ErrH SUBB A, Err0H MOV DiffH, A MOV C, ACC.7 ; Берём знак результата MOV DiffS, C ; Сохраним знак E-Eo JNC Pid4Mul ; Diff -- орицательный, обратим знак MOV A, DiffL CPL A ADD A, #1 MOV DiffL, A MOV A, DiffH CPL A ADDC A, #0 MOV DiffH, A Pid4Mul: ; R7:R6 = DiffH*TdH ; MOV A, DiffH = в любом случае A=DiffH MOV B, TdH MUL AB MOV R6, A MOV R7, B ; R5:R4 = DiffL*TdL MOV A, DiffL MOV B, TdL MUL AB MOV R4, A MOV R5, B ; R6:R5 += DiffH*TdL MOV A, DiffH MOV B, TdL MUL AB ADD A, R5 MOV R5, A MOV A, R6 ADD A, B MOV R6, A MOV A, R7 ADDC A, #0 MOV R7, A ; R6:R5 += DiffL*TdH MOV A, DiffL MOV B, TdH MUL AB ADD A, R5 MOV R5, A MOV A, R6 ADD A, B MOV R6, A MOV A, R7 ADDC A, #0 MOV R7, A ; 6. PID = E + cI + cD | 32bit Pid6: ; R3:R2:R1:R0 равно cI, знак в IntS; ; R7:R6:R5:R4 = cD; знак в DiffS ; E в обратном дополнительном коде JB IntS, ChkDiffN JNB DiffS, Pid6Add ; Int>0, Diff>0 => Add SJMP Pid6Sub ; Int>0, Diff<0 => Sub ChkDiffN: JNB DiffS, Pid6Sub ; Int<0, Diff>0 => Sub ; Int<0, Diff<0 => Add Pid6Add: ; Одинаковый знак => складываем их с проверкой на переполнение MOV A, R0 ADD A, R4 MOV R0, A MOV A, R1 ADDC A, R5 MOV R1, A MOV A, R2 ADDC A, R6 MOV R2, A MOV A, R3 ADDC A, R7 MOV R3, A JNC Pid6Err ; Если нет переноса - в результате сложения переполнения небыло MOV R3, #0FFh MOV R2, #0FFh MOV R1, #0FFh MOV R0, #0FFh SJMP Pid6Err Pid6Sub: ; Знаки разные -- вычтем одно из другого и проверим знак результата CLR C MOV A, R4 SUBB A, R0 MOV R0, A MOV A, R5 SUBB A, R1 MOV R1, A MOV A, R6 SUBB A, R2 MOV R2, A MOV A, R7 SUBB A, R3 MOV R3, A JNC Pid6Err ; Если нет заимствования -- знак результата равен знаку DiffS CPL DiffS ; Если заимствование было, у DiffS и результата надо обратить знак MOV R6, #0 ; R6=0 MOV A, R0 CPL A ADDC A, R6 ; R6=0, C=1 => действие +1 MOV R0, A MOV A, R1 CPL A ADDC A, R6 ; +перенос MOV R1, A MOV A, R2 CPL A ADDC A, R6 MOV R2, A MOV A, R3 CPL A ADDC A, R6 MOV R3, A Pid6Err: MOV R6, #0 ; R6=0 ; В R3:R2:R1:R0 -- лежит cI+cD; знак суммы в DiffS ; надо прибавить/отнять Err, записанное в обратном коде; Приведём знак Err к DiffS MOV R4, ErrL MOV A, ErrH JB ACC.7, Pid6ChkDiffS JNB DiffS, Pid6SumErrNoInv ; Err>0, Diff>0 => NoInv SJMP Pid6SumErrInv Pid6ChkDiffS: JNB DiffS, Pid6SumErrNoInv ; Err<0, Diff>0 => NoInv Pid6SumErrInv: ; У Err знак отличается от DiffS -- инвертируем SETB C ; Не уверен в состоянии C MOV A, ErrL CPL A ADDC A, R6 ; A+=R6+C, R6=0 C=1 => A+=1 MOV R4, A ; R4=ErrL MOV A, ErrH CPL A ADDC A, R6 Pid6SumErrNoInv: MOV R5, A ; ErrH Pid6SumErr: ; Итак, в R5:R4 лежит Err, знак которого согласован с DiffS; но в обратно-дополнительном коде MOV A, R0 ADD A, R4 MOV R0, A MOV A, R5 CLR F0 JNB ACC.7, Pid6SubErrPos SETB F0 MOV R6, #0FFh ; Добавляем отрицательное => дополняем FFами Pid6SubErrPos: ADDC A, R1 MOV R1, A MOV A, R2 ADDC A, R6 ; +расширение MOV R2, A MOV A, R3 ADDC A, R6 ; +расширение MOV R3, A MOV R6, #0 ; Надо проверить нет ли смены знака итоговой суммы JNC Pid6ChkF0 JB F0, Pid7 ; Err<0, был перенос => Знак не сменился, переполнения нет SJMP Pid6SumOv ; Err>0, был перенос => переполнение Pid6ChkF0: JNB F0, Pid7 ; Err>0, небыло переноса => нет переполнения;SJMP Pid6SumUf ; Err<0, небыло переноса => сменился знак Pid6SumUf: ; Если Err<0 и небыло переноса => сменился знак CPL DiffS MOV A, R0 CPL A ADD A, #1 ; C=?, поэтому прибавляем 1 обычным методом MOV R0, A MOV A, R1 CPL A ADDC A, R6 MOV R1, A MOV A, R2 CPL A ADDC A, R6 MOV R2, A MOV A, R3 CPL A ADDC A, R6 MOV R3, A SJMP Pid7 ; Знак у результата и DiffS приведены в норму Pid6SumOv: ; Было переполнение => округляем до максимума MOV R0, #0FFh MOV R1, #0FFh MOV R2, #0FFh MOV R3, #0FFh ; 7. U = K*PID/256 | 32bit*16bit/8bit => 40bit, ; | которые усекаются до 10bit ; | при вычислениях Pid7: ; В R3:R2:R1:R0 лежит результат PID, в DiffS его знак; Нужно вычислить K*PID/256, ограничив результат до 10бит; K всегда положительно, поэтому если PID < 0 => минимум JB DiffS, Pid7Umin ; поскольку мы можем жестко ограничить сверху 16ю битами, ; то если R3 != 0 => ставим максимум в любом случае MOV A, R3 JNZ Pid7Umax ; = ; вычисляем, учитывая что должно получиться R7=0 R6=0, ; иначе переполнение, поэтому R7 и R6 вообще не трогаем; но проверяем результат; R7:R6 = R2*KH MOV A, R2 JZ Pid7S1 MOV A, KH JNZ Pid7Umax ; Если R2!=0 и KH!=0 => R7:R6>0 => переполнение Pid7S1: ; R6:R5 = R2*KL MOV A, R2 MOV B, KL MUL AB MOV R5, A MOV A, B JNZ Pid7Umax ; Если R6 > 0 => переполнение; R6:R5 = R1*KH MOV A, R1 MOV B, KH MUL AB ADD A, R5 JC Pid7Umax ; Если R6 > 0 => переполнение MOV R5, A MOV A, B JNZ Pid7Umax ; Если R6 > 0 => переполнение; R5:R4 = R0*KH MOV A, R0 MOV B, KH MUL AB MOV R4, A MOV A, R5 ADD A, B JC Pid7Umax ; Если R6 > 0 => переполнение MOV R5, A ; R5:R4 = R1*KL MOV A, R1 MOV B, KL MUL AB ADD A, R4 MOV R4, A MOV A, R5 ADDC A, B JC Pid7Umax ; Если R6 > 0 => переполнение MOV R5, A ; R4:R3 = R0*KL MOV A, R0 MOV B, KL MUL AB RLC A ; C = R3>=0x80, Z=R3>0x80 MOV R3, #0FFh ; R3<>0x80 => ничего JNZ Pid7S2 MOV R3, #0FEh ; R3==0x80 => округление до четного Pid7S2: MOV A, R4 ADDC A, B ; Складываем умножение, регистр, и перенос-округление ANL A, R3 ; А так же если округление до четного -- отбрасываем после младший бит MOV R4, A MOV A, R5 ADDC A, R6 ; R6=0 у нас с давних пор, хоть мы туда и не складывали ничего во время перемножения JC Pid7Umax ; Если R6 > 0 => переполнение MOV R5, A ; R5:R4 => ограниченный в 16 бит результат; Теперь надо ограничить R5:R4 до Umax/Umin MOV A, UmaxL SUBB A, R4 ; C=0 на текущий момент MOV A, UmaxH SUBB A, R5 JC Pid7Umax ; Если R5:R4>Umax => R5:R4 = Umax MOV A, UminL SUBB A, R4 ; C=0 на текущий момент MOV A, UminH SUBB A, R5 JNC Pid7Umin ; Если R5:R4 R5:R4 = Umin ; Мощность вычислена MOV UH, R5 MOV UL, R4 SETB UReady AJMP CalcExit Pid7Umax: ; Установить максимальную мощность MOV UH, UmaxH MOV UL, UmaxL SETB UReady AJMP CalcExit Pid7Umin: ; Установить минимальную мощность MOV UH, UminH MOV UL, UminL SETB UReady AJMP CalcExit

IX. Применение воздействия.

Итак, у нас есть рассчитанное воздействие, и наша задача - применить его. Для этого работает общий цикл работы с частотой 50Гц. На четном цикле - производится измерение и вычисление, на нечетном - применение воздействия. Таким образом, общая схема получается: выставлена мощность, через одну синусоиду производится измерение и вычисление, еще через одну - применение новой.

X. Подводные камни.

По сравнению с разностной схемой, подводных камней у прямой схемы крайне мало, вот список тех, которые я видел:
  • Учет размерностей . Самое важное, и самая частая ошибка. Нельзя просто взять U=K*(Err+Ki*Int+Kd*Diff), без оговаривания ЧТО есть K, Ki, Kd. И с какой точностью. Особенно важно для коэффициента Ki, который имеет размерность обратную времени - если операция идёт в целых числах, НЕЛЬЗЯ просто умножать на него - так как там должно быть ДЕЛЕНИЕ, а обратное число в целых числах не представимо.
  • Учет знака . Второе очень важное - учет знака. Все операции должны быть знаковыми, интеграл обязан накапливаться знаковый - так как он не только замещает пропорциональную составляющую, но и позволяет сопротивляться внешним воздействиям, например - выделению тепла самой смеси; и тогда его знак отрицательный.
  • Учет переполнения . Нам важно получить либо мощность от 0% до 100%, либо факт того, что вычисленная мощность больше 100% или меньше 0%. Нет нужды производить все вычисления, если мы получили отрицательный подскобочный результат, например. Но при этом важно учесть, что при произведении-сложении может произойти переполнение - и его нужно учесть как «больше 100%», а ни в коем образе не оставить результат после переполнения. Это чревато в первую очередь отсутствием регулирования когда требуется - объект ниже требуемой температуры, а мощность не подаётся
  • Учет времени вычислений . Необходимость великоразрядных умножений (при кривой реализации - еще и деления) требует времени, поэтому крайне важно просчитать время выполнения самого худшего варианта вычислений, и оно должно быть меньше, чем свободное время между измерениями. Невыполнение этого условия ведёт к неуправляемому объекту, который «вроде работает, но как-то не так

XI. Выводы.

В результате, прямая схема реализации не имеет тех проблем, какие имеет , но требует больше вычислительных затрат. Однако, при правильной реализации, прямая схема вполне применима даже на дешёвых 8 битных микроконтроллерах, и даёт более предсказуемые результаты.

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

Рис. 2. Функциональная схема ПИД-регулятора.

E(t) - отклонение измеряемой величины от уставки (ошибка);
u(t) - управляющее воздействие, генерируемое регулятором.

На рисунке 3 показано более типичное изображение PID-регулятора в виде одного функционального блока, что характерно для АСУ ТП.

Рис. 3. Упрощенное изображение ПИД-регулятора в виде одного функционального блока.

Назначение ПИД-регулятора заключается в поддержании некоторой величины PV на заданном значении SP с помощью изменения другой величины OP, где

PV - измеряемый параметр (process value);
SP - заданное значение измеряемого параметра (уставка, setpoint);
OP - управляющее воздействие (output);
Разность (SP-PV) называется ошибкой или рассогласованием.

Как уже сказано, выходной сигнал OP определяется тремя слагаемыми:

OP = P + DI + TI = KP * (SP-PV) + KDI * d(SP-PV)/dt + KTI * ?(SP-PV)dt;

Где KP, KDI, KTI - коэффициенты усиления соответственно пропорциональной (proportional), дифференциальной (derivative) и интегральной (integral) составляющей. ? - знак интегрирования.

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

OP = Pp * ((SP-PV) + PD * d(SP-PV)/dt + PI * ?(SP-PV)dt),

Где Pp = 1/KP (зона пропорциональности); PD = KDI (постоянная дифференцирования); PI = 1/KTI (постоянная интегрирования).

Теперь разберем смысл каждой составляющей.

Пропорциональная составляющая.

Пропорциональная составляющая стремится устранить непосредственную ошибку (SP-PV) в значении стабилизируемой величины, наблюдаемую в данный момент времени. Значение этой составляющей прямопропорционально отклонению измеряемой величины от уставки (SP-PV). Так если входной сигнал равен уставке, т.е. PV=SP, то пропорциональная составляющая равна нулю.

При использовании только пропорционального регулятора значение регулируемой величины на практике никогда не устанавливается на заданном значении (PVуст=SP). Существует так называемая статическая ошибка, которая равна такому отклонению регулируемой величины, которое обеспечивает выходной сигнал, стабилизирующий выходную величину именно на этом значении. Например, в регуляторе температуры выходной сигнал OP, регулирующий мощность нагревателя, постепенно уменьшается при приближении температуры PV к уставке SP:

При PV -> SP , OP -> 0.

Система стабилизируется на определенном значении OP, при котором мощность нагревателя равна тепловым потерям. При этом температура не может достичь уставки, так как в этом случае мощность нагревателя станет равной нулю (OP=0), и он начнет остывать, а вместе с этим будет падать и температура.

По мере увеличения коэффициента пропорциональности (усиления) уменьшается статическая ошибка, однако слишком большой коэффициент усиления может стать причиной автоколебаний, а при дальнейшем увеличении коэффициента система может потерять устойчивость и пойти “в разнос”.

Интегральная составляющая.

Для устранения статической ошибки вводится интегральная составляющая. Она позволяет регулятору «учиться» на предыдущем опыте. Если система не испытывает внешних возмущений, то через некоторое время регулируемая величина стабилизируется на заданном значении. При стабилизации (PV=SP) пропорциональная составляющая будет равна нулю, а выходной сигнал будет полностью обеспечиваться интегральной составляющей. При постоянном значении рассогласования (SP-PV) интегральная составляющая представляет линейно увеличивающуюся со временем величину.

Физически интегральная составляющая представляет задержку реакции регулятора на изменение величины рассогласования, внося в систему некоторую инерционность, что может быть полезно для управления объектами c большой чувствительностью.

Дифференциальная составляющая.

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

Чем быстрее регулируемая величина отклоняется от уставки, тем сильнее противодействие, создаваемое дифференциальной составляющей. Когда рас-согласование становится постоянной величиной, дифференциальная составляющая перестает оказывать воздействие на сигнал управления.

Процесс настройки PID-регулятора состоит в основном из задания уставки и значений указанных выше трех коэффициентов. Существует несколько математических методов вычисления оптимальных коэффициентов PID-регулятора исходя из обеспечения наибольшей устойчивости системы. Однако на практике настройка регулятора проводится эмпирическим методом (так сказать “на глазок”). В современных АСУ ТП зачастую применяются так называемые самонастраивающиеся PID-регуляторы, которые путем подачи на объект единичного воздействия и анализа ответной реакции автоматически выставляют если не оптимальные, то достаточно хорошие коэффициенты. Более того, существуют алгоритмы адаптированного PID-регулирования, предполагающие автоматическую корректировку (подстройку) коэффициентов регулирования в процессе управления. С их помощью можно достичь очень высокого качества управления даже в сильно нелинейных системах, однако по каким-то причинам технологи и по сей день относятся к этому функционалу с большим подозрением.

Применение.

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

Рис. 4. Пример применения PID-регулятора.

Температурная уставка задается вручную оператором. Регулятор, анализирую разность между уставкой и показанием температурного датчика, формирует сигнал для управления регулирующим клапаном подачи газа на горелку.

Как было отмечено, качество управления сильно зависит от настройки коэффициентов регулятора. На рисунке 5 показано поведение системы при некорректной настройке PID.

Рис. 5. Переходный процесс при плохих настройках PID-регулятора.

Здесь оператор решил поменять уставку. Как видно из рисунка, регулятор не способен отработать корректно, и наблюдается расходящийся колебательный процесс. Система явно не устойчива.

На рисунке 6 показан переходный процесс при правильных настройках регулятора. Оператор опять меняет температурную уставку, но регулятор на этот раз отрабатывает корректно. Наблюдается некоторое перерегулирование, но в целом процесс быстро сходится.

Рис. 6. Переходный процесс при хороших настройках PID-регулятора.

Рассмотрим комплексные схемы применения PID-регуляторов.

Каскадное регулирование (cascade control).

Классический пример. Нагреватель печи (горелка в нашем случае) имеет избыточную мощность, и объект нагрева (заготовка) может с одной стороны перегреться, а с другой - остаться холодным. Если подобный режим нагрева недопустим, то одноконтурного управления будет уже недостаточно. Для обеспечения равномерного нагрева объекта необходимо измерять температуру уже в двух местах: рядом с нагревателем и в самом холодном месте. В таком случае регулятор должен содержать два ПИД - звена, включенных последовательно. Первое ПИД-звено (называемое ведущим), на вход которого подается значение температуры в холодном месте, будет вырабатывать значение уставки для второго звена (называемого ведомым). На вход ведомого звена подается температура около нагревателя (см. рисунок 7).

Рис. 7. Пример каскадного регулирования.

Такая структура регулирования двух с помощью последовательно включенных ПИД - регуляторов, имеющая два входа для параметров измерения и один управляющий выход, называется каскадной. Для эффективного управления необходимо, чтобы ведомый PID-регулятор был быстрее, чем ведущий.

На рисунке 8 изображена другая система.

Рис. 8. Еще один пример каскадного регулирования.

Температура внутри резервуара с рубашкой контролируется каскадом. Ведущий PID-регулятор (Tc1) реагирует на изменение температуры в резервуаре, но его выход не связан напрямую с клапаном, регулирующим входящий поток теплопередающей жидкости. Выход Tc1 задает уставку для ведомого регулятора Tc2, а Tc2 с помощью клапана регулирует температуру теплопередающей жидкости в контуре насоса. Таким образом, Tc2 имеет дело со всеми колебаниями температуры около насоса, которые могут передаваться от источника теплоносителя.

С таким каскадом все входящие возмущения и колебания температуры будут определены и обработаны регулятором Tc2 до того, как они повлияют на температуру непосредственно в резервуаре. Знание о надвигающихся возмущениях и колебаниях до того, как они непосредственно воздействуют на объект управления, позволяет системе предпринимать превентивные действия. Такой подход к организации управления называется упреждающим регулированием.

Управление отношением (ratio control).

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

Обычно переменные процесса, для которых должно сохраняться заданное отношение, представляют собой величины расхода компонентов или величины объемов, что наиболее характерно для процессов сжигания (например, направления топлива на форсунки горелки). На рисунке 9 количество топлива в контуре управления 2 поддерживается в соотношении FAC с количеством воздуха в контуре 1, задаваемым уставкой SP1.

Рис. 9. Управление отношением.

Управление отношением чаще всего используется в следующих процессах:

1. Смешение двух или нескольких потоков веществ для производства смесей заданного химического состава;
2. Смешение двух или нескольких веществ для производства смесей, обладающих заданными физическими свойствами;
3. Поддержание заданного соотношения “топливо/воздух” для достижения оптимального процесса горения.

Практика

В современных АСУ ТП PID-регулятор реализуется в виде программного функционального блока, выполняемого в контроллере. На рисунке 10 изображен блок PID-регулирования, взятый из среды разработки реальной системы управления. Обратите внимание, сколько в блоке различных параметров (более 30). На практике не более десяти из них требуют внимательной настройки.

Рис. 10. Конфигурация функционального блока ПИД-регулятора.

Перечислим наиболее важные параметры блока:
1. SP - значение уставки;
2. PV - значение регулируемой величины;
3. OP -значение выходного сигнала (управляющего сигнала);
4. SL - вход для задания уставки в автоматическом режиме;
5. RemoteSP - вход для задания уставки в удаленном режиме;
6. Mode - вход для задания режима работы регулятора;
7. XP - коэффициент пропорциональной составляющей;
8. TD - коэффициент дифференциальной составляющей;
9. TI - коэффициент интегральной составляющей;
10. SL_Track - вход для включения режима трэкинга.

Ранее мы подробно рассмотрели первые три параметра, поэтому на них останавливаться не будем. Очень интересным является параметр Mode. Дело в том, что регулятор может работать, как минимум, в трех режимах задания уставки: автоматическом (automatic), удаленном (remote) и ручном (manual).

1. Автоматический режим наиболее часто используется; в этом режиме уставка регулятора задается вручную оператором при помощи входа SL.

2. При работе в удаленном режиме уставка программно формируется в другом функциональном блоке и пересылается на вход регулятора RemoteSP.

3. При работе в ручном режиме оператор имеет возможность напрямую задавать значение управляющего сигнала, манипулируя выходом OP; в этом режиме регулятор приостанавливает формирование управляющего воздействия OP по алгоритму PID.

Пример. Допустим, у нас есть емкость с водой, снабженная нагревателем. В данный момент поддерживается температура воды равная 80 С. В этом случае у нас:

PV - это текущая температура воды, измеряемая датчиком;
SP - текущая уставка, задаваемая оператором;
OP - сигнал управления мощностью нагревателя;

Пусть в данный момент PV=SP=80 °C, т.е. рассогласования нет. При этом OP=65% (нагреватель работает на 65% своей номинальной мощности), и PID-регулятор находится в автоматическом режиме. Теперь по каким-либо причинам оператор решает перевести регулятор в ручной режим и устанавливает новое значение OP=20%. Вследствие уменьшения мощности нагрева, по прошествии какого-то времени температура воды падает до 35 °С. Теперь PV=35 °C, SP=80 °C, OP=20%. Представим, что случится, если регулятор перевести обратно в автоматический режим. Рассогласование станет равным SP-PV=80-35=45 °C, а, следовательно, пропорциональная составляющая будет равна XP*45/100. В момент перехода регулятора в автоматический режим это значение XP*45/100 (вместе с другими составляющими) передается на выход OP и вызывает скачкообразное изменение управляющего сигнала соответственно на XP*45/100%. Такое резкое (скачкообразное) изменение управляющего сигнала называется “ударом”. Как отреагирует на это нагревательный элемент? Наверно, не лучшим образом. Хотя с нагревательным элементом, скорее всего, ничего не случится. Гораздо хуже, если в качестве исполнительного механизма выступает позиционирующее устройство.

Для борьбы с эти явлением придумали хитрую схему. При работе регулятора в ручном режиме его уставка SP постоянно отслеживает текущее значение PV (функция tracking), так что рассогласование всегда равно 0 (SP=PV). В этом случае при переходе из ручного режима в автоматический или удаленный удара не наблюдается. Параметр SL_Track нужен для включения/выключения этой функции. Как правило, режим трэкинга оставляют включенным SL_Track=1.

Общие сведения

Обычно, при использовании пропорционально-интегрально-дифференциального или ПИД- (PID- Proportional-Integral-Derivative) регулятора и грамотной его настройке, достигается лучшая точность управления по сравнению с двухпозиционным (релейным) регулятором. Но для оптимальной настройки регулятора и, как следствие, получение желаемого качества управления, необходимо понимание механизмов и принципов работы ПИД-регулятора.
При ПИД-регулировании сигнал управления зависит не только от разницы между текущим и заданным значением (величины ошибки или рассогласования), а также от накопленной ошибки (интеграла) и от скорости изменения ошибки во времени (дифференциала). В результате ПИД-регулятор обеспечивает такое значение сигнала управления, при котором ошибка в установившемся режиме стремится к нулю. Качество управления определяется многими факторами, ключевыми являются недетерминированность объекта управления, точность ввода-вывода регулятора и интенсивность внешних воздействий.

Где:
Xp - полоса пропорциональности
Ei = (SP-PV) = (уставка-тек) = ошибка (рассогласование)
Тд - постоянная времени дифференцирования
∆Ei - разность ошибок соседних измерений (Ei - Ei-1)
∆tизм - время между соседними измерениями (ti - t i-1)
Ти - постоянная времени интегрирования
- Накопленная к i-ому шагу сумма рассогласований (интегральная сумма)
Легко заметить, что сигнал управления является суммой трех составляющих: пропорциональной (слагаемое 1), дифференциальной (слагаемое 2), и интегральной (слагаемое 3).
Пропорциональная составляющая зависит от текущей ошибки Ei и компенсирует текущую ошибку пропорционально ее величине.
Дифференциальная составляющая зависит от скорости изменения ошибки ∆Ei / ∆tизм и компенсирует резкие возмущения.
Интегральная составляющая накапливает ошибку регулирования, что позволяет ПИД-регулятору поддерживать нулевую ошибку в установившемся режиме (устраняет статическую ошибку управления).
Обычно ПИД-регулятор имеет дополнительные параметры помимо трех коэффициентов (Xp, Ти, Тд). Рассмотрим их более подробно на примере скриншота меню параметров ПИД-регулятора прибора “ ”.

Рис. 1

Каналов (выходов) ПИД-регулирования в приборе может быть несколько и параметры для каждого из них свои собственные. Поэтому выберите желаемый канал в первой графе.
Источником обратной связи с объекта управления (текущая контролируемая величина) может быть любой измерительный канал прибора, поэтому необходимо выбрать желаемый измерительный канал в графе ВЛАДЕЛЕЦ.
ПИД-регулятор может управлять как по закону прямой логики (управление печью), так и по обратному закону (управление хладоустановкой). Выберите желаемую логику работы.
Уставка (SP) - это желаемая величина, на которую регулятор должен выйти в установившемся режиме.
Xp - зона пропорциональности. Задается в единицах контролируемой величины (для терморегулятора в градусах). Зона пропорциональности называется так, потому что только в ней ((SP - Xp)…(SP + Xp)) пропорциональная составляющая ПИД-регулятора может формировать мощность выходного сигнала управления пропорционально ошибке. А за ее пределами мощность будет равна либо 0%, либо 100%. Таким образом, чем уже эта зона, тем быстрее отклик регулятора, но слишком высокое быстродействие может ввести систему в автоколебательный режим.
Ти - постоянная времени интегрирования.
Тд - постоянная времени дифференцирования.
Текущая мощность - это информационный параметр.
Минимальная и максимальная мощность определяют границы мощности выхода ПИД-регулятора.
Аварийная мощность - это такая мощность, которая формируется регулятором при неисправности датчика или измерительного канала. Так можно обеспечить отрицательную температуру холодильной камеры или не дать остыть печи даже при аварийной ситуации.
Последним параметром идет период ШИМ. Этот параметр один для всех ПИД-регуляторов, т.к. каналы ШИМ синхронизированы между собой от одного таймера. ШИМ сигнал позволяет регулировать мощность посредством регулировки скважности сигнала (регулируется ширина импульса при постоянной частоте модуляции). Разрядность ШИМ (число позиций мощности) равна 8192 дискреты (13 бит). Период ШИМ (от 1 мс до 250 сек). Этот параметр зависит от типа и коммутационных способностей силовых исполнительных ключей (м.б. реле, пускатель, твердотельное реле, симистор). Чем выше частота коммутации (чем меньше период) тем больше тепловые потери в ключах (квадратичная зависимость потерь от частоты) и больше износ механических коммутаторов, но лучше качество регулирования. Важно найти золотую середину.

Настройка пропорциональной компоненты (Xp)

Перед настройкой зоны пропорциональности интегральная и дифференциальная компоненты отключаются, постоянная интегрирования устанавливается максимально возможной (Ти = макс), а постоянная дифференцирования минимально возможной (Тд = 0). Устанавливается безопасная величина уставки, равная (0,7…0,9)×SP, где SP - это реальная уставка настраиваемой системы. Зона пропорциональности устанавливается минимально возможной (Xp = 0).
В этом случае регулятор выполняет функции двухпозиционного релейного регулятора с гистерезисом равным нулю. Регистрируется переходная характеристика.

Рис. 2


Тο - начальная температура в системе;
Тsp - заданная температура (уставка);
∆T - размах колебаний температуры;
∆t - период колебаний температуры.
Установить зону пропорциональности равной размаху колебаний температуры: Xp = ∆T. Это значение служит
первым приближением для зоны пропорциональности.
Следует проанализировать переходную характеристики еще раз и при необходимости скорректировать значение зоны пропорциональности. Возможные варианты переходных характеристик показаны на рис. 3.
Рис. 3


Переходная характеристика типа 1: Значение зоны пропорциональности очень мало, переходная характеристика далека от оптимальной. Зону пропорциональности следует значительно увеличить.
Переходная характеристика типа 2: В переходной характеристике наблюдаются затухающие колебания (5 - 6 периодов). Если в дальнейшем предполагается использовать и дифференциальную компоненту ПИД-регулятора, то выбранное значение зоны пропорциональности является оптимальным. Для этого случая настройка зоны пропорциональности считается законченной.
Если в дальнейшем дифференциальная компоненты использоваться не будет, то рекомендуется еще увеличить зону пропорциональности так, чтобы получились переходные характеристики типа 3 или 4.
Переходная характеристика типа 3: В переходной характеристике наблюдаются небольшой выброс (перерегулирование) и быстро затухающие колебания (1 - 2 периода). Этот тип переходной характеристики обеспечивает хорошее быстродействие и быстрый выход на заданную температуру. В большинстве случаев его можно считать оптимальным, если в системе допускаются выбросы (перегревы) при переходе с одной температуры на другую.
Выбросы устраняются дополнительным увеличением зоны пропорциональности так, чтобы получилась переходная характеристика типа 4.
Переходная характеристика типа 4: Температура плавно подходит к установившемуся значению без выбросов и колебаний. Этот тип переходной характеристики также можно считать оптимальным, однако быстродействие регулятора несколько снижено.
Переходная характеристика типа 5: Сильно затянутый подход к установившемуся значению говорит о том, что зона пропорциональности чрезмерно велика. Динамическая и статическая точность регулирования здесь мала.
Следует обратить внимание на два обстоятельства. Во-первых, во всех рассмотренных выше случаях установившееся значение температуры в системе не совпадает со значением уставки. Чем больше зона пропорциональности, тем больше остаточное рассогласование. Во-вторых, длительность переходных процессов тем больше, чем больше зона пропорциональности. Таким образом, нужно стремиться выбирать зону пропорциональности как можно меньше. Вместе с тем, остаточное рассогласование, характерное для чисто пропорциональных регуляторов (П-регуляторов), убирается интегральной компонентой регулятора.

Настройка дифференциальной компоненты (Tд)

Этот этап присутствует только в том случае, если применяется полнофункциональный ПИД-регулятор. Если дифференциальная компонента применяться не будет (используется пропорционально-интегральный (ПИ) регулятор), то следует пропустить этот этап.
На предыдущем этапе была задана зона пропорциональности, соответствующая переходной характеристике типа 2, в которой присутствуют затухающие колебания (см. рис. 3, кривая 2, рис. 4, кривая 1.).

Рис. 4


Следует установить постоянную времени дифференцирования Тд так, чтобы переходная характеристика имела вид кривой 2 на рис. 4. В качестве первого приближения постоянная времени дифференцирования делается равной Тд = 0,2×∆t.
Примечательно то, что дифференциальная компонента устраняет затухающие колебания и делает переходную характеристику, похожей на тип 3 (см. рис. 3). При этом зона пропорциональности меньше, чем для типа 3. Это значит, что динамическая и статическая точность регулирования при наличии дифференциальной компоненты (ПД-регулятор) может быть выше, чем для П-регулятора.

Настройка интегральной компоненты (Ти)

После настройки пропорциональной компоненты (а при необходимости и дифференциальной компоненты) получается переходная характеристика, показанная на следующем рисунке, кривая 1.

Рис. 5


Интегральная компонента предназначена для того, чтобы убрать остаточное рассогласование между установившимся в системе значением температуры и уставкой. Начинать настраивать постоянную времени интегрирования следует с величины Ти = ∆t.
Переходная характеристика типа 2: Получается при чрезмерно большой величине постоянной времени интегрирования. Выход на уставку получается очень затянутым.
Переходная характеристика типа 4: Получается при слишком малой величине постоянной времени интегрирования. Если постоянную времени интегрирования уменьшить еще, то в системе могут возникнуть колебания.
Переходная характеристика типа 3: Оптимальная.

Использованные источники информации

  • Сабинин Ю.А. Ковчин С.А. “Теория электропривода”
  • Шрейнер Р. Т. “Системы подчиненного регулирования электроприводов”
  • Олссон, Пиани “Цифровые системы автоматизации и управления”
  • Материалы сайта www.asu-tp.org