Pozor na chybu v Application Note AVR221 (Discrete PID controller) od Atmelu
Richard Kaliciak
hw.kaliciak@stonline.sk
Pondělí Červen 2 13:02:37 CEST 2008
Dobry den,
pri hladani vhodnych PID parametrov som narazil na zvlastne spravanie
regulatora. K_I a K_D som nastavil na nulu, aby som mohol odhadnut
vhodne K_P. Vsetko pekne fungovalo, ale po urcitej dobe vybehla
riadiacia hodnota na maximum.
Tymto chcem upozornit na chybu v programe pid.c z AVR221, ktora sa
prejavi pri K_I=0. V povodnom texte je:
---------- begin ----------
// 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;
}
---------- end ----------
Po istej dobe naakumulovana chyba prekroci maxSumError a i_term sa
nastavi na MAX_I_TERM, aj ked je I_Factor = 0. Po zmene programu na:
---------- begin ----------
// 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 = MIN_I_TERM;
pid_st->sumError = -pid_st->maxSumError;
}
else{
pid_st->sumError = temp;
}
i_term = pid_st->I_Factor * pid_st->sumError;
---------- end ----------
to uz funguje ako sa patri.
Richard Kaliciak
Další informace o konferenci Hw-list