roboforum.ru

Технический форум по робототехнике.

ПИД (на ПИКе)

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Re: ПИД (на ПИКе)

Сообщение =DeaD= » 10 апр 2011, 20:43

Даже не знаю что и сказать, я бы и на 1Гц не взялся на ходу смотреть что происходит.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: ПИД (на ПИКе)

Сообщение dccharacter » 11 апр 2011, 00:42

я уже почти выучил типы данных и сейчас перевожу протокол на двухбайтовые команды - если я тебе скажу, что у меня основная проблема с тем, чтобы из QT послать два байта, обработать их на МК, получить в QT и отобразить на лейбле - ты подумаешь, что я стебусь. Но это реально так.

Добавлено спустя 3 часа 55 минут 3 секунды:
boez, оно работает :-)))) Блина, круто :-) Блина, очень круто! :-))) Спасибо!!!!
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: ПИД (на ПИКе)

Сообщение Levin88 » 29 май 2011, 02:10

Добрый день.
Пытаюсь сделать ПИД-регулятор с обратной связью по скорости
для мотора с квадратурным энкодером (300 имп/об)
на Atmega8535 в Proteus.

Измерение скорости провожу отсчетом числа импульсов
с энкодера таймером T0, за промежуток 0,05 с,
сформированный по прерыванию от T1,
в этом же прерывании прозвожу вычисление ПИД и выдачу сигнала на OCR2

Основная часть программы:

// требуемая скорость
#define Target 100
// коэффициент пропорционального усиления
#define Kp 5
// коэффициент интегрального усиления
#define Ki 0.3
// коэффициент дифференциального усиления
#define Kd 5
// максимальная сумма ошибок
#define MaxIntegral 1000

volatile signed int Error; // отклонение измеренной величины от заданной
volatile signed int PrevValue; // предыдущее значение измерения
volatile signed int P_Term; // пропорциональный компонент
volatile signed int I_Term; // интегральный компонент
volatile signed int D_Term; // дифференциальный компонент
volatile signed int Out; // управляющее воздействие
volatile signed int Integral; // сумма ошибок

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
Perepol++;
}

// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer1 value
TCNT1H=0xF78F >> 8;
TCNT1L=0xF78F & 0xff;
// Place your code here
VMH=Perepol;
VML=TCNT0;
Error = Target - TCNT0;
P_Term = Kp * Error;

if (Integral > MaxIntegral) {Integral = MaxIntegral;}
else if (Integral < - MaxIntegral) {Integral = - MaxIntegral;}
else Integral += Error;

I_Term = Ki * Integral;
D_Term = Kd * (PrevValue - TCNT0);
PrevValue = TCNT0;
Out = P_Term + I_Term + D_Term;

if(Out > 0xFF) { OCR2 = 0xFE; }
else if(Out < 0) { OCR2 = 0;}
else OCR2 = Out;
pwm=OCR2;
TCNT0=0;
Perepol=0;
}

В принципе кое-как работает,но слишком медленно стабилизируется и есть колебания.
Возможно стоит производить измерения скорости между импульсами с энкодера.
Подскажите как реализовать измерение скорости и регулирование в данном случае.
Если у кого есть подобный проект в Proteus с исходниками, то не могли бы вы его выложить для изучения на примере.
Levin88
 
Сообщения: 3
Зарегистрирован: 14 май 2011, 20:46
Откуда: Санкт-Петербург

Re: ПИД (на ПИКе)

Сообщение dccharacter » 01 авг 2011, 17:00

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

Вводная - есть степдаун регулятор на МК. МК чувствует выходное напряжение и аджастит дьюти сайкл ШИМа. Экспериментально установлено, что нужные 5В достигаются при CCPR2L = ~20.

Вот вопрос - всегда ли правильно настроенный ПИД стабилизирует значение CCPR2L в районе нужного или алгоритму необходимо дать какие-то ограничения (думаю, речь не об ограничении роста интегральной компоненты, о которой речь в переводной статье по ПИДам в ВИКИ). Или как-то ремапить полученное от ПИДа значение? Но ведь чтобы это делать, необходимо знать scale factor - его всегда экспериментально устанавливать? Надеюсь вопрос понятен, если нет - попробую переформулировать...
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: ПИД (на ПИКе)

Сообщение =DeaD= » 01 авг 2011, 17:05

dccharacter писал(а):при CCPR2L = ~20

Это вообще кто? :crazy:
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: ПИД (на ПИКе)

Сообщение dccharacter » 01 авг 2011, 18:35

Ну это такой регистр, который содержит старшие 8 бит из 10-ти битного значения дьютисайкла шима на ПИКах

Добавлено спустя 50 минут 29 секунд:
Че-то пытаюсь помоделировать и нифига не получается. Думаю - это из-за того, что у меня модель абсолютно безинерционная что-ли? При малых коэффициентах стабилизаруется чуть ниже середины до таргета, при увеличении коэффициентов уходит вразнос полный.

Добавлено спустя 19 минут 19 секунд:
Хм, ввел инертность и затухание, вроде ничего получилось. Но надо много мерять, чтобы модель близкой к жизни получилась...
Вложения
PID_model2.PNG
Вторая модель: + затухание и инертность
PID_model.PNG
Первая модель
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: ПИД (на ПИКе)

Сообщение dccharacter » 02 авг 2011, 13:54

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

У меня на выходе стоит конденсатор 1000 мкФ. Ток разрядки ок. 1500 мА, напряжение 5В.
т.е. постоянная времени будет 10е-3 * 5 / 1,5 = 3,3мс. Рекомендуется выбирать частоту в 30 раз чаще, т.е. 100 мкс. Правильно?

И на каком же МК я могу обеспечить такую частоту работы ПИДа с учетом того, что надо еще АДС опросить, математику поматемачить и МК еще кучей всяких дел занимается???

Добавлено спустя 2 минуты 58 секунд:
Кстати, вот тут:

"Ошибка (Err) - это разность между измеренным реальным параметром (РП) и требуемым параметром (ТП) объекта регулирования. ТП задается системе регулирования извне - например "переместить объект регулирования (ОР) в точку 20", если сейчас реально измеренное положение (РП) объекта регулирования показывает что он находится в точке 15 то ошибка составляет:

Err = 20 - 15 = 5"

Первая часть противоречит второй. По определению Ерр = РП - ТП, а в примере написано Ерр = ТП - РП.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: ПИД (на ПИКе)

Сообщение =DeaD= » 02 авг 2011, 15:46

dccharacter писал(а):И на каком же МК я могу обеспечить такую частоту работы ПИДа с учетом того, что надо еще АДС опросить, математику поматемачить и МК еще кучей всяких дел занимается???

А в чем вопрос? Приводите вычисления к целочисленным, убирайте деления, запускайте циклический опрос АЦП, по готовности АЦП переваривайте инфу и выставляйте ШИМ. Мне думается там всё впишется и в 10мкс :)

Добавлено спустя 1 минуту 6 секунд:
dccharacter писал(а):Кстати, вот тут:
Первая часть противоречит второй. По определению Ерр = РП - ТП, а в примере написано Ерр = ТП - РП.

Тут - это где? :)))
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: ПИД (на ПИКе)

Сообщение dccharacter » 02 авг 2011, 16:12

=DeaD= писал(а):А в чем вопрос? Приводите вычисления к целочисленным, убирайте деления, запускайте циклический опрос АЦП, по готовности АЦП переваривайте инфу и выставляйте ШИМ. Мне думается там всё впишется и в 10мкс :)

Т.е. если я делаю контроллер питания, то МК следует полностью посвятить этой задаче, а всякие свистульки не позволят мне нормально выход регулировать? Если так, то лучше сразу от этой затеи отказаться и поставить lm2576 какой-нить да компараторы на отсечку - ибо дешево и сердито.

=DeaD= писал(а):Добавлено спустя 1 минуту 6 секунд:
Тут - это где? :)))

http://pidcontrol.narod.ru/
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: ПИД (на ПИКе)

Сообщение dccharacter » 04 авг 2011, 00:15

А еще мне непонятно как предлагается использовать отладочную консоль. Без вывода в УАРТ у меня одна проходка занимает ок. 150 мкс. С выводом 7 байт - 600мс.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: ПИД (на ПИКе)

Сообщение dccharacter » 05 авг 2011, 00:15

Нашел причину колбасни. Я в интегральной компоненте суммировал не ошибки, а суммировал предыдущее значение интегральной компоненты с ошибкой. После стодвадцатого прочтения статьи [[Перевод статьи "Просто о ПИД-алгоритмах"]] все прояснилось. PI вполне хватает, дифференциалка не нужна.

Добавлено спустя 14 минут 39 секунд:
Но это в непрерывном цикле без других задач. Ка-ак только пытаюсь, например, замерить напряжение на входе - тут же расколбашиваемся. Слишком редко начинаем контролировать. Какая уж тут коммуникация по UART?
Не, фигню я все-таки построил....
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: ПИД (на ПИКе)

Сообщение AndreiSk » 05 авг 2011, 00:34

Что за непрерывный цикл?
Прерывания не используешь?
Аватара пользователя
AndreiSk
 
Сообщения: 2639
Зарегистрирован: 23 апр 2009, 17:03
Откуда: Москва, Самара
прог. языки: C#

Re: ПИД (на ПИКе)

Сообщение dccharacter » 05 авг 2011, 00:38

Не удержался, запитал роутер от аккумулятора. Работает, чертяка :-)

Добавлено спустя 1 минуту 3 секунды:
AndreiSk писал(а):Что за непрерывный цикл?
Прерывания не используешь?

Нет, как и дифференциальную компоненту. :no:
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: ПИД (на ПИКе)

Сообщение AndreiSk » 05 авг 2011, 00:41

По идее, прерывания довольно точны по времени.
У меня управление сервой через прерывание сделано,
и еще он успевает лампочкой моргать и USB команды получать :roll:
Аватара пользователя
AndreiSk
 
Сообщения: 2639
Зарегистрирован: 23 апр 2009, 17:03
Откуда: Москва, Самара
прог. языки: C#

Re: ПИД (на ПИКе)

Сообщение dccharacter » 05 авг 2011, 00:47

Блин, сравнил - управление сервой и управление напряжением на конденсаторе, на котором висит нагрузка, жрущая 1,5-2А :-))))

Добавлено спустя 1 минуту 20 секунд:
Сейчас у меня 5кГц частота вызова ПИ-регулятора
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Пред.След.

Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18