avatar_Бандерівець

ПИД-Регулятор

Автор Бандерівець, 29-10-2011, 13:19:10

Попередня тема - Наступна тема

0 Користувачі і 2 Гостей дивляться цю тему.

БандерівецьTopic starter

Еще немножко и получу сбой мозгов :D

Задача на МК сделать ПИД регулятор, с начало нужно реализовать П-регулирование.
Формула для расчета П-регулятора

U = 1/Zp * Error, его запись где,
Zp = 1/К

Zp - зона пропорциональности, размерность такая же как и у Error.
Error = X.set - X.val,
X.set - уставка
X.val - текущее значение рег.параметра.
U - выход. меняетеся от нуля до единицы.

Ограничения на выход:
if(u < 0.0) u = 0.0;
else if(u > 1.0) u = 1.0;

Перейдем от теории к практики.
Есть ШИМ изменять параметры ШИМ можно от 0 до 255, для модели взял подогрев, допустим нам нужно удерживать температуру 50 градусов, реальная 30 градусов, коэффициент равен 1

X.set = 50
X.val  = 30
Zp = 1

U = 1/Zp * Error = 1/1*(50-30) = 0,05

И что дальше, как это U прицепить к значению ШИМ?
Вторые сутки ламаю голову. После того как возникла идея самому придумать велосипед, понял что я не туда двигаюсь.
-------------
П-регулятор дает нам отклонение от заданного значения, то есть при U = 0 у нас температура должна быть 50 градусов, но я воздействую на температуру через ШИМ, откуда я могу знать значение ШИМ при котором температура будет 50?. Да на столе я могу узнать, но на колоне без гемора никак, а если изменится температура в комнате или я захочу изменить температуру сново искать новое значение ШИМ. Как я себе представляю система сама должна расчитать значение ШИМ, смысл тогда ее?

Хочу заметить еще что характеристика значение ШИМ-Температура не прямая линия, чем больше значение ШИМ тем больше температура тем больше ее потери в окружающую среду.



БандерівецьTopic starter

С этой эту формулу U = 1/Zp * Error если  заданная температура будет равна реальной температура тогда(допустим на ноль можно разделить :D) U будет равно 1,  воздействия на систему нету.  Как  понимаю чтоб узнать значение ШИМ нужно U умножить на значение  ШИМ  при котором температура будет 50 градусов. То есть, например у меня при ШИМ = 70 температура 50

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

Я тут явно чего-то не понимаю/опускаю. А инфи в нета полно только  до управляющего сигнала, а как его использовать 0

БандерівецьTopic starter

Немного поплавав в бассейне, остудив мозги , выпив пива подумав,  сделал неутешительный вывод - наука "Автоматика" пошла ложным путем. :)

Вот формула(для примера) для пропорционального управления ШИМ=(Tset-Tsr)*30.0 + Tset*0.85, теперь представим что ошибка ровна 0, тогда ШИМ=Tset*0.85, эта формула имеет место для линейной зависимости температуры от ШИМ, но в реальности зависимость нелинейная, кроме того есть зависимость от внешней среды.

Как теперь я понимаю, задача должна быть следующая:
контроллер должен сам найти значение ШИМ для указаной нами температуры  и дальше использовать формулу выше, при чем это он должен делать при каждом включение, потому что параметры меняются в зависимости от внешней среды. То есть первая задача которую нужно решить это автоматический  оптимальный поиск константы, константа*параметр измерения


m16

ПИД-регулятор

заготовка для следящего, U=(P+I+D)/Zp, ПИД-регулятора с некоторыми пояснениями


/*
заготовка/болванка для ПИД-регулятора.
основные и главные вещи.

кой-какие пояснения:

#define real double

real themp // входная температура, регулируемый параметр, размерность - градусы
real thempSet // уставка температуры, размерность - градусы
real errThemp[3] // массив ошибок регулятора

real zoneProp // зона пропорциональности, размерность - градусы
real tauInt // постоянная интегрирования, размерность - секунды
real tauDiff // постоянная дифференцирования, размерность - секунды

real tauQuant // период квантования (реальный!!! период запуска функции регулятора), размерность - секунды

real tauDiffFilter // как бы кол-во усредняемых отсчётов Д-составляющей,
// не стоит увлекаться и делать это число слишком большим.
real tauOutFilter // как бы кол-во усредняемых отсчётов полного выходного сигнала, аналогично.
// подробности тут http://www.may.nnov.ru/mak/DSP/chEMA.shtml


полезные ссылки по теме
http://lord-n.narod.ru/walla.html#TheoryACUTP
http://lord-n.narod.ru/walla.html#creatPID
http://lord-n.narod.ru/walla.html#tunPID

важная ссылка!!!
http://lord-n.narod.ru/walla.html#Denisenko
для модификации регулятора с весовыми коэффициентами (гл.3.1),
потребуется расчитывать ошибки (и сохранять историю) отдельно для каждой составляющей!
т.е. массив ошибок должен быть таким => errThemp[3,3]
*/

KoeffNormOut = (real)MaxOut  / zoneProp; // нормировочный коэффициент

/****************************************/

errThemp[2] = errThemp[1];
errThemp[1] = errThemp[0];

//*******************************************************************
// Нормированная к отношению MaxOut/zoneProp ошибка регулирования для прямого регулятора.
// т.е. увеличивается температура - увеличивается выходной сигнал.
// режим - охлаждение нагревателя, обогрев.
errThemp[0] = (themp - thempSet) * KoeffNormOut;

// ошибка для обратного регулятора.
// режим - нагрев охладителя, охлаждение.
// errThemp[0] = (thempSet - themp) * KoeffNormOut;

// вычисление и простейшая фильтрация Д-составляющей с предварительным усреднением по двум отсчётам
Differential += (((errThemp[0] - errThemp[2]) * tauDiff * 0.5) - Differential) / tauDiffFilter;

// без предварительного усреднения
// Differential += (((errThemp[0] - errThemp[1]) * tauDiff) - Differential) / tauDiffFilter;

// вычисление И-составляющей методом трапеций с предварительным усреднением по двум отсчётам
Integral += (((errThemp[0] + 2*errThemp[1] + errThemp[2]) * tauQuant * 0.25) / tauInt);

// без предварительного усреднения
// Integral += (((errThemp[0] + errThemp[1]) * tauQuant * 0.5) / tauInt);

// Ограничитель И-составляющей
if(Integral > (real)MaxOut)
Integral = (real)MaxOut;
else
if(Integral < (real)MinOut)
Integral = (real)MinOut;

// Полный сигнал
tmpReal = errThemp[0] + Integral + Differential / tauQuant;

// Ограничитель полного входного сигнала
if(tmpReal > (real)MaxOut)
tmpReal = (real)MaxOut;
else
if(tmpReal < (real)MinOut)
tmpReal = (real)MinOut;

OutPID += (tmpReal - OutPID) / tauOutFilter; // фильтрация полного выходного сигнала

БандерівецьTopic starter

#4
m16, я это читал

P.S. Нашел у себя на компе исходники ПИД-регулятора с симулятором на делфи, прошелся в дебагере, понял как все работает, работает так же как я понимал, это все до одного места,  я разочарован в ПИД-регуляторе.
Вот формула с с исходников   Upr:=Mn * 127 + 127;, то есть при отсутствии ошибки 0 Upr = 127, то есть 127 будет переменной и будет зависеть от выставленной температуры, для меня 127 и для атмегушки ничего 127 не означает, для меня нужна температура, а моет атмегушке все равно и она.

P.S.S  но не все так печально,  когда-то напоюсь абсента и перепишу часть  истории по автоматике    :D

m16

Цитата: vovanxp від 29-10-2011, 21:38:41я разочарован в ПИД-регуляторе.
как совсем недавно в житаге ;о))))
http://electronix.ru/forum/lofiversion/index.php/t1467.html

БандерівецьTopic starter

m16, я объяснил почему мне не понравилось, посмотрим, П-управление я написал работает, только что закончил с I- и D- управлением, еще не запускал.

А с житагом я искал причину почему было не так и ее нашел, я думал что житаг глючить потому что клон.

m16

Цитата: vovanxp від 30-10-2011, 11:38:20я объяснил почему мне не понравилось
я чес говоря не понял причину

БандерівецьTopic starter

Установка параметров регулирования без знания характеристик обьекта
http://automation-system.ru/main/item/416-ustanovka-parametrov-regulirovaniya-bez-znaniya-xarakteristik-obekta.html

Игорь

Есть мысль нескольно отойти от ПИД-технологии, а пойти другим путем - путем последовательных приближений мощности.

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

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

С нагревом ясно. 3начению ШИМ 255 соответствует 100% мощности  нагревателя, а значению 0 - отсутствие нагрева. Чтобы установить - скажем - 20% мощности, нужно установить значение ШИМ 255х 20% = 51.

С потерями тепла сложнее - мы ими не управляем, и они - величина изменяющаяся. Они зависят от разности температур между водой и воздухом помещения, и еще от кучи мелких трудноизмеримых факторов, которые измерить трудно, но учитывать нужно.

Как определить мощность тепловых потерь?
Достаточно просто. Нужно включить нагреватель в режим терморегулятора. Пока температура воды ниже заданной, нагрев 100%, как только температура достигнута, нагрев должен полностью отключиться. В результате мы получим "старт-стопный" режим нагрева, так называемое позиционное регулирование.
Теперь нужно вооружиться секундомером и отсчитать две длительности - длительность включенного и выключенного состояния нагревателя. Их соотношение даст возможность в первом приближении оценить мощность реальных тепловых потерь. Если взять эти данные не за один период переключений, а за много, точность увеличится.
Допустим, за несколько периодов переключений нагреватель был включен 59 секунд, а выключен 78. Значит мощность теплопотерь составляет 59 / (59+78) = 43% от мощности нашего нагревателя, и для компенсации этих потерь нужно установить значение ШИМ 255 х 43% = 110.
Это базовое значение необходимой мощности. Разумеется, оно отличается от необходимого значения и не учитывает влияния изменения внешних факторов. Поэтому его необходимо непрерывно корректировать. Как?
Давай сделаем так-же, как и первый раз, но на новом уровне.

Установим вычисленный уровень мощности - 110 и запустим нагрев. Так как эта мощность обязательно на какую-то величину отличается от необходимой, температура не будет стоять на месте а куда-то поползет. Вверх или вниз - не важно.
Допустим, температура поползла вниз. Значит выбранная нами мощность недостаточна. Выбираем вторую мощность, которая будет заведомо избыточной. Ну, скажем, посредине между предыдущим максимумом (255) и последним выбранным значением (110), то есть (255 + 110) / 2 = 183.
Опять запускаем "термостатный" режим, но теперь уже переключаем не между 0 и 255, а между 110 и 183. При мощности 183 температура попытается вылезти выше нужного значения, и как только она "зашкалит" - включим 110. При этом нагреве температура поползет вниз и станет ниже нужного значения.
Снова настанет режим включений - выключений, то есть переключений с избыточной можности на недостаточную и обратно. Снова замеряем соотношение длительностей.
Допустим, длительность работы на 183 составит 50 секунд, а на 110 - 95 секунд. По этим двум значениям мы получаем уточненное значение тепловых потерь и значения ШИМ, которое нужно поддерживать.
ШИМ = (183 х 50 + 110 х 95) / (50 + 95) = 135.
Устанавливаем это значение нагрева и следим, куда поползет температура. Допустим, она поползет вверх от заданной температуры. Значит выбранное значение ШИМ избыточно. Принимаем его за новое значение максимума, и минимум выберем посредине между этим значением - 135  и предыдущим минимумом  - 110.  (135 + 110) / 2 = 122.

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

Это скелет, все еще сыровато, не видно например что делать если температура резко упадет (долили холодной воды).
К вечеру допишу.

За 4 - 5 циклов такого сужения расстояние между минимумом и максимумом снизится до 1 . Это уже можно режимом стабильности

Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

m16

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

Игорь

Цитата: m16 від 01-11-2011, 11:13:06для конкретного устройства всего лишь один раз подобрать три коэффициента и плевать на внешние факторы
Я тоже так считал пока не взялся за конкретную реализацию ПИД-регулятора.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

m16


GrOV

#13
Вот ещё инфа, может пригодится кому...
http://www.owen.ru/text/17029976
Мозги даны каждому..Не все читали инструкцию по эксплуатации..

БандерівецьTopic starter

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

SMF spam blocked by CleanTalk