bonjours, je suis entrain de programmer un PIC 16F877 afin de commander un onduleur triphasé. jusqu'à maintenant j'ai générer les signaux de commande qui ont une fréquence réglable, tout en tenant compte du temps mort nécessaire pour la commutation des interrupteurs de puissance d'un même bras de l'onduleur. j'aimerais bien que vous me donnez votre avis sur mon code ainsi que des conseils ou propositions afin de l'optimiser. Merci d'avance.
****************************** ***********************
Code:#include <pic.h> static void interrupt inter(void); static void InitialisationConvertisseur(void); int convertisseur(void); bit time; int i; int valeur; float resul; double c; char t; main() { GIE=1; PEIE=1; OPTION=0b10000101; TMR0=0; T0IE=1; TRISB=0; i=0; InitialisationConvertisseur(); while(1) { resul= convertisseur(); c= (53281.25/resul)-3; if((i>=0)&&(i<c)) { RB1=1 ; RB2=0 ; RB3=0 ; RB4=1 ; RB5=1 ; RB6=0 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=c)&&(i<c+3)) { RB1=1 ; RB2=0 ; RB3=0 ; RB4=1 ; RB5=0 ; RB6=0 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=c+3)&&(i<2*c+3)) { RB1=1 ; RB2=0 ; RB3=0 ; RB4=1 ; RB5=0 ; RB6=1 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=2*c+3)&&(i<2*c+6)) { RB1=1 ; RB2=0 ; RB3=0 ; RB4=0 ; RB5=0 ; RB6=1 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=2*c+6)&&(i<3*c+6)) { RB1=1 ; RB2=0 ; RB3=1 ; RB4=0 ; RB5=0 ; RB6=1 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=3*c+6)&&(i<3*c+9)) { RB1=0 ; RB2=0 ; RB3=1 ; RB4=0 ; RB5=0 ; RB6=1 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>3*c+9)&&(i<4*c+9)) { RB1=0 ; RB2=1 ; RB3=1 ; RB4=0 ; RB5=0 ; RB6=1 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=4*c+9)&&(i<4*c+12)) { RB1=0 ; RB2=1 ; RB3=1 ; RB4=0 ; RB5=0 ; RB6=0 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=4*c+12)&&(i<5*c+12)) { RB1=0 ; RB2=1 ; RB3=1 ; RB4=0 ; RB5=1 ; RB6=0 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=5*c+12)&&(i<5*c+15)) { RB1=0 ; RB2=1 ; RB3=0 ; RB4=0 ; RB5=1 ; RB6=0 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=5*c+15)&&(i<6*c+15)) { RB1=0 ; RB2=1 ; RB3=0 ; RB4=1 ; RB5=1 ; RB6=0 ; resul= convertisseur(); c= (53281.25/resul)-3; } if((i>=6*c+15)&&(i<6*c+18)) { RB1=0 ; RB2=0 ; RB3=0 ; RB4=1 ; RB5=1 ; RB6=0 ; resul= convertisseur(); c= (53281.25/resul)-3; } if (i>=6*c+18) { i=0; } if(time) { i= i+1; time=0; resul= convertisseur(); c= (53281.25/resul)-3; } } } static void interrupt inter(void) { if(T0IF) { time=1 ; T0IF=0 ; } } static void InitialisationConvertisseur(void) { ADCS1=0; ADCS0=1; // Fosc/8 CHS2=0; CHS1=0; CHS0=0; // entrée RA0 ADFM=1; // justification à droite PCFG3=0; PCFG2=0; PCFG1=0; PCFG0=0; } int convertisseur(void) { ADON=1; // activation du convertisseur valeur=0; t=6; while(t--); ADGO=1; // demarrer convertion valeur=ADRESH; valeur=valeur<<8; // decalage à gauche de 8bits valeur=valeur|ADRESL; // ou bit à bit ADON=0; // arreter convertisseur return valeur; }
-----