Pilotage de Pas à pas non bloquant?

Bonjour,

Est-il possible de commander deux moteurs pas à pas en vitesse (pas besoin de compter les steep), indépendamment du déroulement du programme ?

Tous les tutos que j’ai trouvés tourne autour du même code mais sont tous bloquants.

Je voudrais faire un doseur d’engrais pour un semoir agricole.

Le microcontrôleur doit réguler la vitesse des doseurs (2) en fonction de la vitesse d’avancement du semoir et d’un valeur tour/doseur par vitesse d’avancement.

Le microcontrôleur doit aussi gérer les impulsions du capteur de vitesse, le port série pour le pilotage, les menus de configurations et … . C’est pour ça que j’aimerais que la génération des pas ne soit pas gênante pour le reste du programme.

Matériel :

-Microcontrôleur : ESP32 (de préférence)

-Driver : ? (à ma disposition : A4988 ou L298N)

-Moteur : Nema17 200 steep/tr.

Merci, bonne journée.

Pour faire cela le mieux est d’utiliser deux sorties PWM si on peut choisir la fréquence. On se moque complètement du rapport cyclique. Sinon, il faut programmer deux timers pour générer des signaux carrés (c’est pareil en fait).
Je ne sais pas le faire avec un ESP32

Merci

Si je préfère un ESP32 c’est pour avoir une connexion bluetooth pour la configuration.

Les PWM dans le ESP32 s’utilise différemment qu’avec un arduino. Il faut régler la fréquence, la résolution et le dutycycle pour chaque canal PWM (15 canaux disponible). Après avec la fonction [ledcWrite(pwmChannel, dutyCycle)] (qui remplace [analogWrite (pin, dutycycle)] de l’Arduino) on peut régler le % haut.

Le petit soucis avec le changement de fréquence et qu’à chaque changement, je réinitialise le PWM et que le redémarrage et déphasé par rapport à celui d’avant. Donc mon moteur fait des clics à chaque changement et si mon code tourne plus vite que la fréquence, ça merde.

Ça pourrai marcher pour mon projet en adaptant le code pour limiter les changements de fréquence. J’ai quand même un peut d’appréhension pour le moteur avec les choc lors du déphasage.

Mon code de test (Driver moteur A4988 ; une pulse égale un pas (vs micropas selon config).

// Motor A
int dirPinA = 33; // Pin direction
int steepPinA = 25; 

// Setting PWM properties
 int i = 50; // RPM
 bool iPlus; // accélération <> deccélération
 int j = 1; // boucle à vitesse stable
 int uSteep = 4;  // microstepp ( division des pas) sur le driver. "pour 1/4 de pas m2 à 5v sur le driver"
const int pwmChannel = 0;
const int resolution = 1;
int freq = i *(200*uSteep)/60;    // points par seconde " [RotationParMinutte] / [60 secondes par minutte] * ([pas par tour] * [micropas par pas]) "
int dutyCycle = 1;

void setup() {
  pinMode(dirPinA, OUTPUT);
  pinMode(steepPinA, OUTPUT);
  
  Serial.begin(115200);
  
  Serial.print("Start Testing Motor...");
  digitalWrite(dirPinA, LOW);
  Serial.print("Start Motor ");
  Serial.print(freq);
  Serial.println(" PWM");
}


void newFreq(){
  freq = i *(200*uSteep)/60;
  ledcSetup(pwmChannel, freq, resolution);
  ledcAttachPin(steepPinA, pwmChannel);
  ledcWrite(pwmChannel, dutyCycle);

  Serial.print(i);
  Serial.print(" RPM   -   PWM ");
  Serial.println(freq);
}


void loop() {
  delay(200);
  if ( j== 0){    // garde la même vitesse pendant les nombre de cycles [j]
      if (iPlus == true){
        i = i+10;
      }else {
        i = i-10;
      }
  }else{
    j --;
  }
  if (i> 400){    // tours minutte max
    iPlus = false;
    j=20;
    i=400;
  Serial.println("PAP deccélère");
  }else if (i < 2){    // tours minutte min
    iPlus = true;
    j=20;
    i=2;
  Serial.println("PAP accélère");
  }
  newFreq ();
}

Pour la version TIMER, je suis trop débutant pour comprendre. Faudrait il creuser de ce côté là ?

Merci

Apparemment vous avez deux problèmes, dont l’un est trivial et l’autre diabolique.

Le problème trivial c’est de supprimer ce "delay(200) dans la boucle loop qui vous sert à déclencher un traitement cinq fois par seconde. Utilisez la fonction “millis()” et une variable chrono déclarée en unsigned long pour régler ce problème. On voit au moins trois fois par semaine des gens qui arrivent sur ce forum, n’ont pas lus les tutos, et se confrontent au même problème : ça enlève l’envie de répondre et de les aider.

Le problème diabolique, c’est d’utiliser un timer pour générer les impulsions d’un moteur pas à pas, et de vouloir changer la fréquence de ces impulsions. Lors du changement, il est très difficile de le faire sans avoir une séquence de deux impulsions (avant / après le changement) dont l’écart soit de l’ordre de grandeur de ce qu’il était avant / après. Soit on a un temps de latence trop long, soit un trop court, entre les deux impulsions. Et un moteur qui est en charge n’aime pas du tout ça, car ça génère un parasite sur le couple / la vitesse, qui peut facilement faire décrocher le moteur. La résolution de ce problème est d’un niveau de complexité tel (informatique, électronique, électrotechnique, mécanique) que c’est la pierre d’achoppement des gens qui font des bibliothèques spécialisées pour la commande numérique avec des moteurs pas à pas. Autant dire que ce n’est pas de votre niveau. Seule manière de s’en tirer, trouver la bibliothèque qui a la fonctionnalité qui vous intéresse et l’utiliser.