Objectifs

  1. Savoir mesurer la vitesse de rotation d’un moteur
  2. Savoir mesurer la fréquence d’un signal (deux méthodes)
  3. Savoir utiliser un tachymètre pour la mesure de la vitesse
  4. Savoir réduire l’erreur de la mesure
  5. Savoir mesurer la largeur d’une impulsion
  6. Etc.

Comment mesurer la vitesse de rotation ?

La mesure de la vitesse de rotation en (tr/min) est équivalente à la mesure de la fréquence de rotation en nombre de cycles par seconde (Hz). En effet,  60 tr/min est égale à 60 cycles/min=60 cycles/(60 secondes) = 1 Hz!  D’une autre façon, la vitesse de rotation en (tr/min) et 60 fois inférieure à la fréquence de rotation en (Hz). Par conséquence, la mesure de vitesse est réduit à la mesure de la fréquence de rotation. Dans ce tuto, on va aborder deux fonctions qui vont nous permettre la mesure de la fréquence d’un signal tout ou rien, en particulier un signal carré. La formule de la vitesse en tours par minute (rpm) en Hertz (Hz) est donnée par F=N/60. Avec :

  •   la fréquence en Hertz (Hz)
  •   la vitesse angulaire en tours par minute (rpm ou tr/min)

La fonction pulseIn()

La fonction pulseIn() comme son nom l’indique, elle permet de mesurer la largeur ou la durée d’une impulsion. Le type de l’impulsion peut être niveau bas ou niveau haut. Dans le cas d’un signal carré, les deux durées sont identiques. La fréquence est donc l’inverse de la somme des deux niveaux ou le double de l’un des deux. La fonction prend en entrée la numération du pin digital, le type du niveau ainsi le timeout (optionnel). Elle retourne la durée de l’impulsion en nombre de cycles en µS.  Par exemple, si la valeur du retour est égale à 1000, alors la durée réelle de l’impulsion est égale à 1000*10^(-6)=1 ms. Par conséquent, la fréquence est égale à 1/(2*1ms)=500 Hz. Le timeout par défaut est égal à 1 seconde s’il n’est pas spécifié.

La fonction peu uniquement mesurée la fréquence dans un pin digital. Du coup, il faut lui fournir un signal ayant des niveaux compatibles avec la carte (0-5V, 0-3.3V, etc.).  Ci-desosus la définiton de la fonction

 

pulseIn(pin, value)
pulseIn(pin, value, timeout)

 

Ci-dessous l’exemple du code utilisé pour la mesure de la fréquence du signal branché dans le pin squareOut+1 (voir le tuto pour plus de détails).

  unsigned long T_l=pulseIn(squareOut+1, LOW);
unsigned long T_h=pulseIn(squareOut+1, HIGH);
Serial.print(1.0/((float)(T_l)*2.0*1E-6));Serial.print("\t");
Serial.print(1.0/((float)(T_h)*2.0*1E-6));Serial.print("\t");
//Serial.println(1.0/((float)(T_l+T_h)*1E-6));return;
Serial.print(1.0/((float)(T_l+T_h)*1E-6));Serial.print("\t");

La fonction getFreqHz()

La fonction getFreqHz() est une fonction fait maison dédiée à la mesure directe de la fréquence d’un signal carré (ou non) branché dans un pin analogique. Elle est basée sur la fonction micros() pour la mesure du temps en µS. La fonction prend en entrée la numérotation du pin, anis le seuil maximale et le seuil minimal (non utilisé) de la détection. Si par exemple le signal branché dans le pin analogique varié entre 0 et 500. Alors, on peut définir un seuil maximal de l’ordre de la moitié de la dynamique (~250) afin de discriminer entre le niveau bas et le niveau haut réel du signal. Ensuite la fonction dérive le signal pour en extraire seulement le font montant (dérivée > seuil) ou le front descendant (dérivée <-seuil). De plus, un front est disponible par période. Par conséquent, on lance une temporisation T0=micros() à la détection du premier front, puis on mesure la fréquence au prochain front (F=1/(micros()-T0)), etc. Ci-dessous la définition de la fonction.

float getFreqHz(int Ai, int s_max, int s_min)
{
static long T_2=0, T_1=0;
static int ai_1=0, ai_2=0;
static float freq=0.0;

ai_1=analogRead(54+Ai);
if((ai_2-ai_1)>s_max)
{
T_2=micros()-T_1;
freq=1.0/((float)T_2*1E-6);
T_1=micros();
}
ai_2=ai_1;
return freq;
}

Attention : La fonction effectue une lecture du signal par appel. Alors, il faut faire des multiples appels qui garantissent la détection de la transition du signal et garantir une bonne résolution de la mesure. La mise à jour la fréquence ne s’effectuée qu’à la détection d’une transition. Il ne faut pas intégrer aussi les retards dans la boucle qui peuvent prolonger la durée de la détection et introduire des fausses mesures.

Programme complet

#define squareOut   8             // Sortie Carrée
#define F0 984.0 // Valeur approchée de la fréquence


void setup()
{
// ADC
analogReadResolution(12); // Ajustable <= 12 (4096 Niveaux)

// Output
analogWrite(squareOut,128); // 0-255

// Input
pinMode(squareOut+1, INPUT);

// Affichage
Serial.begin(250000);
}

void loop()
{
//Serial.println(analogRead(A0)); delay(100); return; // TEST!!


// 1. Mesure via la fonction pulseIn()
/*
unsigned long T_l=pulseIn(squareOut+1, LOW);
unsigned long T_h=pulseIn(squareOut+1, HIGH);
Serial.print(1.0/((float)(T_l)*2.0*1E-6));Serial.print("\t");
Serial.print(1.0/((float)(T_h)*2.0*1E-6));Serial.print("\t");
//Serial.println(1.0/((float)(T_l+T_h)*1E-6));return;
Serial.print(1.0/((float)(T_l+T_h)*1E-6));Serial.print("\t");
*/

// 2. Mesure via la fonction getFreqHz()
int nn=1024; // Filtrage de la fréquence
float F=0.0; // Fréquence en Hz
int s_max=1000; // Seuil maximal
int s_min=100; // Seuil minimal
int Pin=0; // Pin A0, (1)A1, (2)A2, etc.

// Mesure de la fréquence (Pins Analogiques!!)
for(int i=0; i<nn; i++)F+=getFreqHz(Pin, s_max,s_min);
F=F/(float)nn;

// Affichage
Serial.println(F*60.0);
}


float getFreqHz(int Ai, int s_max, int s_min)
{
static long T_2=0, T_1=0;
static int ai_1=0, ai_2=0;
static float freq=0.0;

ai_1=analogRead(54+Ai);
if((ai_2-ai_1)>s_max)
{
T_2=micros()-T_1;
freq=1.0/((float)T_2*1E-6);
T_1=micros();
}
ai_2=ai_1;
return freq;
}

N’oublier de nous laisser un commentaire 🙂

Click to rate this post!
[Total: 1 Average: 5]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut

You have successfully subscribed to the newsletter

There was an error while trying to send your request. Please try again.

FPGA | Arduino | Matlab | Cours will use the information you provide on this form to be in touch with you and to provide updates and marketing.