регулятор?

Hello All!

Где бы подсмотреть исходник реализации ПИД-регулятора, желательно на Си, а не на ассемблере? Или почитать статью о том, как их _правильно_ писать. "кое-как" - я и сам умею, только что приятелю разжевывал. Хочется посмотреть как Умные Люди пишут...

Zahar(@spbdept.rbc.ru)

Reply to
Zahar Kiselev
Loading thread data ...

Hello, Zahar!

ZK> "кое-как" - я и сам умею, только что пpиятелю pазжевывал. Хочется ZK> посмотpеть как Умные Люди пишут...

Для ПИД - умные не те, кто пишет, а кто паpаметpы контуpа выставляет... Во где диссеpов наклепано...

Best regards, // Совесть - неотъемлемый компонент Yurij. // знаний и опыта.

Reply to
Yurij Sysoev

Hi Zahar, hope you are having a nice day!

24 Hоя 03, Zahar Kiselev wrote to All:

ZK> Где бы подсмотреть исходник реализации ПИД-регулятора, желательно на ZK> Си,

Почти в любой книжке, например:

double Kp; double Ti; double Td; double h; double Tt; double ref_value; int n;

double PID(double value); { static double I; static double D; static double old_value; double result; double out_error; double error;

error = ref_value - value; D += Kp * n * (old_value - value); D *= Td / (Td + n * h); // diff. filtering result = Kp * error + I + D; // calculate output power I += Kp * error * h / Ti; // calculate integral part if (result > MAXPOWER) // check limits { out_error = MAXPOWER - result; result = MAXPOWER; } else if (result < 0) { out_error = -result; result = 0; } else out_error = 0; I += out_error * h / Tt; // antiwindup (integral tracking) old_value = value; return result; }

ZK> а не на ассемблере?

Hа асме сложнее найти.

ZK> Или почитать статью о том, как их _правильно_ ZK> писать.

А как можно написать неправильно? Функция простая, как-то иначе написать ее трудно.

ZK> "кое-как" - я и сам умею, только что приятелю разжевывал. ZK> Хочется посмотреть как Умные Люди пишут...

WBR, AVB

ICQ# 43835774 mailto: avb<at>dialup.etr.ru

Reply to
Alexey V Bugrov

Hello, Alexey! You wrote to Zahar Kiselev on Tue, 25 Nov 2003 23:17:23 +0500:

AV> Kp * error + I + D; // calculate output power AV> I += Kp * error * h / Ti; // calculate integral part AV> if (result > MAXPOWER) // check limits { AV> out_error = MAXPOWER - result; AV> result = MAXPOWER; AV> } AV> else if (result < 0) AV> { AV> out_error = -result; AV> result = 0; AV> } AV> else out_error = 0; AV> I += out_error * h / Tt; // antiwindup (integral AV> tracking) AV> old_value = value; AV> return result;

Hе расскажешь ли подробнее, как работает механизм антинасыщения, а то, что то я не въеду никак? По сути, вроде бы, должно было бы так: интегральная компонента перестает накапливаться при выходе пропорциональной компоненты за допустимые пределы. Т.е. если разица между уставкой и измеренной величиной такова, что выходная мощность (без учета интегральной и дифференциальной компонент) выходит за пределы 0..100%, то интегральная компонента перестает накапливаться. Фактически, за пределами зоны пропорциональности ( 1/Ку) ПИД регулятор превращается в двухпозиционный регулятор.

With best regards, Serge.

Reply to
Serge Eremenko

Hi Serge, hope you are having a nice day!

26 Hоя 03, Serge Eremenko wrote to Alexey V Bugrov:

AV>> Kp * error + I + D; // calculate output power AV>> I += Kp * error * h / Ti; // calculate integral part AV>> if (result > MAXPOWER) // check limits { AV>> out_error = MAXPOWER - result; AV>> result = MAXPOWER; AV>> } AV>> else if (result < 0) AV>> { AV>> out_error = -result; AV>> result = 0; AV>> } AV>> else out_error = 0; AV>> I += out_error * h / Tt; // antiwindup (integral AV>> tracking) AV>> old_value = value; AV>> return result;

SE> Hе расскажешь ли подробнее, как работает механизм антинасыщения, а то, SE> что то я не въеду никак? По сути, вроде бы, должно было бы так: SE> интегральная компонента перестает накапливаться при выходе SE> пропорциональной компоненты за допустимые пределы. Т.е. если разица SE> между уставкой и измеренной величиной такова, что выходная мощность SE> (без учета интегральной и дифференциальной компонент) выходит SE> за пределы 0..100%, то интегральная компонента перестает SE> накапливаться. Фактически, за пределами зоны пропорциональности ( SE> 1/Ку) ПИД регулятор превращается в двухпозиционный регулятор.

Это один из вариантов антинасыщения. В данном случае при выходе мощности за

100% значение интеграла сбрасывается до значения, которое обеспечит выходную мощность равную 100%. Если это делать сразу (т.н. back calculate), то регулятор становится чувствительным к шуму (который может сбрасывать интеграл больше чем нужно). Поэтому коррекция производится с некоторой постоянной времени Tt, которая выбирается из соображений Tt = sqrt(Ti*Td).

WBR, AVB

ICQ# 43835774 mailto: avb<at>dialup.etr.ru

Reply to
Alexey V Bugrov

Hello, Alexey! You wrote to Serge Eremenko on Wed, 26 Nov 2003 18:30:28 +0500:

AV> Это один из вариантов антинасыщения. В данном случае при выходе AV> мощности за 100% значение интеграла сбрасывается до значения, AV> которое обеспечит выходную мощность равную 100%. Если это делать AV> сразу (т.н. back calculate), то регулятор становится чувствительным AV> к шуму (который может сбрасывать интеграл больше чем нужно). Поэтому AV> коррекция производится с некоторой постоянной времени Tt, которая AV> выбирается из соображений Tt = AV> sqrt(Ti*Td).

А какое ни будь теоретическое обоснование для такого вольного обращения с интегралом есть (хотя бы ссылочку)? Мне кажется, что качество регулирования при таком способе сильно пострадает. Хотя, конечно, может быть я ошибаюсь.

With best regards, Serge.

Reply to
Serge Eremenko

Hi Serge, hope you are having a nice day!

27 Hоя 03, Serge Eremenko wrote to Alexey V Bugrov:

AV>> Это один из вариантов антинасыщения. В данном случае при выходе AV>> мощности за 100% значение интеграла сбрасывается до значения, AV>> которое обеспечит выходную мощность равную 100%. Если это делать AV>> сразу (т.н. back calculate), то регулятор становится AV>> чувствительным к шуму (который может сбрасывать интеграл больше AV>> чем нужно). Поэтому коррекция производится с некоторой постоянной AV>> времени Tt, которая выбирается из соображений Tt = sqrt(Ti*Td).

SE> А какое ни будь теоретическое обоснование для такого вольного SE> обращения с интегралом есть (хотя бы ссылочку)? Мне кажется, что SE> качество регулирования при таком способе сильно пострадает. Хотя, SE> конечно, может быть я ошибаюсь.

Именно _теоретическое_ обоснование я дать затруднюсь. Hиже несколько ссылок в которых этот медот рассмотрен. Вообще в литературе он встречается очень часто. С точки зрения здравого смысла это не приводит к плохим результатам, т.к. влияет только на переходной процесс и в устоявшемся режиме не влияет на процесс вообще (а собственно здесь и работает интеграл. Практические наблюдения показывают, что с такой схемой регулирования регулятор себя ведет лучше, чем с простой блокировкой интеграла, т.к. схема одинаково хорошо себя ведет при любых значениях регулятора. Выбег получается существенно меньше.

formatting link
WBR, AVB

ICQ# 43835774 mailto: avb<at>dialup.etr.ru

Reply to
Alexey V Bugrov

Hello, Alexey! You wrote to Serge Eremenko on Thu, 27 Nov 2003 19:38:42 +0500:

AV> встречается очень часто. С точки зрения здравого смысла это не AV> приводит к плохим результатам, т.к. влияет только на переходной AV> процесс и в устоявшемся режиме не влияет на процесс вообще (а AV> собственно здесь и работает интеграл. Практические наблюдения AV> показывают, что с такой схемой регулирования регулятор себя ведет AV> лучше, чем с простой блокировкой интеграла, т.к. схема одинаково AV> хорошо себя ведет при любых значениях регулятора. Выбег получается AV> существенно меньше.

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

Спасибо за ссылочки, почитаю.

With best regards, Serge.

Reply to
Serge Eremenko

Hello, Serge! You wrote to Alexey V Bugrov on Fri, 28 Nov 2003 12:31:49 +0300:

AV>> собственно здесь и работает интеграл. Практические наблюдения AV>> показывают, что с такой схемой регулирования регулятор себя ведет AV>> лучше, чем с простой блокировкой интеграла, т.к. схема одинаково AV>> хорошо себя ведет при любых значениях регулятора. Выбег получается AV>> существенно меньше.

SE> IMHO, чаще всего интересует как раз переходный процесс. С точки зрения SE> установившегося процесса, достаточно выбрать поменьше коэффициент SE> усиления и побольше время интегрирования. При отсутствии возмущающих SE> воздействий регулятор всегда найдет необходимое значение выходной SE> мощности, при котором поддерживается заданная уставка, а при достаточно SE> большом Ti и маленьком Ку вообще не будет никакого выбега.

Если интеграл насытится, то выбег будет полюбому, а при малом Кp переходной процесс затянется. Реализацию , похожую на приведенную здесь я применяю в своих разработках, результатами вполне доволен. Кстати, astrom-ch6.pdf - это глава 6 из книги K.J. Astrom'а, весьма интересная (хотя и достаточно старая), советую скачать ее целиком (правда почему-то на том сайте нет второй главы).

WBR, AVB

Reply to
Alexey V Bugrov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.