Pages: [1]   Go Down
Author Topic: [APL] Mesurer fréq. rotation d'un ventilateur CPU  (Read 1679 times)
0 Members and 1 Guest are viewing this topic.
Poitiers (France)
Offline Offline
Full Member
***
Karma: 0
Posts: 136
Ca va j'vais le faire !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mesurer la fréquence de rotation d'un ventilateur CPU

L'objet de ce petit projet est de mesurer la fréquence de rotation d'un ventilateur de micro-processeur. La vitesse de rotation s'affiche en rmp (rotations par minutes) toutes les secondes sur le moniteur de liaison série.

Logged

Cordialement,
Benoît ROUSSEAU

Poitiers (France)
Offline Offline
Full Member
***
Karma: 0
Posts: 136
Ca va j'vais le faire !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La câblage

Rien de bien compliquer...

Le ventilateur a trois fils, généralement facilement identifiable, rouge pour le "plus", noir pour le "moins" et un autre qui est la sortie du capteur de rotation.

Le ventilateur étant généralement alimenté en 12 V, j'ai connecté le ventilateur à une pile 9V afin qu'il tourne.

Il faut relier par un fil, la masse (GND) de la carte Arduino à la masse (-) de la pile afin d'avoir une référence de tension commune.

Pour connecter le capteur, il est nécessaire de savoir que c'est un capteur à sortie dite "collecteur ouvert" et que le programme qui suit utilise l'interruption externe 0 pour compter. Donc, il faut connecter le fil du capteur à l'entrée numérique 2 de la carte, et relier entre cette même entrée 2 et la broche GND une résistance d'au moins 10Ko.



L'épingle sur la photo est présente pour assurer le contact entre la broche 2 et la résistance dont les pattes étaitent trop courtes pour faire la jonction. C'est un proto  smiley-grin mais il fonctionne.
« Last Edit: July 27, 2006, 10:17:55 am by Benoit » Logged

Cordialement,
Benoît ROUSSEAU

Poitiers (France)
Offline Offline
Full Member
***
Karma: 0
Posts: 136
Ca va j'vais le faire !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le programme

Il est tès simple !

La fonction SIGNAL(SIG_INTERRUPT0) est appelée à chaque front montant sur la broche numérique 2 de la carte. En clair, à chaque fois que le ventilateur fait un tour. Cette fonction incrémrente à chaque tour la variable globale NbTopsVentilateur.

Dans la fonction loop(), toutes les secondes et "un poil", la variable NbTopsVentilateur est mise à 0 et le dernier nombre de rotations comptées multiplié par 60 (60 secondes dans une minute) est envoyé sur la sortie série.

Code:
/***************************************/
// FAN SPEED Arduino
// Benoît ROUSSEAU juillet 2006
// - Mesure de la vitesse de rotation d'un
// ventillateur de CPU sous interruption.
/***************************************/

// variables et définitions
#define INT_0_PIN  2
#define EXTINT_LEVEL_LOW      0x00      // déclenchement sur niveau bas
#define EXTINT_EDGE_ANY            0x01      // déclenchement sur tous fronts (montants et descendants)
#define EXTINT_EDGE_FALLING      0x02      // déclenchement sur front descendant
#define EXTINT_EDGE_RISING      0x03      // déclenchement sur front montant
#define sbi(PORT,BIT) PORT|=_BV(BIT)   // macro pratique pour mettre un bit x à 1 (Set Bit In)

unsigned int NbTopsVentilateur; // compteur du nombre de tops ventilateur comptés
unsigned int TopsVentilateurComptes; // nombre de tops ventilateur comptés

/***************************************/
// Fonction appelée à chaque
// déclenchement de l'interruption 0
/***************************************/
SIGNAL(SIG_INTERRUPT0)
{
  NbTopsVentilateur++; // un top de plus
}

/***************************************/
// iniInt0
/***************************************/
// Init. interrupt 0
/****************************************/
void initInt0 (byte config)
{
  sbi(GICR, INT0); //
  sbi(GIFR, INT0); //

  MCUCR &= ~((1<<ISC01) | (1<<ISC00)); // raz
  MCUCR |= config; //
}

/***************************************/
void setup()
{
  pinMode(INT_0_PIN, INPUT);
  Serial.begin(9600);
  initInt0 (EXTINT_EDGE_RISING);
};

void loop ()
{
    NbTopsVentilateur = 0;
    delay (1000);
    MeasuredTopsFan = NbTopsVentilateur;
    Serial.print (MeasuredTopsFan * 60, DEC);
    Serial.print (" rpm");
    Serial.print (13, BYTE);
};
Logged

Cordialement,
Benoît ROUSSEAU

Pages: [1]   Go Up
Jump to: