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