Mesure de la vitesse d'un moteur brushless (TIPE Prépa)

Bien le bonjour et bonne année à tous :slight_smile:

Je suis étudiant en PSI (CPGE) à Angers et dois mener un TIPE qui est une recherche sur une expérience à trouver en quelque sorte pour ceux qui ne connaissent pas mais ce n'est pas super important à expliquer.

J'ai créé un programme Arduino à l'aide de tutoriels et de précieux conseils qui me permet de mettre en rotation un moteur brushless (on relie l'arduino au PWM de l'ESC) à une certaine vitesse à l'aide de mon potentiomètre.
L'idée de départ était de lancer le moteur à une vitesse constante à l'aide d'Arduino mais je n'y suis jamais parvenu... d'où la résolution d'utiliser un potentiomètre

Finalement mon montage comporte aussi un capteur à effet hall qui vient mesurer la vitesse de rotation de mon moteur, (car un aimant est placé sur l'arbre et est détecté à chaque tour) et à une certaine tension définie par la position du potentiomètre.

De cette façon je devrais être capable de mesurer la vitesse de rotation en fonction de la tension
J'obtiens à l'aide des informations fournies par mon capteur à effet hall un certain nombre de détection pour une intervalle de temps choisi (le nombre de tours sur cet intervalle donc car on détecte l'aimant à chaque passage).

J'obtiens après conversion une vitesse de rotation en radians par seconde qui pour le coup est très éloignée de la valeur constructeur du Kv (nombre de tours par minutes et par volts).

Je pense que mon erreur est de ne pas comprendre la fonction map correctement...
Du coup je me trompe surement sur la valeur de la tension envoyée à mon moteur...
Voilà donc mon problème...

Mais le sujet est en fait très intéressant car finalement l'arduino joue le rôle d'une carte de commande pour mon brushless donc j'imagine très bien que l'on peut faire un drone avec une arduino même si mes maigres connaissances ne me permettent pas de le faire ^^.
Je ne sais pas jusqu'à quel point la carte Arduino peut contrôler la vitesse d'un brushless... si on peut lui imposer instantanément une vitesse constante ou autre...

Je laisse le programme ici

#include <Servo.h>
int valeur = 0; // Variable potentiomètre
Servo esc ;
int capteurpin = 2; // Lecture
int sensorValue;
int lastsensorValue = LOW;
int compteur = 0 ;
unsigned long temps = 0;
unsigned long duree = 1000;

void setup() {
  esc.attach(8);
  esc.writeMicroseconds(1000); // On attribue la valeur min
  Serial.begin(9600);
  temps = millis();
  }

void loop() {
  // Lecture du potentiomètre pour régler la vitesse
  valeur = analogRead(A0);
  int valeuresc = map (valeur , 0 , 1023, 1000, 2000);
  esc.writeMicroseconds(valeuresc); // On attribue la variable mappée qu'on attribue à l'esc
  sensorValue = digitalRead(capteurpin);
  if (( sensorValue == HIGH) && (lastsensorValue == LOW)) compteur++;
  lastsensorValue = sensorValue;
  delay(1);

  if (millis() - temps > duree) {
    temps = millis();
    Serial.println(compteur);
    Serial.println(valeur);
    compteur = 0;
  }
 
}

Excusez moi pour mes explications un peu farfelues j'espère que vous comprendrez quand même xD.
Je vous remercie d'avance pour d'éventuelles réponses
Bonne journée à vous :wink:

Bonjour;

Quelle est la vitesse de rotation maxi de ton moteur ?

A plus.

Je pense que ton problème est plutôt sur la façon d'aborder ton projet.

Ton capteur a effet hall il te retourne quoi comme info? signale analogique ou impulsions (0/1) ?

Finalement mon montage comporte aussi un capteur à effet hall qui vient mesurer la vitesse de rotation de mon moteur, (car un aimant est placé sur l'arbre et est détecté à chaque tour) et à une certaine tension définie par la position du potentiomètre.

Je ne vois pas a quoi peut servir le potentiomètre.

A plus

Rebonjour. Concernant la vitesse maximale je ne sais pas mais le Kv du moteur utilisé est de 2200.

Le potentiomètre me permet de faire varier la vitesse de moteur. En fonction de la valeur analogique lue sur le potentiometre on vient appliquer à la PWM de mon ESC une certaine valeur de tension.

Le capteur à effet hall est à impulsion. Il détecte le passage de l'aimant 1 fois par tour

Corentin49:
Rebonjour. Concernant la vitesse maximale je ne sais pas mais le Kv du moteur utilisé est de 2200.

Le potentiomètre me permet de faire varier la vitesse de moteur. En fonction de la valeur analogique lue sur le potentiometre on vient appliquer à la PWM de mon ESC une certaine valeur de tension.

Le capteur à effet hall est à impulsion. Il détecte le passage de l'aimant 1 fois par tour

Bonjour
rapidement parcouru
je pense qu ta methode de comptage du nombre de tour
par polling et impliquant un délai bloquant de 1 ms , n'est pas adaptée

pour un peu d'efficacité AMHA , il faut passer par de l'interruption pour le capteur hall

if (( sensorValue == HIGH) && (lastsensorValue == LOW)) compteur++;
  lastsensorValue = sensorValue;
  delay(1);

Corentin49:
on vient appliquer à la PWM de mon ESC une certaine valeur de tension.

Tu fais fausse route sur ce point, le signal PWM qui sort de ton arduino, fait soit 0v soit 5v, C'est la largeur d'impulsion qui varie.

Les "ESC" classiques attendent un PWM sur une période de 20ms avec une largeur d'impulsion qui varie de 1ms a 2ms (et c'est ce que tu écris dans ta fonction map).

A aucun moment la tension varie, L'ESC ne fait que de la commutation plus ou moins rapide, c'est de la variation de fréquence

Bonjour;
Je rejoint Artouste pour l'acquisition du comptage.

Concernant la vitesse maximale je ne sais pas mais le Kv du moteur utilisé est de 2200.

Tu veux dire quoi par "Kv".

Comment sais tu que ton comptage de tour est correcte si tu ne connais pas la vitesse de rotation en tr/min?

Tu dois déterminer la vitesse angulaire de ton moteur à vitesse max.
Ton calcul devra être intégré dans ta routine d'interruption pour définir ta vitesse actuelle en fonction des top reçus.

Si non à vide (hors charge) en fonction de la tension appliqué au moteur tu peut la définir aussi. (Mais faut connaitre la vitesse maxi/tension maxi).
Si pour 6V tu as 350tr/min à 3V tu 125tr/min. la linéarité n'étant pas exacte du a sensiblement ces résultat. Sachant qu'a une tension trop inférieur ton moteur est bloqué. (effort mécanique de roulements)
Valable sur les moteurs à courant continu.

A plus.

Bonsoir

Kv du moteur : souvent le nombre de tours / minute/ volt (à vide)

Bonjour,

Je tente de résumer ce que je pense avoir compris :

  • Pour la première étape la carte arduino applique un PWM sur l'entrée de commande du contrôleur associé au moteur. (Ce signal étant de même nature qu celui qui permet de contrôler un servo, c'est à dire conforme à ce qu'indique jambe post #5)
  • L'étape suivante serait de concevoir une régulation de vitesse (car la vitesse du moteur brushless sinon ne serait pas rigoureusement constante, et surtout pas du tout indépendante de la charge du moteur)
  • Pour cette régulation (asservissement de vitesse) il faut mesurer la vitesse effective sur l'arbre moteur et la comparer à une consigne (par exemple donnée par un potentiomètre)
  • Le KV indiqué étant de 2200; pour une tension par exemple de 5V; la vitesse attendue va situer un peu en dessous de 2200x5 soit 11000 t/mn .... ce qui nous fait une période de 60/11000 soit environ 5,4 ms

Avec ces ordres de grandeurs et si on veut une bonne précision je pense effectivement qu'il faut mesurer la période en déclenchant une interruption matérielle et compter le délai à chaque tour. (comme l'indique Artouste post #4)

Il reste à faire effectuer par l'arduino en tâche de fond le traitement correspondant à la régulation de vitesse. Comme le traitement du s/programme d'interruption sera très simple (recopie du temps réel donné par ex par micros() dans une variable et raz de ce temps à chaque tour) alors la durée d’exécution du s/p d'interruption sera faible.

Reste à élaborer la traitement pour la régulation de vitesse. (avec une information vitesse rafraîchie en quelques ms la régulation de vitesse sera sans doute assez réactive pour espérer une stabilité correcte de la vitesse)

Pour ma part, je tenterai d'abord de faire fonctionner la mesure (et l'affichage de RPM) par interruption sans prévoir de régulation pour une première étape.

Serge .D

Des infos ici :
https://www.carnetdumaker.net/articles/faire-un-tachymetre-avec-une-carte-arduino-genuino-pour-lire-la-vitesse-de-rotation-dun-ventilateur-de-pc/#mesure-par-interruption

Rebonjour et pardonnez mon retard de réponse. Merci pour toutes vos informations apportées et infos transmises pour m'aider. Effectivement je me suis documenté un peu plus sur le PWM et je l'avais mal défini ce n'est pas du tout la tension qui varie...

Néanmoins je n'ai pas très bien compris la différence entre la méthode polling et par interrupiton pour le capteur à effet hall...

Il est vrai par ailleurs que le délai de 1ms n'est pas adapté et est source de problème...

D'une manière plus générale l'idée était pour moi simplement de pouvoir d'ammener le moteur brushless à une certaine vitesse grâce à la carte arduino et après différents essais le potentiomètre avait été retenu car j'arrivais alors à le faire tourner même si j'avais donc un manque d'informations sur la vitesse...

Bonjour;

J'obtiens après conversion une vitesse de rotation en radians par seconde qui pour le coup est très éloignée de la valeur constructeur du Kv (nombre de tours par minutes et par volts).

Intéresse toi aux interruptions. Si ton calcul est fiable ta valeurs sera fiable.
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.AttachInterrupt

Je pense que mon erreur est de ne pas comprendre la fonction map correctement...

"map()" est une méthode e mise à l'échelle. elle s'utilise pour affecter une grandeur différente aux signale d'entrée.
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.Map

l'idée était pour moi simplement de pouvoir d'ammener le moteur brushless à une certaine vitesse grâce à la carte arduino et après différents essais le potentiomètre avait été retenu car j'arrivais alors à le faire tourner même si j'avais donc un manque d'informations sur la vitesse...

Si cela te conviens... Ou est ton problème ?!

Salutations.