Dysfonctionnement moteur pas à pas

Bonjour
J'essaye de construire une bobineuse dont le guide-fil est solidaire d'une vis sans fin entrainée par un moteur pas à pas Mitsumi M49SP. Un disque à 4 fentes tourne avec un moteur d'entrainement sur lequel se trouve la carcasse à bobiner. Entre chaque fente, le moteur pas à pas exécute une salve de quelques pas (entre 1 et 10 selon diamètre du fil). C'est ce fonctionnement par salves successives qui pose problème : le positionnement de départ du guide fil se fait sans souci ("faire des pas tant que le fin de course n'est pas activé") mais en salves, le moteur est très souvent erratique : des pas en trop (30%, donc des rebonds ?), des pas en moins, des pas en avant et en arrière. Voici mon pilotage des pas via un L297-L298:

digitalWrite(pinEnPap, HIGH);
    while (digitalRead(pinFcd) != HIGH) {
      digitalWrite(pinPas, LOW);
      delayMicroseconds(delai);
      digitalWrite(pinPas, HIGH);
      delayMicroseconds(delai);
    }
    digitalWrite(pinEnPap, LOW);

Je peux régler la durée d'un pas avec "delai", mais ça ne règle rien.
Avez-vous une idée de l'origine de ce problème ?
Merci

Bonsoir alain70

Mets tout ton programme en ligne.

Cordialement
jpbbricole

Bonjour
Merci pour ta réponse jpbbricole, mais mon souci n'est pas dans le programme : l'oscilloscope montre des salves régulières et faites de beaux créneaux sur la sortie de l'arduino reliée à l'entrée clock du L297. Mon problème est dans l'électronique et j'espérais que quelqu'un aurait eu des problèmes analogues.
Cordialement

Sans informations claires sur la mécanique, l'électronique et le code on peut faire des suppositions pendant des jours et des jours sans que ce soit très constructif.
Dans ces conditions, je ne suis pas certain que quelqu'un ait envie de perdre son temps

Oui, c'est vrai. Je vais retourner sur le circuit : je vais l'ausculter du mieux que je peux, et je reviendrai vous exposer les choses plus précisément
Cordialement

Bonjour alain70

Mesures faites pendant cette phase?

ou pendant la phase erratique.

Comment lis tu les fentes, est ce en mode interruption? (d'où l'utilité du programme :wink:)

C'est un shield, si oui, lequel?
Autrement un schéma ou un lien sur un tuto?

Si tu as un shield, je doute.

Cordialement
jpbbricole

C'est sympa de continuer à me répondre !
J'envoie via arduino des salves de 5 créneaux et je les vois bien tous les 5 (oscillo, avec trigger) pendant la phase erratique, ou en continu pendant la phase de positionnement. Donc Arduino fait le job.
Le disque à fente n'est pas activé : j'essaye de voir si le guide-fil sera bien entrainé, mais oui, les fentes sont détectées par interruption et ça fonctionne bien.
Le pilotage du pas à pas se fait par un couple L297-L298 câblés selon la datasheet.
Le L297 semble fonctionner correctement : identité des signaux entre la sortie de l'arduino et l'entrée clock (broche 18) et signal conforme à la datasheet sur l'une des sortie ABCD, avec l'action visible du découpage courant. Donc ça a l'air bien.
Reste le L298 : c'est un shield très courant sur internet, pcb carré, sans doute chinois, à peine modifié pour pouvoir utiliser les résistances Rsense sur le L297. Le scope donne sur ses sorties des signaux qui sont des créneaux très tourmentés mais bon, ça fait tourner le pas à pas en continu.
Le programme n'est pas optimisé. C'était juste pour mesurer l'avance du guide-fil pour un pas. Et aussi pour examiner un autre problème : j'ai remarqué des différences dans les distances parcourues pour un même nombre de pas dans un sens et dans l'autre. mais vérification faite, ça n'est vrai que dans les fonctionnements erratiques. Je ne mets donc que la fonction droite -gauche et j'omets la fonctions recepnbr qui sert à recevoir un nombre saisi depuis le moniteur.

byte pinPas = 7;
byte pinDp = 8;
byte pinFcd = 11;
byte pinFcg = 13;
byte pinEnPap = 17;//carte pap, réduit et en
byte pinSens = 18;


int PASTOT= 4000; //4000 pas à faire pour le test
int SALVE[4]={5,10,20,50};
int delai;
unsigned int intersalve;

void setup(){ 
  
  pinMode(pinCarc, INPUT);
  pinMode(pinFcd,INPUT); 
  pinMode(pinDp,INPUT);
  pinMode(pinFcg, INPUT);

  pinMode(pinSens, OUTPUT);
  pinMode(pinPas, OUTPUT);
  pinMode(pinEnPap, OUTPUT);

  digitalWrite(pinSens,LOW);
  digitalWrite(pinPas, LOW);
  digitalWrite(pinEnPap, LOW);

  Serial.begin(9600);

} 

 

void loop() { 
     //Choix de la vitesse PAP   
  Serial.print("Vitesse du PAP en µs : ");
  delai=recepnbr();
  Serial.println(delai);  
      //Choix du délai intersalve
  Serial.print("Intervalle entre deux salves (ms) : ");
  intersalve=recepnbr();
  Serial.println(intersalve);
 
   
      //mesures  de l'avance par pas en aller et en retour

  Serial.print("Mesure de l'impact des salves");
  for(int K=0;K<4;K++){
    Serial.print(PASTOT);
    Serial.print(" pas, salves de ");
    Serial.println(SALVE[K]);
    droite_gauche(PASTOT,SALVE[K]);
    while(digitalRead(pinDp)==LOW){//attente
      delay(100);
    }
    gauche_droite(PASTOT,SALVE[K]);
    while(digitalRead(pinDp)==LOW){//attente
      delay(100);
    }
  }
}




void droite_gauche(int NBRPAS, int AV){
    int PAS=0;
    Serial.println("Réglage de la position de carcasse. Calage vers la droite du départ");
    digitalWrite(pinSens, LOW); // vers la droite
    digitalWrite(pinEnPap,HIGH);
    while(digitalRead(pinFcd)!=HIGH){
      digitalWrite(pinPas,LOW);
      delayMicroseconds(delai);
      digitalWrite(pinPas,HIGH);
      delayMicroseconds(delai);
    }
    digitalWrite(pinEnPap,LOW);
    Serial.println("Chariot positionné en butée droite. Ajustez la joue puis Dp"); 
    while(digitalRead(pinDp)==LOW){//attente
      delay(100);
    }
    digitalWrite(pinSens, HIGH); // vers la gauche
    if(AV==1){
      digitalWrite(pinEnPap,HIGH);
      for(int I=1;I<=NBRPAS;I++){
        digitalWrite(pinPas,LOW);
        delayMicroseconds(delai);
        digitalWrite(pinPas,HIGH);
        delayMicroseconds(delai);
      }
      digitalWrite(pinEnPap,LOW);
    }
    else{
      while(PAS<=NBRPAS){
        digitalWrite(pinEnPap,HIGH);
        for(int I=1;I<=AV;I++){
          digitalWrite(pinPas,LOW);
          delayMicroseconds(delai);
          digitalWrite(pinPas,HIGH);
          delayMicroseconds(delai);
        }
        digitalWrite(pinEnPap,LOW);
        PAS+=AV;
        delay(intersalve);
      }
      digitalWrite(pinEnPap,LOW);  
    }
   
  }
    

Les créneaux jusqu'au L297 sont très purs mais serait-il possible que des parasites de commutation se manifestent dans le L298 ?
Merci pour ton aide

Bonjour alain70

Je ne saurais pas te dire, mais qu'en est il de la qualité de l'alimentation des L297 et L298?

Concernant tes entrées, est ce qu'elles ont toutes des résistances de PULLUP ou PULLDOWN afin "d'immuniser" ces entrées contre les bruits parasites?

	pinMode(pinCarc, INPUT);
	pinMode(pinFcd,INPUT);
	pinMode(pinDp,INPUT);
	pinMode(pinFcg, INPUT);

A+
Cordialement
jpbbricole

Oui, les entrées ont toutes une résistance de rappel.
L'alimentation est une alimentation de PC recyclée, en principe très stable.
Je viens de refaire un test : en faisant des salves de 5 pas séparées par 1 seconde de temps mort, le comportement est encore erratique...
Il ne me reste que le circuit L298 et le moteur lui-même à vérifier.

Je PLUSSOIE :+1:

Pour parler techniques, il faut aussi des données techniques autres que le code.

Il faut par exemple des schéma, entre autres...

Sinon, comme le dit @fdufnews , on va s'éterniser sur du flou, ou ne pas s'interesser au sujet.

Le schéma électronique est classique. Voici celui dont je me suis servi.


La mécanique est simplissime : l'axe du moteur est couplé à une vis sans fin et un chariot se déplace entre deux fins de courses sur cette vis.

De mon côté, j'ai changé le circuit L298 et ses composants associés : pas de changement. J'ai remplacé aussi le moteur : pas de changement. MAIS j'ai peut être fait une bêtise en réglant trop bas la consigne Vref : le moteur chauffait, et j'ai réduit le courant, peut être trop.

Test fait, une augmentation de Vref améliore considérablement les choses : si j'envoie des salves de 5, 10 ou 20 pas, le guide parcourt 35mm pour 4000 pas en mode demi-pas. Conforme ! MAIS si j'envoie des salves de 50 pas, le guide parcourt (en aller comme en retour) 39mm soit environ 235 pas de trop. Et je ne comprends pas pourquoi. Je pourrais augmenter le courant, mais le moteur est déjà bien bruyant.

Bonsoir alain70

Je n'ai pas parcouru ton code, mais n'aurais tu pas une variable mal définie, en int à la place de long?

Cordialement
jpbbricole

Un int permet de stocker un entier signé jusqu'à environ 32000 si je ne me trompe pas ? Largment suffisant pour ce test.

Ok alors c'est autre chose :wink:

C'est l'introduction d' un délai entre deux salves qui pose problème. Donc ça ne peut pas venir d'une erreur de code ?
En continu, le guide peut se déplacer sur plus de 5000 pas sans a-coup et sans bruit.

Oui mais dans le cas de salve longue, l'ensemble à prit de la vitesse et peut-être ne s'arrête-t-il pas immédiatement.

Je n'avais pas pensé à ça... Une idée pour le vérifier ?
C'est un moteur de 48 pas (7.5°) : est-ce que ça peut jouer aussi ?

J'ai séparé mon moteur du guide fil et j'ai relancé mon programme qui effectue 4000 pas en salves de 5 pas, avec un intervalle d'une seconde entre les salves . J'ai observé l'axe : le moteur avance une fois, deux fois, puis recule un peu une fois, repart un peu en avant, puis beaucoup plus. Bref très très irrégulier. Et ce malgré le fait qu'en envoi continu de pas, le fonctionnement est impeccable ! Quelqu'un aurait-il une idée de l'expérience à mener pour en savoir plus sur ce comportement étrange ?

Bonjour alain70

Cet essai s'est fait avec le programme du post#7?
Si non, mets le programme en ligne.

Cordialement
jpbbricole