гральна складова (І) являє собою попередніх помилок. Підсумовування помилки буде тривати до тих пір, поки значення системного процесу не стане одно потрібному значенню. Зазвичай інтегральну складову використовують разом з пропорційної, в так званих ПІ-регуляторах. Використання тільки інтегральною складовою дає повільний відгук і часто коливальну систему. Відгук ПІ-регулятора не має стаціонарного помилки, а відгук І-регулятора дуже повільної. Диференціальна складова (Д) являє собою швидкість зміни помилки. Додавання цієї складової покращує відгук системи на раптову зміну її стану. Диференціальна складова Д зазвичай використовується з П або ПІ алгоритмами, як ПД або ПІД контролери. Велика диференціальна складова Д зазвичай дає нестійку систему. Відгук ПД-контролера дає швидке зростання значення процесу, ніж П контролер. Зверніть увагу, що диференціальна складова Д поводиться по суті як фільтр верхніх частот для сигналу помилки і, таким чином легко робить систему нестабільною і більш чутливою до шуму.
Апроксимуємо інтегральну і диференціальну складові, щоб отримати дискретний вигляд:
де n - дискретний крок часу t.
Це дає нам такий регулятор:
Де
Реалізація ПІД-контоллера мовою С представлена ??нижче:
# define SCAL_FACTOR 1024
# define P_TERM_MAX (INT32_MAX / 4)
# define I_TERM_MAX (INT32_MAX / 4) struct {
/ * PID koeff. * / _t P_factor; _t i_factor; _t d_factor;
/ * Int. term summator * / _t sum_error;
/ * Last measured value. Use for diff. term * / _t last_meas;
/ * Max values ??* / _t max_sum; _t max_error;
} pidc_t; pid_init (pidc_t * pid, uint16_t p_factor, _t i_factor, uint16_t d_factor)
{
/ * Reset PID * /> last_meas=0; > Sum_error=0;
/ * Tuning * /> p_factor=p_factor; > I_factor=i_factor; > D_factor=d_factor;
/ * Calculate max values ??* /> max_error=P_TERM_MAX / (pid-> p_factor + 1); > Max_sum=I_TERM_MAX / (pid-> i_factor + 1);
} _t pid_controller (pidc_t * pid, _t ref, int16_t meas)
{_t p_term, i_term, d_term; _t error, temp; =Ref - meas; (Error> pid-> max_error) {_term=P_TERM_MAX;
} else if (error <-pid-> max_error) {
p_term =-P_TERM_MAX;
} else {_term=pid-> p_factor * error;
}=pid-> sum_error + error; (Temp> pid-> max_sum) {_term=I_TERM_MAX;
} else if (temp <-I_TERM_MAX) {_term =-I_TERM_MAX;
} else {> sum_error=temp; _term=pid-> i_factor * pid-> sum_error;
} _term=pid-> d_factor * pid-> last_meas - meas; > Last_meas=meas; (Int16_t) ((p_term + i_term + d_term)
/ SCAL_FACTOR);
}
Всі дані ПІД-регулятора зберігаються в структурі pidс_t. Функція pid_init () отримує на вхід коефіцієнти регулятора і ініціалізує структуру ПІД. Функція pid_controller () обчислює сигнал керуючого впливу за переданими їй значенням сигналу завдання і вимірювання значення частоти обертання.
...