alzec
Messages postés2Date d'inscriptionvendredi 23 janvier 2015StatutMembreDernière intervention23 janvier 2015
-
23 janv. 2015 à 09:48
alzec
Messages postés2Date d'inscriptionvendredi 23 janvier 2015StatutMembreDernière intervention23 janvier 2015
-
23 janv. 2015 à 10:04
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, je n'arrive pas à faire fonctionner la pwm lors d'un appui sur l'un ou l'autre BP (gauche ou droite). 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.
/*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; CCPR2L = 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; CCPR1L = 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); }
Bonjour alzec,
Je te conseille d'exposer ton soucis sur le forum Arduino.
Les cadors locaux vont te le régler en deux coups de cuillère à pot, et tu y apprendra plein de bonnes choses.
C'est un forum international, il faut que tu sélectionne le forum français.
Bonne prog...
alzec
Messages postés2Date d'inscriptionvendredi 23 janvier 2015StatutMembreDernière intervention23 janvier 2015 23 janv. 2015 à 10:04
Ok merci, mais je viens de remarquer une erreur justement, donc je corrige et fais quelques tests avant de reposter tout ça. ;)
23 janv. 2015 à 10:04