Bonjour à tous,
J'ai décidé cette année de fabriquer un aéroglisseur pour mon projet de Terminale S. Pour cela je dois commander 3 MLI (un servo-moteur, un moteur arrière et une turbine), par l'intermédiaire d'un PIC 16F648A et d'un capteur infra-rouge (et d'une télécommande IF).
Ce PIC ne disposant que d'une fonction PWM, j'ai décidé de faire les MLI (modulations de largueur d'impulsions) avec une interruption.
Le problème est que les interruptions ont pour effet de rallonger les temps de delay que j'ai dans mon programme principale (et qui permettent l'acquisition des données infra-rouge).
Voici mon programme :
J'ai essayé de diminuer les durrées des delay mais le nombre d'interruptions (une toute les 560µs) qui ont lieu lors de chaque delay varie...Code:#define TURBINE 55 /*attribution des code IF de chaque actions*/ #define ACCELERER 2 #define RALENTIR 8 #define V_TURBINE 0x00 #define SERVO_D 4 //tourner à gauche !! #define SERVO_G 6 #define SERVO_INIT 5 #define SERVO_VAL_INIT 3 #define SERVO_VAL_MAX 6 #define SERVO_VAL_MIN 2 #define SERVO_PAS 1 int pwm_period; // 255 cycles int crt_moment; // go between 0 and 255 int val_servo, rate2; short tableau_vitesse[] = {0,10,20,30,40,50}, vitesse = 1, turbine = 0; int x, i; void interrupt() { if (PIR1.TMR2IF) { ++crt_moment; if ( crt_moment > pwm_period ) crt_moment = 0; PORTA.F4 = ( crt_moment < val_servo ); //PORTA.F2 = ( crt_moment < rate2 ); PORTA.F2 = ( crt_moment < tableau_vitesse[vitesse] ); PIR1.TMR2IF = 0; // clears TMR2IF TMR2 = 255; } } void init() { // ports settings TRISA = 0b00000000;//0b00001000; //lié a une plaque de connection externe CMCON = 0x07; // turn off analog inputs TRISB = 0xFF; PORTB = 0; // no signal at the output // pwm settings val_servo = SERVO_VAL_INIT; //rate2 = 16; pwm_period = 50; // timer settings crt_moment = 0; TMR2 = 255; // Initialize Timer2 register PIE1.TMR2IE = 1; // enable interupt INTCON = 0xC0; // Set GIE, PEIE PR2 = 250 ; T2CON = 0b00000101 ; } void main() { init(); while(1) { while (PORTB.F1==1) //Attendre le front descendant du signal de la télécommande {} x=0; delay_us(1600) ; // Attendre 1,6 ms x=PORTB.F1; // Lire l'état logique for (i=0; i<6;i++) // mémoriser et décaler l'état logique des 6 états suivants { delay_us(1750) ; // toutes les 1750 us x=(2*x+PORTB.F1); } if (x==96 | x==64) // Si le résultat est 96 ou 64 la trame est correcte (0b01100000 ou 0b01000000) { x=0; delay_us(1750); // Attendre 1750 us x=PORTB.F1; // lire et mémoriser l'état logique for (i=0;i<5;i++) // lire, mémoriser et décaler les 5 états suivants touches 0 à 9 { delay_us(1750); x=2*x+PORTB.F1; } switch (x) //variable contenant la variable du bouton { case ACCELERER: if(vitesse < 5) //vitesse maximal vitesse+= 1; //incrémente la vitesse du moteur break; case RALENTIR: if(vitesse > 0) vitesse-= 1; //incrémente la vitesse du moteur break; case SERVO_D: val_servo=SERVO_VAL_INIT+SERVO_PAS; break; case SERVO_G: val_servo=SERVO_VAL_INIT-SERVO_PAS; case SERVO_INIT: val_servo=SERVO_VAL_INIT; } delay_ms(250); } } }
Merci d'avance pour vos réponses.
-----