Перейти к содержанию
    

Еть ли у кого проверенный PID регулятор для управления моторами? Просмотрел великое множество так и не пришел к однозначному выводу какой использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 minutes ago, jenya7 said:

Просмотрел великое множество так и не пришел к однозначному выводу какой использовать.

Тот, который пройдёт моделирование в матлабе.

Я делал пид-регулятор, правда не для мотора, а для источника тока. Считал на cortex-m0. Код дать не могу, не моя собственность. Но формула была банальная. По учебнику. Для настройки использовался метод Зиглера-Никольса. Не могу сказать, что вышло идеально. Но переходные характеристики нас утсраивали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 дает возможность работать с целыми числами.

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пид регулятор это и есть пид-регулятор. Он везде одинаковый, за исключением калибровки, которую в любом случае нужно проводить под ваши индивидуальные условия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 часа назад, jenya7 сказал:

2. в ПИД присутствует dt - соответственно он запускается во временные интервалы, по таймеру. это мне опрос датчиков тоже надо делать по таймеру? это ухудшает время реакции системы.

Скорее вычисления нужно делать после каждого опроса. А так как опрос идёт с неким дискретом по времени то и появляется дельта т.

Опять же двигатель сильно инерционная штука. По этому сильно маленький шаг по времени делает диф коэффициент сильно малюсеньким.

3 часа назад, jenya7 сказал:

и вот что я не понимаю - при вычислении ошибки (E - Eprev) результат может быть отрицательный. что значит отрицательный PWM?

Вращение в обратную сторону

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот как бы этот коэффициент сильно малюсенький в ноль или единицу не превратить у шима ... который подает ток в обмотку. Иначе КЗ будет и защита отработает или не отработает если её нет ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Aner сказал:

Вот как бы этот коэффициент сильно малюсенький в ноль или единицу не превратить у шима ... который подает ток в обмотку. Иначе КЗ будет и защита отработает или не отработает если её нет ...

Шутите? Чтобы мост организовал КЗ нужно чтобы мост управлялся целиком программно. Это редкостное извращение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, MegaVolt сказал:

Шутите? Чтобы мост организовал КЗ нужно чтобы мост управлялся целиком программно. Это редкостное извращение.

Это не шутка. Там не короткое замыкание, а еще хуже будет...

Мотор крутится, а мы приложили обратное напряжение, - ток будет определяться суммой поданного напряжения и противоэдс, пропорциональной скорости.

Раскрутите моторчик и закоротите его... Ток будет огромный. Не всякий драйвер это выдержит. Вся кинетическая энергия нагреет обмотку и ключи. А тут мы еще быстрее останавливаем... Если есть система рекуперации, то можно зарядить конденсатор до очень высокого напряжения. Что с ним будет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, Tanya сказал:

Вся кинетическая энергия нагреет обмотку и ключи. А тут мы еще быстрее останавливаем... 

Упс... я с сильно мощными двигателями не сталкивался. А у мелких это не так заметно. Был не прав.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, MegaVolt сказал:

Упс... я с сильно мощными двигателями не сталкивался. А у мелких это не так заметно. Был не прав.

Драйвер обычно соответствует мощности двигателя... А если он нечто массивное тянет, то кинетическая энергия будет намного больше, чем у "голого" моторчика. А ведь обычно двигатель не просто так крутится для красоты... Торможение самая опасная процедура... Многие начинают это понимать после третьей перепайки драйвера. Но не все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Tanya права, ... из моей практики, при торможении, не такого и мощного мотора (~16V/20A) дуга на конденсаторе в ~20мм. Повторяемо многократно. Как вам такое! 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, Tanya сказал:

Драйвер обычно соответствует мощности двигателя... А если он нечто массивное тянет, то кинетическая энергия будет намного больше, чем у "голого" моторчика. А ведь обычно двигатель не просто так крутится для красоты... Торможение самая опасная процедура... Многие начинают это понимать после третьей перепайки драйвера. Но не все.

А есть букварь на тему правильной остановки двигателя? И правильной схемотехники двигателя. Стало любопытно.
Из мощного видел только на али тормозные резисторы. Я так понимаю ими и нагружают двигатель для остановки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, MegaVolt сказал:

А есть букварь на тему правильной остановки двигателя? И правильной схемотехники двигателя. Стало любопытно.
Из мощного видел только на али тормозные резисторы. Я так понимаю ими и нагружают двигатель для остановки.

Тут нет общих рецептов. Но все формулы известны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...