Moteur Pas à pas Rotation +/-1 deg

Bonjour à tous,

J'ai déjà posté un sujet pour la même machine de réglage industriel (gestion de la fermeture de mâchoire avec temporisation )
Mais ici, j'ai un soucis pour la gestion d'un moteur pas à pas, qui doit absolument tourner de +/- 1deg par impulsion
Tout ca, uniquement via un driver et non par un système mécanique supplémentaire (soucis de place)

le moteur : https://www.lamtechnologies.com/Product.aspx?lng=EN&idp=M1233070
le driver: https://www.pololu.com/product/3730/faqs

Avec le code ci-dessous, je dois faire 4 tours avec ma roue codeuse pour que le moteur fasse un tour complet

Voici le code:

//Pilotage moteurs pas à pas avec driver pololu & comminication SPI

#include <SPI.h>
#include <HighPowerStepperDriver.h>
#include <Arduino.h>

#define RCod_Dr_B 2
#define RCod_Dr_A 3

float compteur_Dr = 0;

const uint8_t CSPin_Dr = 53;

// This period is the length of the delay between steps, which controls the
// stepper motor's speed.  You can increase the delay to make the stepper motor
// go slower.  If you decrease the delay, the stepper motor will go faster, but
// there is a limit to how fast it can go before it starts missing steps.
const uint16_t StepPeriodUs = 100;

HighPowerStepperDriver sd;

//---------------------VOID IRQ CODEUR MESURE DE VITESSE Droite----
void Isr_Dr() {
  if (digitalRead(RCod_Dr_A)) {
    compteur_Dr = compteur_Dr - 1;
  } 
  else {
    compteur_Dr = compteur_Dr + 1;
  }
  if (compteur_Dr > 0) {
    sd.setDirection(0);
    sd.step();
    delayMicroseconds(StepPeriodUs);
    compteur_Dr = compteur_Dr - 1;
  } 
  else {
    sd.setDirection(1);
    sd.step();
    delayMicroseconds(StepPeriodUs);
    compteur_Dr = compteur_Dr + 1;
  }
}

void setup()
{
// Moteurs Pas à Pas
  Serial.begin(9600);
  pinMode(RCod_Dr_B, INPUT);
  pinMode(RCod_Dr_A, INPUT);
  attachInterrupt(digitalPinToInterrupt(RCod_Dr_B), Isr_Dr, RISING );
  
  SPI.begin();

  sd.setChipSelectPin(CSPin_Dr);
    // Give the driver some time to power up.
  delay(1);
    // Reset the driver to its default settings and clear latched status
    // conditions.
  sd.resetSettings();
  sd.clearStatus();
    // Select auto mixed decay.  TI's DRV8711 documentation recommends this mode
    // for most applications, and we find that it usually works well.
  sd.setDecayMode(HPSDDecayMode::AutoMixed);
    // Set the current limit. You should change the number here to an appropriate
    // value for your particular system.
  sd.setCurrentMilliamps36v4(1500);
    // Set the number of microsteps that correspond to one full step.
  sd.setStepMode(HPSDStepMode::MicroStep2);
    // Enable the motor outputs.
  sd.enableDriver();
  
}

void loop()
{
  // ................suite programme.....................

   delay(10000);
}

lorsque je change le microstep de 2 à 1 il ne suffit plus que de 2 tours de roues pour que le moteurs fasse 360° mais il ratent des steps

Comment est-ce que je pourrais, dans ce code, lui faire faire 1° par impulsion (pas besoin d'avoir 1° precisement)

Merci,
Luis

Sans l'aide de la mécanique externe, tu ne vas pas y arriver.
Il faudrait un moteur pas à pas de 360 pas ou multiple ou sous multiple de 360 pas

Bonjour
ton moteur en NEMA23 a une résolution pas entier de 1.8°
si tu ne veux/peux adapter un réducteur planétaire , il ne reste pas beaucoup de solutions "viables".
selon ta tolérance possible sur le ° : utiliser un NEMA23 en 0.9°

Bonsoir Luis

Etonnant, un moteur pas à pas ne rate pas des pas parce qu'il est micros pas, ça n'existerai pas!
C'est ou le courant qui n'est pas bien réglé, ou une fréquence de pas trop élevée.
Avec les micros pas à 16, tu peux arriver à une précision de 0.99°

Je n'ai, malheureusement pas ce type de driver.

Cordialement
jpbbricole

Quelques impressions, car sans infos sur la roue codeuse, sans le moteur, sans le driver et avec une bibliothèque assez rare, c'est pas facile de donner des certitudes.

  • Le courant dans le moteur: il s'agit d'un moteur 4,2A/phase et le programme limite le courant à 1,5A. Cela ne doit rien changer, juste diminuer le couple maximum. Au passage si cela suffit, c'est mieux, le moteur chauffera moins ce qui augmente sa durée de vie.

  • pour avoir un "pas" de 1°: En mode pas une impulsion avance de 1,8°, il faut donc passer avec des micros pas. Par exemple si on veut plus de résolution, en passant en 256 micros-pas, la résolution devient de 1,8°/256. Il faudra environ 142 impulsions par sd.step() pour avencer d'environ 1°. Pour que cela fonctionne, il faudra que si compteur_Dr s'incrémente de 1, il faut appeler non pas une fois sd.step() mais 142 fois. Suivant la résolution souhaitée, on peut passer avec le nombre de micro-pas adéquat.

  • 360 crans font un tour? si on utilise 142 impulsions en mode 256 micros-pas ne donne pas exactement 1°, et si on tourne la roue codeuse de 360 crans on ne fera pas 360° (il manque un demi degré). Soit ce n'est pas important, soit si 360 crans doivent faire exactement un tour, auquel cas il faudra faire 142 impulsions/crans en général et quelques fois 143 impulsions/crans.

  • Le moteur loupe des pas? Je ne le crois pas non plus. Un moteur pas à pas ne peut pas louper un pas ou un micro-pas. En cas de problème il peut louper des pas, mais il retrouve une position stable. Et ces positions stables sont tous les 4 pas. expérience: aven un 200 pas par tour, en alimentant le moteur (éventuellement avec un courant assez faible), en faisant tourner le moteur à la main, on va sentir 50 crans (une position stable tous les 4 pas). Donc si le moteur "loupe un pas", il y a un décalage multiple de 7.2° (4 pas). Et ce n'est pas discret.
    Je pense dans ce cas il peut y avoir au moins deux explications:
    a) si on tourne la roue codeuse d'un cran, le programme d'interruption fait avancer le moteur d'un pas et attend au moins 100µs (certainement beaucoup plus car les instructions autres que delayMicroseconds durent un certain temps). Du coup si la roue codeuse va trop vite, certaines impulsions de la roue codeuse ne peuvent pas être prises en compte. Il manque des pas, mais cela ne vient pas du moteur
    b) si on tourne la roue de plusieurs crans, on va demander au moteur plusieurs pas espacés d'environ 100µs. A cette vitesse, en mode pas un tour se fait en 200*100µs soit 20ms (cela fait 50tr/s ou encore 3000tr/mn). C'est sans doute plus lent, mais cela fait beaucoup trop. En mode 2 micro-pas, la vitesse est deux fois plus lente et le problème se voit moins.

Pour faire tourner le moteur correctement, je crois qu'il faut d'abord mesurer la vitesse maximale de rotation du moteur, départ arrêté. Par exemple en mode pas, on configure le moteur dans le setup (un seul sens), puis loop peut ressembler à:

void loop()
{
  for (word pas=0; pas<200; pas++) // Un tour c'est 200 pas
  {
    sd.step();
    delayMicroseconds(StepPeriodUs);
  }
  delay(1000); // Arrêt du moteur pendant une seconde
}

Si la vitesse est trop faible, le moteur tourne en faisant un tour complet, 1s d'arrêt, un tour complet, 1s... ->diminuer StepPeriodUs
Si la vitesse est trop grande, le moteur ne fait pas des tours entiers -> augmenter StepPeriodUs

Tant que le moteur seul ne tourne pas correctement, ce n'est pas la peine de rajouter la roue codeuse. Il faut tester les éléments un par un avant de les mettre ensembles.

On ne peut pas mettre dans la fonction d'interruption la rotation du moteur car pendant que le moteur tourne, on ne peut pas voir les impulsions de la roue codeuse. Dans un tel cas, je chargerai la routine ISR de compter seulement les impulsions de la roue ceodeuse, et une boucle loop qui fait tourner le moteur

Aurais-tu une référence sur cette roue codeuse, ne serait-ce que le nombre de pas au tour?

Peut-être que ce n'est pas le MPAP qui rate des micros-pas, mais c'est la relation roue codeuse commande du MPAP, parce que la fréquence de la roue codeuse trop rapides.
Cette roue codeuse est manipulée ou elle tourne par une mécanique?

Le moteur et le driver sont référencés dans le premier post, quand à la "bibliothèque assez rare" , elle doit être spécifique au driver qui a un interface SPI.

Cordialement
jpbbricole

Voici:
MPG.pdf (298,3 Ko)

J'ai fais quelques essais malgré mon niveau tres tres tres moyen sur ce genre de projet.
Je laisse tomber l'idée du 1gradutation = +/- 1°
J'ai changer le paramètre:

  sd.setStepMode(HPSDStepMode::MicroStep2);

de 2 vers 1
actuellement, il me faut 2 tours de roue codeuse pour avoir +/- 1 tour complet du moteur.
Ce sera très bien pour mes réglages.

Pour les soucis de "step qui sautaient" j'ai joué avec le courant qui était délivré au moteur

sd.setCurrentMilliamps36v4(1200);

je suis passé de 1500 mA à 1200mA et tout va très bien
C'est peut-être lié a ce que mon alimentation peut délivrer. je n'ai pas encore vérifier.

Je pense que pour la version proto de ma machine je peux rester sur cette situation

Super :+1:

Bonne continuation.

Cordialement
jpbbricole