[PIC] Interruptions MLI (PWM) et réception infra-rouge
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

[PIC] Interruptions MLI (PWM) et réception infra-rouge



  1. #1
    invite730735cd

    [PIC] Interruptions MLI (PWM) et réception infra-rouge


    ------

    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 :
    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);
    		}
    	}
    }
    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...

    Merci d'avance pour vos réponses.

    -----

  2. #2
    zhal

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    Salut !

    Quelle est la fréquence de ton PIC ?

  3. #3
    PIC sur PAC

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    bonjour,
    le "delay" doit être une simple boucle de comptage je suppose. Donc à chaque interruption cette boucle est stoppée le temps d'exécuter le contenu de l'interruption, donc rallongée d'autant. Il faut que tu passe par un timer pour créer les tempos voulues. Après il faut gérer la probable simultanéité des interruptions issue de la MLI et des tempos.
    Bon courage.
    Dans le doute reboot

  4. #4
    invite730735cd

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    J'utilise un quartz de 8Mhz.
    Comment faire avec deux Timer pour éviter que le travail de l'un ne perturbe l'autre ?
    Mes interruptions arrivent toutes les 560µs et mes delay sont supérieurs à 1600µs.
    N'aurais-je pas le même problème avec un second timer que je n'ai maintenant avec le delay ?

  5. A voir en vidéo sur Futura
  6. #5
    Seb.26

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    Citation Envoyé par nono313 Voir le message
    N'aurais-je pas le même problème avec un second timer que je n'ai maintenant avec le delay ?
    Pas forcement, car les timers continuent de tourner quand le CPU est dans une IT ... contrairement à tes anciens delay ( qui sont probablement des for() imbriqués)

    Par contre, tu auras un petit souci si 2 IT tombent en même temps ... d'où l’intérêt d'avoir des routines d'IT les plus courtes possibles ...
    ( mais même si ça t'arrive 1 fois de temps en temps qu'une de tes 2 IT soit décalée de quelques uS, je doute que ce soit critique ... )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  7. #6
    zhal

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    Les fonctions type delay sont a utiliser le moins possible ou pour des durées très courtes ! Les Timers sont ideaux pour les temporisations longues. Fait attention aux differents Timers des Pics, il ont tous leurs specificités.

  8. #7
    invite730735cd

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    Je vais essayer ça alors
    Serait-il possible d'utiliser un autre quartz ou bien l'horloge interne du PIC pour ce deuxième timer et éviter ainsi les problème entre interruption et timer ?

  9. #8
    PIC sur PAC

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    Serait-il possible d'utiliser un autre quartz ou bien l'horloge interne du PIC pour ce deuxième timer et éviter ainsi les problème entre interruption et timer ?
    je crois avoir lu (je connais pas les PIC) que certains PIC on une entrée pour un second quartz (32khz pour battre la seconde)
    Sinon oui "l'horloge" interne doit pouvoir alimenter tous les timers du µC.
    Dans le doute reboot

  10. #9
    invite730735cd

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    Je n'ai pas accès au matériel avant lundi, donc je ne pourrais pas tester ce code, mais dite moi ce que vous en pensez :
    Code:
     void init() {
    ⋅⋅⋅
         TMR1H = 65536;
         TMR1L = 65486;   //50*4*8.10^-6 = 1600ms
         T1CON = 0b00100011;    //pre =  4
    ⋅⋅⋅
    void main() {
       init();
    	while(1)
    	{
           PORTA.F1 = 1;
           TMR1L = 65486;
           PIE1.TMR1IE = 1;    //démarrer
           while(!PIR1.TMR1IF) {}
           PIE1.TMR1IE = 0;    //stoper
           TMR1L = 65481;      //1760µs
           PIR1.TMR1IF = 0;    //réinitialiser
           PIE1.TMR1IE = 1;    //redémarer
           while(!PIR1.TMR1IF) {}
           PIE1.TMR1IE = 0;    //stoper
           //TMR1L = 65481;      //1760µs
    
           PORTA.F1 = 1;
           PIR1.TMR1IF = 0;    //réinitialiser
           PIE1.TMR1IE = 1;    //redémarer
           while(!PIR1.TMR1IF) {}
           PIE1.TMR1IE = 0;    //stoper
            PORTA.F1 = 0;
           PIR1.TMR1IF = 0;    //réinitialiser
           PIE1.TMR1IE = 1;    //redémarer
           while(!PIR1.TMR1IF) {}
           PIE1.TMR1IE = 0;    //stoper
    }
    }

  11. #10
    RISC

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    Salut Nono,

    Pourquoi t'embêtes-tu avec le PIC16F648A (1 PWM) alors que tu dis que tu as besoin de 3 PWM qu'il existe d'autres PIC16 avec beaucoup plus de PWM (jusqu'à 5) ???

    Tu choisis par exemple un PIC16F737 ( 3 PWM) ou un PIC16F1933 (5 PWM dont 3 à timers indépendants) et ton problème est réglé ;=)

    Les PWM en soft c'est possible si elle est à faible fréquence mais cela limite énormément la résolution...
    En général il faut faire pédaler le micro pour pouvoir traiter correctement les INTERRUPTIONS.

    a+

  12. #11
    invite730735cd

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    J'utilise un 16F648A parce que mon prof me l'a donné.
    A la base je programmais sur un 877A mais au moment de faire le circuit mon professeur d'électronique m'as donné un circuit pour 648A (plus petit que les 877A).
    Je vais essayer de me renseigner sur les autres PIC de même taille disposant de plusieurs fonctions de PWM indépendantes et voir si le lycée en possède.

  13. #12
    invite2f1b7080

    Re : [PIC] Interruptions MLI (PWM) et réception infra-rouge

    Salut, je voulais savoir si tu avais reussi à finir ton programme avec ton pic16f? Car je dois réaliser quelques choses qui s'en rapproche.
    Il faut que je créé 35 sorties PWM sur des sorties quelconques de mon PIC32MX. Si tu as réussi, est-il possible que tu m'explique comment tu as fais.
    Merci

Discussions similaires

  1. [Blanc] clim airwell reception infra rouge en panne
    Par invite1572f5c7 dans le forum Dépannage
    Réponses: 6
    Dernier message: 23/06/2009, 21h20
  2. Infra rouge: double pic vers 1750?
    Par invite3d9ec7ca dans le forum Chimie
    Réponses: 4
    Dernier message: 07/08/2008, 17h06
  3. Pwm (mli)
    Par roro1111 dans le forum Électronique
    Réponses: 3
    Dernier message: 26/05/2008, 09h34
  4. Help pour pic 16f84 et transmission reception d'infra rouge
    Par invite44c4c173 dans le forum Électronique
    Réponses: 3
    Dernier message: 27/10/2006, 08h40
Découvrez nos comparatifs produits sur l'informatique et les technologies.