roboforum.ru

Технический форум по робототехнике.
Текущее время: 25 фев 2025, 15:13

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: ПИД на AVR (энкодер + шим)
СообщениеДобавлено: 29 май 2011, 02:37 
Не в сети

Зарегистрирован: 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: ПИД на AVR (энкодер + шим)
СообщениеДобавлено: 29 май 2011, 09:22 
Не в сети
Аватара пользователя

Зарегистрирован: 21 май 2007, 22:57
Сообщения: 600
Откуда: Калининград
прог. языки: C++
а менять коэффициенты ПИД пробовали? :)

_________________
RoboCraft.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД на AVR (энкодер + шим)
СообщениеДобавлено: 29 май 2011, 11:05 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Levin88 писал(а):
Добрый вечер.
Пытаюсь сделать ПИД-регулятор с обратной связью по скорости
для мотора с квадратурным энкодером (300 имп/об)
на Atmega8535 в Proteus.


Смотрите пример PROTEUS AN699

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД на AVR (энкодер + шим)
СообщениеДобавлено: 29 май 2011, 16:57 
Не в сети

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

Пытался разобраться в программе для AN696, но пока не осилил + c PIC-ми совсем не знаком
AN699 не встречал. Где он находится? (samples->...)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД на AVR (энкодер + шим)
СообщениеДобавлено: 29 май 2011, 18:32 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
0. И - уберите совсем.

1. Подберите П, чтобы держал скорость как-то (пусть с колебаниями)

2. Д - увеличивайте, чтобы пропали колебания. П - потихоньку уменьшайте


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД на AVR (энкодер + шим)
СообщениеДобавлено: 29 май 2011, 19:30 
Не в сети
Аватара пользователя

Зарегистрирован: 15 сен 2007, 13:03
Сообщения: 6338
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович
ммм, на скорость обычно ПИ регулятор ставят вроде )

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД на AVR (энкодер + шим)
СообщениеДобавлено: 29 май 2011, 21:45 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
ну как хотите :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ПИД на AVR (энкодер + шим)
СообщениеДобавлено: 30 май 2011, 10:52 
Не в сети
Аватара пользователя

Зарегистрирован: 15 сен 2007, 13:03
Сообщения: 6338
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович
ну зависит от того что там на движке будет )) точнее от инерционности... ПИ разгонит быстрее

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

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


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

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


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

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