Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ПИД регулирование
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Akakiy
Может кто нибудь видел сишные исходники ПИД регулятора. Хотчется глянуть как народ решает эту задачку.
-Tумблер-
Цитата(Akakiy @ Nov 18 2004, 07:05 PM)
Хотчется глянуть как народ решает эту задачку.


Не только читали, но и писали. wink.gif
А что ж в этом такого сложного - в этой хорошо
известной формуле ? Берем ее - и вперед !
Axel
Есть классная книга - "Искусство программирования на С" (Хэффлд, Кирби).
Там есть все, что надо. Если трудно достать, то на сайте Diasoft (www.diasoft.kiev.ua) можно скачать диск с исходниками.
gek
Цитата(Axel @ Nov 23 2004, 18:44)
Есть классная книга - "Искусство программирования на С" (Хэффлд, Кирби).
Там есть все, что надо. Если трудно достать, то на сайте  Diasoft (www.diasoft.kiev.ua) можно скачать диск с исходниками.
*

Море интересных тем, но мне нужен доступ на фтп.
Про цифровой пид регулятор тоже интересно, кто бы чего поподробнее выложил.
Например так
.....
Чтобы реализовать эту функцию управления в цифровой вычислитель-ной машине, должно быть выполнено квантование непрерывной функции в соответствии с периодическими замерами значения ошибки с последующим расчетом регулирующего воздействия. Соответствующее уравнение, являю-щееся основой для решения на цифровой вычислительной машине, имеет вид (3.3):
. Q(n)=Qf(n)+Qi(n)+Qd(n) (3.3)
где:
Q(n) – расчетное значение регулирующего воздействия в момент
квантования n;
QP(n) – значение пропорциональной составляющей регулирующего
воздействия в момент квантования n;
QI(n) – значение интегральной составляющей регулирующего
воздействия в момент квантования n;
QD(n) – значение дифференциальной составляющей регулирующего
воздействия в момент квантования n;
Модифицированное уравнение имеет вид (3.4):

. Q(n)=Kc*e(n)+Ki*{сумма от i=1 до n}e(i) +Qнач+Kd*(e(n)-e(n-1)) (3.4)

где:
Q(n) - расчетное значение регулирующего воздействия в момент квантования n;
KC - коэффициент усиления контура регулирования;
e(n) - значение ошибки регулирования в момент квантования n;
e(n-1) - предыдущее значение ошибки регулирования (в момент квантования n-1);
KI - коэффициент пропорциональности интегральной составляющей;
Qнач - начальное значение регулирующего воздействия;
KD - коэффициент пропорциональности дифференциальной составляющей;
....
ну и дальше в таком же духе
veter
почему все стремяться к таким сложностям?
есть же решения, которые проще настраиваются
Артемка
Цитата(veter @ Feb 3 2005, 23:21)
почему все стремяться к таким сложностям?
есть же решения, которые проще настраиваются
*

Например?
veter
решали задачу управления процессом аустенизации патрубков после сварки, поддержка температуры трубы на 1000 градусах

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

к нам подошел ответственный за работу и говорит: сделайте пока в релейном режиме - дошла Т до уставки вырубайте, снизилась врубайте. - таким методом достигли точности установки примерно в 20 градусов

потом попробовали итерационный алгоритм. первый выброс не более 20 град, поддержка Т - +-5Град.
а коэффициентов всего два 1 - частота съема показаний с датчика,
2 - шаг одной итерации.
потом разогрев по прямой делали, тоже никаких проблемм.
gek
Мда... Нужно было лучше Теорию Автоматического Управления учить
тут интересный материал
http://www.telesys.ru/wwwboards/mcontrol/8...ages/3748.shtml

объявления
signed int mem_UPR, mem_DAT;float R_E1[3], U_E2[2];
формулы
R_E1[0] = (float) (mem_UPR - mem_DAT);U_E2[0] = C0 * R_E1[0] - C1 * R_E1[1] + C2 * R_E1[2] + U_E2[1];U_E2[1] = U_E2[0];R_E1[2] = R_E1[1];R_E1[1] = R_E1[0];
R_E1 - разность между управляющим напряжением и напряжением обратной связи
U_E2 - управляющее воздействие
C1, C2, C3 из коэффициентов ПИД считаются так.
mem_UPR - измеренное управлющее воздействие в кодах АЦП
mem_DAT - измеренное напряжение обратной связи в кодах АЦП
Эти коды в приниципе надо привести к вольтам, но можно и в коэффициентах учесть.
C0 := Kp + ((Ki * T) / 2 ) + Kd /T;C1 := Kp + (2 * Kd) / T;C2 := Kd / T;
Здесь Т - время квантования, Кр - пропорциональный коэффициент, Кi - итегральный коэффициент, Кд - дифференциальная.
Формулы проверенные и рабочие

--------------------

То что приводил я выше взято из документации к логическим контроллерам фирмы siemens simatic s7. В принципе работает, но хочу попробовать новый алгоритм
-Tумблер-
Цитата(veter @ Feb 4 2005, 19:11)
сначала вдарились в ПИДрегулирование - настраивали такой регулятор месяца два. ничего не выходило - при выходе на режим наблюдался выброс на 100 град, а если его убрать (в смысле выброс )- до 1000 доходил аж за 7-10мин.

*

Что значит "убрать" ? Убрать переригулирование до 0 или до 20 градусов
это разные получатся времена.
Да, дело известное. Это "интегратор виноват ".
Тут можно рекомендовать применить разные параметры
ПИД - регулятора для первоначального нагрева и для
регулирования в установившемся режиме.
(Теоретически можно поэкспериментировать с уровнем
насышения интегратора. Это тоже может (могло) помочь.)
В общем, при первоначальном нагреве - релейный алгоритм,
при выходе на режим - ПИД.

smile.gif
veter
Цитата
Здесь Т - время квантования, Кр - пропорциональный коэффициент, Кi - итегральный коэффициент, Кд - дифференциальная.  Формулы проверенные и рабочие


а как выбирать их значения?
gek
Цитата(veter @ Feb 7 2005, 16:33)
Цитата
Здесь Т - время квантования, Кр - пропорциональный коэффициент, Кi - итегральный коэффициент, Кд - дифференциальная.  Формулы проверенные и рабочие


а как выбирать их значения?
*


Вот я и говорю, что лучше нужно было ТАУ изучать blush.gif
Остается только опытным путем. Т беретется самым минимальным, сколько можно достичь, остальными коэффициентами играться. Вот тут без графиков переходных процессов не обойтись. Строишь график измеряемой переменной и смотришь веоичину перерегулирования, колебательность и т.п.
-Tумблер-
Цитата(veter @ Feb 7 2005, 16:33)
а как выбирать их значения?


Что то тут можно почитать:

http://www.dian.ru/sh_autm.html

Автор этой статьи предлагает такую методику:
1. Отключаем все звенья, кроме ПЭ.
2. Увеличиваем Кп до тех пор, пока не появятся колебания.
Это и будет - Кп.
3. Измеряем период (частоту) этих колебаний.
4. Выбираем Tдиф = ~ этому периоду.
Это значит, запас по фазе будет 45 градусов, что достаточно.
5. Выбираем Tинт = ~10 * Tдиф.

6. после параметры можно еще уточнить используя:
http://members.vicard.net/sensor/main1_10.htm
smile.gif
sergag
[quote=-Tумблер-,Feb 10 2005, 15:09]
[quote=veter,Feb 7 2005, 16:33]

а как выбирать их значения?

Не уверен, но по-моему, стоит посмотреть программы по автонастройке контуров. Например, www.ExperTune.com. Она есть у меня немного вылеченная smile.gif Если возражений не будет, то в ближайшее время сброшу (где-то 8 МБ).
А также посмотри www.atm.h1.ru - очень подробно говорится о настройке регуляторов.
khach
Приблудилось из Сети.
Код
/*

 .
 position = ReadPlantADC();
 drive = UpdatePID(&plantPID,  
   plantCommand - position,
   position);
 DrivePlantDAC(drive);
 .
 
*/

typedef struct
{
 double dState;          // Last position input
 double iState;          // Integrator state
 double iMax, iMin;      
 // Maximum and minimum allowable integrator state
 double    iGain,        // integral gain
           pGain,        // proportional gain
         dGain;      // derivative gain
} SPid;
double UpdatePID(SPid * pid, double error, double position)
{
 double pTerm,
dTerm, iTerm;
 pTerm = pid->pGain * error;  
 // calculate the proportional term
// calculate the integral state with appropriate limiting
 pid->iState += error;
 if (pid->iState > pid->iMax) pid->iState = pid->iMax;
 else if (pid->iState
<
pid->iMin) pid->iState = pid->iMin;
 iTerm = pid->iGain * iState;  // calculate the integral term
 dTerm = pid->dGain * (position - pid->dState);
 pid->dState = position;
 return pTerm + iTerm - dTerm;
}
sergag
Поможет или нет - не знаю, но посморите форум http://forum.cta.ru/forum_posts.asp?TID=758&PN=1 - там обсуждали настрйку регуляторов
ucramola
Цитата(Akakiy @ Nov 18 2004, 20:05)
Может кто нибудь видел сишные исходники ПИД регулятора. Хотчется глянуть как народ решает эту задачку.
*


линк вдогонку http://www.jashaw.com/pid/code.htm
это конечно примитивщина, но на 1й раз пойдет

теория http://atm.h1.ru/root/theory/theory.html на "сруском"

а вообще для прграммирования удобней

u(k+1)=K1*u(k)-K2*u(k-1)+K3*u(k-2)
u(i)- управляющее воздействие на i шаге
K1,2,3-коэффициенты
max123
Модель ПИ регулятора.

Управление осуществляется по формуле:

Управление = Управление + Кп * (Текущее_рассогласование - Предыдущее_
рассогласование) + 1/ Ти * Текущее_рассогласование.

Управление(Out) выход регулятора шкала 0-100
Кп - коэффициент пропорциональности = 0.1
Ти - время интегрирования = 5 с

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

Интегральная часть (Ui) = 1/ Ти * Текущее_рассогласование


Шаг 1
Pv Расход воздуха равен 10 м3/ч
Sp Задание по воздуху 20 м3/ч
Текущее_рассогласование = Sp- Pv = 20 - 10 = 10
Предыдущее_рассогласование = 0
При первом включении регулятора Ui = - Кп * Текущее_рассогласование , что бы выход регулятора был равен 0.
Out = 0 + 0.1 * ( 10 - 0 ) + (- 0.1 * 10 ) = 0

Через 1 секунду

Шаг 2
Pv Расход воздуха равен 10 м3/ч
Sp Задание по воздуху 20 м3/ч
Текущее_рассогласование = Sp- Pv = 20 - 10 = 10
Предыдущее_рассогласование = 10
Ui = 1/5 * 10 = 2
Out = 0 + 0.1 * ( 10 - 10 ) + 1/5 * 10 = 2

Через 1 секунду

Шаг 3
Pv Расход воздуха равен 15 м3/ч
Sp Задание по воздуху 20 м3/ч
Текущее_рассогласование = Sp- Pv = 20 - 15 = 5
Предыдущее_рассогласование = 10
Ui = 1/5 * 10 = 2
Out = 2 (Out) + 0.1 * ( 5 - 10 ) + 1/5 * 10 = 2 - 0.5 +2 = 3.5

И т д

Если выход регулятора будет больше 100 или меньше 0 то
выход регулятора нужно замораживать
Fast
Эмпирически я получил (и использую для ФАПЧ КАМ-демодуляторов) такую разновидность
u(k+1)=K1*u(k)-K2*u(k-1) + K3*s(k)
s(k+1)=s(k) + Ka*u(k)

u(i)- управляющее воздействие на i шаге
s(i)- усредненное воздействие на интервале (постоянка)
K1,2,3-коэффициенты

Соотношение коэф-тов приблизительно
K2 = 0.2-0.7 K1
K3 = 0.1-1.0 K1
Ka = 0.001-0.1 K1

Характеристика ПИФ получается узкополосная, но пологая - достаточно быстрый захват и установление + приемлемое сглаживание в установившемся режиме
pschl
Прежде всего нужно начать с того, каков объект и его передаточная функция. Тип регулятора и инженерные методы его синтеза выбираются исходя из модели объекта. Да, классический случай прост, но, например для температурных процессов можно добавить форсирование, так как они медленные... и.т.д А задача программирования достаточно проста. Выбрать дискретный регулятор(модель) и вперед. Есть простой способ получения С кода регулятора. Берется MATLAB с Control System ToolBox, синтезируется и моделируется в нем система управления, а далее можно получить C- код регулятора, там даже некое API есть и библиотеки нужные, как это сделать, написано в документации.
Fast
Цитата(pschl @ Apr 27 2005, 19:57)
Прежде всего нужно начать с того, каков объект и его передаточная функция. Тип регулятора и инженерные методы его синтеза выбираются исходя из модели объекта.

Вот такой обобщенный вопрос:
А если не знаем объект и его передаточную функцию - и все это черный ящик. И модель объекта построить сложно, чтоб адекватно все свойства отражала.
Есть только входные воздействия и выходные отклики (и мы знаем какой он должен быть с вероятностью < 1). Что делать ??
То есть, как строить систему с обучением в общем я знаю, но как обучать, чтобы добиться лучшего приближения и макс. быстрой стабилизации(захвата) - очень хочу знать.

Что значит "форсирование"
Цитата(pschl @ Apr 27 2005, 19:57)
..можно добавить форсирование, так как они медленные...
yuriyc
Была аналогичная проблема. Достаточно долгий выход на режим из за перерегулирования и достатачно длительного затем успокоения системы. Причем требовалось убрать перерегулирование температуры совсем. Задача была в поддержании температур в диапазоне от 30 до 400 градусов с точностью не менее 0.2 градусов. выход на режим осуществляется с со скоростью от 0.5 до 100 грд/мин.
Перерегулирование происходит по двум причинам
1. влияние интегральной, накопившейся за время выхода на режим.
2. из за тепловой инерции системы.
Решилось следующим образом: Был взят класический ПИД закон. при выходе на заданную температуру интегральная составляющая не участвует. т.к. ее влияние важно только на этапе поддержания.
Затем империческим путем определена тепловая инерция системы. т.е. Перелет без участия интегральной. Таким образом получили формулу расчета, дельты когда при выходе на режим регулирование надо прекращать.
Тзаданная = Тзаданная - дельта.
После прекращения регулирования ждем падения скорости прироста температуры практически до нуля. и начинаем регулирование.
Чтобы не было провала в регулировании из за отсутствия интегральной ее надо начинать накапливать с температуры зависящей от скорости выхода и заданной температуры. (формулу получили также империческим путем)

Кстати. Можно еще не ждать перелета, а принудительно понижать скорость на конечном этапе.
Таким образом время выхода на режим уменьшается в разы
yuriyc
Кстати ПИД регудятор можно усовершенствовать. Добавив к нему постоянную составляющую, зависящую от заданного значения. Мы ведь знаем какое воздействие надо оказывать на систему в состоянии поддержания. Возьмем это воздействие вычтем где-то 5-10%. и добавим к резульату ПИД расчета.
Тем самым мы уменьшим время выхода на режим поддержания. т.к. интегральную составляющую надо копить меньше
-Tумблер-
Цитата
..при выходе на заданную температуру интегральная составляющая не участвует. т.к. ее влияние важно только на этапе поддержания. ..


Цитата(yuriyc @ May 5 2005, 09:07)
Кстати ПИД регудятор можно усовершенствовать. Добавив к нему постоянную составляющую, зависящую от заданного значения. 


Удивительно, как иногда разные разработчики независимо
друг от друга приходят к одним и тем же выводам. biggrin.gif
Что удивительно приятно. blush.gif

Могу лишь добавить, что иногда может быть удобно
определить массив "постоянных составляющих" для разных температур.
Так сказать, "равновесную кривую".
А значения между этими точками считать посредством
кусочно-линейной апроксимации.
yuriyc
Цитата(-Tумблер- @ May 6 2005, 14:40)
Могу лишь добавить, что иногда может быть удобно
определить массив "постоянных составляющих" для разных температур.
Так сказать, "равновесную кривую".
А значения между этими точками считать посредством
кусочно-линейной апроксимации.
*


Полностью согласен. При не линейности характеристик это очень даже поможет smile.gif Скорее это будет даже более правильным решением
khach
При ПИД регулировке нагревателей (и охладителей) столкнулся с ситуацией, когда постоянная времени "вверх" сильно отличаеться от постоянной времени "вниз". Кто нибудь сталкивался с регуляторами с двумя P (одна-"вверх", другая -"вниз")? И что говорит академическая теория устойчивости о таких системах?
yuriyc
Цитата(khach @ May 6 2005, 22:46)
При ПИД регулировке нагревателей (и охладителей) столкнулся с ситуацией, когда постоянная времени "вверх" сильно отличаеться от постоянной времени "вниз". Кто нибудь сталкивался с регуляторами с двумя P (одна-"вверх", другая -"вниз")? И что говорит академическая теория устойчивости о таких системах?
*

Ну на счет академическай теории устойчивости о таких системах не скажу. Не вкурсе. Но мне кажется, что конечная устойчивость будет связана с точностью управляющего воздействия. Так в систевах нагрева ее можно довести до сотых градуса используя электронагреватели. А вот при охлаждении уже нет такого результата. Так для крио установок на жидном азоте, заявленная точность крана впрыска +-5грд/сельсия. Охладить можно до -400грд. Тут уже вопрос в реализации системы и общем диапазоне рабочих температур.
Точность можно повысить, я думаю, за счет константы холода и регулированным подогревом.
Что касается постоянной времени, то если нагрев принудительный, то охлаждение наверняка естественное ну или обдув воздухом. Отсюда и разница. Эфективность то нагрева выше.
-Tумблер-
Цитата(khach @ May 6 2005, 22:46)
Кто нибудь сталкивался с регуляторами с двумя P (одна-"вверх", другая -"вниз")? И что говорит академическая теория устойчивости о таких системах?


Специально ничего такого от академической науки найти не удалось.
Что касается регуляторов температуры, то подозреваю что "все они такие".
Причем в Якутии это будет не так, как в Сахаре. blush.gif
Что можно было бы предложить ? Если очень надо, можно
использовать разные передаточные функции регулятора для процесса
нагревания и охлаждения. Видимо, так можно улучшить динамические свойства системы.
Общие законы устойчивости, конечно, не меняются.
'' ..достаточный запас по фазе на частоте единичного усиления
разомкнутой системы..''
smile.gif
ViDo
В продолжение темы вопрос. Нужно регулировать температуру в печи, на твердом топливе со шнековой подачей. Привод - асинхронный двигатель с частотным управлением. Я измеряю температуру и выдаю сигнал на частотник 0-10В, подойдет ли этот алгоритм? Я читал что на выходе ПИД - ШИМ сигнал, может чего путаю? huh.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.