Problème d'interruption Moteurs pas à pas

Bonjour,

J'ai un souci avec mon programme qui consiste à faire tourner un moteur pas et j'ai la possibilité de mettre le programme en pause à l'aide d'un inter. Tout fonctionne, mais lors de mon interruption si le nombre de step_moteur est trop élévé (90000 par exemple: le moteur tourne sans aucune interruption pendant plusieurs heures), lorsqu'il revient sur la loop les moteurs ne tournent plus le temps d'un cycle.
Alors que si je mets 10000pas par exemple, ça fonctionne car le temps d'un cycle est plus court. mais j'ai un temps de pose entre chaque cycles et ça je ne veux pas.
Pouvez-vous me dire pourquoi lorsqu'il revient dans la loop après l'interruption, les moteurs ne tournent plus jusqu'à la fin du cycle?
Ci-joint mon programme:

#include <LiquidCrystal.h>
#include <time.h>

          

#define DELAY_PAS_MOTEUR  250
#define STEP_MOTEUR     10000          // (1/4 de pas selectioné sur le driver)
#define nbreCycles      9000


LiquidCrystal lcd(12,11,10,9,8,7);     // affectation des pins de l'arduino pour l'ecran LCD

volatile const byte interruptPin = 2;  // pin2 attribuer à l'interruption 

const int bouton = A0;                 // attribution du bouton à la pin A0
const int boutonPause = 20;            // attribution du bouton pause à la pin 
const int led = 13;                    // attribution de la led pin 13

long cycle = 0;

int etatBouton;                        // variable bouton demarrage
int etatBoutonPause;                   // variable bouton pause
int M1dirpin = 3;                      // declaration pin 3 pour la direction du moteur 1
int M1steppin = 4;                     // declaration pin 4 pour l'activation des bobines du moteur1
int enable = 43;                       // pin43 active le enable du driver, pour eviter la consommation de courant à l'état delay du moteur1
int i;





void setup() {

 Serial.begin(115200);              //Initialise le moniteur serie
  
  lcd.begin(16,2);                  //set up nombre de lignes et colonne ds l'afficheur
  lcd.print("ON");                  //affiche sur le LCD "cycles :"
 
  
  
  
  pinMode(led,OUTPUT);                  // la pin 13 devient une sortie
  
  pinMode(bouton,INPUT_PULLUP);         // la pin 10 devient une entrée
  etatBouton = HIGH;                    // on force l'entrée à l'état Haut
  
  pinMode(boutonPause,INPUT_PULLUP);    // la pin   devient une entrée
  etatBoutonPause = HIGH;               // on force l'entrée à l'état Haut
   
  attachInterrupt(digitalPinToInterrupt(boutonPause), Pause, LOW);  //Interruption si le boutonPause est actionné, le programme s'interrompt
  
  pinMode(M1dirpin,OUTPUT);
  pinMode(M1steppin,OUTPUT);
  pinMode(enable,OUTPUT);
  digitalWrite (enable,HIGH);       // a l'allumage, le pont en h est desactivé, le moteur ne consomme pas de courant
  
}


void disable_motors(){
  digitalWrite (enable,HIGH);   
  
}

void enable_motors(){
  digitalWrite (enable,LOW);   
  
}

void Pause(){                     
    
    lcd.setCursor(0,1);               // affiche sur la ligne 2 du LCD
    lcd.print("                ");    // efface le contenu de la ligne 2
    lcd.setCursor(2,1);               // affiche la ligne 2 du LCD
    lcd.print("PAUSE           ");   // Dés que le boutonPause est actionner, le LCD affiche la valeur pause     
    disable_motors();
    
}
  
    
void loop(){

  
  digitalWrite(led,HIGH);              // la led est eteinte
  disable_motors();

   
  /*_______________________EN ATTENTE DU BOUTON_________________________*/
  
 
  if(digitalRead(bouton) == LOW){    // Passe à la suite si le bouton est appuyé
   
  
  /*____________________________________________________________________*/
    
  digitalWrite(led,LOW);              //  la led s'allume

  
  for (cycle = 0; cycle <nbreCycles; cycle++){ // le moteur tourne pour le nombre de cycles selectionnés 

    lcd.setCursor(0,1);               // affiche sur la ligne 2 du LCD
    lcd.print("                ");    // efface le contenu de la ligne 2
    lcd.setCursor(2,1);               // affiche la ligne 2 du LCD
    lcd.print("EN MARCHE");           
    
      
    enable_motors();
    delayMicroseconds(2);
    digitalWrite(M1dirpin,HIGH);
    for(i=0;i<STEP_MOTEUR;i++){
      digitalWrite(M1steppin,HIGH);
      delayMicroseconds(2);
      digitalWrite(M1steppin,LOW);
      delayMicroseconds(DELAY_PAS_MOTEUR);
     }    
    //disable_motors();
    //delay(500);
   }
  }
}

merci pour votre aide

Bonjour manuproto19

Tu demandes 90000 (STEP_MOTEUR) pas et tu fais
for(i=0;i<STEP_MOTEUR;i++)
avec un i déclaré int i; or un int va de -32,768 à 32,767, donc n'arrivera jamais à 90000.

Cordialement
jpbbricole

Merci Jpbbricole pour ta réponse. je ne savais pas pour le int.
tu veux dire que lorsque mon programme est lancé (sans faire d'interruption) il ne fait en gros que 60000 pas et il s'arrête?
Sais-tu pourquoi lors de l'interruption, quand il revient dans la loop, les moteurs ne tournent plus?

Bonjour manuproto19

Non, je répondais à

Si le moteur tourne sans interruption pendant longtemps, c'est que ta boucle
for(i=0;i<STEP_MOTEUR;i++)
a i comme compteur, i est une variable int, qui va de -32 768 à 32 767, ce qui veut dire que si STEP_MOTEUR est plus grand que ces valeurs, ce qui est le cas avec #define STEP_MOTEUR 90000 la boucle ne se termine jamais. Avec #define STEP_MOTEUR 10000, c'est plus petit donc la boucle va se terminer.

Pour voir ceci, essaies ce programme,

#define STEP_MOTEUR     10000 // 90000          // (1/4 de pas selectioné sur le driver)

//long i;





void setup() 
{
	Serial.begin(115200);              //Initialise le moniteur serie


	for(long i=0;i<STEP_MOTEUR;i++)
	{
		Serial.println(i);
	}
}

void loop()
{

}

avec le console à 115200, avec STEP_MOTEUR 10000, la boucle se termine, pas avec STEP_MOTEUR 90000.

La solution, passer i de int à long.
Dans ton programme tu as mis i comme variable globale, ce n'est pas nécessaire, fais ainsi:
for(long i=0;i<STEP_MOTEUR;i++)

Dans l'interruption, (boutonPause) il y a l'appel à la fonction disable_motors(); où on met le signal enable du driver du MPAP à HIGH ce qui désactive le moteur.

A+
Cordialement
jpbbricole

Merci beaucoup jpbbricole pour toutes ces infos! je débute dans la programmation et grâce à tes lumières je viens d'apprendre encore quelque chose. :wink:

Je viens de faire la modif et en effet ça fonctionne mieux :grinning:...
Merci encore jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.