Bonjour à tous,
J'ai un problème au niveau de mon code. Aucun soucis avec les registres du PIC mais bien avec la progra en C.
Mon projet est de commander un moteur via un pont en H. Ce moteur commande un gouvernail à partir d'une barre (comme sur un bateau) à l'aide d'une pwm. Je récupère, via des potentiomètres, les positions de ceux-ci. J'affiche la position du gouvernail sur le portb (8 leds). Suivant l'écart entre barre et gouvernail, la pwm fonctionne plus ou moins fort.
Pour l'instant, j'arrive à faire fonctionner la pwm lors de l'appui sur le BP droite mais pas avec le BP gauche. J'ai l'impression que mes boucles ou mes conditions ne sont pas bien réalisées. Est-ce que quelqu'un pourrait jeter un oeil sur mon code pour voir où ce situe mon erreur?
J'utilise MikroC et une platine EasyPic6.
Merci d'avance.
Code:/*Header******************************************************/ #define Gauche PORTD.F2 #define Droite PORTD.F3 unsigned int pot1, pot2; char duc1, duc2, barre, diff1, diff2, new_duty1, new_duty2; bit Mem1, Mem2; /*INITIALISATION**********************************************/ void Init(){ //OSCCON = 0b01110111; //Fréquence interne de 8MHz //ANSEL = 0b00000011; //Pins AN0 et AN1 comme entrée analogique //ANSELH = 0; //Rest of pins is configured as digital //C1ON_bit = 0; // Disable comparators //C2ON_bit = 0; TRISA = 0xFF; //Pins du PORTA en entrée TRISB = 0x00; //Pins du PORTB en sortie TRISC = 0x00; TRISD = 0x00111111; PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; duc1 = duc2 = 0; pot1 = pot2 = 0; Mem1 = Mem2 = 0; Diff1 = Diff2 = 0; //ADCON1 = 0b00110000; //Justifié à gauche- (16F887) ADCON1 = 0b00001101; //16F877 avec RA0/RA1=pot,RA2/RA3=Ref,RA4/RA5=BP } void InitPWM(){ PR2 = 0b01111100; /* Mettre 124 dans PR2 pour avoir une F pwm de 1kHz : TC = (PR2+1)*Tcy*Prescaler = (124+1)*(1/(8M/4))*16 = 125*0.5µs*16 = 1ms = 1000Hz */ T2CON = 0b00000111; // Prescaler à 16, pas de postscaler CCP1CON = 0b00111100; // Sortie unique RC2, PWM mode CCP2CON = 0b00111100; // PWM mode //PWM1CON = 0b11111111; //Dead-band delay de 60µs } /*FONCTION****************************************************/ void affBarre(){ //Fonctionne avec la référence entre 1V et 4V barre = pot2/4; if(0<=barre && barre<=16) PORTB = 0b00000001; if(17<=barre && barre<=33) PORTB = 0b00000011; if(34<=barre && barre<=50) PORTB = 0b00000010; if(51<=barre && barre<=67) PORTB = 0b00000110; if(68<=barre && barre<=84) PORTB = 0b00000100; if(85<=barre && barre<=101) PORTB = 0b00001100; if(102<=barre && barre<=118) PORTB = 0b00001000; if(119<=barre && barre<=136) PORTB = 0b00011000; if(137<=barre && barre<=153) PORTB = 0b00010000; if(154<=barre && barre<=170) PORTB = 0b00110000; if(171<=barre && barre<=187) PORTB = 0b00100000; if(188<=barre && barre<=204) PORTB = 0b01100000; if(205<=barre && barre<=221) PORTB = 0b01000000; if(222<=barre && barre<=238) PORTB = 0b11000000; if(239<=barre && barre<=255) PORTB = 0b10000000; } /*PROGRAMME PRINCIPAL*****************************************/ void main() { Init(); InitPWM(); PWM1_Stop(); PWM2_Stop(); do { pot2 = ADC_Read(1); //Lecture valeur AN1 et envoi vers variable duc2 = pot2/4; //De 0 à 255 //CCPR1L = duc2; // Modification duty cycle PWM2 pot1 = ADC_Read(0); //Lecture valeur AN0 et envoi vers variable duc1 = pot1/4; //De 0 à 255 //CCPR2L = duc1; //Modification duty cycle PWM1 if(Gauche && !Droite){ //Appui sur bp gauche PWM1_Start(); PWM2_Stop(); while(duc1 < duc2){ pot1 = ADC_Read(0); //Lecture valeur AN0 et envoi vers variable duc1 = pot1/4; //De 0 à 255 pot2 = ADC_Read(1); //Lecture valeur AN1 et envoi vers variable duc2 = pot2/4; //De 0 à 255 diff1 = (duc2 - duc1); //On fait la différence if(diff1<=255 && diff1>=70) new_duty1= 255; if(diff1<=69 && diff1>=55) new_duty1 = 190; if(diff1<=54 && diff1>=40) new_duty1 = 80; if(diff1<=39 && diff1>=25) new_duty1 = 30; if(diff1<=24 && diff1>0) new_duty1 = 0; CCPR1L = new_duty1; //MAJ PWM PORTD.F6 = 0; PORTD.F7 = 1; affBarre(); } //CCPR2L = new_duty1; //PORTD.F7 = 1; //affBarre(); } if(Droite && !Gauche){ //Appui sur BP Droite PWM1_Stop(); PWM2_Start(); while(duc2 < duc1){ pot1 = ADC_Read(0); // Lecture valeur AN0 et envoi vers variable duc1 = pot1/4; pot2 = ADC_Read(1); // Lecture valeur AN1 et envoi vers variable duc2 = pot2/4; //De 0 à 255 diff2 = (duc1 - duc2); //On fait la différence if(diff2<=255 && diff2>=70) new_duty2 = 255; if(diff2<=69 && diff2>=55) new_duty2 = 190; if(diff2<=54 && diff2>=40) new_duty2 = 80; if(diff2<=39 && diff2>=25) new_duty2 = 30; if(diff2<=24 && diff2>0) new_duty2 = 0; CCPR2L = new_duty2; //MAJ PWM PORTD.F6 = 1; PORTD.F7 = 0; affBarre(); } //CCPR1L = new_duty2; //PORTD.F6 = 1; //affBarre(); } if((Gauche && Droite)||(!Gauche && !Droite)){ //Si aucun BP ou les 2 en même temps PWM1_Stop(); PWM2_Stop(); PORTD.F6 = 0; PORTD.F7 = 0; new_duty1 = 0; new_duty2 = 0; affBarre(); } } while(1); }
-----