я уже почти выучил типы данных и сейчас перевожу протокол на двухбайтовые команды - если я тебе скажу, что у меня основная проблема с тем, чтобы из QT послать два байта, обработать их на МК, получить в QT и отобразить на лейбле - ты подумаешь, что я стебусь. Но это реально так.
Добавлено спустя 3 часа 55 минут 3 секунды: boez, оно работает ))) Блина, круто Блина, очень круто! )) Спасибо!!!!
Добрый день. Пытаюсь сделать ПИД-регулятор с обратной связью по скорости для мотора с квадратурным энкодером (300 имп/об) на Atmega8535 в Proteus.
Измерение скорости провожу отсчетом числа импульсов с энкодера таймером T0, за промежуток 0,05 с, сформированный по прерыванию от T1, в этом же прерывании прозвожу вычисление ПИД и выдачу сигнала на OCR2
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;
В принципе кое-как работает,но слишком медленно стабилизируется и есть колебания. Возможно стоит производить измерения скорости между импульсами с энкодера. Подскажите как реализовать измерение скорости и регулирование в данном случае. Если у кого есть подобный проект в Proteus с исходниками, то не могли бы вы его выложить для изучения на примере.
Ребят, хочу немножко оживить тему, так как столкнулся с ПИДом снова и, как выяснилось, понимания нет и по сей день. Да, читал и перечитывал. Но буксую все равно где-то в основах - так мож подскажете.
Вводная - есть степдаун регулятор на МК. МК чувствует выходное напряжение и аджастит дьюти сайкл ШИМа. Экспериментально установлено, что нужные 5В достигаются при CCPR2L = ~20.
Вот вопрос - всегда ли правильно настроенный ПИД стабилизирует значение CCPR2L в районе нужного или алгоритму необходимо дать какие-то ограничения (думаю, речь не об ограничении роста интегральной компоненты, о которой речь в переводной статье по ПИДам в ВИКИ). Или как-то ремапить полученное от ПИДа значение? Но ведь чтобы это делать, необходимо знать scale factor - его всегда экспериментально устанавливать? Надеюсь вопрос понятен, если нет - попробую переформулировать...
Ну это такой регистр, который содержит старшие 8 бит из 10-ти битного значения дьютисайкла шима на ПИКах
Добавлено спустя 50 минут 29 секунд: Че-то пытаюсь помоделировать и нифига не получается. Думаю - это из-за того, что у меня модель абсолютно безинерционная что-ли? При малых коэффициентах стабилизаруется чуть ниже середины до таргета, при увеличении коэффициентов уходит вразнос полный.
Добавлено спустя 19 минут 19 секунд: Хм, ввел инертность и затухание, вроде ничего получилось. Но надо много мерять, чтобы модель близкой к жизни получилась...
Ребят, сижу читаю, перечитываю и вижу, что особый упор делается на то, что чтобы дифф компонента работала верно, жизненно необходимо делать отсчеты в равные промежутки времени. Мне интересно, как это работает в моем случае (степ-дауна).
У меня на выходе стоит конденсатор 1000 мкФ. Ток разрядки ок. 1500 мА, напряжение 5В. т.е. постоянная времени будет 10е-3 * 5 / 1,5 = 3,3мс. Рекомендуется выбирать частоту в 30 раз чаще, т.е. 100 мкс. Правильно?
И на каком же МК я могу обеспечить такую частоту работы ПИДа с учетом того, что надо еще АДС опросить, математику поматемачить и МК еще кучей всяких дел занимается???
Добавлено спустя 2 минуты 58 секунд: Кстати, вот тут:
"Ошибка (Err) - это разность между измеренным реальным параметром (РП) и требуемым параметром (ТП) объекта регулирования. ТП задается системе регулирования извне - например "переместить объект регулирования (ОР) в точку 20", если сейчас реально измеренное положение (РП) объекта регулирования показывает что он находится в точке 15 то ошибка составляет:
Err = 20 - 15 = 5"
Первая часть противоречит второй. По определению Ерр = РП - ТП, а в примере написано Ерр = ТП - РП.
dccharacter писал(а):И на каком же МК я могу обеспечить такую частоту работы ПИДа с учетом того, что надо еще АДС опросить, математику поматемачить и МК еще кучей всяких дел занимается???
А в чем вопрос? Приводите вычисления к целочисленным, убирайте деления, запускайте циклический опрос АЦП, по готовности АЦП переваривайте инфу и выставляйте ШИМ. Мне думается там всё впишется и в 10мкс
Добавлено спустя 1 минуту 6 секунд:
dccharacter писал(а):Кстати, вот тут: Первая часть противоречит второй. По определению Ерр = РП - ТП, а в примере написано Ерр = ТП - РП.
=DeaD= писал(а):А в чем вопрос? Приводите вычисления к целочисленным, убирайте деления, запускайте циклический опрос АЦП, по готовности АЦП переваривайте инфу и выставляйте ШИМ. Мне думается там всё впишется и в 10мкс
Т.е. если я делаю контроллер питания, то МК следует полностью посвятить этой задаче, а всякие свистульки не позволят мне нормально выход регулировать? Если так, то лучше сразу от этой затеи отказаться и поставить lm2576 какой-нить да компараторы на отсечку - ибо дешево и сердито.
=DeaD= писал(а):Добавлено спустя 1 минуту 6 секунд: Тут - это где? ))
А еще мне непонятно как предлагается использовать отладочную консоль. Без вывода в УАРТ у меня одна проходка занимает ок. 150 мкс. С выводом 7 байт - 600мс.
Нашел причину колбасни. Я в интегральной компоненте суммировал не ошибки, а суммировал предыдущее значение интегральной компоненты с ошибкой. После стодвадцатого прочтения статьи [[Перевод статьи "Просто о ПИД-алгоритмах"]] все прояснилось. PI вполне хватает, дифференциалка не нужна.
Добавлено спустя 14 минут 39 секунд: Но это в непрерывном цикле без других задач. Ка-ак только пытаюсь, например, замерить напряжение на входе - тут же расколбашиваемся. Слишком редко начинаем контролировать. Какая уж тут коммуникация по UART? Не, фигню я все-таки построил....
По идее, прерывания довольно точны по времени. У меня управление сервой через прерывание сделано, и еще он успевает лампочкой моргать и USB команды получать