Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Регулировка температуры (П ПИ ПИД регуляторы)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
AndryG
Доброго времени суток.
Начало истории банально - регулятор для инкубатора.
Железо - Tiny2313, DS18B20, симистор ...
каждые 2-е сек. читает температуру unsigned char ds_term "в десятых градуса" (366 -> 36.6 C)
может выставлять мощность нагревателя unsigned char pwr_level 0%-100% (управляем пропусками полупериодов по алгоритму Брезенхама) с дельтой в 1%
индикатор, кнопочки, проверка пропажы напруги, подача тревоги и другая хрень.

Теперь самое интересное - регулировка температуры.
На телесистемах нашел регулятор -- через время t проверяется температура: "жарко" - мощность--; "холодно" - мощность++ ... закинул лампу,вентилятор, датчик (спрятал в тень лампы) в коробку... температура то устанавливается через некторое время ... но с большими проскоками - сильно "жарко" порой бывает... если потом открыть коробку (проветривание/переворачивание яиц/любопытный нос), то опять пока установится ... сильно колеблется.

Второй вариант: "релейное управление" -- холодно/жарко - мощность 100/0% ... выходит сразу и красиво на нужную температуру ... почти без "проскока в жарко" ... но получается такая колебалка, что лампы долго не выдержат sad.gif (а в инкубаторе, в котором сгорел штатный регулятор ... лампы уж 40 скоро как работают ... если я их попалю за сезон - спасибо не скажут)

Третий вариант: "холодно" - 100% "жарко"-0% "норма"-XX%. XX - задаю кнопками сам ... вроде как можно и подобрать (методом тыка) для данного ящика ... но в полном итоге - фигня полная.

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

Нашел "ПИД в картинках" http://www.pidregulator.com/index.html ... понял, что все мои три варианта - извратные методы ПИД регуляторов ... решил, что мне нужен ПИ регулятор. (П - прост, а ПИД-очень крут)
http://icm-tec.com/main1_10.htm - еще один ресурс .. более-менее доступно (формул нет в несколько этажей smile.gif )

Самое противное, что не знаю как задать вопрос ...

Как в теме написано .. наверно стоит начать с ликеза по вышке ... объясните, пжлст, на пальцах ... что такое интеграл и как он влияет на график регулирования в ПИ регуляторе?

Не нужно посылать читать определение интеграла и т.д. -- начитался ... вот только неувязывается у меня "площадь под функцией" и "температура 36, надо 40 -- значит мощность +3"

Эх! Надежда, что найдется кто-нить, кто понимает, что я не знаю и что мне нужно ... спасибо за прочтение.
Kuzmi4
Ну в принципе на счёт ПИ - регулятора понятно - но вот формул я чтото не видел.

А на счёт интеграла вообсче (возьмём тот же пример с краном) - то в данном случае у тебя интеграл - пропорционален величине как долго кран у тебя открыт+как с него и что вытекало - плосчадь под графиком - у тебя и есть интеграл. Вои т получается что в зависимости от плосчади под графиком - тобто интеграла - нужно и регулировать мощность..

А на счёт "..."площадь под функцией" и "температура 36, надо 40 -- значит мощность +3"
..." - дайте прямую сцылочку - посмотримс....
Turnaev Sergey
Всё просто: интегралл в данном случае есть среднее значение контроллируемого параметра (температуры), за определённый период, которое и может получиться в вашем случае 36.
Т. е. к примеру температура колебалась в пределах 34, 36, 38 при этом среднее значение будет (34+38+36)/3=36, в данном случае период интегрирования равен трём.
Таким образом уменьшается ошибка измерения, которая бы возникла, если бы взяли только значение 34.
Затем это значение сравнивается с заданным 40. И исходя из разницы этих значений (40-36) пропорционально увеличивать мощность (или уменьшать).
AndryG
... наверно скажу полный бред ...
Немного теории в моей интерпретации ... насколько верно?
Наш ящик теряет тепло по закону F(t)... типа теплопередача, сквозняк и т.д. Если построить график колебания температуры, то мы получим график нашей функции F(t) ... теперь, дабы держать температуру на одном значении, нам нужно определить сколько тепла потеряла коробка (это и есть площадь под графиком - он же интеграл) и в зависимости от этого значения изменить мощность нагревателя.
Именно этот вариант у меня был в третьем варианте -- где произведение интеграла на кофф. я подобрал руками и температура держалась на одном уровне...
Но! Так-как F(t) у нас изменчивая, то мой вариант "однократного интегрирования" не пашет ... вот тут мы время разбиваем на куски ... и появляется "время интегрирования" ... так?

ДОБАВЛЕНО
__
P.S.
Нет. полную фигню написал ... не удивлюсь, если Вы даже не знаете как это прокомментировать
Bird2
А может применить трехпозиционный закон регулирования в данном случае? Для отопления помещений он вполне подходит.
AndryG
а можно подробней? типа греем/подогреваем/не греем? Для инкубатора прокатит и релейный метод ... но хочется разобраться с П ПИ ПИД ... чтоб их smile.gif
Tanya
Цитата(AndryG @ Nov 20 2007, 15:43) *
Доброго времени суток.

Теперь самое интересное - регулировка температуры.

Эх! Надежда, что найдется кто-нить, кто понимает, что я не знаю и что мне нужно ... спасибо за прочтение.

Я хоть и не Надежда... Но...
Интегральную составляющую включайте только тогда, когда пропорциональная часть или релейное управление устаканится... Иными словами, когда температура попадет в коридор...
Цыпляток жалко... Может теорию поучить... Как Вы подбираете коэффициенты? И очень-очень зря Вы спрятали температурный датчик в коробку....
AndryG
Цыплят и мне жалко - посему и на форуме сижу.
Теорию штудирую ... но проблема в том, что не грызется гранит нифига ... объясните с привязкой к жизни, что такое интеграл и интегральная составляющая ... и почему и к чему мы тут вообще интеграл вспомнили?
___
P.S.
Татьяна ... это лучше, чем Надежда smile.gif красивое имя.
Tanya
Цитата(AndryG @ Nov 20 2007, 17:59) *
Цыплят и мне жалко - посему и на форуме сижу.
Теорию штудирую ... но проблема в том, что не грызется гранит нифига ... объясните с привязкой к жизни, что такое интеграл и интегральная составляющая ... и почему и к чему мы тут вообще интеграл вспомнили?
___
P.S.
Татьяна ... это лучше, чем Надежда smile.gif красивое имя.

Все это Вы уже, наверное читали...
Банально, но в двух словах на пальцах...
Пропорциональная составляющая дает мощность пропорциональную невязке.
Поэтому, если инкубатор не полностью теплоизолирован, следовательно нужна некая средняя мощность, то эта средняя мощность появится только при некотором среднем отклонении температуры - температура в среднем будет ниже заданной.
Интегральная составляющая устраняет это безобразие путем медленной подстройки мощности.
И.С. пропорциональна интегралу от невязки по времени... Когда мы достигнем того, чего хотели, она перестает меняться. В установившемся (стационарном) режиме мощность полностью определяется ИС.
А почитайте-ка Титце с Шенком. Там все очень хорошо описано...
AndryG
и в третьем посте описан процесс "интегрирования на ходу"? ушел искать книгу ...
Bird2
Вкратце про трехпозиционный
Имеем
1. Нагреватель (типа греет- не греет - охлаждает (???) )
2. То что нужно нагревать и поддерживать постоянную температоуру (инкубатор)
3. Термадатчик
4. Блок управления

В блоке управления должны быть опции
1. Интервал нагрева
2. Интервал опроса
3. дельта температуры
Названия не совсем по теории, но ладно

Блок управления с периодом Интервала опроса опрашивает термодатчик. Если температура меньше чем заданная + коридор (дельта температуры), то греем на время Интервал нагрева. Если в коридоре - ничего не делаем. Если больше - охлаждаем на тот же Интервал нагрева (охлаждения)

Естественно Интервал нагрева <= Интервал опроса

Это все хорошо работает в отопительных системах помещений, но там клапана (открываются и закрываются), а здесь "отопитель и охладитель" или просто "отопитель".

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

Да и еще - с датчиком DS нужно аккуратно, добиться заявленной точности не так просто. Хотя для узкого коридора температур... нормально будет
Diko
Цитата(Bird2 @ Nov 20 2007, 21:43) *
Да и еще - с датчиком DS нужно аккуратно, добиться заявленной точности не так просто. Хотя для узкого коридора температур... нормально будет


Да было замечено, что при частом опросе - греется сам термометр, что приводит в свою очередь к ошибке измерения температуры до 2-4 градусов smile.gif ("Рядом" (около 5 см), находился ещё один такой же термометр, опрашиваемый в 10 раз реже)
sergeeff Jr.
Я бы все таки начал с составления системы уравнений и расчета передаточной функции системы (см. пример). Все остальное это скорее управление, чем регулировка.

А во вторых любой регулятор надо просимулировать, т.к. есть некоторые нюансы, которые не просчитать (что касается нестабильности), а это обязывает в наличии передаточной функции системы.
ogurets
может, эти статейки пригодятся

PID Without a PhD
http://www.embedded.com/2000/0010/0010feat3.htm

The PID controller из Nuts and Volts 2005 года
http://www.c51c51.com/index.php?lay=show&a...&Id=5337031
Tanya
Цитата(sergeeff Jr. @ Nov 22 2007, 11:36) *
Я бы все таки начал с составления системы уравнений и расчета передаточной функции системы (см. пример). Все остальное это скорее управление, чем регулировка.

А во вторых любой регулятор надо просимулировать, т.к. есть некоторые нюансы, которые не просчитать (что касается нестабильности), а это обязывает в наличии передаточной функции системы.

Инкубатор с яйцам, вентилятором и датчиком в коробке - увы, нелинейная система...
Автору надо ехать, а не шашечки... В его случае можно поставить еще ограничение скорости изменения задатчика, ограничение мощности (чтобы лампы были целы) и все будет хорошо... чтобы по-осени считать цыплят...
MaslovVG
Цитата(Bird2 @ Nov 20 2007, 18:09) *
А может применить трехпозиционный закон регулирования в данном случае? Для отопления помещений он вполне подходит.

Вполне подойдет и двухпозиционный регулятор.
Но есть тонкости. Первое датчик температуры должен находится по возможности вблизи Нагревателя.
Мощность нагревателя должна быть минимальна. только чтобы обеспечить нужную температуру, это значительно уменьшит перебег при отключении. Желательно обеспечить максимально быстрое выравнивание температуры в камере.(принудительная конвенция,теплопроводящие трубки, распределеный нагреватель.)
В случае применения ПИД регуляторов следует учесть очень большие постоянные времени. И "емкостный характер нагрузки" в виде теплоемкости объэкта регулирования. И большой "люфт"
(низкая скорость выравнивания температуры в камере).
AndryG
По термометру
У меня термометр живет на паразитном питании Управляется двумя функциями: ds_convert()-> инициализирует датчик и запускает конвертацию; и ds_read() -> читает температуру.
В основном цикле прокручиваются функции -> ds_convert ... 2 сек(время преобразования при 12 бит. 1.75 сек) ... ds_read ... ds_convert и т.д.
Саморазогрев идет 0.1 градуса. Посчитал, что пока можно смирится. а там посмотрим.
По трех-позиционном алг. управления
Насколько я понял, такой алгоритм прокатит в довольно инерционной системе ... а у меня ящик остывает с скорость примерно 0.75 от скорости нагрева smile.gif Примерно с таким алгоритмом я уже возился -- мощность нагревателя постоянно прыгает.

Ну и П-регулятор
http://icm-tec.com/main1_10.htm
Y=К·(U-X) , для П-регулятора К= 1/R·t0
Я так понял, что первым делом надо данные с датчика завести на комп и сварганить логгер - построить криву разогрева моего ящика ... тогда можно думать о расчете коф.
Но пока пара вопросов ...
Следуя закону Y=К·(U-X) при уменьшении невязки мощность нагревателя падает ... и в один прекрасный момент становится нулю ... коробка остывает - невязка увеличивается - нагреватель включается - невязка уменьшается - нагреватель выключается ... одним словом получаем колебания ... период которых зависит от качества изоляции моей коробки и К. Амплитуда в большей степени зависит от К ... вроде.

Если этот алгоритм впихнуть в мою коробку, которая остывает всего немного медленне, чем ее лампа нагревает ... то d (стат. ошибка) у меня должна быть ну Очень большой. Верно?

Ну это всё пока изыски ... "а что, а как" Вот теперь интереснее вопрос .. как X превратить в конкретный показатель мощности, который у меня в пределах 0..100 ? А если невязка отрицательную получу при "проскоке" или смене задания? Лампу в холодильник как превратитьsmile.gif ? или просто мощность в 0 ?
Bird2
Сорри за офф smile.gif
Я в детстве книжку читал, как два мальчика делали инкубатор. Использовали настольную лампу, термометр и тетрадки. Подкладывая или вынимая тетрадки со стопки они регулировали температуру!
Может стоит занятся созданием РОБОТА ДЛЯ ПОДКЛАДЫВАНИЯ ТЕТРАДОК?
Не бейте меня больно, я понимаю, что тема серъезная...
AndryG
Я так понял, что все махнули на меня рукой - безнадежен sad.gif
Demeny
Цитата(AndryG @ Nov 22 2007, 14:53) *
Следуя закону Y=К·(U-X) при уменьшении невязки мощность нагревателя падает ... и в один прекрасный момент становится нулю ...

Вот где ошибка. При уменьшении невязки падает не мощность, а приращение мощности, и при нулевой невязке мощность равна не нулю, а некоторому установившемуся значению. То есть я предлагаю сделать Вам не пропорциональный, а пропорционально-интегральный (ПИ) регулятор.
Теперь подробнее "на пальцах". 1) Измеренное значение температуры фильтруем (усредняем) на интервале, скажем, 10 секунд 2) Формируем сигнал ошибки (невязки) как разность заданной температуры (уставки) и фильтрованного значения текущей температуры 3) Теперь главный параметр - коэффициент усиления K, на него умножаем ошибку и ... 4) интегрируем полученное значение, т. е. U = U + K*Error на каждом цикле управления (например, раз в секунду). Это U и есть выдаваемая мощность на нагреватель, её нужно ограничить условием 0<=U<=100.
Настройка этого регулятора заключается в подборе коэффициента K , по теории автоматического управления он равен 1/T, где T - время выхода инкубатора на установившийся режим, т е холодный инкубатор -> включаем нагреватель на 100 % -> измеряем время до момента, когда температура практически не меняется, это и есть T в первом приближении, K = 1/T, затем K в процессе эксперимента нужно подобрать более точно. Если K будет завышен - интегратор слишком лихо будет гонять мощность, Вы будете всё время пролетать уставку. Если К будет слишком мал - инкубатор будет очень медленно выходить на режим и компенсировать открывание дверцы.
Чтобы в районе нужной температуры не гонять нагреватель, разумно сделать "зону нечувствительности" - коридор температуры вокруг уставки, где интегратор перестает интергрировать.
Dog Pawlowa
Я делал инкубатор в голодное начало девяностых. Неудачно :-)
Вместо мудреной электроники был ртутный термометр с размыкателем через ртуть.
Результат был печален - я не учел градиент температуры по объему. Произошло ужасное - яйца вверху - спеклись, яйца внизу - протухли, яйца в середине - наполовину.
Самое обидное, что даже непонятно было, что с этими яйцами делать sad.gif Есть было боязно.

Так что там про ПИД? smile.gif
Достаточно просто ПИ - регулятора. Можно не париться диф составляющей, все равно инкубатор периодически проветривать и остужать.
И еще. Аппаратура и программа должна иметь возможность плавно управлять мощностью через ШИМ. Напишите и отладьте такую промежуточную функцию SetHeaterPower(char percentage).
Тогда регулятор сведется до одной формулы. Успехов smile.gif
AndryG
Спасибо за ответ ...
Я дальше ПИ и не дергаюсь smile.gif Но хочется разобраться с теорией хоть немного.
Demeny Если не против, то давайте пока про П-регулятор ... без интегралов... Если в Y=К·(U-X) Y- [u]изменение[u] мощности, то тогда понятно и что будет при "проскоке" - уменьшение текущей мощности.

R=Ymax/tи ... Здесь именно (я так понял ) и идет привязка к моей макс. мощности. А здесь необходимо указывать мощность нагревателя (40Вт лампа) или 100 единиц, которыми я оперирую в прошивке сейчас?
Если нужно ставить 40 - реальную мощность ... то, получается, потом придется делать перевод с реальной мощности в мою процентную шкалу sad.gif
Ааааааа! Капут!

Dog Pawlowa, мощностью я плавно уже управляю - 100 градаций от 0 до 100%
Dog Pawlowa
Посмотрел я свои исходники прибора, где требуется очень точная установка температуры.
Вообще без регулятора! То есть пропорциональный с "ручным" пересчетом мощности в зависимости от разности требуемой и действительной температур. За счет большой мощности нагревателя колебания отклонения получились около 0,1 градуса.
А 100 градаций мощности - это супер, все нормальные пацаны так делают a14.gif
Tanya
Цитата(AndryG @ Nov 23 2007, 15:07) *
Я так понял, что все махнули на меня рукой - безнадежен sad.gif

Что Вы так странно реагируете? Уже столько было советов, отчасти правильных.
Вот еще. Не знаю, какой у Вас Контроллер, но советую для настройки коэффициентов П и И использовать
переменные резисторы, которые Вы будете крутить, а контроллер считывать... Не переживайте - точность подбора этих параметров низкая...
Я один раз была на экскурсии в инкубаторе - он был очень большой - целый дом. Глаза только резало от формалина... Оказалось, что бедные цыплята вылупляются не одновременно. Первые ждут освобождения пару дней... Без еды и питья. В темноте. Какая-то часть не дожидается.
Дышат формалином. Там еще влажность стабилизируется. Еще зачем-то кассеты с яйцами переворачивались автоматически. Как часто - не знаю.
Wildcat
Цитата
Результат был печален - я не учел градиент температуры по объему

А ведь товарищ прав. Неплохо иметь это ввиду. Если объем большой, то и колебания будут большими. Может, поставить еще один датчик температуры ? И при вычислениях учитывать их разность.
sergeeff Jr.
А может если объем большой, то все таки добиться равномерного распределения температуры (каким угодно методом). Это как включать инфракрасную лампочку в одном конце ангара, а в другом конце мерять температуру...
AndryG
Спасибо всем за ответы ... не стоит поднимать тему высиживания цыпляток :-) ... давайте лучше о П-регуляторе smile.gif А?

Может ответите на пост 17 и 22 ?
Demeny
Цитата(AndryG @ Nov 25 2007, 15:03) *
Спасибо всем за ответы ... давайте лучше о П-регуляторе smile.gif А?
Может ответите на пост 17 и 22 ?

Давайте. П-регулятор не подходит для Вашей задачи. Инкубатор - достаточно сложный объект с большой постоянной времени. Лучше использовать ПИД-регулятор, но поскольку у Вас нет опыта построения и отладки систем автоматического управления, Вам будет сложно настроить дифференциальную составляющую регулятора. Поэтому я предложил Вам ПИ-регулирование несколькими постами выше, расписав всё подробно "на пальцах" и указав единственный параметр, который придётся подстроить, чтобы регулятор не вошел в колебательный режим. Не нужно бояться слова "интеграл" - это всего лишь сумма в контексте данной задачи smile.gif
AndryG
smile.gif не боюсь ... и я понимаю, что П мало и надо ПИ ... но хочется по порядку ... так легче разобраться.

Вот и спрашиваю ... насколько я понял "чтиво" привязка к моим отсчетам мощности происходит при вычислении R ?

Понимаю, что с практикой куча вопросов отпадет ... вот доделаю опторазвязку на ком-порт - нарисую на компе кривую разгона моего ящика .. да буду считать smile.gif
andrej2005
Интересно узнать как разрешилась Ваша проблема?
AndryG
Теорию переварил ... а на практику вернуться - нет времени ... да и сложновато одному ковыряться.
Kass
AndryG , Я тоже задался целью создать такой регуляторю. Элементная база такая-же. Пожалуйста, поделитесь опытом, как у вас все получилось.
И еще вопрос: При опросе датчика, вы пользуетесь стандартными функциями С-компилятьра (у меня CodeVision) или писали свои на asме?
Меня беспокоит такая штука: просто стандартная функция опроса датчика на С не любит когда в нее врывается прерывание, а опрос датчика продолжается довольно долго. У меня по прерыванию считаются полупериоды сетевой частоты, и т.д.; как у вас это сделано?
AndryG
http://andryg.ho.ua/index.php?p=ds18b20_simple - мой код для CV по работе с датчиком. Встроенные функции используются, но только по работе с шиной.

Никак у меня не получилось ... с теорией в общем виде разобрался ... но перевести это всё на практику ... забросил ... хотя точнее сказать "отложил в сторону".

последний затык был ... выбор времени интегрования ... через какие промежутки читать температуру? сколько выборок использовать в интеграторе? и т.д.
PhX
Для начала разберемся с П-регулятором.
Итак, есть какая-то система допустим инкубатор.
1. У инкубатора есть выходная контролируемая величина - температура.
2. У инкубатора есть управляющее воздействие (допустим ток, протекающий через нагреватель) - u.

Стоит задача поддержать температуру на заданном уровне.

П - регулятор

Алгоритм. (Исполнитель - робот)
Итак робот каждую секунду (можно меньше или больше) просыпается и
1. Сравнивает желаемую температуру с температурой фактической и вычисляет ошибку
e=tзад - tфакт.
2. Вычисляет необходимое в данный момент времени управляющее воздействие по закону:
u=k*e,
где k - некоторый коэффициент (подбираемый эмпирически);
3. Проверяет находится ли величина требуемого управляющего воздействия в допустимых пределах.
Если u<0 то u=0 (ток через нагр. элемент выключить).
Если u>uмакс, то u=uмакс. (чтобы ничего не сгорело).

Это понятно?
PhX
Теперь о И-регуляторе (чисто интегральный регулятор).
Интегральный регулятор предназначен для повышения точности стабилизации регулируемой величины.

Математическое описание в непрерывном виде
u = kинт*integ(e,dt),
где
integ(e,dt) - интеграл от ошибки регулирования по времени. Отметим, что этот интеграл вычисляется не зарание и не после, а во время процесса управления.

Переведем алгоритм И-регулирования в дискретную форму.


Алгоритм
1. Сравнивает желаемую температуру с температурой фактической и вычисляет ошибку
e=tзад - tфакт.
2. Робот вспоминает, какое управляющее воздействие он использовал на предыдущем шаге uпр_шаг.
Вычисляет управляющее воздействие для данного шага:
u= T*kинт*e+uпр_шаг (очень грубое представление интеграла, но при малых T подойдет).
3. Проверяет находится ли величина требуемого управляющего воздействия в допустимых пределах.
Если u<0 то u=0 (ток через нагр. элемент выключить).
Если u>uмакс, то u=uмакс. (чтобы ничего не сгорело).
4. Записывает значение u в uпр_шаг.
5. Исполняем оставшуюся часть подпрограммы. Засыпаем до следующего прерывания.

Почитайте апноту. Полное решение вашей задачи. Проц другой но, я надеюсь это не проблема.
Kass
PhX, есть некоторые вопросы. 1)u= T*kинт*e+uпр_шаг что такое Т, какой "kинт" хоть примерно, и на что эти величины влияют?
2) Как соединить П и И законы (напишите пож алгоритм для ПИ.)
Сразу говорю что с математикой туговато, но вобщем мозги вроде бы имеются.
AndryG писал "последний затык был ... выбор времени интегрования ... через какие промежутки читать температуру? сколько выборок использовать в интеграторе? и т.д. "
Количество выборок интегратора это количество запомненых uпр_шаг, или как? Объясните на пальцах пожалуйста. Что такое время интегрирования, как оно влияет на результат, какое должно быть для такого обьекта как инкубатор?
Aesthete Animus
- это коэффициент интегральной составляющей. Подобные коэффициенты обычно подбираются опытным путем из "общих" инженерных соображений.

Закон ПИ выглядит довольно просто:



Тоесть, все предельно просто. Берете рассогласование - умножаете на коэффициент , берете интеграл от рассогласования (фактически, накопленную сумму рассогласований) и умножаете на в результате получаете виличину управляющего воздействия. Пропорциональная составляющая реагирует на малые расхождения желаемой и задfной величин. Интегральная составляющая - на большие, она как бы подтягивает точку равновесия в ту область, где будет эффективно пропорциональное регулирование.

Цитата(Kass @ May 8 2008, 12:48) *
Меня беспокоит такая штука: просто стандартная функция опроса датчика на С не любит когда в нее врывается прерывание, а опрос датчика продолжается довольно долго. У меня по прерыванию считаются полупериоды сетевой частоты, и т.д.; как у вас это сделано?

Какой датчик используете? Если что-нибудь наподобее ds1820, то можно проверять контрольную сумму.
Kass
Что значит :
Цитата(PhX @ May 8 2008, 23:13) *
integ(e,dt) - интеграл от ошибки регулирования по времени. Отметим, что этот интеграл вычисляется не зарание и не после, а во время процесса управления.
Это как понимать???
Aesthete Animus
Цитата(Kass @ May 12 2008, 21:38) *
Что значит : Это как понимать???

Это значит, что сей интеграл вычисляется в время работы железяки, к примеру, банальным суммированием рассогласований.
PhX
Цитата(Kass @ May 12 2008, 14:27) *
2) Как соединить П и И законы (напишите пож алгоритм для ПИ.)

Что-то я отвлекся smile.gif
Алгоритм для ПИ:
Робот каждую секунду (интервал интегрирования T) просыпается и
1. Сравнивает желаемую температуру с температурой фактической и вычисляет ошибку
e=tзад - tфакт.
2. Вычисляет пропорциональную составлющую упр. возд. по закону:
uпр=kпр*e,
3. Робот вспоминает, какое значение интегральной составляющей он использовал на предыдущем шаге uи_пр_шаг.
Вычисляет интегральную составляющую упр. возд. для данного шага:
uи= T*kинт*e+uи_пр_шаг
4. Запоминает интегральную составляющую
uи_пр_шаг = uи
5. Вычисляет общее упр. возд. суммированием пропорц. и интегральной составляющей
u= uпр + uи
6. Проверяет находится ли величина требуемого управляющего воздействия в допустимых пределах.
Если u<0 то u=0 (ток через нагр. элемент выключить).
Если u>uмакс, то u=uмакс. (чтобы ничего не сгорело).
5. Исполняет оставшуюся часть подпрограммы. Засыпает до следующего прерывания.

uпр(0) = 0; uи(0) = 0
Алгоритм в виде рекурентной формы:
uпр(i) = kпр*e(i)
uи(i) = T*kинт*e(i) + uи(i-1)
u(i) = uпр(i) + uи(i)
i = 0,1,2... 0 - начало, 1 - первре прерывание, 2 - второе прерывание and so on smile.gif

Рекомендации по поводу выбора коэффициентов:
Если Вы не дружите с математикой выбор коэффицентов осуществляется эмпирически.
0. Для таких объектов как инкубатор время (постоянная времени инкубатора Tинк>100 с.), через которое происходит вызов прерываний должно быть T<= 0.1 сек (в принципе можно больше, но все современные МК легко уложатся в 0.1 с. T это то самое T, которое в алгоритме).
1. В начале установите kинт = 0.
2. Подберите kпр таким, чтобы достичь требуемого быстродействия (слишком высоко также задирать не надо. Следите за током нагр. элементов он должен изменяться плавно, а не релейно).
3. Аккуратно увеличивайте величину kинт. Добивайтесь требуемой точности.
Andrey_B
Цитата(AndryG @ May 8 2008, 14:01) *
последний затык был ... выбор времени интегрования ... через какие промежутки читать температуру? сколько выборок использовать в интеграторе? и т.д.


Все временные параметры нужно выбирать исходя из инерционности всей системы.
Основные проблемы при реализации ПИ-, ПИД-регуляторов, это механизм
антинасыщения, и собственно подбор коэффициентов. Вот небольшой кусок
из фидошной эхи RU.EMBEDDED, где простым языком описана реализация
ПИ-регулятора на МК :

==============================================

Изложенный ниже (1)алгоритм не мой, и уже публиковался в эхе, но без привязки к
системе Физическая величина-АЦП-процессор(2).
(1)
И так:
Uz - задание регулятора , code
Uos - обратная связь , code
e=Uz-Uos - рассогласование , code
Ky - коэффициент усиления , byte
Ti - постоянная времени интегрального звена , sec
t - период опроса АЦП , sec
E=E+e - "виртуальный"конденсатор интегрального звена
Итоговая формула ПИ регулятора:
Uout=Ky*(e+Е*t/Ti)
(2)
Для оптимизации работы параметры Uz, Uos, e, Uout - это числа с разрядностью
как у АЦП (8, 10, 12, 16 ... и т.д. бит) процессору ведь всё равно, что он
считает, 0.001В(Вольт) или 0х0001 (только для 0.001 неплохо было бы иметь FPU).
Коэффициент усиления пусть будет целым однобайтным числом (ни разу на практике
не встречал коэффициент больше 100)
t/Ti вычисляются заранее и представляют собой число с фиксированной точкой,
размерность которого зависит от максимальной Ti которую ты планируешь
использовать в системе регулирования
Пример:
Частота опроса АЦП - 14500 Гц
т.е. t=1/14500=0.00006897 сек
максимальная Ti = 3 сек
t/Ti=0.00002299
Перевод в число с фиксированной точкой с точностью 4 знака после запятой:
0.00002299*0х10000 =1.5066.. полученная целая часть и есть значение с
точностью 4знака после запятой (0х10000 - кл-во нулей после 1 определяет
точность) после чего можно записать, что t/Ti=0.0x0001 - если ты не собираешся
использовать постоянные времени меньше 0.001 сек то смело можешь считать что
полученная константа - двухбайтовое беззнаковое число 0х0001.
Если Ti будут небольшими (в данном случае меньше 0.00006 сек) то придётся
учитывать и целую часть числа (0х01.0х2640).
Если тебе нужны Ti>10 то увиличивай точность 0х10000... но чтобы точность
всегда была чётной иначе будут серьёзные тормоза при умножении (особенно на
восьмибитке)

Выбор разрядности Е:
Требование одно, чтобы Е не переполнялся при самой большой постоянной
времени, а то получишь генератор пилообразного напряжения (или температуры smile.gif
Контролируй и ограничивай Uout на предмет максимального значения (не больше чем
макмальный код АЦП) после этого нужно обходить процесс интегрирования до тех
пор
пока е (рассогласование) не сменит знак, иначе регулятор уйдёт в глубокой
насыщение
что при больших Ti чревато серьёзными последствиями (например на двигатель
совершенно бесконтрольно (допустим ты написал регулятор и решил его проверить,
а
защиты ещё не реализовал) подаётся максимальное напряжение в течении
длительного
времени).
Из произведения E*t/Ti для дальнейшихз вычисления (сложение с е) бери только
челую часть , в данном случае отбрасываешь два младших байта. При сложении не
забывай учитывать знак е, т.к. результат будет многобайтовым, перед сложением
расширяй е до разрядности Е с учётом знака (аналог movsx в х386).

Как и чем управлять:
Uout имеет тоже кол-во разрядов что и АЦП, соответственно напрашивается
таблица КодУправленияПреобразователем=ТаблицаКодов[Uout] что при большом
количестве памяти совершенно логично, целесообразно и экономит немалое кол-во
вычислительных ресурсов.
Допустим у меня тиристорный преобразователь (ТП), угол управления кодируется -
2х байтным числом, следовательно при разрядноси АЦП 12бит размер таблицы
0xFFF*2=8Кб.
С ШИМ всё гораздо проще т.к. он чаще всего реализован аппаратно.
Таблицу нужно сразу расчитать для получения наилучшей характеристики эдс
преобразователя от кода управления ,для ТП это синус.

==============================================

На этом форуме обитает авторитетный человек, по этим вопросам - LordN,
поищите поиском, тема уже обсуждалась.
h_t_t_p://lord-n.narod.ru/walla.html#Automatica

И по поводу градиента температуры, для ее выравнивания нужно перемешивать
воздух, например вентилятором.
Kass
PhX и Andrey_B , большое спасибо за исчерпывающие ответы. Вчера сделал только П-регулирование. Результат превзошел ожидания: при коэф. усил (Кпр) 0,5 наблюдалась статическая ошибка 0,6 градуса. (как и в теории) При Кпр = 5, - небольшое перерегулирование (0,1градуса), и общая раскачка 0,3градуса. Выходит на режим долго. Испытывал в банке с водой (0,5литра), нагреватель - миникипятильник 350Вт. Чтитал в теории, что для правильного подбора коэффициентов нужно знать кривую разгона(если есть соображения - поделитесь). И еще, датчик DS1820 имеет погрешность около 0,5градуса, т. е. надо калибровать. Если кто занималься этим, напишите, интересно узнать как это делали вы.
Andrey_B
Цитата(Kass @ May 15 2008, 11:57) *
Вчера сделал только П-регулирование. Результат превзошел ожидания: при коэф. усил (Кпр) 0,5 наблюдалась статическая ошибка 0,6 градуса. (как и в теории) При Кпр = 5, - небольшое перерегулирование (0,1градуса), и общая раскачка 0,3градуса. Выходит на режим долго. Испытывал в банке с водой (0,5литра), нагреватель - миникипятильник 350Вт. Чтитал в теории, что для правильного подбора коэффициентов нужно знать кривую разгона(если есть соображения - поделитесь). И еще, датчик DS1820 имеет погрешность около 0,5градуса, т. е. надо калибровать. Если кто занималься этим, напишите, интересно узнать как это делали вы.


У атмела есть путевая апнота http://www.atmel.com/dyn/resources/prod_do...nts/doc2558.pdf хоть на английском, но понятная.
Погрешность датчика даст статическую ошибку, которую действительно можно убрать калибровкой. Она не влияет на точность(стабильность) поддержания температуры. А вот дрейф(шум) датчика влияют, их можно минимизировать фильтрацией и усреднением поступаемых данных.
По поводу подбора коэффициентов, обычно применяют метод Циглера-Hиколса, вот еще вырезки из фидо на эту тему :

==================================================

Для рассчета необходимо знать Ku (ultimate gain). Для этого при настройке
система включается в релейный (триггерный)
режим с небольшим гистерезисом. Hужно зафиксировать амплитуду A и период Tk
установившихся колебаний температуры
нагревателя (объекта).

Ku = (4*d)/(Pi*A), где d - амплитуда колебаний выходной мощности (в нашем
случае 50, т.к. полная мощность 100), А -
амплитуда колебаний температуры (не перепутай с двойной амплитудой). Эта
формула упрощенная, но дает неплохие
результаты.

Тогда по Циглеру-Hиколсу:

Kp = 0.6 * Ku;
Ti = Tk / 2;
Td = Tk / 8;

==================================================

Рассчет коэффициентов регулятора (K, Ti, Td, Tt) исходя из значений Ku
(ultimate gain) и Tu (ultimate period). Как будут получены Tu и Ku, дело десятое.
Можно и step response применить, и relay feedback (optional with hysteresis) и
даже метод свободных колебаний.

По Ц-H для ПИД-регулятора:

K = 0.6 * Ku;
Ti = 0.5 * Tu;
Td = 0.125 * Tu;
Tt = SQRT(Ti * Td); // или приближенно Tt = 0.25 * Tu;

==================================================

Обычно можно начать с того, что yстановить максимально возможный
Ti и минимально возможный Td и затем подбиpая Kp добится пеpвого
пpиемлемого pезyльтата. После этого yменьшают Ti с той же целью,
и в последнюю очеpедь yвеличивают Td.
Окончательнyю доводкy ведyт на pеальном yстpойстве в pеальном
pежиме pаботы.

==================================================

Для любителей настраивать PID на глаз есть такой метод:

1) D = 0, I = 0. Увеличиваем P, пока не начнутся колебания.
Откатываем P назад вдвое относительно порога автоколебаний.
2) Теперь оставляем P там же и настраиваем I до порога колебаний
и откатываем вдвое назад.
3) Теперь оставляем P и I, точно так же настраиваем D.

EK> Хочется побороться за меньшее значение, может быть посредством
EK> автоматической настройки - хостовой PC пишет в контроллер коэфиициенты,
EK> задает тестовую траекторию, меряет отклик и т.п.
EK> Хотелось бы почитать умные мысли на этот счет, а то что-то "ручками и
EK> глазками" получается таки лучше чем посредством дурной программы.

Классика. Меряется step response, дальше методом Циглера-Hикельса.


EK> А чем оно лучше/ хуже
EK> 1) выставляем P в минимум, I - в ноль
EK> 2) поднимаем D до состояния "critically dumped"
EK> 3) поднимаем P до максимума, при котором остается "critically dumped" или
EK> чуть больше с небольшим переколебанием
EK> 4) поднимаем I для уменьшения статической ошибки и тоже чтобы не выйти на
EK> колебательный режим.

==================================================
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.