Jump to content

    
jenya7

PID регулятор.

Recommended Posts

1 hour ago, Aner said:

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

Превиделось. 

1 hour ago, Tanya said:

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

Огромный он будет только если мотор раскручивает внешняя сила. Инерция не вызовет скачок тока. 

Share this post


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

Превиделось. 

Огромный он будет только если мотор раскручивает внешняя сила. Инерция не вызовет скачок тока. 

Попробуйте... Капица придумал в свое время... импульсный магнит питал.

Share this post


Link to post
Share on other sites

выбрал такой

typedef struct 
{
   float dState;   // Last position input
   float iState;   // Integrator state
   // Maximum and minimum allowable integrator state
   float iMax;
   float iMin;  	
 
   float iGain;  // integral gain
   float pGain;  // proportional gain
   float dGain;  // derivative gain
   
   float value;
} PID_S; 

float PID_Run(PID_S *pid, float *input)
{
    float pTerm, dTerm, iTerm;
    float error = pid->value - *input;

    pTerm = pid->pGain * error;    // calculate the proportional term
    pid->iState += error;          // calculate the integral state with appropriate limiting

    if (pid->iState > pid->iMax) 
        pid->iState = pid->iMax;     
    else if (pid->iState < pid->iMin) 
       pid->iState = pid->iMin;
    
    // calculate the integral term
    iTerm = pid->iGain *  pid->iState;
    // calculate the diff term   
    dTerm = pid->dGain * (*input - pid->dState);
    pid->dState = *input;

    pid->value = (pTerm + iTerm - dTerm);
    
    return pid->value;
} 

начал настраивать. вход подал постоянный, поставил минимум, максимум и начал играться с коэффициэнтами iGain, pGain , dGain. сижу уже целый день - не могу настроить - осцилирует либо в плюс либо в минус.

пробовал всякие подходы.

такой

Quote
  1. Set all gains to zero.
  2. Increase the P gain until the response to a disturbance is steady oscillation.
  3. Increase the D gain until the the oscillations go away (i.e. it's critically damped).
  4. Repeat steps 2 and 3 until increasing the D gain does not stop the oscillations.
  5. Set P and D to the last stable values.
  6. Increase the I gain until it brings you to the setpoint with the number of oscillations desired (normally zero but a quicker response can be had if you don't mind a couple oscillations of overshoot)

и такой

Quote
  1. Set all gains to 0.
  2. Increase Kd until the system oscillates.
  3. Reduce Kd by a factor of 2-4.
  4. Set Kp to about 1% of Kd.
  5. Increase Kp until oscillations start.
  6. Decrease Kp by a factor of 2-4.
  7. Set Ki to about 1% of Kp.
  8. Increase Ki until oscillations start.
  9. Decrease Ki by a factor of 2-4.

ничего не выходит. как настроить?

Edited by jenya7

Share this post


Link to post
Share on other sites
1 hour ago, Tanya said:

Это задача не для программирования программистами. Схему нарисуйте.

да нет схемы. скажем вход - температура датчика, выход - PWM вентилятора. изменение скорости вентилятора от температуры.

Share this post


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

да нет схемы. скажем вход - температура датчика, выход - PWM вентилятора. изменение скорости вентилятора от температуры.

На НЕТ и суда НЕТ.

Share this post


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

да нет схемы. скажем вход - температура датчика, выход - PWM вентилятора. изменение скорости вентилятора от температуры.

Не нужно для вентилятора полного ПИДа. Достаточно пропорционального звена. И зону пропорциональности нет смысла большой делать. И не забыть, что обычные кулеры примерно от 25% ШИМа начинают работать. А ниже - или останавливаются, или крутят на минимальной скорости.

Share this post


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

Не нужно для вентилятора полного ПИДа. Достаточно пропорционального звена. И зону пропорциональности нет смысла большой делать. И не забыть, что обычные кулеры примерно от 25% ШИМа начинают работать. А ниже - или останавливаются, или крутят на минимальной скорости.

Это, смотря для чего все это.  Может, и релейный  (двухпозиционный), реализованный на достаточно мощном процессоре, будет удовлетворять.

Регуляторы температуры для разных целей применяют. И ПИД в регуляторах температуры прекрасно работает. В умелых руках.

Share this post


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

Это, смотря для чего все это.

Именно так. ТС не выдал условия своей задачи, а я дал рекомендации относительно моих задач :biggrin:

Эти рекомендации для управления кулером, который охлаждает перегретый/охлажденный относительно окружающей температуры объект по разнице температур.
А что нужно ТС - х.з. :dirol:

Share this post


Link to post
Share on other sites
1 hour ago, Baser said:

Не нужно для вентилятора полного ПИДа. Достаточно пропорционального звена. И зону пропорциональности нет смысла большой делать. И не забыть, что обычные кулеры примерно от 25% ШИМа начинают работать. А ниже - или останавливаются, или крутят на минимальной скорости.

а дифференциальная часть нужна? она без интегральной никак не влияет.

 

Edited by jenya7

Share this post


Link to post
Share on other sites

Задачу сначала озвучьте.
Что есть на входе (датчики)? Какой вентилятор? ШИМ чем управляет и как? Результат управления какой нужен?

Share this post


Link to post
Share on other sites
1 hour ago, Baser said:

Задачу сначала озвучьте.
Что есть на входе (датчики)? Какой вентилятор? ШИМ чем управляет и как? Результат управления какой нужен?

это вобщето планируется как универсальный ПИД. какая разница от какого датчика я получу цифру 25 (градусов)? и какая разница на какой дравер я подам ШИМ? я реально не понимаю вопроса. тип вентилятора? это важно для ПИД?

Edited by jenya7

Share this post


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

а дифференциальная часть нужна? она без интегральной никак не влияет.

 

В 101 раз...

Теплоемкость, умноженная на производную от температуры по времени равно мощности. Мощность равна сумме членов ПИД-регулятора.

Продифференцируем это уравнение по времени.

Получим -

Теплоемкость, умноженная на вторую производную от невязки температуры равно сумме ( коэффициент пропорциональности (П) на первую производную от температуры) + (И, умноженный на невязку температуру ) +(Д, умноженный на вторую производную).

Вспоминаем уравнение механического осциллятора (груз на пружинке).

Видим. что дифференциальный член увеличивает эффективную массу (теплоемкость), интегральный член играет роль пружинки, а пропорциональный вводит трение (вязкое).

Таким образом посредством регулятора мы создаем колебательную систему с затуханием.

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

Share this post


Link to post
Share on other sites

ок. взял такое решение

float PID_Reg(PID_S *pid, float *input)
{
    static char is_first_call = 1;
    static float U, I, error, error_prev;
    
    if (is_first_call)
    {
        is_first_call = 0;
        I = 0;
        error_prev = 0;
        //Kp, Ki, Kd initialization
    }
    
    U = 0;
    error = *input;
    
    //integral part
    if (pid->iGain != 0)
    {
        U = I + pid->iGain * error;
        I = U;
    }
    
    //proportional part
    if (pid->pGain != 0)  
    {
        U += pid->pGain * error;
    }
    
    //differencial part
    if (pid->dGain != 0)
    {
        U += pid->dGain * (error - error_prev);
        error_prev = error;
    }

    return U;
}

вобщем то неплохо. можно настроить довольно стабильно. но почему то I, D коэффициэнты малы - P = 80, I = 0.001, D = 0.1. при увеличении система идет вразнос.

 

ок. с P и I разобрался. D не влияет - нет изменения на входе, но и он понятен (скорость реагирования на изменение). спасибо.

 

 

 

 

Edited by jenya7

Share this post


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

это вобщето планируется как универсальный ПИД. какая разница от какого датчика я получу цифру 25 (градусов)? и какая разница на какой дравер я подам ШИМ? я реально не понимаю вопроса. тип вентилятора? это важно для ПИД?

Если это ПИД в общем виде, то отвечать вам вообще нечего. Формулы у вас в общем виде есть, методики настройки в общем виде тоже на каждом углу в интернете разбросаны.
Вот если бы у вас был вопрос по конкретному применению ПИД - тогда другое дело, везде есть нюансы. Чистый теоретический ПИД редко применяется, обычно в алгоритм вводят кучу эмпирических добавок.

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

но почему то I, D коэффициэнты малы - P = 80, I = 0.001, D = 0.1.

Без нормализации входного сигнала и сигнала управления - это просто числа, которые могут быть любыми.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.