Tutorial · Einsteiger · 30 Min.

A4988-Verdrahtung und Vref: Stromgrenze einstellen

A4988 mit Arduino und NEMA 17 verdrahten und die Stromgrenze mit dem Multimeter einstellen. Vref-Formel, Sense-Widerstand-Falle und der Preis des Weglassens.

Wozu der Treiber wirklich da ist

Ein A4988 ist kein Schalter. Er ist ein Stromregler, der zufällig schaltet.

Diese Unterscheidung zählt, weil eine Schrittmotorwicklung eine niederohmige Induktivität ist – 2 bis 4 Ohm sind typisch. Schließe eine 2,8-Ω-Wicklung direkt an 24 V an, sagt das Ohmsche Gesetz 8,6 A, was den Motor in Sekunden zerstören würde. Die Aufgabe des Treibers ist, die Versorgung tausendfach pro Sekunde zu zerhacken, sodass sich der mittlere Strom auf einen von dir gewählten Wert einpendelt, und diesen Strom dann zwischen den zwei Spulen in dem Muster umzuschalten, das das Feld rotieren lässt.

Der Treiber braucht also eine Zahl: wie viel Strom pro Phase. Das ist die Stromgrenze, und sie einzustellen ist die einzige Justierung auf der Platine. Alles andere – Mikroschritte, Richtung, Enable – ist ein Pin, den du einmal setzt.

Eine A4988-Trägerplatine von oben mit je acht vergoldeten Pads pro Seite. Die linke Pad-Spalte lautet ENABLE, MS1, MS2, MS3, RESET, SLEEP, STEP und DIR, wobei STEP und DIR hervorgehoben sind. Die rechte Spalte lautet VMOT, GND, 2B, 2A, 1A, 1B, VDD und GND, wobei VMOT rot hervorgehoben ist. Ein Trimm-Potentiometer oben ist als VREF-Trimmpoti zum Messen beschriftet, und ein Kühlkörper mit Rippen bedeckt den Treiberchip. Zwei kleine Sense-Widerstände unten auf der Platine sind als R100 gleich 0,1 Ohm oder R050 gleich 0,05 Ohm markiert, mit Warnhinweis, den eigenen abzulesen, bevor man irgendetwas rechnet.
Sechzehn Pads, ein Trimmpoti und zwei winzige Widerstände, die die Rechnung ändern. STEP und DIR sind die einzigen zwei Pins, die dein Sketch zur Laufzeit anfasst; alles andere ist Konfiguration. SVG herunterladen

Verdrahtung

A4988-Pin Geht an Hinweis
VMOT 8–35-V-Motorversorgung Nicht die 5 V des Arduino. Niemals.
GND (neben VMOT) Masse der Motorversorgung Die Hochstrom-Rückleitung
VDD Arduino 5 V Logikversorgung, wenige Milliampere
GND (neben VDD) Arduino GND Muss Masse mit der Motorversorgung teilen
1A, 1B Eine Motorspule Polung egal – sie dreht nur die Richtung um
2A, 2B Die andere Motorspule Falsche Paarung ist der fatale Fehler
STEP Beliebiger Arduino-Ausgang Ein Puls, ein Mikroschritt
DIR Beliebiger Arduino-Ausgang High oder Low wählt die Richtung
ENABLE GND oder Arduino-Pin Active-Low: auf Low legen zum Bestromen
RESET, SLEEP Miteinander verbunden Beide müssen High sein; sie zu brücken erledigt das
MS1, MS2, MS3 Siehe Tabelle unten Offen bedeutet Vollschritt

Zwei Verdrahtungsregeln tragen fast das ganze Risiko:

  • Ein 100-µF-Elko über VMOT und GND, nah an der Platine. Nicht optional. Datenblatt und jede Trägerdokumentation sagen es, und der Grund ist, dass der Zerhacker Strom in scharfen Bursts zieht; ohne großzügige Kapazität in der Nähe verwandelt die Induktivität der Zuleitungen diese Bursts in Spannungsspitzen über den 35-V-Nennwert des Chips. Platinen sterben beim Einschalten, nicht im Betrieb, und meist darum.
  • Niemals den Motor abziehen, solange der Treiber versorgt ist. Das Unterbrechen einer bestromten Spule erzeugt einen großen induktiven Kick ohne Ziel. Jedes Mal erst spannungslos schalten.

Sind die vier Motordrähte nicht beschriftet, finde die Paare mit dem Multimeter: Innerhalb einer Spule misst du wenige Ohm, zwischen Spulen misst du offene Leitung. Paare sie per Durchgang, dann ein Paar an 1A/1B und das andere an 2A/2B.

Die Stromgrenze einstellen

Auf der Platine sitzt ein Poti, und Drehen daran ändert eine Referenzspannung, die der Chip mit der Spannung über seinen Sense-Widerständen vergleicht. Du misst diese Referenz – Vref – zwischen Potischleifer und Masse.

Die Formel beim A4988 lautet:

Vref = I_phase × R_sense × 8

Hier sitzt die Falle, die Leute Motoren kostet. R_sense ist nicht auf jeder Platine gleich. Trägerplatinen kommen entweder mit 0,1-Ω- oder 0,05-Ω-Sense-Widerständen, und das Formelergebnis unterscheidet sich um Faktor zwei:

Sense-Widerstand Aufdruck auf der Platine Vref für 1,0 A Vref für 1,2 A Vref für 1,5 A
0,1 Ω R100 0,80 V 0,96 V 1,20 V
0,05 Ω R050 0,40 V 0,48 V 0,60 V
0,068 Ω R068 0,54 V 0,65 V 0,82 V

Lies die Markierung auf den zwei schwarzen SMD-Widerständen unten auf der Platine, bevor du irgendetwas rechnest. Stelle 1,2 V auf einer Platine mit 0,05-Ω-Widerständen ein, und du hast gerade 3 A durch einen 1,7-A-Motor verlangt.

Die Vorgehensweise:

  1. Versorge die Platine – VMOT angeschlossen, Motor abgeklemmt. Der Chip braucht Motorspannung zum Regeln, aber der Motor muss sich nicht drehen.
  2. Schlage den Phasennennstrom des Motors nach. Ein gängiger NEMA 17 hat 1,5 A oder 1,7 A.
  3. Nimm 70–85 % davon als Ziel. Der Nennstrom setzt Datenblatt-Kühlung voraus, die du nicht hast, und die letzten 20 % Strom kaufen sehr wenig Drehmoment bei viel Wärme.
  4. Berechne Vref aus der Formel und dem Sense-Widerstand, den du wirklich hast.
  5. Lege die schwarze Messspitze auf einen Massepin und die rote Spitze auf die Metallschraube des Potis. Drehe langsam – eine Vierteldrehung ist eine große Änderung –, bis das Messgerät deine Zahl zeigt.

Ein kleiner Keramikschraubendreher lohnt sich. Ein metallener, der das Poti mit etwas anderem brückt, solange die Platine lebt, ist ein gängiger Weg, einen Treiber zu zerstören.

Klar ausgesprochen: Die Stromgrenze ist das T_peak in der Drehmomentgleichung, die alles am Schrittmotor regiert. Stelle sie niedrig ein, hinkt der Motor bei gleicher Last weiter hinterher und verliert früher Schritte. Stelle sie hoch ein, läuft der Motor heiß für Drehmoment, das er vielleicht nicht braucht. Es ist die eine Zahl, bei der du bewusst vorgehen solltest.

Mikroschritt-Pins

MS1, MS2 und MS3 haben interne Pull-downs, alles Offenbleibende liest sich also als Low:

MS1 MS2 MS3 Auflösung Schritte pro Umdrehung
Low Low Low Vollschritt 200
High Low Low Halbschritt 400
Low High Low Viertelschritt 800
High High Low Achtelschritt 1600
High High High Sechzehntelschritt 3200

Die meisten Aufbauten brücken alle drei auf High und lassen sie dort. Der Grund ist nicht Genauigkeit – Mikroschritte kaufen unter Last keine Genauigkeit –, sondern dass Sechzehntelschritte das Nachschwingen des Motors bei jedem Schritt stoppen, was die Maschine leise macht und verhindert, dass sich die Welligkeit im Werkstück zeigt. Der Preis: Dein Mikrocontroller muss nun sechzehnmal so viele Pulse pro Millimeter liefern, was auf einem Arduino Uno oberhalb von rund 10 000 Schritten pro Sekunde eine echte Grenze ist.

Ansteuerung

Der minimale nützliche Sketch. Beachte, dass hier keine Bibliothek steckt: Ein Schritt ist ein Puls, und das ist wirklich alles.

const int STEP_PIN = 3;
const int DIR_PIN  = 4;
const int EN_PIN   = 5;   // active LOW

void setup() {
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(EN_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);      // energise the coils
  digitalWrite(DIR_PIN, HIGH);
}

void loop() {
  // One revolution at 1/16 stepping = 3200 pulses.
  for (int i = 0; i < 3200; i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(2);         // datasheet minimum is 1 us
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(300);       // this delay IS the speed
  }
  delay(1000);
}

Dieser Code funktioniert, und er ist zugleich genau das, was du nicht ausliefern solltest – aus zwei Gründen.

Der erste: Die Schrittrate springt sofort von null auf voll. Fordere eine Rate über der Anfahrgrenze des Motors, brummt er nur und geht nirgendwohin – mit den Defaults im Schrittmotor-Simulator verliert das Kommando voller Drehzahl aus dem Stand 280 Vollschritte auf einer 60-mm-Fahrt und lässt die Achse bei 4 mm stehen. Dieselbe Fahrt mit Rampe landet exakt auf Ziel. Das ist der Unterschied, den ein Beschleunigungsprofil macht, und es ist keine Verfeinerung.

Der zweite: delayMicroseconds blockiert. Während die Schleife schrittet, läuft nichts anderes auf dem Mikrocontroller – keine Endschalterprüfung, kein Serielles, keine zweite Achse. Für alles Echte nutze das nicht blockierende Zeitmuster oder übergib an AccelStepper, das Rampe und Zeitplanung für dich übernimmt:

#include <AccelStepper.h>
AccelStepper axis(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  pinMode(EN_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);
  axis.setMaxSpeed(8000);        // steps/s  -> 100 mm/s at 80 steps/mm
  axis.setAcceleration(16000);   // steps/s2 -> 200 mm/s2
  axis.moveTo(80 * 50);          // 50 mm
}

void loop() {
  axis.run();                    // returns immediately; call it constantly
}

setMaxSpeed und setAcceleration geben dir ein Trapezprofil und sonst nichts – es gibt keine S-Kurven-Option. Willst du ein ruckbegrenztes Profil, erzeugst du den Sollwert selbst.

A4988 oder eine der Alternativen?

Treiber Strom Mikroschritte Geräusch Nimm ihn, wenn
A4988 1 A nackt, ca. 1,5 A gekühlt bis 1/16 Hörbar Billig, überall, gut dokumentiert
DRV8825 1,5 A nackt, ca. 2,2 A gekühlt bis 1/32 Hörbar Du mehr Strom oder feinere Schritte brauchst
TMC2208 ca. 1,2 A bis 1/256 Fast lautlos Geräusch zählt; darum sind Drucker umgestiegen
TMC2209 ca. 1,7 A bis 1/256 Fast lautlos Wie oben, plus sensorloses Referenzieren
ULN2003 + 28BYJ-48 ca. 0,3 A Halbschritt Brummig Eine Spielzeug-Demo, keine Maschine

Der DRV8825 ist pinkompatibel, aber seine Vref-Formel ist anders – Vref = I × 0,5 – und sein Poti dreht andersherum. Einen einzusetzen, ohne die Formel neu zu lesen, ist ein klassischer Weg, einen Motor zu garen.

Die TMC-Treiber sind das Geld wert, sobald eine Maschine dort lebt, wo man sie hören kann. Sie leisten dieselbe Arbeit mit glatterer Stromkurve, weshalb ein Drucker mit ihnen Lüftergeräusche statt Motorgeräusche macht.

Wenn es schiefgeht

Symptom Ursache Lösung
Motor vibriert, dreht aber nicht Spulenpaare falsch verdrahtet Paare per Durchgang finden und neu verdrahten
Gar nichts passiert ENABLE offen oder High, oder RESET/SLEEP Low ENABLE auf Low legen; RESET mit SLEEP brücken
Treiber wird zu heiß zum Anfassen, schaltet dann ab Stromgrenze zu hoch Vref neu messen; Kühlkörper und Luftstrom ergänzen
Motor ist heiß, Treiber aber in Ordnung Normal 60–80 °C am Gehäuse sind zu erwarten
Schrittverlust nur bei schnellen Fahrten Versorgungsspannung zu niedrig für diese Drehzahl VMOT erhöhen – mehr Strom hilft nicht
Schrittverlust bei harten Beschleunigungen Rampe zu aggressiv oder Strom zu niedrig Beschleunigung senken oder Vref Richtung Nennwert heben
Platine starb beim Einschalten Fehlender Stützkondensator an VMOT 100-µF-Elko, nah an den Pins
Motor hält Position, läuft aber rau Vollschrittbetrieb MS1–MS3 auf High brücken für 1/16
Widerstand liest offen über einem „Paar“ Diese zwei Drähte stammen aus verschiedenen Spulen Neu paaren

Weiter

Mit eingestelltem Treiber bleibt die Frage, wie viele Pulse ein Millimeter Weg wert ist – was ganz davon abhängt, was die Welle dreht. Das sind Schritte pro Millimeter, und es ist die Zahl, gegen die jeder andere Teil der Maschine kalibriert wird.

Den Graphen erkunden

Teil dieser Bauprojekte

Projekte und Lernpfade, die dieses Tutorial enthalten.

Weiterführende Literatur

Quellen