PID con PIC, error constante

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:
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;			
			}
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
 
Atrás
Arriba