Simulateur interactifIntermédiaire

Simulateur de pas à pas : perte de pas et retard

Regardez un rotor traîner derrière le champ commandé, poussez-le au-delà de 90 degrés électriques : la machine perd sa position sans que rien ne le remarque.

Catégorie
Systèmes embarqués
Durée
20–40 min
Plateforme
Navigateur · Arduino · ESP32
Schéma technique : Simulateur de pas à pas : perte de pas et retardFIELDROTORCARRIAGE80 STEPS/MM · 1.8° · 1/16LAG ANGLE DECIDES WHETHER IT ARRIVES

01 / Commencez ici

Introduction

Un pas à pas ne fait pas des pas — il traîne un rotor derrière un champ magnétique tournant, et l'angle entre les deux décide si le mouvement aboutit. Ce labo intègre directement l'équation du mouvement du rotor : rien n'y cherche la perte de pas, donc quand l'angle de retard s'emballe au-delà de la limite de décrochage de 90 degrés, le moteur se désynchronise tout seul, exactement comme sur un établi.

Live lab / Open-loop step integrity

Stepper motor simulator

Command a move and watch the rotor trail the field. Push the acceleration, drop the voltage or add load until the lag angle runs past the 90° pull-out limit — and the motor silently stops arriving.

Browser native
This lab plots a stepper move twice: the position the driver believes the axis has reached against the position the rotor actually reached, and below it the lag angle between the commanded magnetic field and the rotor. Use the controls below to change the move, the drive and the load.

Upper plot: the dashed line is where the driver thinks the axis is, the solid line is where the rotor actually is. Lower plot: the lag angle between them. The shaded band is where a steady load can sit — past ±90 electrical degrees the torque starts falling instead of rising, so there is no equilibrium out there, and a rotor that keeps going reaches 180° and slips a pole.

  • Commanded (what the driver counted)
  • Actual rotor position
  • Where a load can sit (±90°e)
  • Sync lost
Try it

There is nothing to start — the whole move is re-integrated as you drag any control. Step through the five presets to see the four ways an open-loop move stops arriving.

The move
The drive
The load

The rotor stays inside the stable band for the whole move and lands on target.

Full steps lost
0
Peak lag
25°e
Position error
0.000 mm
Resolution
80 steps/mm
Pull-out torque
0.311 N·m
Corner speed
599 rpm

Every action has a button above. If you prefer the keyboard, focus the plots and press P for the next preset, M for the next microstepping setting, N to toggle the acceleration ramp, R to reset and F for full screen; sliders respond to the arrow keys.

Commandes

Le labo rejoue tout le mouvement à chaque saisie, donc les traces suivent le curseur pendant que vous le tirez plutôt que d’attendre un appui sur Start. Il n’y a rien à démarrer — le mouvement fait 30 000 pas d’intégration et il se termine avant que votre doigt ait bougé.

Commande Ce qu’elle modifie
Preset Cinq situations traitées, d’un mouvement propre à quatre façons différentes d’échouer
Step rate Une rampe d’accélération trapézoïdale, ou la fréquence de pas qui saute directement au maximum
Distance / Top speed / Acceleration Le mouvement demandé
Supply voltage Ce dont dispose le pont pour pousser le courant dans l’enroulement
Current limit Ce que vous réglez avec le potentiomètre — c’est le couple maximal
Microstepping La finesse de division du champ, de 1/1 à 1/16
Mechanism Courroie GT2 (40 mm/tr) ou vis-mère T8 (8 mm/tr)
Resisting torque Frottements et charge à l’arbre du moteur

Le tracé du haut est la position : la ligne en pointillés est l’endroit où le pont croit que l’axe est, la ligne continue est l’endroit où le rotor est réellement. Le tracé du bas est l’angle de retard entre eux, avec la bande stable ±90° ombrée.

Théorie

Un pas à pas ne fait pas des pas. Le pont fait tourner un champ magnétique par incréments et le rotor le suit, toujours en traînant derrière d’un certain angle — et le couple qu’il produit est le sinus de cet angle :

T = T_peak(ω) × sin(δ)

δ est mesuré en degrés électriques. Un moteur 1,8° a 50 dents au rotor, donc sa magnétisme se répète 50 fois par tour et un pas entier vaut exactement 90 degrés électriques. Cette conversion est la seule arithmétique de tout le sujet.

Entre −90° et +90°, le moteur est un ressort : prenez plus de retard, soyez tiré plus fort. Cette zone stable est pourquoi un pas à pas en boucle ouverte fonctionne, et c’est là que toute charge permanente doit se tenir. Au-delà de 90°, le sinus redescend, donc prendre plus de retard produit moins de couple de rappel, ce qui fait prendre encore plus de retard — et à 180°, le couple s’inverse carrément et commence à tirer vers le pôle suivant. Le rotor glisse jusqu’à la dent stable suivante, à un cycle électrique — quatre pas entiers — de distance.

Ce sont deux nombres différents et le labo les distingue. 90° est là où finit l’équilibre ; un bref dépassement est survivable, c’est pourquoi une commande en pas entiers — un à-coup de 90° à chaque pas — ne détruit pas la machine. 180° est le point de non-retour.

Trois choses font croître l’angle de retard :

  • La charge. À vitesse stabilisée, sin(δ) = demandé ÷ disponible. Une charge à la moitié du couple disponible se tient à 30°, laissant 60° de marge.
  • L’accélération. Mettre le rotor en mouvement coûte du couple pris sur le même budget, donc le retard est pire sur la rampe, pas à vitesse élevée.
  • La vitesse, car T_peak lui-même chute à mesure que le moteur tourne plus vite.

Cette dernière est la moins évidente. Un enroulement est une inductance, et plus le moteur tourne vite, plus il est difficile d’y forcer le courant et de l’en ressortir — la réactance monte avec la fréquence électrique, et la propre force contre-électromotrice du rotor tournant mange la tension d’alimentation. Le résultat est une courbe de couple plate jusqu’à une vitesse de coude puis qui s’effondre au-delà, et le coude est fixé par la tension d’alimentation.

D’où les deux règles que le labo existe pour rendre évidentes : plus d’ampères achète du couple, plus de volts achète de la vitesse.

Algorithme

Le rotor est intégré directement. Rien dans ce code ne détecte la perte de pas, ne l’insère, ni ne sait qu’elle est possible — elle découle de la loi en sinus.

// per 20 us tick
const ideal    = sampleProfile(plan, time).position;         // mm the planner wants
const command  = Math.round(ideal * stepsPerMm) / stepsPerMm; // the driver only does whole microsteps
const lag      = rotorTeeth * (commandAngle - theta);         // electrical radians

const { torque } = peakTorque(setup, omega);                  // falls with speed
const friction   = loadTorque * Math.tanh(omega / 0.5);       // smooth Coulomb, one line
const accel      = (torque * Math.sin(lag) - friction - damping * omega) / inertia;

theta += omega * dt + 0.5 * accel * dt * dt;
omega += accel * dt;

Deux détails comptent plus qu’il n’y paraît.

La commande est quantifiée sur la grille de micro-pas avant que le rotor ne la voie. Cet escalier est l’excitation : en pas entiers, chaque commande est un à-coup à 90 degrés électriques sur une résonance très peu amortie, ce qui est exactement pourquoi un moteur en pas entiers hurle et un moteur en micro-pas non.

Le modèle d’enroulement fixe le plafond de couple :

const backEmf   = kT * speed;
const impedance = Math.hypot(resistance, rotorTeeth * speed * inductance);
const current   = Math.min(currentLimit, Math.max(0, supplyVolts - backEmf) / impedance);
const torque    = Math.SQRT2 * kT * current;

C’est une approximation globale en régime permanent d’un pont à découpage, pas une simulation phase par phase. Elle reproduit l’allure d’une vraie courbe de couple et donne les deux bonnes réponses d’ingénierie ; elle reste conservatrice tout en haut.

La trajectoire commandée provient du planificateur de profils de mouvement existant du site, donc « avec une rampe » et « sans » sont le même chemin de code avec une limite d’accélération différente — il n’y a aucun mode d’échec séparé écrit dedans.

Expériences guidées

Chacune isole une seule variable. Ne changez rien d’autre.

1. La rampe est toute la machine. Laissez tout aux valeurs par défaut et basculez Step rate entre Ramped et Straight to full speed.

Ramped Straight to full speed
Pic de retard 25°e au-delà de 90° à 1,2 ms, fini à 3,0 ms
Pas entiers perdus 0 280
Où finit l’axe 60,00 mm 4,0 mm

Même moteur, même pont, même courant, même cible. La seule différence est si la fréquence de pas a été rampée, et la différence entre les deux est tout le mouvement.

2. Trouvez la fréquence d’accrochage. Réglez Straight to full speed, puis augmentez Top speed depuis 100 mm/s par paliers. Ça passe, et ça passe, puis quelque part vers 200 mm/s cela cesse complètement de passer — pas progressivement. Ce seuil est la fréquence d’accrochage, et c’est un vrai nombre sur les vrais moteurs.

3. Les volts achètent la vitesse. Chargez le préréglage 12 V supply, run fast : le mouvement décroche. Augmentez maintenant Supply voltage à 24 et regardez-le passer, sans toucher à la limite de courant. Revenez ensuite à 12 V et essayez de le sauver avec Current limit à la place — vous ne pouvez pas. Au-delà de la vitesse de coude, le pont n’atteignait jamais le courant réglé.

4. Les micro-pas n’achètent pas la précision. Fixez tout et faites passer Microstepping de 1/1 à 1/16, en lisant deux choses :

Micro-pas Taille de pas Pire écart au parcours Erreur permanente due à la charge
Pas entier 0,200 mm 0,127 mm 0,049 mm
1/4 0,050 mm 0,061 mm 0,044 mm
1/16 0,0125 mm 0,045 mm 0,044 mm

Le suivi s’améliore environ trois fois puis s’arrête. L’erreur de charge ne bouge pas du tout. Elle était de 0,044 mm en pas entiers et elle est de 0,044 mm en seizièmes de pas — la différence est que 0,044 mm est un quart de pas entier et trois micro-pas et demi, donc des micro-pas fins rendent la même erreur bien pire dans les unités rapportées par le pont.

5. Décrochage. Augmentez lentement Resisting torque avec une vitesse modeste réglée. Regardez l’angle de retard sur le tracé du bas grimper vers la ligne en pointillés. Il va se tenir à 30°, puis 50°, puis 70° — puis, sur un petit incrément de curseur, la synchronisation est partie. Il n’y a pas de zone d’avertissement, car il n’y a aucun équilibre au-delà de 90° où se stabiliser.

7. Les pas entiers sont un à-coup de 90°. Chargez le préréglage Full stepping et lisez le pic de retard : environ 102°e. Chaque pas commande les 90° complets, et l’élan du rotor l’emporte au-delà. Il arrive quand même — rien n’est perdu — mais il passe tout le mouvement à osciller dans la zone où un moteur chargé ne peut pas se permettre d’entrer. C’est à la fois pourquoi les pas entiers sont bruyants et pourquoi ils laissent si peu de marge pour la charge.

6. Le mécanisme change le problème. Basculez Mechanism sur la vis-mère T8 avec tout le reste fixe. La résolution passe de 80 à 400 pas/mm, et la même vitesse maximale exige désormais cinq fois la fréquence de pas.

Ce que vous devriez observer

  • L’échec est une falaise, pas une pente. Rien ne se dégrade. L’angle de retard croît doucement jusqu’à 90° puis le mouvement a simplement disparu. C’est la différence déterminante entre un pas à pas et une boucle fermée de type servo, qui ralentit simplement sous charge.
  • La machine ne sait jamais. La ligne commandée en pointillés finit toujours exactement sur la cible, car le pont a compté chaque impulsion reçue. Seule la ligne continue dit la vérité, et aucune vraie machine n’a cette ligne.
  • L’erreur de charge est toujours là. Même dans un essai parfait, le rotor se tient des dizaines de microns derrière l’endroit annoncé par le pont. Ce n’est pas un défaut ; c’est ce qu’exige sin(δ) = charge ÷ couple.
  • Les pas perdus sont toujours un multiple de quatre. Essayez de produire un compte qui n’en est pas un.

Transposition au matériel

Ce labo Un vrai axe
Temporisation de pas idéale à 50 kHz Gigue d’horloge d’un microcontrôleur, et un plafond vers 10–15 kHz sur un Arduino Uno
Une masse rigide Allongement de courroie, jeu, châssis qui fléchit
Couple résistant constant Frottement qui varie le long de l’axe, et traînée des câbles
Un modèle d’enroulement global Une vraie courbe de couple, avec couple de détente et résonance de bande moyenne
Régulation de courant parfaite Un pont qui réduit thermiquement quand la limite est trop haute
Rien ne chauffe jamais 8 W par moteur, en continu, dès qu’il est alimenté

La différence la plus importante est la dernière dans un autre sens : une vraie machine ne vous donne aucun tracé du bas. Vous ne pouvez pas voir l’angle de retard, donc vous ne pouvez pas voir la marge sur laquelle vous fonctionnez. Le substitut pratique est de trouver volontairement le point d’échec — augmentez vitesse et accélération jusqu’à ce que l’axe saute, puis reculez de 30 à 50 pour cent et restez-y.

Partez de la procédure de câblage et de limite de courant, étalonnez les pas par millimètre contre une règle, et assemblez le tout dans le montage de table traçante.

Code source

La rampe n’est pas optionnelle sur une vraie machine. La version bloquante ci-dessous est à quoi ressemblent la plupart des premiers croquis, et c’est celle qui bourdonne :

// What not to ship: the step rate jumps from zero to full.
void moveBlocking(long steps, unsigned delayUs) {
  for (long i = 0; i < steps; i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(2);
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(delayUs);      // constant => no acceleration at all
  }
}

La version rampée et non bloquante. C’est le même trapèze que le labo planifie, généré un pas à la fois pour que rien d’autre sur le microcontrôleur ne cale :

#include <AccelStepper.h>

const float STEPS_PER_MM = 80.0;          // 20T GT2 pulley at 1/16 stepping
AccelStepper axis(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  pinMode(EN_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);              // active low: energise

  axis.setMaxSpeed(200 * STEPS_PER_MM);   // 200 mm/s
  axis.setAcceleration(2000 * STEPS_PER_MM);
}

void loop() {
  if (axis.distanceToGo() == 0) {
    axis.moveTo(axis.currentPosition() == 0 ? lround(60 * STEPS_PER_MM) : 0);
  }
  axis.run();                             // returns immediately — call it constantly
  checkEndstops();                        // which is only possible because it does
}

setMaxSpeed et setAcceleration vous donnent un profil trapézoïdal et rien d’autre — il n’y a pas d’option de courbe en S dans AccelStepper. Pour un profil à secousse limitée, vous générez la consigne vous-même et la transmettez à moveTo sur une horloge.

Si vous voulez savoir si votre propre machine est près du bord, le test bon marché est un test de répétabilité :

// Drive a long move out and back, N times, then check whether home moved.
// Anything other than a multiple of four full steps is not step loss.
for (int i = 0; i < 20; i++) { moveTo(LONG_MOVE); runToPosition(); moveTo(0); runToPosition(); }
// now re-home and compare the reported position against zero

Hypothèses et différences avec le matériel

La dynamique du rotor est honnête : un couple proportionnel à sin(δ) est le fonctionnement d’un pas à pas hybride, et le comportement de glissement est une conséquence de son intégration plutôt qu’une règle écrite dans le code. Les constantes décrivent un NEMA 17 de classe 17HS4401 — 1,8°, 1,7 A, 2,8 Ω, 3,2 mH, 0,44 N·m de maintien, avec un chariot de 300 g réfléchi sur l’arbre.

Ce que le modèle simplifie : l’enroulement est réduit à une impédance en régime permanent et un terme de force contre-électromotrice plutôt que simulé phase par phase, donc l’extrême queue de la courbe de couple est pessimiste. Le couple de détente — le petit crantage senti en tournant à la main un pas à pas non alimenté — n’est pas modélisé, ni la résonance de bande moyenne, ni le comportement en mode de décroissance du pont, ni aucun effet thermique. La temporisation est idéale, donc la gigue de pas d’un vrai microcontrôleur n’apparaît pas.

Rien de tout cela ne change quel bouton tourner. Tout cela est une raison de vérifier une vraie machine plutôt que de faire confiance à un nombre de cette page.

Schéma de câblage

Le montage physique modélisé ici, ce sont quatre fils du moteur au pont, deux fils du pont au microcontrôleur, et un condensateur que l’on oublie sans arrêt :

Arduino 5V  ──── VDD
Arduino GND ──── GND (logic) ──┬── GND (motor) ──── PSU −
PSU + (12–24 V) ──── VMOT ──┬──┴── 100 µF electrolytic, close to the board
Pin 3 ──── STEP             RESET ──┬── SLEEP
Pin 4 ──── DIR              MS1, MS2, MS3 ──── 5 V   (1/16)
Pin 5 ──── ENABLE (active low)
Coil A ──── 1A, 1B          Coil B ──── 2A, 2B

La page du composant A4988 contient le brochage complet, la table Vref pour les deux variantes de résistances de mesure, et la raison pour laquelle ce condensateur n’est pas optionnel.

Liste de vérification du matériel

Composants

  • Un pas à pas bipolaire — le type 1,8°, 200 pas entiers
  • Un pont à régulation de courant avec une limite ajustable
  • Une alimentation moteur de 12 V ou plus, et le réflexe de la mesurer
  • Un axe à courroie ou vis, car les pas/mm sont la moitié de la réponse

Explorer le graphe

Où ce simulateur est utilisé

Les projets, parcours d'apprentissage et tutoriels qui s'appuient sur ce labo.

Continuer la construction

Ressources à télécharger

Utilisez ces références sur la page pendant que vous avancez dans le projet. Les archives de projet téléchargeables ne seront ajoutées qu'une fois leur source et leur version publiées.

Questions courantes

Questions fréquentes

Pourquoi mon moteur pas à pas perd-il des pas ?

Parce que le rotor a pris trop de retard sur le champ commandé. Dans les 90 degrés électriques — un pas entier — le moteur se remet en ligne tout seul, donc c'est là que toute charge permanente doit se tenir. Au-delà de 90, le couple disponible diminue à mesure qu'il prend du retard, et à 180 il s'est inversé et tire vers le pôle suivant à la place, donc le rotor glisse jusqu'au point stable suivant à tout un cycle électrique de distance. Trois choses le poussent au-delà de cette limite : une charge plus grande que le couple disponible, une accélération assez raide pour que mettre le rotor en mouvement coûte plus de couple qu'il n'en reste, et la vitesse, car le couple disponible chute à mesure que le moteur tourne plus vite. Le labo permet de déclencher chacune séparément.

Pourquoi perd-il exactement quatre pas à la fois ?

Parce que le motif magnétique se répète tous les quatre pas entiers. Quand le rotor décroche, il ne s'arrête pas à un angle arbitraire — il glisse jusqu'à s'accrocher à la dent stable suivante, qui est à tout un cycle électrique de distance, et un cycle électrique vaut 360 degrés électriques, soit quatre pas entiers. Le labo n'impose jamais cela ; il intègre la loi de couple en sinus et le compte de pas perdus ressort toujours multiple de quatre tout seul. Si votre machine est un jour décalée d'un nombre qui n'est pas un multiple de quatre pas entiers, la cause n'est pas la perte de pas.

Les micro-pas rendent-ils ma machine plus précise ?

Ils la rendent plus douce, pas plus précise. Faites passer le sélecteur de micro-pas de 1/1 à 1/16 à charge fixe et regardez les deux nombres séparément : l'écart au parcours commandé chute d'environ trois fois, car vous avez cessé de secouer le rotor de 90 degrés électriques à la fois et il a cessé de vibrer. L'erreur permanente causée par la charge ne bouge pas du tout — elle est de 0,044 mm en pas entiers et de 0,044 mm en seizièmes de pas. Diviser le pas a rendu cette erreur plus grande en unités de pas ; cela n'a rien changé à l'erreur.

Dois-je augmenter la tension ou le courant pour corriger un décrochage ?

Cela dépend où il décroche, et le labo rend la différence évidente. Sous la vitesse de coude, le pont maintient la limite de courant que vous avez réglée, donc le couple est fixé par le courant — augmentez la limite. Au-dessus de la vitesse de coude, le pont ne peut plus pousser le courant réglé dans l'enroulement contre la réactance et la force contre-électromotrice, donc le couple est fixé par la tension d'alimentation et augmenter la limite de courant ne change rien sauf la chaleur dégagée. Chargez le préréglage 12 V et regardez le même mouvement qui échoue à 12 V passer à 24 V sans toucher au courant.

Pourquoi le même mouvement passe-t-il avec une rampe et échoue-t-il sans ?

Parce que monter le rotor en vitesse prend du couple, et à l'instant où commence un mouvement le rotor est au repos pendant que le champ commandé sprinte déjà. Basculez la commande de fréquence de pas sur straight to full speed avec tout le reste inchangé et le retard dépasse 90 degrés en environ une milliseconde et c'est fini à trois : le pont compte tout le mouvement de 60 mm pendant que l'axe atteint 4 mm. Cette limite est la fréquence d'accrochage, la fréquence de pas la plus élevée commandable depuis l'arrêt, et une rampe d'accélération est ce qui vous maintient en dessous.

Est-ce ce que fait un vrai moteur ?

La dynamique du rotor est exacte — un couple proportionnel au sinus de l'angle de retard est le fonctionnement réel d'un pas à pas hybride, et le comportement de glissement suit en l'intégrant. Le modèle d'enroulement est une approximation globale en régime permanent d'un pont à découpage plutôt qu'une simulation phase par phase, donc il reproduit l'allure d'une courbe de couple de fiche technique et donne les bonnes réponses d'ingénierie, mais il reste conservateur dans la queue. Utilisez-le pour construire l'intuition et voir quel bouton compte ; utilisez une vraie courbe de couple quand vous dimensionnez une machine.

Pour aller plus loin

Références

Des sources faisant autorité pour aller plus loin que le modèle pédagogique, borné, de ce simulateur.