roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 23:03

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 61 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 10 апр 2011, 20:43 
Не в сети
Аватара пользователя

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

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 11 апр 2011, 00:42 
Не в сети
Аватара пользователя

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

Добавлено спустя 3 часа 55 минут 3 секунды:
boez, оно работает :-)))) Блина, круто :-) Блина, очень круто! :-))) Спасибо!!!!

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 29 май 2011, 02:10 
Не в сети

Зарегистрирован: 14 май 2011, 20:46
Сообщения: 3
Откуда: Санкт-Петербург
Добрый день.
Пытаюсь сделать ПИД-регулятор с обратной связью по скорости
для мотора с квадратурным энкодером (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 с исходниками, то не могли бы вы его выложить для изучения на примере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 01 авг 2011, 17:00 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Ребят, хочу немножко оживить тему, так как столкнулся с ПИДом снова и, как выяснилось, понимания нет и по сей день. Да, читал и перечитывал. Но буксую все равно где-то в основах - так мож подскажете.

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

Вот вопрос - всегда ли правильно настроенный ПИД стабилизирует значение CCPR2L в районе нужного или алгоритму необходимо дать какие-то ограничения (думаю, речь не об ограничении роста интегральной компоненты, о которой речь в переводной статье по ПИДам в ВИКИ). Или как-то ремапить полученное от ПИДа значение? Но ведь чтобы это делать, необходимо знать scale factor - его всегда экспериментально устанавливать? Надеюсь вопрос понятен, если нет - попробую переформулировать...

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 01 авг 2011, 17:05 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
dccharacter писал(а):
при CCPR2L = ~20

Это вообще кто? :crazy:

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 01 авг 2011, 18:35 
Не в сети
Аватара пользователя

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

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

Добавлено спустя 19 минут 19 секунд:
Хм, ввел инертность и затухание, вроде ничего получилось. Но надо много мерять, чтобы модель близкой к жизни получилась...


Вложения:
Комментарий к файлу: Вторая модель: + затухание и инертность
PID_model2.PNG
PID_model2.PNG [ 65.4 КиБ | Просмотров: 2295 ]
Комментарий к файлу: Первая модель
PID_model.PNG
PID_model.PNG [ 68.69 КиБ | Просмотров: 2291 ]

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 02 авг 2011, 13:54 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Ребят, сижу читаю, перечитываю и вижу, что особый упор делается на то, что чтобы дифф компонента работала верно, жизненно необходимо делать отсчеты в равные промежутки времени. Мне интересно, как это работает в моем случае (степ-дауна).

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

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

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

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

Err = 20 - 15 = 5"

Первая часть противоречит второй. По определению Ерр = РП - ТП, а в примере написано Ерр = ТП - РП.

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 02 авг 2011, 15:46 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
dccharacter писал(а):
И на каком же МК я могу обеспечить такую частоту работы ПИДа с учетом того, что надо еще АДС опросить, математику поматемачить и МК еще кучей всяких дел занимается???

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

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

Тут - это где? :)))

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 02 авг 2011, 16:12 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
=DeaD= писал(а):
А в чем вопрос? Приводите вычисления к целочисленным, убирайте деления, запускайте циклический опрос АЦП, по готовности АЦП переваривайте инфу и выставляйте ШИМ. Мне думается там всё впишется и в 10мкс :)

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

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

http://pidcontrol.narod.ru/

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 04 авг 2011, 00:15 
Не в сети
Аватара пользователя

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

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 05 авг 2011, 00:15 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Нашел причину колбасни. Я в интегральной компоненте суммировал не ошибки, а суммировал предыдущее значение интегральной компоненты с ошибкой. После стодвадцатого прочтения статьи [[Перевод статьи "Просто о ПИД-алгоритмах"]] все прояснилось. PI вполне хватает, дифференциалка не нужна.

Добавлено спустя 14 минут 39 секунд:
Но это в непрерывном цикле без других задач. Ка-ак только пытаюсь, например, замерить напряжение на входе - тут же расколбашиваемся. Слишком редко начинаем контролировать. Какая уж тут коммуникация по UART?
Не, фигню я все-таки построил....

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 05 авг 2011, 00:34 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 05 авг 2011, 00:38 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Не удержался, запитал роутер от аккумулятора. Работает, чертяка :-)

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

Нет, как и дифференциальную компоненту. :no:

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 05 авг 2011, 00:41 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД (на ПИКе)
СообщениеДобавлено: 05 авг 2011, 00:47 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Блин, сравнил - управление сервой и управление напряжением на конденсаторе, на котором висит нагрузка, жрущая 1,5-2А :-))))

Добавлено спустя 1 минуту 20 секунд:
Сейчас у меня 5кГц частота вызова ПИ-регулятора

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 61 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO