Compteur de tours/s d'un ventilateur
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Compteur de tours/s d'un ventilateur



  1. #1
    invitee66c9895

    Compteur de tours/s d'un ventilateur


    ------

    Bonsoir,

    J'ai voulu faire un compteur de tours/s d'un ventilateur de pc pour une futur application mais je bloque au niveau de l'utilisation des timers, j'arrive à compter le nombre de tours depuis l'allumage du circuit mais pas le nombre de tours depuis 1 seconde.

    J'utilise un pic 16F88 avec une horloge externe de 20MHz, un ventilateur et un afficheur LCD classique pour afficher le nombre de tours/s.
    Le capteur de tour du ventilateur est un capteur à collecteur ouvert et est branché sur la broche RB5 du pic avec bien sûr une résistance de rappel pour imposer le niveau haut, il produit 2 périodes par tour.

    Voici donc le code source, je programme en C sous MikroC :

    Code:
    // LCD module connections
    sbit LCD_RS at RA1_bit;
    sbit LCD_EN at RB4_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;
    
    sbit LCD_RS_Direction at TRISA1_bit;
    sbit LCD_EN_Direction at TRISB4_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    
    char ligne;
    unsigned int temps=0;
    unsigned int tours=0;
    char colonne;
    char centaine;
    char dizaine;
    char unite;
    long acquisition;
    
    
    void timer(){
    if(TMR0 >= 250) {TMR0 = 0; temps++;}
           if(temps>=312){
           acquisition = tours/2;
           tours = 0;
           temps = 0;
           }
    }
    
    
    void main() {
    
     // ADCON1 = 0x0E;                     // Configuration du registre ADCON1 AN0 actif
    
    
     Lcd_Init();                        // On initialise le LCD
    
      Lcd_Cmd(_LCD_CLEAR);               // On efface l'affichage
      Lcd_Cmd(_LCD_CURSOR_OFF);          // On désactive l'affichage du cuseur.
    
    PORTB = 0;
    PORTA = 0;
    TRISA = 0;
    TRISB = 0b00100000; //RB5 en entrée
    OPTION_REG = 0b01100101;
    TMR0 = 0;
    acquisition=0;
    ligne = 2;
    colonne = 6;
           while(1){
    
           while(RB5_bit==1){timer();}
           while(RB5_bit==0){timer();}
           
           timer();
           tours++;
    
    
           centaine = ((acquisition-(acquisition % 100))/100)+0x30;                   // Récupération du nombre de centaines.
           dizaine = (((acquisition % 100) - ((acquisition % 100)%10))/10)+0x30;      // Récupération du nombre de dizaines.
           unite = ((acquisition % 100)%10)+0x30;                                     // Récupération du nombre d'unitées.
    
    
           Lcd_Chr(ligne,colonne,centaine);
           Lcd_Chr(ligne,colonne + 1,dizaine);
           Lcd_Chr(ligne,colonne + 2,unite);
    
           } // Fermeture while
    }  // Fermeture main
    D'après ce que j'ai compris le TMR0 compte de 0 à 255 en s'incrémentant de 1 toutes les 12,8µs dans mon cas (J'ai mis le prescaler sur 64 si j'ai bien mis).
    Il faut donc que je le laisse monter 312 fois jusqu'à 250 pour faire 12,8 * 10^-6 * 250 * 312 = 0,9984s ce qui correspond quasiment à 1s.

    Là dans l'état actuelle l'afficheur LCD m'affiche tout le temps 000, je me doute bien que j'ai mal utiliser le TMR est-ce que vous pourriez donc m'aider ?

    Merci d'avance pour vos réponses.

    -----

  2. #2
    invitee66c9895

    Re : Compteur de tours/s d'un ventilateur

    Bonsoir,

    Voici une deuxième version du programme qui je pense est un peu mieux mais ne fonctionne toujours pas.

    Code:
    // LCD module connections
    sbit LCD_RS at RA1_bit;
    sbit LCD_EN at RB4_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;
    
    sbit LCD_RS_Direction at TRISA1_bit;
    sbit LCD_EN_Direction at TRISB4_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    
    char ligne;
    unsigned int temps=0;
    unsigned int tours=0;
    char oldRB5=0;
    char colonne;
    char centaine;
    char dizaine;
    char unite;
    long acquisition;
    
    
    
    
    void main() {
    
     Lcd_Init();                        // On initialise le LCD
    
      Lcd_Cmd(_LCD_CLEAR);               // On efface l'affichage
      Lcd_Cmd(_LCD_CURSOR_OFF);          // On désactive l'affichage du cuseur.
    
    PORTB = 0;
    PORTA = 0;
    TRISA = 0;
    TRISB = 0b00100000; //RB5 en entrée
    OPTION_REG = 0b00000101;
    TMR0 = 0;
    INTCON.GIE=1;
    INTCON.TMR0IF=0;
    acquisition=0;
    ligne = 2;
    colonne = 5;
    INTCON.TMR0IE=1;
           while(1){
              while(!INTCON.TMR0IF){
                    if(RB5_bit != oldRB5) {
                    tours++;
                    oldRB5 = RB5_bit;
                    }
              }
             INTCON.TMR0IF=0;
             temps++;
           
            if(temps>=15){
            temps=0;
            acquisition = tours*30;
            tours = 0;
            }
           
           
           centaine = ((acquisition-(acquisition % 100))/100)+0x30;                   // Récupération du nombre de centaines.
           dizaine = (((acquisition % 100) - ((acquisition % 100)%10))/10)+0x30;      // Récupération du nombre de dizaines.
           unite = ((acquisition % 100)%10)+0x30;                                     // Récupération du nombre d'unitées.
    
           Lcd_Out(1,4,"Fan Speed");
           Lcd_Chr(ligne,colonne,centaine);
           Lcd_Chr(ligne,colonne + 1,dizaine);
           Lcd_Chr(ligne,colonne + 2,unite);
           Lcd_Out(2,9,"RPMs");
    
           
           } // Fermeture while
    }  // Fermeture main
    ça m'affiche toujours 000 RPMs sur l'afficheur LCD.

Discussions similaires

  1. calcul nombre de tours d'un pignon
    Par invitec205d090 dans le forum Technologies
    Réponses: 7
    Dernier message: 01/04/2010, 17h56
  2. Création d'un compteur tour a partir d'un PICDEM 2 PLUS
    Par invite6380305f dans le forum Électronique
    Réponses: 7
    Dernier message: 09/03/2010, 16h00
  3. Tours du monde, tours du ciel 2
    Par mtheory dans le forum Archives
    Réponses: 5
    Dernier message: 16/11/2009, 23h34
  4. compteur tours
    Par invitefc1671e3 dans le forum Électronique
    Réponses: 0
    Dernier message: 06/03/2007, 16h58
  5. Générer les tours de poule d'un tournoi
    Par invite510f2318 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 06/06/2004, 10h42
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...