Jump to content

    

PID регулятор.

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

Share this post


Link to post
Share on other sites
31 minutes ago, jenya7 said:

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

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

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

Share this post


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

 

Edited by jenya7

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
23 часа назад, jenya7 сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 час назад, Aner сказал:

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

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

Share this post


Link to post
Share on other sites

Так непонятно что у ТСа, может оно ... редкостное извращение.

Share this post


Link to post
Share on other sites
9 минут назад, MegaVolt сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
14 минут назад, Tanya сказал:

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

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

Share this post


Link to post
Share on other sites
13 минут назад, MegaVolt сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
6 минут назад, Tanya сказал:

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

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

Share this post


Link to post
Share on other sites
4 минуты назад, MegaVolt сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now