Mesure de fréquence
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Mesure de fréquence



  1. #1
    inviteec8d8fa2

    Mesure de fréquence


    ------

    Bonjour à tous,

    Je souhaite mesurer la fréquence d'un signal carré d'une plage comprise entre 30 et 70Hz. Pour cela j'utilise un pic 18F4520 et un afficheur lcd.
    Pour calculer la durée jutilise TIMER0.
    Mon quartz est de 20Mhz. Tout d'abord je configure mon osc interne à 8Mhz.
    Donc Fosc/4= 2Mhz
    Donc 2000000 cycles/s
    1/2000000= 0.5us-> un cycle
    donc le timer0 peut compter jusqu'à 256*0.5us= 128us
    jutilise un prédiviseur(128)-> 128*128us= 16,38 ms.

    Dans mon programme, je mesure la durée de T/2 entre front montant et front descendant. Je peut donc mesurer un fréquence de 30hz mini!

    Programme en pièce jointe

    Mais voila quand je programme mon pic il s'affiche sur mon ecran lcd des valeur très variables qui ne correspondent pas avec la réalité.

    Si quelqu'un voit ce qui peut générer des erreurs merci de me répondre.

    -----
    Fichiers attachés Fichiers attachés

  2. #2
    inviteec8d8fa2

    Re : Mesure de fréquence

    Code:
    #include <p18f4520.h> // Include the PIC18F4520 header file
    #include <delays.h>  // Include the delay library
    #include <xlcd.h>  //Include the LCD library
    #include <adc.h>
    
    #pragma config OSC = INTIO67 //set osc mode to Internal
    #pragma config WDT = OFF // set watchdog timer off
    #pragma config LVP = OFF  // Low Voltage Programming Off
    #pragma config DEBUG = OFF  // Compile without extra Debug compile Code
    #pragma config MCLRE = ON  // Set Master Clear
    
    #define signal PORTDbits.RD0// signal connected on RD0
    
    //--------------------------------------------------------------
    // Declaration of variables
    //--------------------------------------------------------------
    
    
    unsigned char Numbers []= {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,};
    int etat;
    int frequence;
    
    //--------------------------------------------------------------
    // declaration of header functions
    //--------------------------------------------------------------
    
    //delays
    
    void DelayPORXLCD (void)
    {
    Delay10KTCYx(3);
    }
    void DelayFor18TCY (void)
    {
    Delay100TCYx(2);
    }
    void DelayXLCD (void)
    {
    Delay10KTCYx(1);  //delay 5mS
    }
    
    //number
    
    void number(int Z)
    {
    int X,Y[3];
    X=Z;
    Y[2]=X;
    X=((Z0)/10);
    Y[1]=X;
    X=((Z00)/100);
    Y[0]=X;
    putcXLCD(Numbers [Y[0]]);
    putcXLCD(Numbers [Y[1]]);
    putcXLCD(Numbers [Y[2]]);
    }
    
    //initialisation
    
    void Init_PIC()
    {
    TRISD = 0x00; // Configure Port D as O/P 1=INPUT
    OSCCON = 0x70;  // Set Internal OSC to 8 Mhz
    ADCON1 = 0x0F;
    
    //configuration timer0
    
    T0CONbits.TMR0ON = 0; //disable timer0
        
    T0CONbits.T08BIT = 1;     //timer0 configured as a 8-bit
    T0CONbits.T0CS = 0;        //timer mode
    T0CONbits.T0SE = 1;        //input active in rising edge
    T0CONbits.PSA = 0;        //prescaler enable
    
    T0CONbits.T0PS0 = 1;    // division by 256    
    T0CONbits.T0PS1 = 1;    // division by 256
    T0CONbits.T0PS2 = 1;    // division by 256
    
    }
    
    //------------------------------------------------------------------------------
    // main program
    //------------------------------------------------------------------------------
    
    void main(void)
    {
        Init_PIC();
    
        TMR0L=0x00;    //tmr0 values ( TMRL for 8-bit and TMRL+TMRH for 16 bit)
        signal=0;    
        etat=0;    
        
        while (!OSCCONbits.IOFS);
        OpenXLCD(FOUR_BIT & LINES_5X7);
        while( BusyXLCD() );
        SetDDRamAddr(0x45);putrsXLCD("Hz");
            
    
        while(1)
        {
    
        if((signal==1) && (etat==0)) //rising edge
            {
            etat=1;
            T0CONbits.TMR0ON = 1;     //enable timer0        
            }
    
        if((signal==0) && (etat==1))//faling edge
            {
            etat=0;
            T0CONbits.TMR0ON = O; //disable timer0
            frequence=1/(TMR0L*2);
            SetDDRamAddr(0x41);number(frequence); //read frequence        
            }
        
            
        }
    
        while(1); //end of program
    }
    C'est tout de même plus facile à lire avec les balises code, non?
    Penses-y la prochaine fois.

    Pense également à indenter tes lignes de code pour facilité encore plus la lecture.
    Dernière modification par Jack ; 29/01/2012 à 16h45. Motif: Ajout balises code

  3. #3
    paulfjujo

    Re : Mesure de fréquence

    Bonjour,
    pourquoi 1 quartz de 20Mhz et usage de oscil interne de 8Mhz
    pour la lecture du temps il vaudrait mieux utilise r tmr0 en mode 16 bits et s'affranchir du prediiseur
    dans ton cas,il faut rajouter le complement du reste du presaler
    celui ci n'etant pas lisible,il faut creer de fausses impuses pour vour evoluer tmroL
    et donc recuper 128-nb fausses impuls
    arajouter a ta valeur lue precedement sur tmr0L
    complique...!
    Il vaut mieux utiliser le mode ccp
    qui donnera une tres grande precision,associe a Timer1 16b
    demarre sur interrupt front montant,stop sur it front
    descendant.
    Attention aux eventuel debordement de tmr1!

  4. #4
    Moezzz

    Re : Mesure de fréquence

    Citation Envoyé par paulfjujo Voir le message
    Bonjour,
    pourquoi 1 quartz de 20Mhz et usage de oscil interne de 8Mhz
    pour la lecture du temps il vaudrait mieux utilise r tmr0 en mode 16 bits et s'affranchir du prediiseur
    dans ton cas,il faut rajouter le complement du reste du presaler
    celui ci n'etant pas lisible,il faut creer de fausses impuses pour vour evoluer tmroL
    et donc recuper 128-nb fausses impuls
    arajouter a ta valeur lue precedement sur tmr0L
    complique...!
    Il vaut mieux utiliser le mode ccp
    qui donnera une tres grande precision,associe a Timer1 16b
    demarre sur interrupt front montant,stop sur it front
    descendant.
    Attention aux eventuel debordement de tmr1!
    plus précisément le mode capture. pour mesurer la période il faut evaluer le temps qui s’écoule entre deux front montants ou deux front descendants.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. mesure de frequence
    Par invite85b00791 dans le forum Électronique
    Réponses: 15
    Dernier message: 02/08/2012, 16h43
  2. mesure de fréquence
    Par invite43a8f1a7 dans le forum Électronique
    Réponses: 29
    Dernier message: 12/04/2010, 15h53
  3. [Exercice] Mesure de fréquence de recombinaison
    Par invite1648352d dans le forum Biologie
    Réponses: 4
    Dernier message: 11/01/2009, 15h15
  4. Mesure de fréquence
    Par invite5e29026f dans le forum Électronique
    Réponses: 4
    Dernier message: 23/04/2008, 16h42
  5. Mesure de frequence de vibration
    Par invite76af0dde dans le forum Électronique
    Réponses: 6
    Dernier message: 02/02/2008, 10h53
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...