PID kerdesek

Lukács Ákos lukrskywalkman at gmail.com
Tue Jan 16 20:05:19 CET 2007


Deriváló tag "hivatalosan" pont az előző és a mostani hiba különbsége.
Legalábbis valami ilyesmi rémlik diszkrét PD-ről :)

FIFO-t tulajdonképpen ki lehet
dobni. IIIgazság szerint nem is értem, hogy miért is pont így néz ki ez a
kódrészlet. Pontosabban hogy minek van ott az a FIFO. (persze ez nem
jelent semmit :D).
Csak átlagot csinál az előző hibákból, azt meg egy mozgó átlag számítással
meg lehet csinálni.

A " pwm = pwm +" rész
már magában egy integráló jelleget ad.  A "+Kp*error" lenne a
propócionális (deszépszó) rész, a "+Kd*(error-error_prev)" meg a
deriváló része.

(ha valami magasabb fokú algoritmus lenne, ami több előző értéket több
különböző szorzóval venne figyelembe, akkor még lenne értelme, de itt
így nem látom értelmét
annak a FIFO-nak.)

Egyébként mi a nyűgje? Pl. ha túl magas a Ki, akkor nekiáll lengeni
ahelyett, hogy beállna pontos értékre. Egyik változó sem csordul túl?

á.


On 1/16/07, Moczik Gabor <pm at progzmaster.hu> wrote:
>
> 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 )))
>
> -----------------------------------------
>           elektro[-flame|-etc]
>


More information about the Elektro mailing list