Bonjour,

Le projet consiste à réaliser un MPPT de type boost, je n'ai pas le choix du panneau solaire. Il délivre une tension à vide de +-6.3V/Batterie 12v plomb

Je suis entrain de coder sur un 16f883 avec le compilateur CCS.

Le régulateur reste calé sur une mauvaise coordonnée du panneau (0.57W) alors que dans cet état, il est capable d'en délivrer plus du double (j'ai testé en modifiant le PWM manuellement).

J'ai vérifier les données traitées par l'ADC, et tout est ok. Désepérant...

Donc en gros, impossible de se caler sur le MPP.

voici le schéma et le code. Une bonne âme pour m'aider???

Nom : schéma.jpg
Affichages : 110
Taille : 69,7 Ko

Code:
#include "C:\Documents and Settings\Moi\Bureau\PICC\MPPT citea 3V\main.h"
#byte ADCON0=0x1F
#byte ADCON1=0x9F
#define LED pin_b7

#int_TIMER1
TIMER1_isr() 
{	
	int i;
	i++;
	if(i>=30)
   	{output_high(LED);
	 delay_ms(100);
	 output_low(LED);
	 i=0;
	}
	
}

void main()
{
	unsigned int16 PWM=0,t=0,i=0;
	unsigned int16 ADVp=0,ADVpt=0,CompADVp=0;
	unsigned int16 ADVb=0,ADVbt=0;
	unsigned int16 ADI=0,ADIt=0;
	unsigned int16 SADI=0,SADVb=0,SADVp=0;
	unsigned int32 Pow=0,CompPow=0;
	float fADVp=0,fADVb=0,fADI=0;
	Set_tris_b( 0b00000000 );    //Pin B0-B7 output
	setup_adc_ports(sAN0|sAN1|sAN3);
   	setup_adc(ADC_CLOCK_DIV_32);
   	setup_spi(SPI_SS_DISABLED);
   	setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
	setup_wdt(WDT_2304MS);
   	setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   	setup_timer_2(T2_DIV_BY_1,62,1);
	enable_interrupts(INT_TIMER1);
    	enable_interrupts(GLOBAL);
   	setup_ccp1(CCP_PWM);
   	set_pwm1_duty(0);
while(1)
	{

//Capture, traitement et envoi de Vpanel START

	ADCON1=0b10000000;				//Activation de l'ADC
	delay_us(15);

	ADCON0=0b10000101;				//Choix du canal à échantillonner
	delay_us(15);

	while(i<10)					//Capture de 10 mesures successives
	{	
		ADVpt=read_adc();
		SADVp=SADVp+ADVpt;		//Somme des tensions 
		i++;
	}
	ADVp=SADVp/10;				//Moyenne effectuée
	SADVp=0;
	ADVpt=0;
	i=0;
	
	if(t==4000)
	{
	 fADVp=(float)ADVp/131.02;			//Conversion en valeur décimale (float)
	 printf("\n\nSTART----------------------------------------");
	 printf("\n\nPanel voltage : %1.1fV",fADVp);
	}

//Capture, traitement et envoi de Vpanel END

//______________________________________________________________________________________________________________
	
//Capture, traitement et envoi de Ipanel START

	ADCON0=0b10001101;				//Choix du canal
	delay_us(15);
	
	while(i<10)					//Capture de 10 mesures successives
	{	
		ADIt=read_adc();
		SADI=SADI+ADIt;			//Somme des courants
		i++;
	}
	ADIt=0;
	ADI=SADI/10;					//Moyenne effectuée
	SADI=0;
	i=0;
	if(t==4000)
	{
		fADI=(float)ADI/511; 
		printf("\n\nPanel current : %1.3fA",fADI);	
	}

//Capture, traitement et envoi de Ipanel END
	
//______________________________________________________________________________________________________________


//Capture, traitement et envoi de Vbatterie START

//______________________________________________________________________________________________________________
	



	ADCON0=0b10000001;				//Choix du canal
	delay_us(15);
	
	while(i<5)					//Capture de 5 mesures successsives
	{	
		ADVbt=read_adc();
		SADVb=SADVb+ADVbt;
		i++;
	}
	ADVb=SADVb/5;
	ADVbt=0;
	SADVb=0;
	i=0;	

	if(t==4000)
	{	
		fADVb=(float)ADVb/65.51;
		printf("\n\nAccu voltage : %2.1fV",fADVb);
	}

//Capture, traitement et envoi de Vbatterie END

//______________________________________________________________________________________________________________
	



//routine de comparaison des Pow calculées

Pow=ADVp*ADI;



	if(ADVb>904)								//Vb>13,8V 
	{set_pwm1_duty(0);}
	else{
 		
	if(Pow<CompPow)
		

		{ if((ADVp>CompADVp)&&(PWM<230)&&(ADVp>407))		//ADVp>3,1V 
			{ 	PWM++;
				set_pwm1_duty(PWM);		
			}	
		  else if((ADVp<CompADVp)&&(PWM>0))
			{	PWM--;
				set_pwm1_duty(PWM);
			}
		}
	else if(Pow>=CompPow)
		

		{ if((PWM<230)&&(ADVp>407))					//ADVp>3,1V	
			{	PWM++;
			 	set_pwm1_duty(PWM);		
			}	
		}
	}

CompPow=Pow;
CompADVp=ADVp;
t++;
restart_wdt();

}

	
}