Capteur à effet Hall d'un moteur DC

Bonjour,

J'arrive à piloter un moteur DC 24v (via un composant L298N). Ce moteur est doté d'un capteur à effet Hall, avec une alimentation séparée de 12v. Et là je n'arrive pas à récupérer les changements d'état. Il y en a mais ils sont beaucoup trop nombreux, ce qui me fait dire que ce que je récupère est inconsistent.

Voici mon branchement : hall sensor bb — Postimages (je n'ai représenté que le Hall A).
La doc du moteur : 24h 30 33 rev — Postimages

J'ai des doutes sur mon branchement, j'ai mis une résistance pull-down de 10kOhms.

Quelqu'un pourrait m'éclairer ?

Merci !

Normalement pas besoin de pull down. Code ?

Voici le code :

Plusieurs chose : ton câblage est incomplet (il manque HALL B) je suppose que tu l’as branché de la même manière que le A.
Ensuite ton interrupt ne gère pas les changement de B justement, seulement ceux de A. Dans une interruption on essaye de faire le moins de chose possible car tout est figé dans l’Atmega (incrémenter une variable, lever un flag …). Ensuite vaut mieux eviter les Serial.print() sans delay(), c’est un coup à bloquer l’atmega … Enfin on peut simplifier tous les if :

const int I1_PIN = 6;
const int I2_PIN = 7;
const int SPEED_PIN = 5; // j'ai changé pour libérer le deuxième pin interrupt
const int HALL_A_PIN = 2;
const int HALL_B_PIN = 3;

volatile boolean stateChanged = false;
 
void setup() {

     Serial.begin(9600);
     pinMode(I1_PIN, OUTPUT);
     pinMode(I2_PIN, OUTPUT);
     pinMode(SPEED_PIN, OUTPUT);
     attachInterrupt(0, hallChange, CHANGE); // interrupt on pin 2
     attachInterrupt(1, hallChange, CHANGE); // interrupt on pin 3
     digitalWrite(I1_PIN, LOW);
     digitalWrite(I2_PIN, HIGH);
     analogWrite(SPEED_PIN, 100);

}
 
void loop() {

  if (stateChanged) {
    
    boolean a = digitalRead(HALL_A_PIN);
    boolean b = digitalRead(HALL_B_PIN);
    boolean Pos=a<<1|b;
    Serial.print("Changed to position ");
    Serial.println(Pos);
    stateChanged=false;

  }
}
 
void hallChange() {
  stateChanged = true;
}

Ok merci pour ton code, c'est plus propre effectivement.
Par contre on est d'accord : étant donné que mon moteur tourne lentement (environ 20 s pour faire un tour) le nombre de changement d'état devrait être faible (pour un tour 1 tous les 5 secondes puisqu'il y a changement d'état tous les 90° selon la doc du moteur).
Or j'en obtiens un nombre très important, de plus la suite est incohérente :

Donc je dois rater quelque chose là...

Oula je viens de calculer un truc : il doit sortir du 12V puisque tu l'alimentes à cette tension ... Il y a des chances pour que ton Atmega ait morflé ... Si t'as un voltmètre vérifies

elgranjuego:
Ok merci pour ton code, c'est plus propre effectivement.
Par contre on est d'accord : étant donné que mon moteur tourne lentement (environ 20 s pour faire un tour) le nombre de changement d'état devrait être faible (pour un tour 1 tous les 5 secondes puisqu'il y a changement d'état tous les 90° selon la doc du moteur).
Or j'en obtiens un nombre très important, de plus la suite est incohérente :
Changed to position 1Changed to position 3Changed to position 3Changed to - Pastebin.com

Donc je dois rater quelque chose là...

bonjour
en dehors des reponses de B@tto
non
tu a 2 pulses (creneaux) par tour et par canal, mais le double en changement d'etat = les transisitions de low à high et de high à low

C'est un moteur réducté.
Le codeur est placé sur l'axe du moteur.
Donc que ce soit voie A ou B il emet 2xR impulsions par tour.
R est le rapport de réduction. Pas documenté, semble t-il !
Quels farceurs ces chinois.
Il faudrait aussi savoir si les sorties de l'encodeur sont en collecteur ouvert ou non.
Supposons que le moteur tourne à 6000 tr/mn le rapport de réduction serait de 1/2000.
soit une période de 1/4000 secondes sur les sorties des encodeurs .
Cela correspond à 250µsec. Si en plus il faut gérer les deux un arduino de base va s'essouffler .
Mébon, ça dépend de ce qu'on veut faire avec.

Salut,
Merci pour vos réponses. Effectivement c'est dur d'avoir des infos...
Si je l'alimente en 12v, en sortie (j'ai controlé avec le voltmètre) j'ai 6v... du coup je n'ose pas relier le capteur à ma carte. Si je l'alimente en 9v je reçois 4v en sortie, par contre les infos sont incohérentes mais c'est peut-être normal...
Vous voyez une solution pour récupérer les infos sans flinguer les pins de la carte ?

Un pont diviseur tout simplement

Ok effectivement le pont diviseur (en théorie) c'est tout simple.
Donc j'ai 6v en entrée (qui vient de mon capteur effet Hall intégré au moteur) et je souhaite 5v en sortie (pour l'Arduino).
Après application des lois d'Ohm j'ai : R2 = 5 * R1

Sur le schéma ci-dessous, j'ai fait avec les moyens du bord et j'ai mis pour R1 2 résistances de 1k et pour R2 une résistance de 10k pour avoir mon rapport. Cependant quand je mesure ma sortie je n'ai que 4v. Que je mette les 2 résistances (R1) ou pas c'est pareil, alors je ne comprends pas où je me plante.

Merci !

Bon je me réponds à moi même : le truc c'est que ce principe de diviseur de tension est théorique (pour l'obtention des valeurs), la réalité est tout autre. C'est très bien expliqué ici : Electronique - Bases - Pont diviseur resistif. Je pense que mon capteur à effet hall doit avoir une résistance dite "série" ce qui m'embrouillait complètement.