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

Не могу добиться устойчивости работы шим регулятора

 

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

могу сказать как я делал очень пид регулятор..

Kp = коэффицент пропрц.

Ki = интегр постоянная

Kd = дифф постоянная

[П] proporc = Kp*(Ustavka_i-izm)

[И] INT = (Tpwm*Kp*(ustavka_I-izm)/Ki

[Д] Diff = (Kd*Kp*(LAST_izm-izm))/Tpwm

 

OUT(pid) = Diff+INT+proporc

;========================

 

 

Для И канала Вы либо здесь ошиблись, либо в программе - там должна стоять сумма всех предыдущих (ustavka_I-izm). Без этого нет интеграла, и регулятор неустойчив. Кстати, в источниках питания не применяется, как правило Д канал, поскольку он обостряет переходной процесс, который может нагнуть или источник, или нагрузку.

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


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

дело в том что у меня вся это приблуда запускалась только при изменении значения ос

ну а так то конечно и обязательно сумма до текущего измерения...

ну а так как значение у меня могло измениться только на +- 1 А все это и не прокатитло...

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


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

Я полностью соглашаюсь с Ковровым. Тот пример программного ПИД регулятора, который Вы привели и стало основой моего одного проекта. Так как именно разделение вычислений каждого звена ПИД регулятора позволило гибко настроить его коэффициенты на готовом объекте. Только одно замечание: Вы не предусмотрели такую особенность, как насыщение интегратора, при котором необходимо отключить накопление ошибки интегрального звена.

В довесок приведу часть кода для Имейдж Крафта

 

delta=present_period-zadanie_oborotov;

PID=delta*Kp;

 

if(!(status_flag&(1<<saturation_flag)))

{

integral=integral+delta;

}

temp=Ki*integral/1000;

PID=PID+temp;

temp=Kd*(delta-delta1)/1000;

PID=PID+temp;

delta1=delta;

status_flag&=(~(1<<saturation_flag));

 

////////////////////////////////////////////////////////////////////////////////

 

PWM=PID>>12;

if(PWM>127)

{

PWM=127;

status_flag|=(1<<saturation_flag);

}

 

if(PWM<-127)

{

PWM=-127;

status_flag|=(1<<saturation_flag);

}

OCR2=PWM+127;

Может написано и убого, но понятно.

Этот регулятор применялся именно для стабилизации частоты вращения двигателя. Коэфициенты подбирались уже на "живую".

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


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

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

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

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

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

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

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

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

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

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