Heh, nista bez cika Macole ;)
Pomogo mi je dosta da ovo debugiram.
Elem, problem je bio u tome sto nisam cuvao vrednost PWM-a za sledeci prolaz.
Tehnicki gledano, i kada je greska=0 ja i onda moram da imam neku vrednost za PWM jer mora i dalje da se ulaze energija da bi to radilo.
Ovo se svodi na princip da PID odrzavanja recimo nekakvu brzinu a ne poziciju. Kada bi odrzavao pozicuju, kada stignem na zadatu tacku vise nema potrebe da se ulaze energije i tu je bila moja greska jer to u svim ovim primerima koje sam gledao nije pisalo.
Sad sam napravio samo P kontrolu koja radi extra dobro, sto se kaze NE MRDA :)
Odrzava izlazni napon jako dobro i pri promeni opterecenja i pri promeni ulaznog napona.
Evo kako to programski izgleda, manje-vise lici na pseudo code:
Code:
//izracunaj gresku
greska = zadato - izmereno;
//P algoritam (Kp je celobrojna vrednost, npr 100)
greska = greska * (Kp / 1000.00);
if (greska == 0) {
outpwm = old_outpwm;
} else {
outpwm = old_outpwm + greska;
}
//Saturacija, drzimo se nekih limita, npr max_pwm = 4096
if (outpwm > max_pwm - 2) outpwm = max_pwm - 2;
if (outpwm <= 0 ) outpwm = 2; //ovde sam popravio gresku
//sacuvaj trenutno stanje za sledeci prolaz
old_outpwm = outpwm;
//Postavi sad PWM
SetHSPWMDutyCycle1(outpwm);
Sad vec imam solidnu bazu za igranje sa I i D.
To cu sledece da uvedem.
[Ovu poruku je menjao mikikg dana 03.12.2013. u 05:05 GMT+1]