Преобразователь частоты и пид-регулятор — общая настройка. Пид регулирование для чайников Пид расшифровка
В данной статье приведены основные принципы и правила настройки коэффициентов ПИД-регулятора сточки зрения практического применения. Теоретические основы можно прочитать .
Для простоты изложения рассмотрим настройку регулятора на примере. Допустим, необходимо поддерживать температуру в помещении с помощью обогревателя, управляемого регулятором. Для измерения текущей температуры используем термопару.
Задача настройки
Настройка регулятора производится с одной единственной целью: подобрать его коэффициенты для данной задачи таким образом, чтобы регулятор поддерживал величину физического параметра на заданном уровне. В нашем примере физическая величина — это температура.
Допустим текущая температура в помещении 10 °С, а мы хотим, чтобы было 25°С. Мы включаем регулятор и он начинает управлять мощностью обогревателя таким образом, чтобы температура достигла требуемого уровня. Посмотрим как это может выглядеть.
На данном рисунке красным цветом показана идеальная кривая изменения температуры в помещении при работе регулятора. Физическая величина плавно, без скачков, но в тоже время достаточно быстро подходит к заданному значению. Оптимальное время, за которое температура может достигнуть заданной отметки, определить довольно сложно. Оно зависит от многих параметров: размеров комнаты, мощности обогревателя и др. В теории это время можно рассчитать, но на практике чаще всего это определяется экспериментально.
Чёрным цветом показан график изменения температуры в том случае, если коэффициенты подобраны совсем плохо. Система теряет устойчивость. Регулятор при этом идёт «в разнос» и температура «уходит» от заданного значения.
Рассмотрим более благоприятные случаи.
На этом рисунке показаны графики, далёкие от идеального. В первом случае наблюдается сильное перерегулирование: температура слишком долго «скачет» относительно уставки, прежде чем достичь её. Во втором случае регулирование происходит плавно, но слишком медленно.
А вот и приемлемые кривые:
Данные кривые тоже не идеальны, но могут быть сочтены за удовлетворительные.
В процессе настройки регулятора, пользователю необходимо стремиться получить кривую, близкую к идеальной. Однако, в реальных условиях сделать это не так-то просто — приходится долго и мучительно подбирать коэффициенты. Поэтому зачастую останавливаются на «приемлемой» кривой регулирования. Например, в нашем примере нас могли бы устроить коэффициенты регулятора, при которых заданная температура достигалась бы за 15-20 минут с максимальным перерегулированием (максимальными «скачками» температуры) 2 °С. А вот время достижение уставки более часа и максимальные «скачки» температуры 5 °С — нас бы не устроили.
Настраиваем пропорциональный коэффициент
Выставляем дифференциальный и интегральный коэффициенты в ноль, тем самым убирая соответствующие составляющие. Пропорциональный коэффициент выставляем в 1.
Далее нужно задать значение уставки температуры отличное от текущей и посмотреть, как регулятор будет менять мощность обогревателя, чтобы достичь заданного значения. Характер изменения можно отследить «визуально», если у вас получится мысленно представить этот график. Либо можно регистрировать в таблицу измеренное значение температуры каждые 5-10 секунд и по полученным значением построить график. Затем нужно проанализировать полученную зависимость в соответствии с рисунком:
При большом перерегулировании, необходимо уменьшать пропорциональный коэффициент, а если регулятор долго достигает уставки — увеличивать. Так убавляя-прибавляя коэффициент необходимо получить график регулирования как можно ближе к идеальному. Поскольку достичь идеала удастся вряд ли, лучше оставить небольшое перерегулирование (его можно будет скорректировать другими коэффициентами), чем длительное нарастание графика.
Настраиваем дифференциальный коэффициент
Постепенно увеличивая дифференциальную составляющую, необходимо добиться уменьшения или полного исчезновения «скачков» графика (перерегулирования) перед выходом на уставку. При этом кривая должна стать еще больше похожа на идеальную. Если слишком сильно завысить дифференциальный коэффициент, температура при выходе на уставку будет расти не плавно, а скачками (как показано на рисунке).

При появлении таких скачков необходимо прекратить увеличение дифференциального коэффициента.
Настраиваем интегральный коэффициент
При настройке двух предыдущих коэффициентов можно получить практически идеальную кривую регулирования или близкую к ней кривую, удовлетворяющую условиям задачи. Однако, как правило возникает так называемая «статическая ошибка». При этом в нашем примере температура стабилизируется не на заданном значении 25 °С, а на несколько меньшем значении. Дело в том, что если температура станет равной уставке (то есть разность текущей и заданной температур станет равна 0), то пропорциональная и дифференциальная составляющая будут равны нулю (). При этом мощность регулятора тоже станет равна 0 и он начнёт остывать.

Для того чтобы исключить этот эффект, используют интегральную составляющую. Её необходимо постепенно увеличивать до исчезновение статической ошибки. Однако, чрезмерное её увеличение тоже может привести к возникновению скачков температуры.
Заключение
Настройка ПИД-регулятора довольно сложный и трудоёмкий процесс. На практике достаточно тяжело достичь оптимального регулирования и зачастую в этом нет необходимости. Чаще всего достаточно добиться такого вида переходного процесса, который устроит пользователя в условиях текущей задачи.
Нужно держать температуру на заданном неком уровне и менять задание. Есть микроконтроллер, к которому прицеплены измеритель температуры, и симистор для управления мощностью. Не будем греть голову на ТАУ, ни разностными схемами , просто возьмём и сделаем «в лоб» ПИД-регулятор.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)
Теперь производим расчет баланса разрядности. Для этого распишем полную формулу пошагово:
- Eo = E ; Нам нужна прошла ошибка. Ошибки - по 16бит
- E = Y-X ; Вычисляем новое рассогласование. 16bit
- Int = Int + (E+Eo)/2 ; Интегрируем ошибку. При этом считаем полусумму разности (разностная схема). 32bit = 32bit + 16bit
- cI = Int * (1/Ti) ; Считаем интегральный вклад - 32bit * 32bit => 32bit
- cD = Td * (E-Eo) ; Считаем диф вклад - 16*16 => 32bit
- PID = E + cI + cD ; Подскобочное; 16+32+32 => 32bit
- 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
IX. Применение воздействия.
Итак, у нас есть рассчитанное воздействие, и наша задача - применить его. Для этого работает общий цикл работы с частотой 50Гц. На четном цикле - производится измерение и вычисление, на нечетном - применение воздействия. Таким образом, общая схема получается: выставлена мощность, через одну синусоиду производится измерение и вычисление, еще через одну - применение новой.X. Подводные камни.
По сравнению с разностной схемой, подводных камней у прямой схемы крайне мало, вот список тех, которые я видел:- Учет размерностей . Самое важное, и самая частая ошибка. Нельзя просто взять U=K*(Err+Ki*Int+Kd*Diff), без оговаривания ЧТО есть K, Ki, Kd. И с какой точностью. Особенно важно для коэффициента Ki, который имеет размерность обратную времени - если операция идёт в целых числах, НЕЛЬЗЯ просто умножать на него - так как там должно быть ДЕЛЕНИЕ, а обратное число в целых числах не представимо.
- Учет знака . Второе очень важное - учет знака. Все операции должны быть знаковыми, интеграл обязан накапливаться знаковый - так как он не только замещает пропорциональную составляющую, но и позволяет сопротивляться внешним воздействиям, например - выделению тепла самой смеси; и тогда его знак отрицательный.
- Учет переполнения . Нам важно получить либо мощность от 0% до 100%, либо факт того, что вычисленная мощность больше 100% или меньше 0%. Нет нужды производить все вычисления, если мы получили отрицательный подскобочный результат, например. Но при этом важно учесть, что при произведении-сложении может произойти переполнение - и его нужно учесть как «больше 100%», а ни в коем образе не оставить результат после переполнения. Это чревато в первую очередь отсутствием регулирования когда требуется - объект ниже требуемой температуры, а мощность не подаётся
- Учет времени вычислений . Необходимость великоразрядных умножений (при кривой реализации - еще и деления) требует времени, поэтому крайне важно просчитать время выполнения самого худшего варианта вычислений, и оно должно быть меньше, чем свободное время между измерениями. Невыполнение этого условия ведёт к неуправляемому объекту, который «вроде работает, но как-то не так
XI. Выводы.
В результате, прямая схема реализации не имеет тех проблем, какие имеет разностная схема , но требует больше вычислительных затрат. Однако, при правильной реализации, прямая схема вполне применима даже на дешёвых 8 битных микроконтроллерах, и даёт более предсказуемые результаты.П-регулятор - Это регулятор, у которого μ пропорционально σ, т.е.μ = – Кσ.
При скачке входной величины σ на значение (–10ºС) затвор регулирующего органа переходит в новое μ - положение скачком (рис.2.10).
Рис.2.10. Закон регулирования П-регулятора.
Достоинство такого регулирования: регулирующий орган быстро перемещается на новое положение, т.е. высокая скорость регулирования (t – время).
Недостаток: имеет место остаточное отклонение, т.е. имеет место некоторая ошибка регулирования.
И-регулятор Это регулятор, у которого μ пропорционально интегралу σ
При скачке входной величины на значение (–10ºС) затвор регулирующего органа медленно переходит в новое положение (рис.2.11).
Рис.2.11. Закон регулирования И-регулятора.
Достоинство:отсутствие остаточного отклонения регулируемого параметра от зад-го знч-я.
Недостаток: низкая скорость рег-я, т.е. затвор в новое положение перемещается медленно.
ПИ-регулятор – это параллельное соединение предыдущих двух регуляторов (П и И - регуляторов). Этот регулятор сочетает положительные моменты П и И -регуляторов. У ПИ-регулятора (рис.2.12) регулирующее воздействие μ перемещает затвор пропорционально отклонению параметра σ и интегралу отклонения σ.
Где: К, Т и – параметры настройки регулятора. Как видим, формула данного закона – это сумма двух предыдущих формул. Затвор регулирующего органа часть пути пройдет скачком по П-закону, а оставшуюся часть – медленно по И - закону.
Рис.2.12. Закон регулирования ПИ-регулятора
Регуляторы с предварением
ПД-регулятор - это такой регулятор (рис.2.13), у которого выходной сигнал μ пропорционален входному сигналу σ и производной dσ/dt, т.е..
Рис.2.13. Закон регулирования ПД-регулятора.
Производная dσ/dt характеризует тенденцию изменения (отклонения) регулируемой величины. Величина и знак воздействия от производной позволяют регулятору как бы предвидеть в какую сторону и на сколько отклонилась бы регулируемая величина под действием данного возмущения. Это предвидение позволяет регулятору предварять своим воздействием возможное отклонение регулируемой величины. В результате процесс регулирования завершается в более короткое время.
Сначала затвор скачком переходит из точки а в точку в (П – закон), т.е. больше чем надо, затем отскакивает назад в точку б (дифференциальное действие), и остаётся в этом положении.
ПИД-регулятор .
У него 3 родителя: П-регулятор, И-регулятор, ПД-регулятор. Соответственно складываются 3 формулы (рис.2.14.)
.
Здесь: К, Т и, Т д – параметры настройки, которые можно настроить вручную.
Рис.2.14. Закон регулирования ПИД-регулятора.
ПИД - закон используется во всех контроллерах. Сначала затвор скачком переходит из точки а в точку в (П – закон), т.е. больше чем надо, затем отскакивает назад в точку б (дифференциальное действие), а далее затвор медленно перемещается в конечное положение (И – закон). В результате процесс регулирования завершается в более короткое время и с меньшей погрешностью регулирования.
Регуляторы с линейным законом регулирования по математической зависимости между входными и выходными сигналами подразделяются на следующие основные виды:
- 1) П-регулятор (пропорциональный);
- 2) И-регулятор (интегральный);
- 3) ПИ-регулятор (пропорционально-интегральный (изодром- ный));
- 4) регуляторы с предварением (с опережением):
- ПД-регулятор (пропорционально-дифференциальный);
- ПИД-регулятор (пропорционально-интегрально-дифференциальный).
В системах автоматического регулирования наиболее распространенными являются П-регулятор, ПИ-регулятор, ПИД-регулятор.
В зависимости от задающего воздействия и параметров объекта регулирования подбирают регулятор с определенной характеристикой W p . Изменение W p адекватно ведет к изменению коэффициентов дифференциального уравнения общего передаточного звена (регулятор-объект), и тем самым достигается необходимое качество регулирования. В промышленных регуляторах эти величины называются параметрами настройки. Параметрами настройки являются: коэффициент усиления; зона нечувствительности; постоянная времени интегрирования; постоянная времени дифференцирования и т.д. Для изменения параметров настройки в регуляторах имеются органы настройки (управления) . Наиболее распространены регуляторы на один контур, но в настоящее время все больше появляется многоконтурных регуляторов. Такие регуляторы часто позволяют реализовать взаимосвязанное регулирование параметров.
Рассмотрим смысл закона регулирования регулятора на примере САР температуры целевого продукта в теплообменнике (рис. 3.9). Эта схема нам уже известна. Это САР по отклонению. Здесь а - сигнал рассогласования 90° - 100° = - 10°С =о. Закон регулирования регулятора (контроллера) определяет характер перемещения затвора регулирующего органа в новое положение. На место регулятора (контроллера) в данной схеме будем поочередно ставить линейные регуляторы и исследовать влияние регулирующего воздействия р от каждого закона регулирования на характер перемещения затвора регулирующего органа. Рассматриваем линейные регуляторы с идеальными характеристиками.
П-регулятор. Это регулятор, у которого ц пропорционально о, т.е. где К - коэффициент передачи (коэффициент усиления).

Рис. 3.9.
При скачке входной величины а на значение (минус 10°С) затвор регулирующего органа переходит в новое ц-положение скачком (рис. 3.10). Регуляторы, действующие по П-закону, просты по устройству и при эксплуатации надежны. Однако их характеризуют малое перестановочное усилие на регулирующем органе, низкая точность поддержания заданного параметра. Параметром настройки регулятора является коэффициент передачи К.

Рис 3.10.
Достоинство такого регулирования: регулирующий орган быстро перемещается на новое положение, т.е. высокая скорость регулирования. Недостаток: имеет место остаточное отклонение, т.е. имеет место некоторая ошибка регулирования (рис. 3.11). Поэтому П-ре- гуляторы применяются там, где нет строгого требования к точности регулирования.

Рис. 3.11.
И-регулятор.
Это регулятор, у которого ц пропорционально интегралу а:

При скачке входной величины на значение минус КТС затвор регулирующего органа медленно переходит в новое положение (рис. 3.12). Как бы ни было мало отклонение регулируемой величины от заданного значения, интегральный регулятор будет продолжать перемещать регулирующий орган вплоть до необходимого положения. Достоинство: отсутствие остаточного отклонения регулируемого параметра от заданного значения. Недостаток: низкая скорость регулирования, т.е. затвор в новое положение перемещается медленно.
ПИ-регулятор. Это параллельное соединение П- и И- регуляторов. ПИ-регулятор сочетает положительные моменты П- и И-регу- ляторов. ПИ-регулятор оказывает воздействие на регулирующий орган пропорционально отклонению и интегралу отклонения регулируемой величины. У ПИ-регулятора (рис. 3.13) регулирующее воздействие р перемещает затвор пропорционально отклонению параметра о и интегралу отклонения о.

Рис. 3.12.

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

Рис. 3.14.
ПД-регулятор. Это такой регулятор (рис. 3.15), у которого выходной сигнал р пропорционален входному сигналу о и производной do/ 5т, т.е.
где К - коэффициент усиления; T d

Рис. 3.15.
Производная dc/dx характеризует тенденцию изменения (отклонения) регулируемой величины. Величина и знак воздействия от производной позволяют регулятору как бы предвидеть, в какую сторону и насколько отклонилась бы регулируемая величина под действием данного возмущения. Это предвидение позволяет регулятору предварять своим воздействием возможное отклонение регулируемой величины. В результате процесс регулирования завершается в более короткое время. Сначала затвор скачком переходит из точки а в точку в (П-закон), т.е. больше, чем надо, затем отскакивает назад в точку б (дифференциальное действие) и остается в этом положении.
ПИД-регулятор. ПИД-регуляторы воздействуют на объект пропорционально отклонению регулируемой величины, интегралу от этого отклонения и скорости изменения регулируемой величины. ПИД-регулятор сочетает достоинства П-регулятора, И-регулятора, ПД-регулятора (рис. 3.16). Соответственно, в уравнении регулятора присутствуют три формулы законов регулирования:
где К - коэффициент пропорциональности; Г и - постоянная времени интегрирования; Т д - постоянная времени дифференцирования.
Эти параметры можно настроить вручную.
Параметрами настройки ПИД-регуляторов являются: коэффициент пропорциональности регулятора к р; постоянная времени интегрирования Г и; постоянная времени дифференцирования Т д.

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

Рис. 3.17.

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

Рис. 3.19. ПИД-закон идеальный а и реальный б с учетом действия по времени
П,ПИ,ПИД,ПД ЗАКОН РЕГУЛИРОВАНИЯ.
Общее описание
Принцип ПИД-регуляторов
Для позиционных регуляторов процесс регулирования представляет собой колебания вокруг заданной точки. Естественно это связано с «релейной» статической характеристикой Y(U-X).
РЕГУЛЯТОРЫ
С ПИД-ЗАКОНОМ РЕГУЛИРОВАНИЯ
На рисунке показана линейная статическая Y(U-X) характеристика.
пропорционального регулятора
Если входная Е = U-X (невязка) и выходная величина сигнала регулятора Y связаны простым соотношением Y=K·(U-X), такой регулятор называется пропорциональным. Естественно что линейный участок статической характеристики не бесконечен, он ограничен максимально возможным значением выходной величины: Ymax. Например, при регулировании температуры воды в баке: Х — температура воды; U — заданное значение требуемой температуры; Y — выходной сигнал регулятора (мощность нагревателя, Вт); Ymax, например, 750 Вт. Если при максимальной мощности величина Е = 75оС, то К = 0,1оС/Вт.
При очень большом коэффициенте усиления К пропорциональный регулятор вырождается в позиционный с нулевой зоной нечувствительности. При меньшем значении К регулирование происходит без колебаний
(см.рис. 2).
П-регулятором при скачкообразном изменении
задания с 0 до U (разгонная кривая)
Отметим, что значение регулируемой величины Х никогда не достигнет задания U. Образуется, так называемая статическая ошибка: d (см. рис. 2). Действительно, при приближении температуры воды Х к заданию U постепенно уменьшается подаваемая мощность Y, т.к. Y=К·(U-X). Но теплота, рассеиваемая в окружающую среду, увеличивается, и равновесие наступит при Y = K·d и d не достигнет 0, т.к. если d будет равно 0, то и Y=0 и Х=0. Таким образом на выходе регулятора устанавливается некоторое значение Y=K·d , которое приводит регулируемую величину Х в состояние отличное от задания. Чем больше К, тем меньше d. Однако при достаточно большом К САР и объект могут перейти в автоколебания. Этот предельный коэффициент усиления определяется соотношением наклона разгонной кривой R и транспортным запаздыванием to объекта: Kmax = 2/(R·to) (см. рис. 2).
В ряде случаев, при малом транспортном запаздывании, статическая ошибка находится в необходимых пределах, поэтому П-регуляторы находят некоторое применение. Для устранения статической ошибки d при формировании выходной величины Y вводят интегральную составляющую отклонения от задания:
Y = K·(U-X) + In(U-X)/Ti ,
где Тi — постоянная интегрирования.
Таким образом, чем больше время, в течение которого величина Х меньше задания, тем больше интегральная составляющая, тем больше выходной сигнал. Регулятор с таким законом формирования выходного сигнала называется пропорционально-интегральным ПИ-регулятором.
В установившемся режиме (d=0) в интеграторе содержится величина In/Т, которая равна выходной мощности, требуемой для получения необходимой Х. Таким образом интегратор как бы находит статический коэффициент передачи объекта. Для достижения установившегося режима в интеграторе требуется достаточно большее время. Поэтому ПИ-регулятор можно применять в случае, когда и внешние воздействия достаточно медленные.
В случае резких изменений внешних и внутренних факторов (например, налили холодной воды в бак или резко изменили задание) ПИ-регулятору требуется время для компенсации этих изменений.
Для ускорения реакции САР на внешние воздействия и изменения в задании в регулятор вводят дифференциальную составляющую D(U-X):
Y = K·(U-X) + In(U-X)/Ti+Тd·D(U-X),
где Тd — постоянная дифференцирования.
Чем быстрее растет Е, тем больше D(U-X). Регулятор с таким законом управления называется ПИД-регулятором. Подобрав для конкретного объекта К,Тi и Td можно оптимизировать качество работы регулятора: уменьшить время выхода на задание, снизить влияние внешних возмущений, уменьшить отклонение от задания. При очень большом Тi регулятор очень медленно выводит объект на задание. При малом Тi происходит перерегулирование, т.е. регулируемый параметр Х проскакивает задание (рис.7), а затем сходится к нему. Ниже описаны методики настройки регуляторов, т.е. расчет коэффициентов в зависимости от динамических свойств объекта. Без настройки ПИ-регулятор может обладать худшим качеством работы, чем даже Т-регулятор. Приведем передаточные функции П-, ПИ- и ПИД-регуляторов, принятые в теории автоматического управления.
Пропорциональный регулятор – П:
y = К(u -x)
, т.е. в обратную связь заводится отклонение от уставки.
Пропорционально-Интегральный – ПИ:
y = (u-x)(Kp + /pTi)
, т.е. в обратную связь заводится также интеграл от отклонения, это позволяет избежать статической ошибки.
Пропорционально-Интегрально- Дифференциальный – ПИД:
y = (u-x)·(Kp + 1/pTi + p·Td)
, т.е. в обратную связь заводится также производная отклонения, это позволяет улучшить динамические характеристики регулятора.
Блок схема ПИД регулятора показана на рис. 3.
Структурная схема ПИД-регулятора
Величина рассогласования Е подвергается диференцированию и интегрированию. Выходная вели-чина — Y ПИД-регулятора формируется суммированием с весовыми коэффициентами дифференциальной, пропорциональной и интегральной составляющих. По наличию этих составляющих регуляторы и имеют сокращенное название П, ПИ, ПИД.
Существуют модификации ПИД-регуляторов:
а) при наличии интегратора на выходе или в исполнительном механизме (например сервопривод задвижки водяного отопления) ПД-регулятор как бы превращается в ПИ-регулятор, а вычислительная схема ПИД-регулятора требует двойного дифференцирования;
б) дифференциальная составляющая часто вычисляется только по Х, что дает более плавный выход на режим при изменении задания U.
Настройка регуляторов При применении ПИД- регуляторов для каждого конкретного объекта необходимо настраивать от одного до трех коэффициентов. Возможны САР с автоматизированной настройкой. Для типовых регуляторов известны простейшие аналитические и табличные методы настройки (например две методики Цидлера).
Настройка по реакции
на входной скачок
Алгоритм настройки:
— на вход САР подается новое задание (уставка) – нагреватель включается на максимальную мощность, и по переходному процессу X(t) определяются t0, R, tи (см. рис. 4):
Разгонная кривая для объекта с транспортным запаздыванием:
to — время транспортного запаздывания;
tи — постоянная времени (время согласования) определяется инерционностью объекта;
Xy — установившееся значение;
R — наклон разгонной кривой dX/dt (макс. скорость изменения Х)
— вычисляются коэффициенты настройки согласно следующим примерным соотношениям:
для П-регулятора К= 1/R·t0
для ПД-регулятора К= 1/R·t0, Td=0.25·t0
для ПИ-регулятора К= 0.8/R·t0, Ti= 3·t0
для ПИД-регулятора К= 1.2/R·t0, Ti= 2·t0, Td=0.4·t0.
Не обязательно выводить объект на максимально возможную величину Х. Однако, следует иметь в виду, что слишком маленький скачок не позволяет определить R с достаточно высокой точностью.
Настройка по методу максимального коэффициента усиления Этот способ применяется, если допустим колебательный процесс, при котором значения регулируемой величины значительно выходят за пределы задания U.
К настройке по методу максимального
коэффициента усиления
Алгоритм настройки:
— определяется предельный коэффициент Кмах усиления при котором САР и объект переходят в колебательный режим, т.е. без интегральной и дифференциальной части (Тd=0, Тi=Ґ). Вначале К=0, затем он увеличивается до тех пор, пока САР и объект переходит в колебательный режим. САР соответствует схеме П-регулятора (см.рис.2).
— определяется период колебаний tc (см. рис. 5);
для П-регулятора К= 0.5·Kмах
для ПД-регулятора К= 0.5·Кмах, Td=0.05·tc
для ПИ-регулятора К= 0.45·Кмах, Ti= 0.8·tс
для ПИД -регулятора К= 0.6·Кмах, Ti= 0.5·tс, Td=0.12·tc.
Настройка по процессу двухпозиционного
регулирования по релейному закону
К настройке по процессу двухпозиционного
регулирования
Эта методика удобна, если применялся Т-регулятор, который затем заменяется на ПИД- регулятор:
— система переводится в режим двухпозиционного регулирования по релейному закону (см. рис. 6);
определяется амплитуда — А и период колебаний tс;
— вычисляются коэффициенты настройки согласно следующим примерным соотношениям:
для П-регулятора К = 0.45/А
для ПД-регулятора К = 0.45/А, Td=0.05·tc
для ПИ-регулятора К = 0.4/А, Ti= 0.8·tc
для ПИД-регулятора К = 0.55/А, Ti= 0.5·tс, Td=0.12·tc.
Если объект не меняет структуру и свои параметры, то системы с ПИД-регуляторами обеспечивают необходимое качество регулирования при больших внешних возмущающих воздействиях и помехах, то есть близкое к 0 рассогласование Е (см. рис. 7). Как правило, точно согласовать параметры регулятора и объекта сразу не удается. Если Ti меньше оптимального в два раза, процесс регулирования может перейти в колебательный режим. Если Ti существенно больше оптимального, то регулятор медленно выходит на новый режим и слабо реагирует на быстрые возмущения — G. Таким образом, как правило необходима дополнительная подстройка. На рис. 7 показано влияние неоптимальных настроек ПИД-регуляторов на вид переходной функции (реакции САР и объекта на единичный скачок в задании).


