Перейти к содержанию
    

Может кто нибудь видел сишные исходники ПИД регулятора. Хотчется глянуть как народ решает эту задачку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотчется глянуть как народ решает эту задачку.

 

Не только читали, но и писали. ;)

А что ж в этом такого сложного - в этой хорошо

известной формуле ? Берем ее - и вперед !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть классная книга - "Искусство программирования на С" (Хэффлд, Кирби).

Там есть все, что надо. Если трудно достать, то на сайте Diasoft (www.diasoft.kiev.ua) можно скачать диск с исходниками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть классная книга - "Искусство программирования на С" (Хэффлд, Кирби).

Там есть все, что надо. Если трудно достать, то на сайте  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 - коэффициент пропорциональности дифференциальной составляющей;

....

ну и дальше в таком же духе

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почему все стремяться к таким сложностям?

есть же решения, которые проще настраиваются

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почему все стремяться к таким сложностям?

есть же решения, которые проще настраиваются

Например?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

потом попробовали итерационный алгоритм. первый выброс не более 20 град, поддержка Т - +-5Град.

а коэффициентов всего два 1 - частота съема показаний с датчика,

2 - шаг одной итерации.

потом разогрев по прямой делали, тоже никаких проблемм.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

тут интересный материал

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. В принципе работает, но хочу попробовать новый алгоритм

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Что значит "убрать" ? Убрать переригулирование до 0 или до 20 градусов

это разные получатся времена.

Да, дело известное. Это "интегратор виноват ".

Тут можно рекомендовать применить разные параметры

ПИД - регулятора для первоначального нагрева и для

регулирования в установившемся режиме.

(Теоретически можно поэкспериментировать с уровнем

насышения интегратора. Это тоже может (могло) помочь.)

В общем, при первоначальном нагреве - релейный алгоритм,

при выходе на режим - ПИД.

 

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Вот я и говорю, что лучше нужно было ТАУ изучать :blush:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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

 

Не уверен, но по-моему, стоит посмотреть программы по автонастройке контуров. Например, www.ExperTune.com. Она есть у меня немного вылеченная :) Если возражений не будет, то в ближайшее время сброшу (где-то 8 МБ).

А также посмотри www.atm.h1.ru - очень подробно говорится о настройке регуляторов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приблудилось из Сети.

/*

 .
 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поможет или нет - не знаю, но посморите форум http://forum.cta.ru/forum_posts.asp?TID=758&PN=1 - там обсуждали настрйку регуляторов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...