jenya7 0 10 июня, 2019 Опубликовано 10 июня, 2019 · Жалоба Еть ли у кого проверенный PID регулятор для управления моторами? Просмотрел великое множество так и не пришел к однозначному выводу какой использовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 10 июня, 2019 Опубликовано 10 июня, 2019 · Жалоба 31 minutes ago, jenya7 said: Просмотрел великое множество так и не пришел к однозначному выводу какой использовать. Тот, который пройдёт моделирование в матлабе. Я делал пид-регулятор, правда не для мотора, а для источника тока. Считал на cortex-m0. Код дать не могу, не моя собственность. Но формула была банальная. По учебнику. Для настройки использовался метод Зиглера-Никольса. Не могу сказать, что вышло идеально. Но переходные характеристики нас утсраивали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 июня, 2019 Опубликовано 10 июня, 2019 (изменено) · Жалоба 4 hours ago, haker_fox said: Тот, который пройдёт моделирование в матлабе. Я делал пид-регулятор, правда не для мотора, а для источника тока. Считал на cortex-m0. Код дать не могу, не моя собственность. Но формула была банальная. По учебнику. Для настройки использовался метод Зиглера-Никольса. Не могу сказать, что вышло идеально. Но переходные характеристики нас утсраивали. хочу проверенный, рабочий ПИД, используеммый в motion. к тому же есть пару вопросов по использованию ПИД. 1. можно использовать один и тот же ПИД для закрытия current, position loop? 2. в ПИД присутствует dt - соответственно он запускается во временные интервалы, по таймеру. это мне опрос датчиков тоже надо делать по таймеру? это ухудшает время реакции системы. 3. я вижу коэфициэнты размерности float. по крайней мере те варианты которые я видел. но я помню настройку ПИД в довольно серьезной конторе и там они пользовались коэфициэнтами 100 - 50000. есть реализации с целочисленными коэфициэнтами? этот пункт я понял (по моему) ret = (p_term + i_term + d_term) / SCALING_FACTOR; SCALING_FACTOR дает возможность работать с целыми числами. Изменено 10 июня, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rkit 4 10 июня, 2019 Опубликовано 10 июня, 2019 · Жалоба Пид регулятор это и есть пид-регулятор. Он везде одинаковый, за исключением калибровки, которую в любом случае нужно проводить под ваши индивидуальные условия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 15 hours ago, rkit said: Пид регулятор это и есть пид-регулятор. Он везде одинаковый, за исключением калибровки, которую в любом случае нужно проводить под ваши индивидуальные условия. ну так уж и одинаковый. схожесть есть. но вот три примера и абсолютной идентичности нет. Spoiler int32_t PID_Update(PID *pid, int32_t val) { //calculate new errors pid->e = pid->set - val; pid->val = val; //update differential pid->de = pid->d_buf[pid->d_cnt] - val; pid->d_buf[pid->d_cnt] = val; if (++(pid->d_cnt) >= pid->d_n) pid->d_cnt = 0; //calculate new OUT value pid->out = ( (pid->kp * pid->e + pid->kd * pid->de) * (int32_t)pid->out_mul ) / ( (int32_t)pid->out_div + (pid->i_sum / pid->i_n) ); //limit OUT if (pid->out < pid->out_min) pid->out = pid->out_min; if (pid->out > pid->out_max) pid->out = pid->out_max; //update integral sum with output value pid->i_sum = pid->i_sum - pid->i_buf[pid->i_cnt] + pid->out; pid->i_buf[pid->i_cnt] = pid->out; if (++(pid->i_cnt) >= pid->i_n) pid->i_cnt = 0; return pid->out; } float PID_Reg(int32_t val) { static char is_first_call = 1; static float U, I, Kp, Ki, Kd, E, Eprev; if (is_first_call) { is_first_call = 0; I = 0; Eprev = 0; //Kp, Ki, Kd initialization } U = 0; E = val; //integral part if (Ki != 0) { U = I + Ki * E; I = U; } //proportional part if (Kp != 0) { U += Kp * E; } //differencial part if (Kd != 0) { U += Kd * (E - Eprev); Eprev = E; } return U; } int16_t PID_Controller(int16_t setPoint, int16_t processValue, pidData_t *pid_st) { int16_t error, p_term, d_term; int32_t i_term; int32_t ret; int32_t temp; error = setPoint - processValue; // Calculate Pterm and limit error overflow if (error > pid_st->maxError) p_term = MAX_INT; else if (error < -pid_st->maxError) p_term = -MAX_INT; else p_term = pid_st->P_Factor * error; // Calculate Iterm and limit integral runaway temp = pid_st->sumError + error; if(temp > pid_st->maxSumError) { i_term = MAX_I_TERM; pid_st->sumError = pid_st->maxSumError; } else if(temp < -pid_st->maxSumError) { i_term = -MAX_I_TERM; pid_st->sumError = -pid_st->maxSumError; } else { pid_st->sumError = temp; i_term = pid_st->I_Factor * pid_st->sumError; } // Calculate Dterm d_term = pid_st->D_Factor * (pid_st->lastProcessValue - processValue); pid_st->lastProcessValue = processValue; ret = (p_term + i_term + d_term) / SCALING_FACTOR; if(ret > MAX_INT) ret = MAX_INT; else if(ret < -MAX_INT) ret = -MAX_INT; return((int16_t)ret); } и вот что я не понимаю - при вычислении ошибки (E - Eprev) результат может быть отрицательный. что значит отрицательный PWM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 23 часа назад, jenya7 сказал: 2. в ПИД присутствует dt - соответственно он запускается во временные интервалы, по таймеру. это мне опрос датчиков тоже надо делать по таймеру? это ухудшает время реакции системы. Скорее вычисления нужно делать после каждого опроса. А так как опрос идёт с неким дискретом по времени то и появляется дельта т. Опять же двигатель сильно инерционная штука. По этому сильно маленький шаг по времени делает диф коэффициент сильно малюсеньким. 3 часа назад, jenya7 сказал: и вот что я не понимаю - при вычислении ошибки (E - Eprev) результат может быть отрицательный. что значит отрицательный PWM? Вращение в обратную сторону Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aner 7 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба Вот как бы этот коэффициент сильно малюсенький в ноль или единицу не превратить у шима ... который подает ток в обмотку. Иначе КЗ будет и защита отработает или не отработает если её нет ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 1 час назад, Aner сказал: Вот как бы этот коэффициент сильно малюсенький в ноль или единицу не превратить у шима ... который подает ток в обмотку. Иначе КЗ будет и защита отработает или не отработает если её нет ... Шутите? Чтобы мост организовал КЗ нужно чтобы мост управлялся целиком программно. Это редкостное извращение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aner 7 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба Так непонятно что у ТСа, может оно ... редкостное извращение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 9 минут назад, MegaVolt сказал: Шутите? Чтобы мост организовал КЗ нужно чтобы мост управлялся целиком программно. Это редкостное извращение. Это не шутка. Там не короткое замыкание, а еще хуже будет... Мотор крутится, а мы приложили обратное напряжение, - ток будет определяться суммой поданного напряжения и противоэдс, пропорциональной скорости. Раскрутите моторчик и закоротите его... Ток будет огромный. Не всякий драйвер это выдержит. Вся кинетическая энергия нагреет обмотку и ключи. А тут мы еще быстрее останавливаем... Если есть система рекуперации, то можно зарядить конденсатор до очень высокого напряжения. Что с ним будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 14 минут назад, Tanya сказал: Вся кинетическая энергия нагреет обмотку и ключи. А тут мы еще быстрее останавливаем... Упс... я с сильно мощными двигателями не сталкивался. А у мелких это не так заметно. Был не прав. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 13 минут назад, MegaVolt сказал: Упс... я с сильно мощными двигателями не сталкивался. А у мелких это не так заметно. Был не прав. Драйвер обычно соответствует мощности двигателя... А если он нечто массивное тянет, то кинетическая энергия будет намного больше, чем у "голого" моторчика. А ведь обычно двигатель не просто так крутится для красоты... Торможение самая опасная процедура... Многие начинают это понимать после третьей перепайки драйвера. Но не все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aner 7 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба Tanya права, ... из моей практики, при торможении, не такого и мощного мотора (~16V/20A) дуга на конденсаторе в ~20мм. Повторяемо многократно. Как вам такое! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 6 минут назад, Tanya сказал: Драйвер обычно соответствует мощности двигателя... А если он нечто массивное тянет, то кинетическая энергия будет намного больше, чем у "голого" моторчика. А ведь обычно двигатель не просто так крутится для красоты... Торможение самая опасная процедура... Многие начинают это понимать после третьей перепайки драйвера. Но не все. А есть букварь на тему правильной остановки двигателя? И правильной схемотехники двигателя. Стало любопытно. Из мощного видел только на али тормозные резисторы. Я так понимаю ими и нагружают двигатель для остановки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 4 минуты назад, MegaVolt сказал: А есть букварь на тему правильной остановки двигателя? И правильной схемотехники двигателя. Стало любопытно. Из мощного видел только на али тормозные резисторы. Я так понимаю ими и нагружают двигатель для остановки. Тут нет общих рецептов. Но все формулы известны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться