Ik ben een PID regeling voor de spanning-mode van mijn algemene DCDC converter aan het maken.
Volgens mij heb ik de PID code nu redelijk simpel maar wel precies zoals het 'hoort".
c code:
int run_pid (struct pid_s *pid, int input)
{
int de, e;
e = pid->setpoint - input;
de = e - pid->error;
pid->error = e;
pid->acc += pid->error * pid->kI;
pid->out = ( (pid->acc>>4) + pid->kP * pid->error + pid->kD * de) >> 8;
return pid->out;
}
De berekeningen gebeuren dus met 8 bits "achter de comma", omdat de output toch als integer gebruikt wordt, hoop ik dat dit voldoende is. Hmm. Misschien een idee om even niet op CPU cycles te besparen en het ook met floats te implementeren. Niet optimaliseren voordat het werkt. Wie zei dat ook al weer? (*)
Onder belasting krijg ik met parameters:
CV pid: kp=22, ki=32, kd=0. Set=5642, acc=812320, error=-6, out=197.
De Kp heb ik bepaald door Kulitmate te bepalen. Boven de 44 ging ie raar doen, en volgens Ziegler–Nichols moet ik dan een Kp van ongeveer de helft daarvan gebruiken.
Maar als ik dan verder de Ziegler–Nichols methode ga gebruiken, dan snap ik niet goed wat ik met die tijden moet doen en wat de eenheden zijn.
https://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method
In dit grafiekje: de output en de error. (error rond de nul, de output rond de 200).
(*) Ik ben grote aanhanger van die uitspraak.