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

1 hour ago, Aner said:

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

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

1 hour ago, Tanya said:

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

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

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


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

7 минут назад, AlexandrY сказал:

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

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

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

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


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

выбрал такой

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.

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

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

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


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

1 hour ago, Tanya said:

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

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

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


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

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

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

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

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


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

3 минуты назад, jenya7 сказал:

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

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

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


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

12 минут назад, Baser сказал:

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

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

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

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


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

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

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

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

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

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


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

1 hour ago, Baser said:

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

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

 

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

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


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

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

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


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

1 hour ago, Baser said:

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

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

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

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


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

7 минут назад, jenya7 сказал:

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

 

В 101 раз...

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

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

Получим -

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

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

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

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

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

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


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

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

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 не влияет - нет изменения на входе, но и он понятен (скорость реагирования на изменение). спасибо.

 

 

 

 

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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