Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
02.03.2011, 19:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: ПИД регулятор на С
Сообщение от Easyrider83
|
Таким образом два прерывания.
|
Зачем два? это вдвое увеличение RAM для сохранения контента. Всё в одном прерывании. Вообще ВСЁ.
Какая разница в каком прерывании запускать измерение АЦП и считывать результат. Длина кода и время исполнения одинаково, где бы его не написали.
При двух прерываниях полезная работа по запуску АЦП считыванию результата и вычислениях будет обрамлятся ещё двумя сохранениями-восстановлениями контента вместо одного...
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 02.03.2011 в 19:48.
|
|
|
|
02.03.2011, 20:35
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: ПИД регулятор на С
Сообщение от 7Fantomas7
|
Оно то все хорошо, только не смогли бы конкретизировать что такое Z-transfrom и что такое Z-домен. А то чет в сети рускоязычного на эту тему гулькин нос.
|
Объяснение зависит от того, сколько знаний у вас уже есть. Для начала нужно уметь расчитать ПИД регулятор в аналоговой форме. Используя частотный критерий стабиьлности. Сможете? В результате получаем его передаточную функцию G(s) = a + b/s + c*s, коэффициенты a,b,c рассчитываются. Для цифровой формы преобразуем G(s)-›G(Z) путем замены s = 2/T*(1-Z^-1)/(1+Z^-1). Делаем из полученной передаточной функции цифровой фильтр. Литературы полно, но нужно разбираться. рекомедую поискать здесь: http://rusbooks.webege.com/index.php
И еще есть хорошая книга "ТАУ для чайников / Поляков".
Сообщение от 7Fantomas7
|
И значение элементов формулы не подскажете ли.
|
В моей формуле все элементы - переменные int 32 бит. v_ref - эталонное значение, adc - результат АЦП, pwm - значение ШИМ котрым управляем. Формула вставляется в обработчик прерывания АЦП. Думал и так понятно.
|
|
|
|
02.03.2011, 22:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: ПИД регулятор на С
Цитата:
|
Для начала нужно уметь расчитать ПИД регулятор в аналоговой форме. Используя частотный критерий стабиьлности. Сможете?
|
Не смогу. Пока. Потому и спрашиваю..
Цитата:
|
Формула вставляется в обработчик прерывания АЦП. Думал и так понятно.
|
Ну ежиль понятно то всеравно необходимо проверится, а вот что такое e[0], а e[1]-это величина ошибки?.
|
|
|
|
02.03.2011, 22:36
|
|
Заблокирован
Регистрация: 06.11.2010
Сообщений: 267
Сказал спасибо: 13
Сказали Спасибо 108 раз(а) в 65 сообщении(ях)
|
Re: ПИД регулятор на С
|
|
|
Эти 11 пользователя(ей) сказали Спасибо кротоВ за это сообщение:
|
7Fantomas7 (02.03.2011), Catcatcat1 (03.03.2011), danilych2 (03.03.2011), dimchik_b (03.03.2011), dosikus (02.03.2011), leoblp (03.03.2011), master.k (03.03.2011), NikBatch (03.03.2011), roma2005 (03.03.2011), RY723 (03.03.2011), Serbond (04.03.2011) |
|
02.03.2011, 23:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: ПИД регулятор на С
Честно говоря не думал что так все усложнится. Попробую переварить.
Только вот мучает меня несколько вопросов. А нужно ли для решения моей задачи ПИД регулирование? Есть ли более лучшие методики регулирования? Может я просто вперся не туда?
Напомню что регулировать и стабилизировать необходимо ток в сварочной цепи, нагрузка очень динамичная.
|
|
|
|
02.03.2011, 23:57
|
|
Частый гость
Регистрация: 12.01.2008
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
|
Re: ПИД регулятор на С
Сообщение от 7Fantomas7
|
А нужно ли для решения моей задачи ПИД регулирование? Есть ли более лучшие методики регулирования? Может я просто вперся не туда?
Напомню что регулировать и стабилизировать необходимо ток в сварочной цепи, нагрузка очень динамичная.
|
Конечно, можно попробовать ПИ-регулятор. Но ПИД - наиболее оптимальный с точки зрения соотношения точности отработки и быстродействия.
Сообщение от tanq
|
Для начала нужно уметь расчитать ПИД регулятор в аналоговой форме. Используя частотный критерий стабиьлности.
|
Именно частотный, лучше всего минимум резонансного максимума
__________________
Нет слов "не могу" - есть "не хочу"
Последний раз редактировалось vikpol; 03.03.2011 в 00:01.
|
|
|
|
02.03.2011, 23:58
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: ПИД регулятор на С
Сообщение от 7Fantomas7
|
Ну ежиль понятно то всеравно необходимо проверится, а вот что такое e[0], а e[1]-это величина ошибки?.
|
e[0] - это предыдущая величина ошибки. Она сохраняется каждый раз.
Сообщение от 7Fantomas7
|
Не смогу. Пока. Потому и спрашиваю..
|
Тогда "ТАУ для чайников". По содежанию книга полноценная, но изллагается в ней более простым языком.
Сообщение от 7Fantomas7
|
А нужно ли для решения моей задачи ПИД регулирование?
|
Оно довольно простое. У тебя управляемая система грубо RL цепочка, т.е. первого порядка. Управлять ей просто. Указанный мной интегратор вполне с этим справится. Я пробовал его для драйвера светодиода и эксперементально для buck конвертера на 40 Вт (30 -›10 В). Обе системы 2 порядка, кстати. Последний лепил на ARM. И питал от лаботаторного БП. Что весьма примечательно, он держал на выходе ровно 10.00 вольт при изменеии входа от 14 до 32 вольт. У интегрирующего регулятора не очень хорошая динамика, но зато полностью отсутствует статическая ошибка регулирования. То есть в среднем выход абсолютно точно равен заданию.
Я рекомендую для начала испольовать его, а впоследствии формулу можно заменить.
У цифрового регулятора еще будет проблема с задержкой в АЦП и в ШИМ. Это актуально когда нужно высокое быстродейтвие - более 5 кГц. Но задержки можно скомпенсировать.
Сообщение от 7Fantomas7
|
Напомню что регулировать и стабилизировать необходимо ток в сварочной цепи, нагрузка очень динамичная.
|
Не очень она динамичная. У дуги полюс АЧХ расположен на частоте олколо 1,5 кГц, выше которой дуга начинает уже сущесвтенно напоминает обычный резистор. Ниже 1,5 кГц у нее сопротивление орицательное. Но нужно учитывать что в реал оно будет суммироваться с положительным сопротивлением выходного дросселя. Поэтому переход в отрицательное сопротивление будет сдвинут по частоте вниз.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо tanq за это сообщение:
|
|
|
03.03.2011, 02:47
|
|
Прохожий
Регистрация: 12.10.2007
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ПИД регулятор на С
В аппноте AVR221 есть готовый пример на C под компилятор IAR
|
|
|
|
03.03.2011, 09:29
|
|
Прописка
Регистрация: 07.12.2004
Адрес: Урал
Сообщений: 254
Сказал спасибо: 12
Сказали Спасибо 80 раз(а) в 42 сообщении(ях)
|
Re: ПИД регулятор на С
Вот это попробуйте. Еще учитывайте, что период вызова регулятора должен быть постоянным, и соответствующим необходимомй скорости регулирования. Если тема интересна действительно, то пишите в личку. Есть еще материалы и собственный опыт. Поделюсь. Здесь самое простое.
|
|
|
|
03.03.2011, 12:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: ПИД регулятор на С
Вобшем написал такое, честно сказать в тупую передрал из архива который предложил mironov. Изменений практически никаких за исключением того что переименовал переменные и некоторые константы.
Что делается в P, I, D более менее понятно, выглядит так:
Код:
|
void PWM_control_I(void){
#define Kp 10//коэфициент пропорционального усиления (30 прелагается как оптимум)
#define Ki 2//коэфициент интегрального усиления (0.3 предлагается как оптимум)
#define Kd 12//коэфициент дифференциального усиления (90 предлагается как оптимум)
#define MaxIntegral 1000//максимальная сумма ошибок (1000 предлагается как оптимум)
volatile signed int err;//отклонение измереной величины от заданой (величина ошибки)
static signed int pre_izmerenoe_I;//предидущее значение измерения
volatile signed int P_component;//пропорциональный компонент
volatile signed int I_component;//интегральный компонент
volatile signed int D_component;//диференциальный компонент
volatile signed int out;//управляющая величина
static signed int integral;//сумма ошибок
err=zadanie_I-izmerenoe_I;//расчитываем величину ошибки
/***************/
P_component=Kp*err;//расчитываем P_component
if (integral›MaxIntegral){
integral=MaxIntegral;}
else
if (integral‹-MaxIntegral){
integral=-MaxIntegral;}
else
integral+=err;
/****************/
I_component=Ki*integral;
/****************/
D_component=Kd*(pre_izmerenoe_I-izmerenoe_I);
pre_izmerenoe_I=izmerenoe_I;
out=P_component+I_component+D_component;
if(out›0xFF){
OCR2=0xFF;}
else
if(out‹0){
OCR2=0;}
else
OCR2=out;
} |
а вот как работает управляющая величина не понятно, почему коэфициенты Kp, Ki, Kd такие а не другие, почему максимальная сума ошибок 1000, а не другая? Влияет частота вызова этой функци на точность и с какой частотой нужно вызывать эту функцию для достижения максимальной точности? Критична ли точность работы этой функции к стабильности частоты вызова этой функции? Зависит ли величина коэфициентов от частоты вызова функции и если зависит то как?
Почему столько вопросов? Да очень просто, потому что нет полного понимания, потому что на макете конечно погоняю но любой бок в работе это -24$ минимум, а на макете все процесы всеравно не смоделирую и не отслежу.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:46.
|
|