Регулятор скорости с обратной связью от энкодера на ATmega

Highlander88

Добрый день.
Пытаюсь сделать простой регулятор скорости с обратной обратной связью от энкодера на Atmega8535 в Proteus.
Управление мотором через ШИМ от 2-го таймера.
Измерение скорости осуществляю подсчетом импульсов от энкодера (300 имп/об) за 0.05с таймером Т0 (до 1000 об/мин).
промежуток 0.05с формирую по прерыванию сравнения от таймера T1. В этом же прерывании произвожу корректирование скорости:
VM=TCNT0;//полученная скорость за 0.05 (до 250 если скорость <1000 об/мин)
VF=ADCH;//нужная скорость задаем с потенциометра на АЦП
if (VF>VM)
{
ER=VF-VM;
PWM=PWM+ER;
ER=0;
};
if (VF<VM)
{
ER=VM-VF;
PWM=PWM-ER;
ER=0;
};
OCR2=PWM;
Работает крайне неважно - скорость постоянно колеблется с огромной ошибкой. Я новичек в вопросе управления и регулирования. 😃
Подскажите как лучше программно реализовать измерение скорости и регулирование в данном случае.

sashok17

Предлагаешь ему в ж*** засунуть провода?😃

Highlander88

Попытался реализовать ПИД-регулятор

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

// требуемая скорость
#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 с исходниками, то не могли бы вы его выложить для изучения на примере.

ivereninov

Ну так коэффициенты настраивать надо. Либо Циглер-Никольс, либо на глазок

SGordon

не понял как вы считаете интеграл, может выкинуть пока и посчитать только П и Д ?

Dj_smart

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

2 months later
kapusta
Dj_smart:

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

а Вы не можете выложить схемку с прошивкой. Ато есть парочка двигателей на 220.

druksel
kapusta:

а Вы не можете выложить схемку с прошивкой. Ато есть парочка двигателей на 220.

+100500!!!

Dj_smart
kapusta:

Вы не можете выложить схемку с прошивкой.

Народ, извиняюсь, давно не заходил:(. Короче там настраиваются тьма параметров пида с кнопок… В общем всё тут, плата, прошивка. www.cncmasterkit.ru/modules.php?name=Forums&file=v… Тамс 29-го поста. Только желательно почитать всё, вносились изменения. Да! Движки только коллекторные(фрезер, дрель, и тд). Я сделал на фрезер с ЧПУ, не нарадуюсь, обороты держит как немое:). А движок полтора киловата. Так что…

kapusta
Dj_smart:

Народ, извиняюсь, давно не заходил:(. Короче там настраиваются тьма параметров пида с кнопок… В общем всё тут, плата, прошивка. www.cncmasterkit.ru/modules.php?name=Forums&file=v… Тамс 29-го поста. Только желательно почитать всё, вносились изменения. Да! Движки только коллекторные(фрезер, дрель, и тд). Я сделал на фрезер с ЧПУ, не нарадуюсь, обороты держит как немое:). А движок полтора киловата. Так что…

Спасибо большое:)… Вот с движком от дрельки или болгарки проблем нету:)…