Interaktiver SimulatorMittelstufe

Schrittmotor-Simulator: Schrittverlust und Lagewinkel

Sieh zu, wie ein Rotor dem kommandierten Feld hinterherhängt, schiebe ihn über 90 elektrische Grad und erlebe, wie eine Maschine lautlos Position verliert.

Kategorie
Eingebettete Systeme
Zeitaufwand
20–40 Min.
Plattform
Browser · Arduino · ESP32
Technisches Schema: Schrittmotor-Simulator: Schrittverlust und LagewinkelFIELDROTORCARRIAGE80 STEPS/MM · 1.8° · 1/16LAG ANGLE DECIDES WHETHER IT ARRIVES

01 / Hier starten

Einführung

Ein Schrittmotor macht keine Schritte — er schleppt einen Rotor hinter einem rotierenden Magnetfeld her, und der Winkel dazwischen entscheidet, ob der Hub landet. Dieses Labor integriert die Bewegungsgleichung dieses Rotors direkt: Nichts darin sucht Schrittverlust — läuft der Lagewinkel über die 90-Grad-Kippgrenze weg, fällt der Motor von selbst aus dem Tritt, genau wie auf der Werkbank.

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.

Steuerung

Das Labor fährt den ganzen Hub bei jeder Eingabe neu — die Spuren folgen dem Schieber beim Ziehen statt auf Start zu warten. Es gibt nichts zu starten — der Hub sind 30 000 Integrationsschritte und endet, bevor sich dein Finger bewegt.

Steuerung Was sie ändert
Voreinstellung Fünf durchgerechnete Fälle, vom sauberen Hub bis vier Arten des Scheiterns
Schrittrate Trapezförmige Beschleunigungsrampe oder Schrittrate sofort auf voll
Distanz / Spitze / Beschleunigung Der Hub, den du verlangst
Versorgungsspannung Was der Treiber hat, um Strom in die Wicklung zu drücken
Stromgrenze Was du per Trimmer setzt — das ist das Spitzenmoment
Mikroschritt Wie fein das Feld geteilt ist, 1/1 bis 1/16
Mechanik GT2-Riemen (40 mm/U) oder T8-Spindel (8 mm/U)
Widerstandsmoment Reibung und Last an der Motorwelle

Das obere Diagramm ist Position: Die gestrichelte Linie ist, wo der Treiber die Achse wähnt, die durchgezogene wo der Rotor wirklich ist. Das untere Diagramm ist der Lagewinkel dazwischen mit schattiertem stabilem ±90°-Band.

Theorie

Ein Schrittmotor macht keine Schritte. Der Treiber dreht ein Magnetfeld in Inkrementen, und der Rotor folgt ihm, immer etwas hinterherhängend — und das Moment, das er erzeugt, ist der Sinus dieses Winkels:

T = T_peak(ω) × sin(δ)

δ misst in elektrischen Graden. Ein 1,8°-Motor hat 50 Rotorzähne, seine Magnetik wiederholt sich also 50-mal pro Umdrehung, und ein Vollschritt sind exakt 90 elektrische Grad. Diese Umrechnung ist die einzige Arithmetik im ganzen Thema.

Zwischen −90° und +90° ist der Motor eine Feder: Weiter zurückfallen, härter zurückgezogen werden. Dieser stabile Bereich ist, warum ein ungeregelter Schrittmotor überhaupt funktioniert — dort muss jede Dauerlast sitzen. Jenseits 90° kippt der Sinus um: Weiteres Zurückfallen erzeugt weniger Rückstellmoment, was weiteres Zurückfallen macht — und bei 180° kehrt sich das Moment glatt um und zieht zum nächsten Pol. Der Rotor rutscht zum nächsten stabilen Zahn, einen elektrischen Zyklus — vier Vollschritte — entfernt.

Das sind zwei verschiedene Zahlen, und das Labor hält sie auseinander. 90° ist, wo das Gleichgewicht endet; kurzes Überschwingen darüber ist überlebbar — darum zerstört ein Vollschrittbefehl — ein 90°-Tritt, jeder Schritt — die Maschine nicht. 180° ist der Punkt ohne Wiederkehr.

Drei Dinge lassen den Lagewinkel wachsen:

  • Last. Im Beharrungslauf sin(δ) = verlangt ÷ verfügbar. Last bei halbem verfügbarem Moment sitzt bei 30° und lässt 60° Marge.
  • Beschleunigung. Den Rotor in Gang zu bringen kostet Moment aus demselben Budget — der Lagewinkel ist also auf der Rampe am schlimmsten, nicht bei Tempo.
  • Drehzahl, denn T_peak selbst fällt mit steigender Motordrehzahl.

Letzteres ist am wenigsten offensichtlich. Eine Wicklung ist eine Induktivität, und je schneller der Motor dreht, desto schwerer lässt sich Strom hinein- und herauszwingen — Reaktanz steigt mit elektrischer Frequenz, und die Gegen-EMK des drehenden Rotors frisst Versorgungsspannung. Ergebnis ist eine Momentkurve, flach bis zu einer Eckdrehzahl und fallend dahinter, und die Ecke setzt die Versorgungsspannung.

Daraus die zwei Regeln, für die das Labor existiert: Mehr Ampere kaufen Moment, mehr Volt kaufen Drehzahl.

Algorithmus

Der Rotor wird direkt integriert. Nichts in diesem Code erkennt Schrittverlust, fügt ihn ein oder weiß, dass er möglich ist — er fällt aus dem Sinusgesetz.

// 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;

Zwei Details zählen mehr, als sie aussehen.

Das Kommando wird quantisiert auf das Mikroschrittraster, bevor der Rotor es sieht. Diese Treppe ist die Anregung: Bei Vollschritt ist jedes Kommando ein 90-Elektrograd-Tritt bei sehr leicht gedämpfter Resonanz — exakt darum schreit ein vollschrittiger Motor und ein mikroschrittiger nicht.

Das Wicklungsmodell setzt die Momentdecke:

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;

Es ist eine konzentrierte Beharrungsnäherung eines zerhackenden Treibers, keine phasengenaue Simulation. Es reproduziert die Form einer echten Momentkurve und gibt beide Ingenieurantworten richtig; ganz oben läuft es konservativ.

Die kommandierte Trajektorie kommt vom vorhandenen Bewegungsprofil-Planer der Seite — „mit Rampe“ und „ohne“ sind derselbe Codepfad mit anderer Beschleunigungsgrenze, es ist kein separater Fehlermodus einprogrammiert.

Geführte Experimente

Jedes isoliert eine einzige Variable. Ändere nichts sonst.

1. Die Rampe ist die ganze Maschine. Lasse alles auf Standard und kippe Schrittrate zwischen Mit Rampe und Sofort Volltempo.

Mit Rampe Sofort Volltempo
Spitzenlage 25°e über 90° bei 1,2 ms, weg bei 3,0 ms
Verlorene Vollschritte 0 280
Wo die Achse endet 60,00 mm 4,0 mm

Gleicher Motor, gleicher Treiber, gleicher Strom, gleiches Ziel. Der einzige Unterschied ist, ob die Schrittrate gerampt wurde — und der Unterschied dazwischen ist der ganze Hub.

2. Finde die Anlauffrequenz. Setze Sofort Volltempo und hebe Spitze von 100 mm/s schrittweise. Es geht, und geht, und dann irgendwo um 200 mm/s geht es gar nicht mehr — nicht allmählich. Diese Schwelle ist die Anlauffrequenz, und sie ist eine echte Zahl an echten Motoren.

3. Volt kaufen Drehzahl. Lade die Voreinstellung 12-V-Versorgung, schnell fahren: Der Hub blockiert. Hebe nun Versorgungsspannung auf 24, und sieh ihn durchgehen, Stromgrenze unangetastet. Dann zurück auf 12 V und versuche stattdessen Stromgrenze zur Rettung — du kannst nicht. Jenseits der Eckdrehzahl erreichte der Treiber den Sollstrom nie.

4. Mikroschritt kauft keine Genauigkeit. Fixiere alles und schalte Mikroschritt von 1/1 bis 1/16, zwei Dinge lesend:

Mikroschritt Schrittweite Schlimmste Pfadabweichung Beharrungsfehler aus Last
Vollschritt 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

Die Folgegenauigkeit bessert sich etwa dreifach und stoppt dann. Der Lastfehler bewegt sich gar nicht. Er war 0,044 mm bei Vollschritt und ist 0,044 mm bei Sechzehntelschritt — der Unterschied: 0,044 mm ist ein Viertel Vollschritt und dreieinhalb Mikroschritte, feiner Mikroschritt lässt also denselben Fehler in Treibereinheiten viel schlimmer aussehen.

5. Kippen. Hebe Widerstandsmoment langsam bei mäßigem Tempo. Beobachte den Lagewinkel im unteren Diagramm zur gestrichelten Linie klettern. Er sitzt bei 30°, dann 50°, dann 70° — und dann, über ein kleines Schieberinkrement, ist der Gleichlauf weg. Es gibt keinen Warnbereich, denn jenseits 90° gibt es kein Gleichgewicht zum Einpendeln.

7. Vollschritt ist ein 90°-Tritt. Lade die Voreinstellung Vollschritt und lies die Spitzenlage: etwa 102°e. Jeder einzelne Schritt kommandiert die vollen 90°, und der Schwung des Rotors trägt ihn darüber. Er kommt dennoch an — nichts geht verloren — verbringt aber den ganzen Hub schwingend durch den Bereich, den sich ein belasteter Motor nicht leisten kann. Darum ist Vollschritt zugleich laut und lässt so wenig Lastmarge.

6. Die Mechanik ändert das Problem. Schalte Mechanik auf T8-Spindel bei sonst fixiertem allem. Auflösung geht von 80 auf 400 Schritte/mm, und dieselbe Spitze braucht nun fünffache Schrittrate.

Was du beobachten solltest

  • Versagen ist Klippe, nicht Hang. Nichts altert. Der Lagewinkel wächst glatt bis 90°, und dann ist der Hub schlicht weg. Das ist der definierende Unterschied zum servoartigen geschlossenen Kreis, der unter Last nur langsamer wird.
  • Die Maschine merkt nie etwas. Die gestrichelte Kommandolinie endet immer exakt auf Ziel, denn der Treiber zählte jeden Impuls, den er bekam. Nur die durchgezogene Linie sagt die Wahrheit, und keine echte Maschine hat diese Linie.
  • Der Lastfehler ist immer da. Selbst im perfekten Lauf hängt der Rotor dutzende Mikrometer hinterher, wo der Treiber ihn wähnt. Kein Fehler; das verlangt sin(δ) = Last ÷ Moment.
  • Verlorene Schritte sind immer ein Vielfaches von vier. Versuche, eine Zählung zu erzeugen, die es nicht ist.

Umsetzung auf Hardware

Dieses Labor Echte Achse
Ideales 50-kHz-Schritttiming Zeitgeberjitter des Mikrocontrollers und Decke nahe 10–15 kHz auf Arduino Uno
Eine starre Masse Riemendehnung, Spiel, nachgiebiger Rahmen
Konstantes Widerstandsmoment Reibung, die entlang der Achse schwankt, und Kabelschlepp
Konzentriertes Wicklungsmodell Echte Momentkurve, mit Rastmoment und Mittenbandresonanz
Perfekte Stromregelung Treiber, der thermisch drosselt, wenn die Grenze zu hoch steht
Nichts wird je heiß 8 W je Motor, dauerhaft, sobald bestromt

Der wichtigste Unterschied ist der letzte in anderem Sinn: Eine echte Maschine gibt dir kein unteres Diagramm. Du kannst den Lagewinkel nicht sehen, also nicht die Marge, auf der du fährst. Der praktische Ersatz ist, die Versagensgrenze bewusst zu suchen — Tempo und Beschleunigung heben, bis die Achse springt, dann 30 bis 50 Prozent zurück und dort leben.

Beginne mit der Verdrahtungs- und Stromgrenzen-Anleitung, kalibriere Schritte je Millimeter gegen ein Lineal und setze alles im Stiftplotter-Bau zusammen.

Quellcode

Die Rampe ist auf echter Maschine nicht optional. Die blockierende Version unten ist, wie die meisten ersten Sketche aussehen — und sie brummt:

// 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
  }
}

Die gerampte, nichtblockierende Version. Das ist dasselbe Trapez, das das Labor plant, Schritt für Schritt erzeugt, sodass nichts sonst auf dem Mikrocontroller steht:

#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 und setAcceleration geben dir ein Trapezprofil und sonst nichts — S-Kurven-Option gibt es in AccelStepper keine. Für ein ruckbegrenztes Profil erzeugst du den Sollwert selbst und fütterst ihn per Zeitgeber in moveTo.

Ob deine eigene Maschine nah an der Kante steht, zeigt billig ein Wiederholtest:

// 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

Annahmen und Unterschiede zur Hardware

Die Rotordynamik ist ehrlich: Moment proportional zu sin(δ) ist, wie ein Hybrid-Schrittmotor arbeitet, und das Schlupfverhalten folgt aus dessen Integration statt regelcodierter Regel. Die Konstanten beschreiben NEMA-17-Klasse 17HS4401 — 1,8°, 1,7 A, 2,8 Ω, 3,2 mH, 0,44 N·m Halte, mit reflektierten 300 g Schlitten auf der Welle.

Was das Modell vereinfacht: Die Wicklung ist zu Beharrungsimpedanz plus Gegen-EMK-Term konzentriert statt Phase für Phase simuliert — der ferne Auslauf der Momentkurve ist also pessimistisch. Rastmoment — das kleine Rasten, das du fühlst, wenn du einen stromlosen Schrittmotor von Hand drehst — ist nicht modelliert, noch Mittenbandresonanz, noch Treiber-Abklingverhalten, noch irgendein thermischer Effekt. Timing ist ideal, der Schritjitter eines echten Mikrocontrollers erscheint also nicht.

Nichts davon ändert, an welchem Knopf zu drehen ist. Alles sind Gründe, eine echte Maschine zu verifizieren statt einer Zahl von dieser Seite zu trauen.

Schaltplan

Der physische Aufbau, den dies modelliert, sind vier Drähte vom Motor zum Treiber, zwei Drähte vom Treiber zum Mikrocontroller und ein Kondensator, den Leute ständig weglassen:

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

Die A4988-Komponentenseite hat die volle Pinbelegung, die Vref-Tabelle für beide Sense-Widerstand-Varianten und den Grund, warum dieser Kondensator nicht optional ist.

Hardware-Checkliste

Bauteile

  • Bipolarer Schrittmotor — 1,8°, 200 Vollschritte
  • Stromregelnder Treiber mit einstellbarer Grenze
  • Motorversorgung ab 12 V — und die Vernunft, sie zu messen
  • Riemen- oder Spindelachse, denn Schritte/mm ist die halbe Antwort

Den Graphen erkunden

Wo dieser Simulator verwendet wird

Die Projekte, Lernpfade und Tutorials, die auf diesem Labor aufbauen.

Weiterbauen

Ressourcen herunterladen

Nutze diese Referenzen auf der Seite, während du das Projekt durcharbeitest. Herunterladbare Projektpakete kommen erst hinzu, wenn ihr Quellcode und ihre Version veröffentlicht sind.

Häufige Fragen

Häufig gestellte Fragen

Warum verliert mein Schrittmotor Schritte?

Weil der Rotor zu weit hinter das kommandierte Feld fiel. Innerhalb 90 elektrischer Grad — einem Vollschritt — zieht sich der Motor selbst wieder in Linie, dort muss also jede Dauerlast sitzen. Jenseits 90 sinkt das verfügbare Moment, je weiter er hinten ist, und bei 180 hat es sich umgekehrt und zieht zum nächsten Pol statt — der Rotor rutscht zum nächsten stabilen Zahn einen ganzen elektrischen Zyklus entfernt. Drei Dinge schieben ihn über diese Grenze: Last größer als das verfügbare Moment, Beschleunigung so steil, dass das Hochfahren des Rotors mehr Moment kostet als übrig ist, und Drehzahl, denn verfügbares Moment fällt mit steigender Drehzahl. Das Labor lässt dich jedes einzeln auslösen.

Warum verliert er genau vier Schritte auf einmal?

Weil sich das Magnetmuster alle vier Vollschritte wiederholt. Bricht der Rotor aus dem Tritt, stoppt er nicht in beliebigem Winkel — er rutscht, bis er sich am nächsten stabilen Zahn fängt, einen vollen elektrischen Zyklus entfernt, und ein elektrischer Zyklus sind 360 elektrische Grad, also vier Vollschritte. Das Labor erzwingt das nie; es integriert das Sinus-Momentgesetz, und die Verlustzählung kommt von selbst stets als Vielfaches von vier heraus. Liegt deine Maschine je um eine Zahl daneben, die kein Vielfaches von vier Vollschritten ist, ist die Ursache kein Schrittverlust.

Macht Mikroschritt meine Maschine genauer?

Er macht sie ruhiger, nicht genauer. Stelle den Mikroschrittwähler bei fester Last von 1/1 bis 1/16 durch und lies beide Zahlen getrennt: Die Abweichung vom kommandierten Pfad fällt etwa dreifach, weil du aufgehört hast, den Rotor 90 elektrische Grad auf einmal zu treten, und er aufgehört hat zu klingen. Der lastbedingte Beharrungsfehler bewegt sich gar nicht — 0,044 mm bei Vollschritt und 0,044 mm bei Sechzehntelschritt. Schrittteilung ließ diesen Fehler in Schritten größer aussehen; am Fehler tat sie nichts.

Soll ich Spannung oder Strom erhöhen, um Blockieren zu beheben?

Kommt darauf an, wo er blockiert — das Labor macht den Unterschied offensichtlich. Unter der Eckdrehzahl hält der Treiber die eingestellte Stromgrenze, Moment steht also per Strom — hebe die Grenze. Über der Eckdrehzahl kann der Treiber den Sollstrom gegen Reaktanz und Gegen-EMK nicht mehr in die Wicklung drücken — Moment steht per Versorgungsspannung, und Stromgrenze erhöhen ändert nichts außer heißerer Bauteile. Lade die 12-V-Voreinstellung und sieh, wie derselbe Hub, der bei 12 V scheitert, bei 24 V durchläuft, ohne Strom anzufassen.

Warum geht derselbe Hub mit Rampe und scheitert ohne?

Weil den Rotor auf Tempo zu bringen Moment kostet — und im Hubbeginn steht der Rotor, während das kommandierte Feld schon sprintet. Schalte die Schrittratensteuerung auf sofort Volltempo bei sonst unverändert allem, und der Lagewinkel ist binnen etwa einer Millisekunde über 90 Grad und bei drei weg: Der Treiber zählt den ganzen 60-mm-Hub aus, während die Achse 4 mm erreicht. Diese Grenze ist die Anlauffrequenz, die höchste Schrittrate, die du aus dem Stand kommandieren kannst — eine Beschleunigungsrampe hält dich darunter.

Ist das so, wie ein echter Motor arbeitet?

Die Rotordynamik ist exakt — Moment proportional zum Sinus des Lagewinkels ist, wie ein Hybrid-Schrittmotor wirklich arbeitet, und das Schlupfverhalten folgt aus dessen Integration. Das Wicklungsmodell ist eine konzentrierte Beharrungsnäherung eines zerhackenden Treibers statt phasengenauer Simulation — es reproduziert die Form einer Datenblatt-Momentkurve und gibt beide Ingenieurantworten richtig, läuft aber im Auslauf konservativ. Nutze es für Intuition und dafür, welcher Knopf zählt; nutze eine echte Momentkurve, wenn du eine Maschine auslegst.

Weiterführende Literatur

Quellen

Maßgebliche Quellen, um tiefer einzusteigen als das begrenzte Lernmodell dieses Simulators.