PID kerdesek

Moczik Gabor pm at progzmaster.hu
Tue Jan 16 18:37:44 CET 2007


Hali!

Most kuzdok eletem elso digitalis PID motorszabalyzojaval. Olvasok a neten 
egy par anyagot, de nem minden vilagos.
Annyi a kiserlet lenyege, hogy PWM-mel hajtok egy motort, es az inaktiv 
felperiodusok alatt merem a Back-EMF feszt (ezek mukodnek).
A szabalyzokornek a fordulatszamot kellene stabilan tartani.

Eddig ennyi:

// RPM: a mert fordulatszam
// PWM: a motormeghajto jel kitoltesi tenyezoje

#define I_LEN  16

signed short   integrator[I_LEN];
signed short   integr;
unsigned char  idx_new;
unsigned char  idx_old;

signed short   error_prev;

unsigned char Kp;
unsigned char Ki;
unsigned char Kd;

void PID()
{
     error = setpoint - RPM;

     // add the new value to the FIFO
     integrator[idx_new] = error;
     // calculate the sum of the FIFO
     integr = integr + error - integrator[idx_old];
     // step
     idx_new++;
     if (idx_new==I_LEN) idx_new=0;
     idx_old++;
     if (idx_old==I_LEN) idx_old=0;

     pwm = pwm + (Kp*error + Ki*integr/16 + Kd*(error-error_prev))/100;

     error_prev = error;
}

-----------

A P tag hibatlanul mukodik :-)

A kerdes:
Van ugye a 3 fele komponens, es annak a szorzo faktorjai, Kp, Ki, Kd.

Emellett meg feletetelezem, hogy kellene tudni allitani az integralashoz 
hasznalt FIFO meretet is (I_LEN), mert nyilvan nem mindegy, hogy mekkora 
idore integralok. Tovabba szerintem a derivalo tagnal is allithatonak 
kellene lennie, hogy ne az elozo hanem korabbi mintat vonjon ki.

Egyebkent lehetne valahogy integralni nagymeretu FIFO nelkul?
(keves a RAM...)

-- 
((( Móczik Gábor  )))--((( pm -> @ -> progzmaster -> . -> hu  )))
((( Skype: moczik )))--((( Website: http://www.progzmaster.hu )))



More information about the Elektro mailing list