Fréquencemètre avec Pic 18f4520
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Fréquencemètre avec Pic 18f4520



  1. #1
    invite20f901d9

    Fréquencemètre avec Pic 18f4520


    ------

    Bonjour,


    Je suis entrain de fabriquer un fréquencemètre avec un Pic 18f4520 sur une carte Picdem2+, programmé en C sous Mplab.
    Un petit montage avec un ne555 me permet d'obtenir un signal carré, que j'envoie sur la patte RC2 du Pic.
    Pour mon application, je doit avoir une plage de fréquences comprise entre 15 KHz et 25 KHz, de forme carré, entre 0V et 5V.

    Jusqu'ici tout va bien, avec RC2 en interruption, le Pic "receuille" le signal carré du ne555 et arrive à calculer sa fréquence.

    Voici un petit aperçu (RS232):

    #########################
    Image hébergée sur serveur externe supprimée
    Merci de suivre ces consignes





    Le problème me diriez-vous ? C'est que je m'attendais en fait à avoir une meilleure résolution.
    En effet quand je tourne le potentiomètre (ne555) pour modifier la fréquence, j'obtiens ceci :

    #########################


    Comme vous pouvez le constater, la précision est d'environ 2000 Hz, ce que je trouve beaucoup.


    Voici le code :

    Code:
    // mesure de période sur CCP1 (RC2) (TIMER1 et fonction capture)
    
    #include <stdlib.h>
    #include <delays.h>
    #include <USART.h>
    #include "ftoa.c"
    
    
    
    unsigned int duree=5555;	// représente le comptage entre 2 fronts (5555)
    char maj=1;					// indique qu'une nouvelle mesure est prête
    char chaine[6];				// pour itoa
    float freq;
    
    
    // sous programme d'interruption
    #pragma interrupt itcomp
    void itcomp(void) 
    {
    unsigned static int ancien;			
    	if(PIR1bits.CCP1IF)				// l'IT provient d'une capture sur RC2
    			{						
    			duree=CCPR1-ancien;  	// comptage entre les deux front
    			ancien=CCPR1;		 	// mémorise le CCPR1 actuel
    			maj=1;					// nouvelle mesure pr^te
    			}
    	PIR1bits.CCP1IF=0;				//efface le drapeau d'IT
    }			
    			
    #pragma code interruption=0x08
    void fontion (void)
    {
    _asm goto itcomp  _endasm
    }
    #pragma code
    
    
    
    
    /* PROGRAMME DE SAUT DE LIGNE */
    void Saut(void)           // Programme de saut et retour de ligne
    	{
    	while(BusyUSART());
    	WriteUSART(0x0D);  // Carriage Return
    	
    	while(BusyUSART());
    	WriteUSART(0x0A);  // New Ligne
    	}
    
    void main(void)
    {	
    
    
    OpenUSART(	USART_TX_INT_OFF & // Initialisation de l'USART (RS232)
    			USART_RX_INT_OFF &
    			USART_ASYNCH_MODE &
    			USART_EIGHT_BIT &
    			USART_BRGH_HIGH,25);
    
    
    
    // configure PORTC CCP1
    	DDRCbits.RC2=1;	// RC2/CCP1 en entree
    
    // configure le TIMER1
    	T1CONbits.RD16=0;		// TMR1 mode simple (pas de RW)
    	T1CONbits.TMR1CS=0;		// compte les impulsions sur internal clock
    	T1CONbits.T1CKPS1=1;	// prédiviseur =1/8 periode sortie = 8uS
    	T1CONbits.T1CKPS0=1;	
    	T1CONbits.T1SYNC=1;		// pas de synchronisation sur sleep/Reset	
    	T1CONbits.TMR1ON=1;		// TMR1 Activé
    
    // configure le mode capture sur le TIMER1 avec IT sur CCP1 
    	T3CONbits.T3CCP2=0;		// mode comparaison entre TMR1 et CCPR1
    	CCP1CON=0x05;			// capture mode sur fronts montants
    	
    	PIE1bits.CCP1IE=1;		// active IT sur mode capture/comparaison CCP1
    	
    		RCONbits.IPEN=1;		// Interruption prioritaires activées
    	INTCONbits.GIE=1;		// Toutes les IT démasquées autorisées
    
    	while(1)
    		{
    
    
    		if (maj) {					
    					freq=1.0/(duree*8e-6);
    					itoa(freq,chaine);
    					Delay10KTCYx(1);
    					putsUSART(chaine);	// affiche duree
    					putrsUSART(" Hz");
    					Saut();
    					maj=0;
    				}
    		}
    }

    Ce code ne m'appartient pas, je l'ai modifié pour l'adapter à mon application.


    Est il donc possible d'avoir une meilleure précision que cela et comment y remédier dans le code ?

    Merci par avance de votre aide.

    -----
    Dernière modification par Jack ; 14/07/2011 à 12h03.

  2. #2
    RISC

    Re : Fréquencemètre avec Pic 18f4520

    Salut,

    Quelle fréquence utilises-tu pour ton PIC18F4520 ?
    Sa fréquence maximum est de 40MHz ce qui permet de mesurer avec une résolution de 100ns les signaux qui entrent sur le CCP à condition d'utiliser un quartz externe.

    Ou sont les bits de configuration ?? Tu devrais les mettre au début de ton code :
    #pragma config OSC = HS,...

    La raison principale pour laquelle cela ne fonctionne pas est que le registre CCPR1 fait 16 bits mais ton micro est un 8 bits, il faut donc lire la partie haute et la partie basse séparemment (en déclarant mesure comme un int global) :
    Code:
    mesure = (CCPR1H << 8 )+ CCPR1L
    duree=mesure-ancien;  	// comptage entre les deux front
    ancien=mesure;		 	// mémorise le CCPR1 actuel

    Avant de lancer le timer il faut tout initialiser par précaution :
    Code:
    INTCONbits.GIE=1;		// Toutes les IT démasquées autorisées
    T1CONbits.TMR1ON=1;		// TMR1 Activé
    Tu démarres avec une valeur qui pourrait être aléatoire (en fonction du compilateur) il vaudrait mieux déclarer :
    Code:
    unsigned static int ancien = 0;
    a+

  3. #3
    invite20f901d9

    Re : Fréquencemètre avec Pic 18f4520

    Salut RISC et merci pour ta réponse,


    Je vais regarder ça de plus près et reposterais si besoin.



    [EDIT] : J'utilise un oscillateur de 4Mhz
    Images attachées Images attachées

  4. #4
    RISC

    Re : Fréquencemètre avec Pic 18f4520

    Salut,

    Je te conseille de changer ton quartz pour un 10MHz.
    Ensuite tu changes les bits de configuration pour utiliser la PLL internet et ainsi obtenir 40MHz (10 fois plus rapide que ta version actuelle).

    #pragma config OSC=HSPLL, ...

    Cela te permettra d'augmenter la précision et aussi d'exécuter tes fonctions plus rapidement car tu utilises des flottants et aussi des fonctions de gestion de chaine.

    a+

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Problème sur PIC 18f4520
    Par inviteb337bc34 dans le forum TPE / TIPE et autres travaux
    Réponses: 0
    Dernier message: 02/12/2009, 17h11
  2. interruption pic 18f4520
    Par bird12358 dans le forum Électronique
    Réponses: 19
    Dernier message: 25/07/2009, 22h07
  3. PIC 18f4520
    Par invite9756f1a4 dans le forum Électronique
    Réponses: 1
    Dernier message: 18/03/2009, 14h57
  4. programation d'un pic 18F4520 avec sdcc, soucis de tableau?
    Par invite9a03a7c9 dans le forum Électronique
    Réponses: 13
    Dernier message: 16/07/2008, 16h10
  5. Conversion A/D PIC 18F4520
    Par invitea6488f97 dans le forum Électronique
    Réponses: 0
    Dernier message: 14/05/2008, 16h23
Découvrez nos comparatifs produits sur l'informatique et les technologies.