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