roboforum.ru

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

ПИД регулятор - PID алгоритм, энкодер и другая ОС

Обсуждаем рождающиеся мысли и результаты экспериментов.

ПИД регулятор - PID алгоритм, энкодер и другая ОС

Сообщение RoboTok » 17 дек 2008, 22:48

Всем привет.

Решил создать отдельную тему для обсуждения алгоритма работы ПИДа для своей тележки и Duhasа.

Ветки:
тележка Duhas
Моя тележка

Кто не в теме описание в Вики:
[[Перевод статьи "Просто о ПИД-алгоритмах"]]

< avr123 > ПИД регулятор на русском языке с примерами и простым алгоритмом - http://pidcontrol.narod.ru/

Схема моего энкодера ниже и фотка готового енкодера на тележке.
Вложения
SS850793.jpg
Untitled-1.gif
Untitled-1.gif (9.04 КиБ) Просмотров: 36854
Последний раз редактировалось RoboTok 18 дек 2008, 00:07, всего редактировалось 1 раз.
Аватара пользователя
RoboTok
 
Сообщения: 1060
Зарегистрирован: 04 фев 2008, 13:18
Откуда: Москва
прог. языки: PHP

Re: Алгоритм работы ПИД регулятора, энкодер и другая ОС

Сообщение avr123.nm.ru » 17 дек 2008, 23:10

ПИД регулирование кратко на русском языке и простой алгоритм - http://pidcontrol.narod.ru/
PID ПИД регулирование для начинающих - краткое толкование.

Изображение

ПИД регулятор PID можно помоделировать в PROTEUS - в его примерах есть апноут AN696
http://microchip.com - SERVO привод с квадратурным энкодером. http://www.microchip.com/stellent/idcpl ... e=en011782

PID на AVR в WinAVR реализован в проекте http://openservo.org и открыт.

ПИД PID реализован и в апноутах ATMEL по электроприводу BLDC мотора AVR447 AVR449 и разных моторов в апноутах с номерами AVR49x
их можно найти и скачать внизу моей странички о прошивании AVR - http://avr123.nm.ru/07.htm

Статья о применении PID регулятора ПИД в перевернутом маятнике,
влияние коэффициентов ПИД на параметры регулирования - переведена на русский язык
Вложения
PID ПИД регуляторы на МК - статья на русском.7z
(311.83 КиБ) Скачиваний: 386
Последний раз редактировалось avr123.nm.ru 02 фев 2009, 12:50, всего редактировалось 1 раз.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Алгоритм работы ПИД регулятора, энкодер и другая ОС

Сообщение RoboTok » 17 дек 2008, 23:33

Апноуты смотрел, но у меня мозг "плющит" от них.
Хочется на пальцах и на русском.

Вот код моего регулятора:
Код: Выделить всёРазвернуть
//структура с параметрами двигателя
struct motorstatus
   {
   unsigned int oc;//счётчик тиков датчика обратной связи
   char ocs;//состояние датчика
   char speedcur;//Текущая скорость мотора
   char speed;//Нужная скорость мотора
   char flag;//Запуск команды на выполнение
   char flagoc;//регулировка ШИМ при активном флаге
   unsigned char pause;//пауза перед скидыванием флага flagoc
   char dir;//Направление текущее мотора
   volatile unsigned long *reg;//Адрес регистра PWMMR
   volatile unsigned long bitoc;//вывод порта ОС
   volatile unsigned long *regoc;//Адрес порта ОС
   };

//Прерывание таймера 3кГц, считает время между тиками энкодера
//обрабатывает через функцию S=U*t и записывает в статус двигателя
__irq void T0_Isr( void )
{
char i;

for( i = 0 ; i < 2 ; i ++ ) {
if( motstat[ i ].oc < 255 )
   {
   motstat[ i ].oc ++;
   motstat[ i ].pause = 255;
   }
else
   {
   motstat[ i ].speedcur = 0;
   if( motstat[ i ].pause > 200 )
      {
      motstat[ i ].flagoc = 1;
      motstat[ i ].pause = 0;
      }
   else motstat[ i ].pause++;
   }
   //ОС2 анализируем состояние датчика и если было изменение состояния записываем тик
   if( ( *motstat[ i ].regoc & motstat[ i ].bitoc ) && !motstat[ i ].ocs )
      {
      if( motstat[ i ].oc > 250 ) motstat[ i ].speedcur = 1;
      else motstat[ i ].speedcur = 1100000 / ( motstat[ i ].oc * 833 );
      motstat[ i ].oc = 0;
      motstat[ i ].ocs = 1;
      motstat[ i ].flagoc = 1;
      }
   else
      if( !( *motstat[ i ].regoc & motstat[ i ].bitoc ) && motstat[ i ].ocs )
         {
         motstat[ i ].ocs = 0;
         }
}
}

//Этот код находится в функции main и выполняется при обновлении скорости
//Или, если не было обновление больше установленной паузы величиной
//с минимальную скорость
//Регулятор скорости по энкодерам
if( modemotor == 1 ) {
   for( i = 0 ; i < 2 ; i ++ )
   {
   if( motstat[ i ].flagoc ) {//регулируем ШИМ при обновлении датчика скорости
   motstat[ i ].flagoc = 0;

      r = *motstat[ i ].reg;//значение регистра задающий скважность ШИМ
      if( r == 0x64 ) motstat[ i ].flag = 0;
      if( motstat[ i ].speed == 0 && r < 0x64 )//Если заданная скорость равна нулю, а текущая скорость выше нуля и ШИМ включён, то уменьшаем мощность
         {
         if( motstat[ i ].speedcur == 0 )//Если двигатель не крутится выключаем ШИМ.
            {
            *motstat[ i ].reg = 0x64;
            PWMLER = 0x7F;
            motstat[ i ].flag = 0;//если двигатель остановился, то скидываем флаг запрета выполнения следующей команды
            }
         else
      //Если двигатель крутится уменьшаем мощность постепенно
            {
            if( r > 0x60 )
               *motstat[ i ].reg = r + 1;//инверсия ШИМ, при увеличении значения мощность падает
            else *motstat[ i ].reg = r + 4;
            PWMLER = 0x7F;
            }
         }
      else {
//      if( motstat[ i ].flag )
//         {
//         r = *motstat[ i ].reg;
         if( motstat[ i ].speedcur > motstat[ i ].speed && r < 0x64 )
            {
            if( ( motstat[ i ].speedcur - motstat[ i ].speed ) < 4 || r > 0x62 ) *motstat[ i ].reg = r + 1;
            else if( ( motstat[ i ].speedcur - motstat[ i ].speed ) < 15 || r > 0x60 ) *motstat[ i ].reg = r + 2;
               else *motstat[ i ].reg = r + 4;
//            *motstat[ i ].reg = r + 1;
            PWMLER = 0x7F;
            }
         else
            {
            if( motstat[ i ].speedcur < motstat[ i ].speed && r > 3 )//при максимальном ШИМ должна оставатся скважность, а то ключи сгорят
               {
               if( ( motstat[ i ].speed - motstat[ i ].speedcur ) < 4 || r < 5 ) *motstat[ i ].reg = r - 1;
               else if( ( motstat[ i ].speed - motstat[ i ].speedcur ) < 15 || r < 7 ) *motstat[ i ].reg = r - 2;
                  else *motstat[ i ].reg = r - 4;
//               *motstat[ i ].reg = r - 1;
               PWMLER = 0x7F;
               }
//            else motstat[ i ].flag = 0;
            }
//            }
         }
      }
   }
}
Аватара пользователя
RoboTok
 
Сообщения: 1060
Зарегистрирован: 04 фев 2008, 13:18
Откуда: Москва
прог. языки: PHP

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение =DeaD= » 17 дек 2008, 23:36

2RoboTok: То что вы опубликовали - это не на пальцах, это "песец" :P

Я конечно понимаю что оно как-то работает, но это нагромождение IF-ов к ПИД-регулятору имеет посредственное отношение.

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

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение RoboTok » 18 дек 2008, 00:01

Что сейчас я имею...

Даю команду в формате M1YY, где YY - скорость движения машины и бит 7 задаёт направление.
Команда P1YY, где YY скорость поворота и бит 7 задаёт направление поворота.

При получении команды M1 я записываю в буфер команд скорость YY обоим двигателям.
Если пришла команда поворота, то если бит 7=1 вычитаю скорость поворота из скорости левого двигателя и бит 7 = 0, то вычитаю для правого.

Как это выглядит в реальности ?! :bad:

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

Добавлено спустя 17 минут 10 секунд:
=DeaD= писал(а):нагромождение IF-ов к ПИД-регулятору


Предлагаю, чтоб облегчить участь мою, спрашивать к чему очередная лесенка IF-ов, а я её буду описывать, а вы советовать вариант её корректировки ? :friends:

IF-ы эти возникли для улучшения некоторых участков работы регулятора.

Например лесенка из 3 вложений IF-ов
Код: Выделить всёРазвернуть
            if( ( motstat[ i ].speedcur - motstat[ i ].speed ) < 4 || r > 0x62 ) *motstat[ i ].reg = r + 1;
            else if( ( motstat[ i ].speedcur - motstat[ i ].speed ) < 15 || r > 0x60 ) *motstat[ i ].reg = r + 2;
               else *motstat[ i ].reg = r + 4;


Сделал для более быстрого разгона, разделив на 3 ступеньки разницу в скорости между требуемой скоростью и текущей.
Например, если разница в скорости меньше 4( motstat[ i ].speedcur - motstat[ i ].speed ), то ШИМ изменяем только на 1(*motstat[ i ].reg = r + 1).

Или, к примеру, скидывание флага для запуска регулятора с паузой:
Код: Выделить всёРазвернуть
if( motstat[ i ].oc < 255 )
   {
   motstat[ i ].oc ++;
   motstat[ i ].pause = 255;
   }
else
   {
//   motstat[ i ].oc = 230;
   motstat[ i ].speedcur = 0;//текущая скорость
   if( motstat[ i ].pause > 200 )
      {
      motstat[ i ].flagoc = 1;
      motstat[ i ].pause = 0;
      }
   else motstat[ i ].pause++;
   }


Тут переменные motstat[ i ].oc - который считает время между тиками и
motstat[ i ].pause которая выставляет паузу для сброса флага motstat[ i ].flagoc и периодического запуска регулятора, если
двигатель не работает.

Как это можно сделать без условий мне в голову не пришло...
Аватара пользователя
RoboTok
 
Сообщения: 1060
Зарегистрирован: 04 фев 2008, 13:18
Откуда: Москва
прог. языки: PHP

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение avr123.nm.ru » 18 дек 2008, 08:17

ИМХО для таких больших колес энкодер нужен с бОльщим числом "тиков" и желательно квадратурный как у мышки - чтоб показывал и направление. Либо такой энкодер как ваш но установленый на вал мотора.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение Duhas » 18 дек 2008, 11:56

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

поддерживаю советы авр-а....

на счет F=m*a - несоглашусь, закон линейный... в нашем случае о линейности нет и речи... и есть промежуток где нам вообще не сильно важно что там творится в алгоритме, нада в форсаж двиг загнать....
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение =DeaD= » 18 дек 2008, 11:58

2Duhas: Вот ты б сначала эксперименты поставил, а потом рассказывал как IF-ами всё можно классно сделать :)

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

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение Duhas » 18 дек 2008, 12:02

2Dead, а если подумать? я и говорил что на всех этапах КРОМЕ граничного нам ПОБАРАБАНУ.. ифами можно и границу сделать... но лучше чем на ПИД-е - врядли..

про эксперименты: пытался в протеусе эксперименты ставить.. дык там ондни глюки... при 0 шиме на выводе 1-ца торчит и тд... а в железе все ок... но железо для опытов не готово.. увы...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение =DeaD= » 18 дек 2008, 12:07

2Duhas: Не было ничего про пограничные случаи :)
А вот как без нагромождения полсотни IF-ов сделать нормальную регуляцию во всём диапазоне скоростей - это я бы и сам послушал :)

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

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение Duhas » 18 дек 2008, 12:11

просто когда после
Duhas писал(а):в нашем случае о линейности нет и речи... и есть промежуток где нам вообще не сильно важно что там творится в алгоритме, нада в форсаж двиг загнать....

получаешь вот это
=DeaD= писал(а):На границе как оно себя вести будет? Здравствуй колебательный процесс?

возникает ощущение что собеседник невнимательно читает, а при невнимательном прочтении, имхо, нужно или не говорить ничего, или перечитать...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение =DeaD= » 18 дек 2008, 12:29

2Duhas: А это что:
ифами можно и границу сделать... но лучше чем на ПИД-е - врядли..


Между "лучше чем на ПИД-е врядли" и "100% будет колебательный процесс если сделать несколько десятков IF-ов" есть ведь разница?

Всё я нормально читаю :)

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

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение Duhas » 18 дек 2008, 12:46

на счет колебательного процесса... думаю можно будет избежать...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение =DeaD= » 18 дек 2008, 12:56

Duhas писал(а):на счет колебательного процесса... думаю можно будет избежать...

Вот именно это и интересно как можно избежать. Если мы умеем выставлять ШИМ только в 40 и 50, а для нужной скорости нужен шим 45. Мы будем колебаться между 40 и 50 постоянно и робот будет двигаться рывками, ну или нужно IF-ами будет просто поделить с шагом 2-3 всё.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: ПИД регулятор - алгоритм работы, энкодер и другая ОС

Сообщение Виталий » 18 дек 2008, 13:00

Проведите эксперимент... ШИМ ШИМа.
Все новости о моих проектах http://savethebest.ru
Аватара пользователя
Виталий
 
Сообщения: 2114
Зарегистрирован: 08 окт 2004, 16:43
Откуда: St. Petersburg
Skype: quark-bot
ФИО: Клебан Виталий

След.

Вернуться в Идеи

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

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