Дифференциальный пропорционально-интегральный регулятор – устройство, которое устанавливают в автоматизированных системах для поддержания заданного параметра, способного к изменениям.
На первый взгляд все запутанно, но можно объяснить ПИД регулирование и для чайников, т.е. людей, не совсем знакомых с электронными системами и приборами.
ПИД регулятор – прибор, встроенный в управляющий контур, с обязательной обратной связью. Он предназначен для поддержания установленных уровней задаваемых величин, например, температуры воздуха.
Устройство подает управляющий или выходной сигнал на устройство регулирования, на основании полученных данных от датчиков или сенсоров. Контроллеры обладают высокими показателями точности переходных процессов и качеством выполнения поставленной задачи.
Работа ПИД-регулятора заключается в подаче выходного сигнала о силе мощности, необходимой для поддержания регулируемого параметра на заданном уровне. Для вычисления показателя используют сложную математическую формулу, в составе которой есть 3 коэффициента – пропорциональный, интегральный, дифференциальный.
Возьмем в качестве объекта регулирования ёмкость с водой, в которой необходимо поддерживать температуру на заданном уровне с помощью регулирования степени открытия клапана с паром.
Пропорциональная составляющая появляется в момент рассогласования с вводными данными. Простыми словами это звучит так – берется разница между фактической температурой и желаемой, умножается на настраиваемый коэффициент и получается выходной сигнал, который должен подаваться на клапан. Т.е. как только градусы упали, запускается процесс нагрева, поднялись выше желаемой отметки – происходит выключение или даже охлаждение.
Дальше вступает интегральная составляющая, которая предназначена для того, чтобы компенсировать воздействие окружающей среды или других возмущающих воздействий на поддержание нашей температуры на заданном уровне. Поскольку всегда присутствуют дополнительные факторы, влияющие на управляемые приборы, в момент поступления данных для вычисления пропорциональной составляющей, цифра уже меняется. И чем больше внешнее воздействие, тем сильнее происходят колебания показателя. Происходят скачки подаваемой мощности.
Интегральная составляющая пытается на основе прошлых значений температуры, вернуть её значение, если оно поменялось. Подробнее процесс описан в видео ниже.
А дальше выходной сигнал регулятора, согласно коэффициенту, подается для повышения или понижения температуры. Со временем подбирается та величина, которая компенсирует внешние факторы, и скачки исчезают.
Интеграл используется для исключения ошибок путем расчета статической погрешности. Главное в этом процессе – подобрать правильный коэффициент, иначе ошибка (рассогласование) будет влиять и на интегральную составляющую.
Третий компонент ПИД – дифференцирующий. Он предназначен для компенсации влияния задержек, возникающих между воздействием на систему и обратной реакцией. Пропорциональный регулятор подает мощность до тех пор, пока температура не достигнет нужной отметки, но при прохождении информации к прибору, особенно при больших значениях, ошибки всегда возникают. Это может привести к перегреву. Дифференциал прогнозирует отклонения, вызванные задержками или воздействием внешней среды, и снижает подаваемую мощность заранее.
Настройка ПИД-регулятора осуществляется 2 методами:
Теоретический метод анализа и настройки на практике применяются крайне редко, что связано с незнанием характеристик объекта управления и кучей возможных возмущающих воздействий. Более распространены экспериментальные методы на основе наблюдения за системой.
Современные автоматизированные процессы реализуются как специализированные модули под управлением программ для настройки коэффициентов регулятора.
ПИД регулятор предназначен для поддержания на требуемом уровне некой величины – температуры, давления, уровня в резервуаре, расхода в трубопроводе, концентрации чего-либо и т.д., изменением управляющего воздействия на исполнительные механизмы, такие как автоматические регулирующие клапана, используя для этого пропорциональную, интегрирующую, дифференцирующую величины для своей настройки.
Целью использования является получение точного управляющего сигнала, который способен контролировать большие производства и даже реакторы электростанций.
Часто ПИД регуляторы используются при регулировке температуры, давайте на простом примере подогрева воды в ёмкости рассмотрим данный автоматический процесс.
В емкости налита жидкость, которую нужно подогреть до нужной температуры и поддерживать её на заданном уровне. Внутри бака установлен датчик измерения температуры – термопара или термометр сопротивления и напрямую связан с ПИД-регулятором.
Для подогрева жидкости будем подавать пар, как показано ниже на рисунке, с клапаном автоматического регулирования. Сам клапан получает сигнал от регулятора. Оператор вводит значение температурной уставки в ПИД-регуляторе, которую необходимо поддерживать в ёмкости.
Если настройки коэффициентов регулятора неверны, будут происходить скачки температуры воды, при этом клапан будет то полностью открыт, то полностью закрыт. В этом случае необходимо рассчитать коэффициенты ПИД регулятора и ввести их заново. Если все сделано правильно, через небольшой промежуток времени система выровняет процесс и температура в ёмкости будет поддерживаться на заданной отметке, при этом степень открытия регулирующего клапана будет находиться в среднем положении.
odinelectric.ru
Регуляторы процесса (Process Controllers) – это параметрируемые цифровые контроллеры со встроенным набором стандартных функций для регулирования технологических переменных (температуры, давления и т.п.).
В качестве сигналов задания (Reference) могут использоваться как фиксированные уставки (Fixed Setpoints), так и внешние (External).
Аналоговые входы используются для подключения датчиков обратной связи (термометров сопротивления, термопар, манометров и т.п.).
Дискретные входы используются для задания фиксированных уставок и переключения между режимами.
Дискретные выходы используются для сигнализации: готовности, аварий, состояния.
Релейные выходы используются для дискретного управления, а аналоговые выходы – для непрерывного управления.
Для непрерывного управления используются ПИД-регуляторы. Возможна реализация каскадного (подчинённого) управления.
Переходный процесс – это реакция системы на внешнее воздействие (задание, возмущение).
Колебательный | Апериодический | Монотонный |
С помощью настройки ПИД-регулятора (PID-controller) мы можем скорректировать переходный процесс так, как нам нужно для решения своей задачи.
Хзад – заданное (желаемое) значение выходной переменной
Xmax – верхний допустимый предел выходной переменной
Xmin – нижний допустимый предел выходной переменной
Т – период колебаний
Тн – время нарастания
Тр – время переходного процесса (последняя точка пересечения кривой с Xmin или Xmax)
А1 – первое перерегулирование
А2 – второе перерегулирование
d=А1/A2 — степень (декремент) затухания переходного процесса (отношение первого перерегулирования ко второму)
Рассогласование, перерегулирование, время нарастания, время переходного процесса, степень
затухания характеризуют
ПИД-регулятор открывает и закрывает регулирующий вентиль на горячей трубе так, чтобы из крана текла вода с температурой +40°С с погрешностью плюс-минус 2 градуса. Регулятор вычисляет рассогласование (ошибку) — отклонение реальной температуры (например, +20°С) от заданного значения (+40°С) и решает – когда и насколько необходимо приоткрыть горячий вентиль, чтобы температура повысилась на 20С. Реальную (фактическую) температуру регулятор узнаёт с помощью датчика температуры (обратная связь), а заданную температуру (уставку) ему сообщает оператор, например, набирая число «40» на своём ПК.
Чтобы настроить ПИД-регулятор, необходимо подобрать правильную комбинацию трёх коэффициентов:
Могут использоваться и более простые — П и ПИ-регуляторы.
где e(t) — ошибка (рассогласование), u(t) — выходной сигнал регулятора (управляющее воздействие).
Чем больше Пропорциональный коэффициент, тем выше быстродействие, но меньше запас устойчивости. Но! простой П-регулятор не может полностью отработать рассогласование, т.е. всегда работает с ошибкой.
ПИ-регулятор позволяет избавиться от статической (установившейся) ошибки, но, чем больше Интегральный коэффициент, тем больше перерегулирование (динамическая ошибка).
ПИД-регулятор позволяет нам уменьшить перерегулирование, но, чем больше Дифференциальный коэффициент, тем больше погрешность из-за влияния шумов.
Если шумы идут по каналу обратной связи, то мы можем их отфильтровать с помощью фильтра низкой частоты, но чем больше постоянная этого фильтра, тем медленнее регулятор будет отрабатывать возмущения.
Циглер и Николс предложили свой вариант быстрой настройки ПИД-регулятора для периодического переходного процесса, в котором затухание примерно равно 4.
Теперь нам захотелось добавить комфорта и сделать так, чтобы уставка задания температуры воды менялась в зависимости от температуры воздуха на улице (на улице мороз – вода горячая, на улице жара – вода прохладная). Можно установить ещё один регулятор комфортной температуры, который по показаниям термометра узнаёт фактическую температура наружного воздуха и решает, что комфортная температура воды должна быть, например, +40°С, поэтому он выдаёт задание регулятору температуры воды – поддерживать температуру на уровне +40С (см. пример выше). Здесь мы имеем каскадное регулирование: контур регулирования температуры воды подчинён контуру регулирования комфортной температуры воды.
С помощью регуляторов процесса мы можем реализовать и более сложные связи. Например, поддерживать постоянный расход и температуру воды, независимо от давления и температуры горячего и холодного трубопроводов.
Не всегда простой ПИД-регулятор в системе с обратной связью может обеспечить требуемое быстродействие
из-за возникновения нежелательных колебаний или недопустимо большого перерегулирования.
Для улучшения характеристик регулирования применяют
Если измерить возмущение, то можно подать упреждающее воздействие, которое компенсирует влияние этого возмущения на процесс до того, как начнёт изменяться регулируемый параметр.
www.maxplant.ru
Содержание:
Среди множества приборов, предназначенных для коммутации, управления и выполнения других функций хочется отметить ПИД-регулятор, используемый в цепях обратной связи. Он устанавливается в системы с автоматическим управлением и поддерживает на определенном уровне значение какого-либо параметра. В большинстве случаев ПИД-регулятор участвует в регулировке температурных режимов и других величин, участвующих в различных процессах.
Аббревиатура ПИД происходит от английского понятия PID, и расшифровывается как Proportional, Integral, Derivative. На русском языке это сокращение включает в себя три компонента или составляющие: пропорциональную, интегрирующую, дифференцирующую.
Принцип работы ПИД-регулятора наилучшим образом подходит для контуров управления, схема которых оборудована звеньями обратной связи. В первую очередь, это различные автоматические системы где формируются сигналы управления, обеспечивающие высокое качество и точность переходных процессов.
В состав управляющего сигнала ПИД-регулятора входят три основных компонента, складывающиеся между собой. Каждый из них находится в пропорции с определенной величиной:
Если какой-либо компонент выпадет из этого процесса, то данный регулятор уже не будет представлять собой ПИД. В этом случае его схема будет просто пропорциональной, пропорционально-дифференцирующей, пропорционально-интегрирующей.
Поскольку эти приборы чаще всего используются для поддержания заданного уровня температуры, в том числе для чайников, целесообразно ПИД-регулятор рассматривать на практических примерах именно в этом ракурсе.
В самом процессе будет участвовать объект, на котором должна поддерживаться заданная температура. Все регулировки осуществляются извне. Другой составляющей будет само устройство с микроконтроллером, которое непосредственно решает имеющуюся задачу. Через измеритель на контроллер поступают данные об уровне температуры на данный момент. Мощность нагревателя отдельно контролируется специальным устройством. Для того чтобы установить требуемое значение параметров температуры, микроконтроллер нужно подключить к компьютеру.
Таким образом, исходными данными служат следующие температурные показатели: текущее значение и уровень, до которого должен нагреться или остыть рассматриваемый объект. На выходе должна получиться величина мощности, передаваемой к нагревательному элементу. Именно она обеспечивает необходимый температурный режим, позволяющий выполнить поставленную задачу. Для ее решения будут задействованы все три компонента, рассмотренные выше.
Формирование выходного сигнала осуществляет пропорциональная составляющая. Данный сигнал удерживает входную величину, подлежащую регулировке, на нужном уровне и не дает ей отклоняться. С повышением этого отклонения возрастает и уровень сигнала.
Если на входе регулируемая величина сравняется с заданным значением, то уровень выходного сигнала будет равен нулю. Однако на практике невозможно отрегулировать нужную величину с помощью лишь одной пропорциональной составляющей и стабилизировать ее на определенном уровне. Всегда существует вероятность статической ошибки, равной величине отклонения, поэтому стабилизация выходного сигнала останавливается на этом значении.
Данная проблема решается за счет использования второго, интегрирующего компонента. Его основным элементом является интеграл по времени, взятый от общей величины рассогласования. То есть, интегральная составляющая находится в пропорции с этим интегралом. Данный компонент способен ликвидировать статическую ошибку, так как регулятор постепенно накапливает учет статической погрешности.
Таким образом, при отсутствии внешних воздействий, через определенный период времени регулируемая величина будет приведена в стабильное состояние на отметке правильного значения. В этом случае величина пропорциональной составляющей будет нулевой, а интегрирующая полностью обеспечивает точность выходных данных. Однако и она может вызвать неточности, требующие исправления, в случае неправильного выбора коэффициента.
Эти отклонения устраняются за счет третьих – дифференциальных составляющих, пропорциональных с темпом изменяющегося отклонения величины. Она препятствует отклонениям, возможным в перспективе под влиянием задержек или внешних воздействий. Все три компонента дискретно связаны между собой.
ПИД-регулятор температуры способен поддерживать заданное значение какой-то величины на протяжении определенного промежутка времени. С этой целью используется изменение напряжения и других величин, которые можно рассчитать по специальным формулам. При этом учитывается величина уставки и заданного значения, а также разница или рассогласование.
1.
2.
В идеальном варианте напряжение u задается с помощью формулы 1. В ней хорошо просматриваются коэффициенты пропорциональности ПИД-регулятора, предусмотренные для каждого компонента. На практике используется другая формула 2 с коэффициентом усиления, подходящим к любому из трех составляющих.
На практике ПИД-регулирование систем в теоретическом плане анализируются довольно редко. Это связано с недостатком информации о характеристиках регулируемого объекта, нелинейностью и нестабильностью всей системы, когда невозможно использовать дифференцирующий компонент.
Рабочий диапазон устройств, функционирующих на практике, обычно ограничивается верхним и нижним пределами. В связи с нелинейностью, каждая настройка выполняется экспериментально, при подключении объекта к системе управления.
Величина, образуемая с помощью программного алгоритма управления, имеет специфические особенности. Например, для нормальной регулировки температуры может потребоваться вместо одного сразу два прибора: один будет управлять нагревом, а другой – охлаждением. В первом случае осуществляется подача разогретого теплоносителя, а во втором – хладагента. Самым современным прибором считается цифровой ПИД-регулятор, воплотивший в своей конструкции все варианты практических регулировочных решений.
electric-220.ru
Сегодняшняя статья будет посвящена такой замечательной вещи, как ПИД-регулятор. По определению, пропорционально-интегрально-дифференциальный регулятор — устройство в цепи обратной связи, используемое в системах автоматического управления для поддержания заданного значения измеряемого параметра. Чаще всего можно встретить примеры, где ПИД-регулятор используется для регулировки температуры, и, на мой взгляд, этот пример прекрасно подходит для изучения теории и понимания принципа работы регулятора. Поэтому именно задачу регулировки температуры и будем сегодня рассматривать.
Итак, что у нас имеется?
Во-первых, объект, температуру которого необходимо поддерживать на заданном уровне, кроме того, эту температуру необходимо регулировать извне. Во-вторых, наше устройство на базе микроконтроллера, с помощью которого мы и будем решать поставленную задачу. Кроме того, у нас есть измеритель температуры (он сообщит контроллеру текущую температуру) и какое-нибудь устройство для управления мощностью нагревателя. Ну и поскольку необходимо как-то задавать температуру, подключим микроконтроллер к ПК.
Таким образом, у нас есть входные данные – текущая температура и температура, до которой необходимо нагреть/остудить объект, а на выходе мы должны получить значение мощности, которое необходимо передать на нагревательный элемент.
И для такой задачи, да и вообще любой похожей задачи, отличным решением будет использование пропорционально-интегрально-дифференциального регулятора 😉
Здесь все просто, берем значение нужной нам температуры (уставку) и вычитаем из него значение текущей температуры. Получаем рассогласование (невязку). Умножаем полученную невязку на коэффициент и получаем значение мощности, которое и передаем на нагреватель. Вот и все ) Но при использовании только пропорциональной составляющей есть два больших минуса – во-первых, эффект от нашего воздействия наступает не моментально, а с запаздыванием, и, во-вторых, пропорциональная составляющая никак не учитывает воздействие окружающей среды на объект. Например, когда мы добились того, чтобы температуры объекта была равна нужному нам значению, невязка стала равна нулю, а вместе с ней и выдаваемая мощность стала нулевой. Но температура не может просто так оставаться постоянной, поскольку происходит теплообмен с окружающей средой и объект охлаждается. Таким образом, при использовании только пропорциональной составляющей температура будет колебаться около нужного нам значения.
Давайте разбираться, как ПИД-регулятор решает две выявленные проблемы )
Для решения первой используется дифференциальная составляющая. Она противодействует предполагаемым отклонениям регулируемой величины, которые могут произойти в будущем. Каким образом? Сейчас разберемся!
Итак, пусть у нас текущая температура меньше нужного нам значения. Пропорциональная составляющая начинает выдавать мощность и нагревать объект. Дифференциальная составляющая вносит свой вклад в мощность и представляет из себя производную невязки, взятую также с определенным коэффициентом. Температура растет и приближается к нужному значению, а следовательно невязка в предыдущий момент больше текущего значения невязки, а производная отрицательная. Таким образом, дифференциальная составляющая начинает постепенно снижать мощность до того, как температура достигла необходимого значения. С этим вроде разобрались, вспоминаем про вторую проблему регулятора 😉
А с ней нам поможет справиться интегральная составляющая. Как нам в программе получить интеграл? А легко – просто суммированием (накоплением) значений невязки, на то он и интеграл ) Возвращаемся к нашему примеру. Температура ниже значения уставки, начинаем подогревать. Пока мы нагреваем, значение невязки положительное и накапливается в интегральной составляющей. Когда температура “дошла” до нужного нам значения, пропорциональная и дифференциальная составляющая стали равны нулю, а интегральная перестала изменяться, но ее значение не стало равным нулю. Таким образом, благодаря накопленному интегралу мы продолжаем выдавать мощность и нагреватель поддерживает нужную нам температуру, не давая объекту охлаждаться. Вот так вот просто и эффективно =)
В итоге мы получаем следующую формулу ПИД-регулятора:
Тут u(t) – искомое выходное воздействие, а e(t) – значение невязки.
Частенько формулу преображают к следующему виду, но суть от этого не меняется:
Пожалуй, на этом закончим, разобрались мы сегодня как работает ПИД-регулятор, а в ближайшее время разберемся еще и как произвести подбор коэффициентов ПИД-регулятора )
microtechnics.ru
; 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_sh2, Pid5Calc ; если Ti_sh2=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
; Теперь сдвинуть вправо на sh3.
; sh3 может быть до 16 (так как у нас Ti 16разрядный; проверим необходимость сдвига на 16 бит)
MOV A, Ti_sh3
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
; [R2:R1:R0 * KH:HL] = [R7:R6:R5:R4:R3]
; вычисляем, учитывая что должно получиться 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<Umin => 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
habr.com
В данной статье приведены основные принципы и правила настройки коэффициентов ПИД-регулятора сточки зрения практического применения. Теоретические основы можно прочитать вот в этой статье.
Для простоты изложения рассмотрим настройку регулятора на примере. Допустим, необходимо поддерживать температуру в помещении с помощью обогревателя, управляемого регулятором. Для измерения текущей температуры используем термопару.
Настройка регулятора производится с одной единственной целью: подобрать его коэффициенты для данной задачи таким образом, чтобы регулятор поддерживал величину физического параметра на заданном уровне. В нашем примере физическая величина — это температура.
Допустим текущая температура в помещении 10 °С, а мы хотим, чтобы было 25°С. Мы включаем регулятор и он начинает управлять мощностью обогревателя таким образом, чтобы температура достигла требуемого уровня. Посмотрим как это может выглядеть.
На данном рисунке красным цветом показана идеальная кривая изменения температуры в помещении при работе регулятора. Физическая величина плавно, без скачков, но в тоже время достаточно быстро подходит к заданному значению. Оптимальное время, за которое температура может достигнуть заданной отметки, определить довольно сложно. Оно зависит от многих параметров: размеров комнаты, мощности обогревателя и др. В теории это время можно рассчитать, но на практике чаще всего это определяется экспериментально.
Чёрным цветом показан график изменения температуры в том случае, если коэффициенты подобраны совсем плохо. Система теряет устойчивость. Регулятор при этом идёт «в разнос» и температура «уходит» от заданного значения.
Рассмотрим более благоприятные случаи.
На этом рисунке показаны графики, далёкие от идеального. В первом случае наблюдается сильное перерегулирование: температура слишком долго «скачет» относительно уставки, прежде чем достичь её. Во втором случае регулирование происходит плавно, но слишком медленно.
А вот и приемлемые кривые:
Данные кривые тоже не идеальны, но могут быть сочтены за удовлетворительные.
В процессе настройки регулятора, пользователю необходимо стремиться получить кривую, близкую к идеальной. Однако, в реальных условиях сделать это не так-то просто — приходится долго и мучительно подбирать коэффициенты. Поэтому зачастую останавливаются на «приемлемой» кривой регулирования. Например, в нашем примере нас могли бы устроить коэффициенты регулятора, при которых заданная температура достигалась бы за 15-20 минут с максимальным перерегулированием (максимальными «скачками» температуры) 2 °С. А вот время достижение уставки более часа и максимальные «скачки» температуры 5 °С — нас бы не устроили.
Далее поговорим о том, как подобрать коэффициенты для достижения оптимального регулирования. Рекомендуется настраивать коэффициенты в том же порядке, в котором это описано.
Выставляем дифференциальный и интегральный коэффициенты в ноль, тем самым убирая соответствующие составляющие. Пропорциональный коэффициент выставляем в 1.
Далее нужно задать значение уставки температуры отличное от текущей и посмотреть, как регулятор будет менять мощность обогревателя, чтобы достичь заданного значения. Характер изменения можно отследить «визуально», если у вас получится мысленно представить этот график. Либо можно регистрировать в таблицу измеренное значение температуры каждые 5-10 секунд и по полученным значением построить график. Затем нужно проанализировать полученную зависимость в соответствии с рисунком:
При большом перерегулировании, необходимо уменьшать пропорциональный коэффициент, а если регулятор долго достигает уставки — увеличивать. Так убавляя-прибавляя коэффициент необходимо получить график регулирования как можно ближе к идеальному. Поскольку достичь идеала удастся вряд ли, лучше оставить небольшое перерегулирование (его можно будет скорректировать другими коэффициентами), чем длительное нарастание графика.
Постепенно увеличивая дифференциальную составляющую, необходимо добиться уменьшения или полного исчезновения «скачков» графика (перерегулирования) перед выходом на уставку. При этом кривая должна стать еще больше похожа на идеальную. Если слишком сильно завысить дифференциальный коэффициент, температура при выходе на уставку будет расти не плавно, а скачками (как показано на рисунке).
При появлении таких скачков необходимо прекратить увеличение дифференциального коэффициента.
При настройке двух предыдущих коэффициентов можно получить практически идеальную кривую регулирования или близкую к ней кривую, удовлетворяющую условиям задачи. Однако, как правило возникает так называемая «статическая ошибка». При этом в нашем примере температура стабилизируется не на заданном значении 25 °С, а на несколько меньшем значении. Дело в том, что если температура станет равной уставке (то есть разность текущей и заданной температур станет равна 0), то пропорциональная и дифференциальная составляющая будут равны нулю (см. функцию преобразования ПИД-регулятора). При этом мощность регулятора тоже станет равна 0 и он начнёт остывать.
Для того чтобы исключить этот эффект, используют интегральную составляющую. Её необходимо постепенно увеличивать до исчезновение статической ошибки. Однако, чрезмерное её увеличение тоже может привести к возникновению скачков температуры.
Настройка ПИД-регулятора довольно сложный и трудоёмкий процесс. На практике достаточно тяжело достичь оптимального регулирования и зачастую в этом нет необходимости. Чаще всего достаточно добиться такого вида переходного процесса, который устроит пользователя в условиях текущей задачи.
lazysmart.ru
ПИД (или английская аббревиатура — PID) – это регулятор, осуществляющий пропорциональное, интегрирующее и дифференциальное управление. ПИД регуляторы находят широкое применение в современных системах точного контроля, таких как управление термосистемами и системами позиционирования. Использование ПИД регуляторов помогает уменьшить энергетические потери на настройку системы и обеспечивают более быстрый выход на требуемые параметры.
В общем случае ПИД регулятор получает значение определяющего параметра от объекта (Рис. 1) и воздействует на управление, состояние которого влияет на исходный параметр. Классическим примером применения ПИД регулятора являются управление термосистемой, будь это нагреватель или холодильная установка. Данный пример интересен тем, что нагрев или охлаждение процессы достаточно инертные и зачастую снижение температуры получается естественным путем из-за потерь
Рис. 1
ПИД регуляторы применяются в системах, математическое описание которых трудоемко, или не может быть получено из-за случайного характера воздействия внешней среды или помех. Для термосистемы информация о состоянии объекта представляет собой значение температуры с датчика, а объект управления – нагреватель системы. Размерности графиков приведены условно, так как точная модель регулятора зависит от конкретных особенностей термосистемы.
Рис. 2
Пропорциональное управление рассчитывается как произведение постоянного коэффициента Кpна текущую ошибку отклонения. Если включить в обратную связь нагревателя термосистемы только пропорциональное управление, требуемую температуру вообще невозможно достичь (Рис. 2). Это связано с инерционностью системы, так как управление нагревателем должно осуществляется с учетом динамики повышения температуры объекта.
Интегральное регулирование реализуется умножениясуммы ошибок температурдо текущего момента временина интегральный коэффициент KI. Для термосистем интегрирующее управление вполне может поддерживать заданную температуру(Рис. 3). Такое управление компенсирует запаздывание нагревание объекта и позволяет приблизиться к требуемому значению с большей или меньшей точностью. Для систем с меньшей инерционностью применения только интегрального управления неприменимо, так как запаздывание процесса накопления ошибки приведет к «вылетанию» регулируемого параметра и появлению колебаний.
Рис. 3
С применением дифференциального управления система получает возможность компенсировать возможную будущую ошибку параметра. Расчет дифференциальной составляющей численно выглядит как разность между текущим и предыдущим значением параметра, умноженную на коэффициент регулирования KD. Так как используется измерения, выполненные в небольшом интервале времени, ошибки и внешнее воздействие сильно влияет на процесс регулирования. Дифференциальное управление в чистом виде трудно реализуется для большинства систем из-за указанных факторов.
Рис. 4
В сумме, три компоненты ПИД регулятора обеспечивает получение эффективного результата в коротком промежутке времени (Рис. 4).
На практике лучшие результаты достигаются подбором констант для каждого компонента регулирования. Также находят применения саморегулирующие ПИД контроллеры, для которых коэффициенты рассчитываются программным путем внутри системы.
elektronchic.ru