Hola!, estoy haciendo un control para una fuente buck en bucle cerrado y quiero implementarlo con un control PI. el codigo que estoy utilizando es el siguiente:
la ecuacion que estoy siguiendo para el pid la he sacado del control de un pendulo invertido de una hoja de aplicacion de microchip y es (ki*sume/(kp*fs) + error)*kp, que es igual a ki*sume/fs+kp*error, el problema es que, en primer lugar el termino integral se satura enseguida, con lo que se convierte en una constante, y el termino proporcional tambien se convierte en constante ya que el ciclo d etrabajo siempre es el mismo porque si tengo un error, y lo estoy multiplicando por una constante, el error nunca varia, por tanto el cuclo de trabajo tampoco, por tanto el error es constante, ciclo d etrabajo constante, error constante y asi sucesivamente, con lo que siempre tengo un error de bastante amplitud, en concreto para una salida de 30V, me saca 12 o 13 voltios, queria saber si alguien sabe otra forma de hacerlo, o si mi código esta mal. ya he probado a hacer que el termino integral no entre en juego hasta que el error no es pequeño, pero como el error siempre es grande nunca entra. . .
Un saludo
Código:
ADCON0=0x03;
for(indice=0;indice<=200;indice++);
while(ADCON0bits.GO==1);
vi=ADRESH;
vi=vi;
ADCON0=0x07;
for(indice=0;indice<=200;indice++);
while(ADCON0bits.GO==1);
ref=ADRESH;
ref=ref;
if(flag_pi){
flag_pi=0;
des=0;
error=ref-vi;
sume=sume+error;
if(sume>sume_max)
sume=sume_max;
if(sume<sume_min)
sume=sume_min;
integral_term=sume/4500;
integral_term=integral_term*ki;
integral_term=integral_term/kp;
pi_res=error+integral_term;
pi_res=pi_res*kp;
pi_res=pi_res/255;
if(pi_res>1000)
pi_res=1000;
if(pi_res<0)
pi_res=0;
CCPR2L=pi_res/4;
CCP2CONbits.DC2B0=pi_res&0x01;
CCP2CONbits.DC2B1=pi_res&0x02;
}
Un saludo