Fréquencemetre avec un Atmega32
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Fréquencemetre avec un Atmega32



  1. #1
    invite6d67225b

    Fréquencemetre avec un Atmega32


    ------

    Bonjour.
    J'ai réalisé un petit montage créant un signal alternatif et j'aimerai afficher la fréquence sur un afficheur LCD.
    J'ai pensé à fabriquer un fréquencemètre à l'aide d'un afficheur et d'un µC ATMEGA32.

    J'ai déjà fait un petit algorigramme suivant :

    - Créer un signal qui servira de base appelé S1.
    - Déclencher un compteur sur un front montant de S1
    - Arrêter le compteur sur un autre front montant de S1.
    Ce compteur compte les fronts montants du signal à mesurer.
    - En sachant la période de S1, on peut savoir la période du signal à mesurer.
    - Avec un calcul simple (division) on peut connaitre donc la fréquence du signal à mesurer.
    - On affiche cette fréquence sur un afficheur LCD en écrivant :
    FREQ : **.** kHz


    Voilà et maintenant je dois créer un programme en langage C réalisant mon "fréquencemètre".

    Si quelqu'un pourrait m'aider un peu, cela serait super sympa.

    Merci d'avance

    -----

  2. #2
    JPL
    Responsable des forums

    Re : Fréquencemetre avec un Atmega32

    À votre avis on laisse ici ou bien on déplace la question vers Électronique (ce que je serais tenté de faire) ?
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  3. #3
    invite6d67225b

    Re : Fréquencemetre avec un Atmega32

    Faites ce que vous voulez
    Tant que j'ai une réponse

    merci

  4. #4
    Jack
    Modérateur

    Re : Fréquencemetre avec un Atmega32

    Il existe 2 méthode pour calculer la fréquence. Si le signal à mesurer est de fréquence faible: on appelle Tm la période du signal à mesurer et Tref la période d'un signal de référence et de période connue. Il suffit de compter le nombre N de périodes Tref au cours de Tm. On a donc Tm = N.Tref, donc une simple division permettra d'obtenir Fm.

    Si signal à mesurer est de fréquence élevée, on va calculer le nombre N de périodes de Tm au cours de Tref avec Tref << Tm. En ramenant Tref à une seconde, on obtient donc facilement Fm à partir de N.

    Voilà et maintenant je dois créer un programme en langage C réalisant mon "fréquencemètre".
    Vas-y, crée-le.

    A+

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

    Re : Fréquencemetre avec un Atmega32

    Merci beaucoup.
    Or je n'ai pratiquement aucune notion en programme C et je dois néanmoins en fabriquer un.
    Je sais qu'il faut utiliser le Timer1 de l'ATMEGA32 mais après comment s'en servir et concevoir le programme autour, c'est une autre histoire...

  7. #6
    JPL
    Responsable des forums

    Re : Fréquencemetre avec un Atmega32

    Au vu du dernier message je pense qu'il vaut mieux déplacer le sujet en Électronique. Quitte plus tard à revenir vers Programmation quand les questions de base auront été réglées.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  8. #7
    invite6d67225b

    Re : Fréquencemetre avec un Atmega32

    Bonjour,

    Après quelques recherches, je suis tombé là dessus, est ce que c'est un bon départ ?

    "Il faut faire une boucle infinie "while(1)"
    et laisser le timer 1 compter, mettre une interuption qui arrete le compteur
    (lorsque tu as un front montant de la fréquence a mesuré), sauvegarde sa valeur dans une variable, puis le remet a zéro.
    a partir de la variable sauvegardé tu regarde au temps qu'elle correspond (en fonction de la fréquence de ton µC),
    ensuite tu inverse ce nombre pour avoir la valeur de la fréquence que tu enverra sur le port de ton afficheur "

    Merci

  9. #8
    Jack
    Modérateur

    Re : Fréquencemetre avec un Atmega32

    utiliser les interruptions est évidemment la meilleure solution. Pour le reste, c'est exactement ce que j'ai indiqué dans mon message #4, solution 1.

    A+

  10. #9
    invite6d67225b

    Re : Fréquencemetre avec un Atmega32

    Ok merci.

    Il ne me reste plus qu'à essayer de faire le programme en effectuant les interruptions.

  11. #10
    invite6d67225b

    Re : Fréquencemetre avec un Atmega32

    Est ce que cela serait possible de m'aider un peu pour la création du signal à partir du Timer1.
    Comme je dois mesurer une fréquence de 15 kHz, je pense fabriquer un signal de 1Hz afin d'avoir une plus grande plage de mesure.
    Malheureusement je n'arrive pas à fabriquer ce signal à partir du CodeWizardAVR automatic program generator.

    Merci d'avance

  12. #11
    Jack
    Modérateur

    Re : Fréquencemetre avec un Atmega32

    je n'ai malheureusement aucunes compétences en ATMEL.

    A+

  13. #12
    invite6d67225b

    Re : Fréquencemetre avec un Atmega32

    Ok.
    Si quelqu'un d'autre pourrait m'aider

    Merci

  14. #13
    invite6d67225b

    Fréquencemètre

    Bonjour,
    Étant déjà venu pour quelques soucis avec ma réalisation de fréquence, j'ai travaillé dessus et j'ai réussi à dresser un code.
    Serait-il possible de me dire s'il ressemble à quelque chose svp ?
    Merci d'avance

    Code:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.0 Evaluation
    Automatic Program Generator
    © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date    : 01/06/2011
    Author  : 
    Company : 
    Comments: 
    
    
    Chip type               : ATmega32
    Program type            : Application
    AVR Core Clock frequency: 8,000000 MHz
    Memory model            : Small
    External RAM size       : 0
    Data Stack size         : 512
    *****************************************************/
    
    #include <mega32.h>
    #include <delay.h>
    #include <math.h>
    
    // Alphanumeric LCD Module functions
    #include <alcd.h>
    #asm
        .equ__lcd_port=0x15 ;PORTC
    #endasm
    
    unsigned long int frequence   ;
    unsigned long int fclk = 8000000     ;
    unsigned int ICR1   ;
    unsigned int period = 0
    
    // Timer1 input capture interrupt service routine
    interrupt [TIM1_CAPT] void timer1_capt_isr(void)
    {
    // Place your code here
    
        period = TCNT1            ;
            PORTB = floor(8000.0 / period);         
            TCNT1 = 0x0000;
    
    /* TCNT1=0    // remise à zéro du compteur
        if (!(TIFR & 0x04))
          {                 
            // calcul de la frequence
            ICR1=ICR1H
    //          PORTA = ICR1H;
    //          ICR1 = ICR1 << 8;
    //          ICR1 = ICR1 |  ICR1L;
    //          PORTNB = ICR1L;
    //          frequence = fclk/ICR1;
    
        }    
        else
        {
         // fréquence inférieur à 122Hz
         frequence = 128;
         TIFR &= ~(1<< TOV1);
         };
    */
    }
    
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    char msg1[16]="freq fil guidage" ;
    char msg2[16]="Frequence";
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTA=0x00;
    DDRA=0xFF;
    
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTB=0x00;
    DDRB=0xFF;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 8000,000 kHz
    // Mode: CTC top=ICR1
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: On
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: On
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x41;   //45    /5D
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x20;
    
    // USART initialization
    // USART disabled
    UCSRB=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // Alphanumeric LCD initialization
    // Connections specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTC Bit 0
    // RD - PORTC Bit 1
    // EN - PORTC Bit 2
    // D4 - PORTC Bit 4
    // D5 - PORTC Bit 5
    // D6 - PORTC Bit 6
    // D7 - PORTC Bit 7
    // Characters/line: 16
    lcd_init(16);
    PORTA=0xFF
    delay_ms(200);
    
    
    // Global enable interrupts
    #asm("sei")
    lcd_puts(msg1);
    
    while (1)
          {
          // Place your code here
    //          printf("\n\rStart");
    //          PORTA = ICR1;
    //          PORTB = TmpHi;
    //         delay_ms(500);
          }
    }

  15. #14
    Jack
    Modérateur

    Re : Fréquencemètre

    Pourquoi continuer à poster dans le forum algo et langages?

    Le forum électronique est préférable comme déjà évoqué. De plus quel est l'intérêt de rouvrir une nouvelle discussion alors que visiblement il s'agit de la suite d'un fil précédent?


    Discussions fusionnées

  16. #15
    invite6d67225b

    Re : Fréquencemètre

    Merci... mais vu que ça concernait désormais de la programmation, j'ai pensé qu'il était préférable de recréer un topic.
    Merci

  17. #16
    Jack
    Modérateur

    Re : Fréquencemetre avec un Atmega32

    mais vu que ça concernait désormais de la programmation
    Comme indiqué en épinglé du forum info, les problèmes de µContrôleurs sont à traiter dans le forum électro.

    j'ai pensé qu'il était préférable de recréer un topic
    Je pense qu'il y a intérêt à assurer la continuïté de ce fil.

    A+

Discussions similaires

  1. fréquencemètre précis avec communication sans fil
    Par invite99aaa6a7 dans le forum Électronique
    Réponses: 12
    Dernier message: 25/03/2010, 16h12
  2. Créer un Robot(Reversed Pendulum) Avec un ATmega32
    Par mehditlili dans le forum Électronique
    Réponses: 2
    Dernier message: 12/12/2009, 19h36
  3. ATmega32 HS ?
    Par Kilhian dans le forum Électronique
    Réponses: 0
    Dernier message: 18/07/2007, 09h01
  4. réalisation d'un capteur de température avec un fréquencemètre
    Par inviteed63aef3 dans le forum Électronique
    Réponses: 3
    Dernier message: 25/04/2007, 11h40
  5. Sonde pour Oscillo, Gbf, fréquencemetre avec carte son PC
    Par nounoursvincent dans le forum Électronique
    Réponses: 1
    Dernier message: 07/06/2005, 13h24
Découvrez nos comparatifs produits sur l'informatique et les technologies.