Zum Hauptinhalt springen

Die Schrittfrequenz hoch- und herunterfahren

Was dieses Beispiel zeigt​

Der Motor beschleunigt und verlangsamt sich anschließend wieder. Das Modul verfügt über keine integrierte Beschleunigungskurve, daher wird im Beispiel auf einfache Weise eine erstellt: Die Verzögerung zwischen den Schritten wird bei jedem Durchlauf ein wenig verkürzt und anschließend wieder verlängert.

Hier werden nur DIR und STEP verwendet. ENABLE, RESET und SLEEP werden in begin() weggelassen, daher müssen RESET und SLEEP in der Hardware auf High gesetzt werden, damit dieser Sketch ausgeführt werden kann: Beide verfügen über interne Pull-Down-Widerstände und würden den Treiber andernfalls im Reset- und Schlafmodus halten.

Die im Beispiel verwendeten Pin-Nummern, GPIO4 für DIR und GPIO5 für STEP, sind beide auf dem NULA DeepSleep ESP32-S3 herausgeführt, sodass dieser Code unverändert läuft.

Der Beispielcode​

from drv8825 import DRV8825 # Import the DRV8825 motor driver module
from time import sleep # Import sleep function for timing delays

# Define GPIO pins for motor control
DIR_PIN = 4 # GPIO pin used for direction control
STEP_PIN = 5 # GPIO pin used for step pulses

# Create a DRV8825 motor instance
motor = DRV8825()

# Initialize the motor with the specified DIR and STEP pins
motor.begin(DIR=DIR_PIN, STEP=STEP_PIN)

# Set the number of steps the motor takes per full rotation (usually 200 for a 1.8° stepper motor)
motor.setStepsPerRotation(200)

# Set the length of each step pulse in microseconds
motor.setStepPulseLength(1000)

# Set motor rotation direction to clockwise
motor.setDirection(DRV8825.CLOCK_WISE)

# Enable the motor driver (turns on output)
motor.enable()

print("Accelerating")

# Gradually increase the step frequency (i.e., speed up the motor)
accelerationFactor = 1
while accelerationFactor < 2000:
motor.step() # Send a single step pulse to the motor
sleep(
1 / accelerationFactor
) # Delay inversely proportional to the factor (higher = faster)
accelerationFactor += 1 # Increase acceleration factor
print(accelerationFactor) # Print current acceleration factor

# Gradually decrease the step frequency (i.e., slow down the motor)
while accelerationFactor > 1:
motor.step() # Send a single step pulse
sleep(1 / accelerationFactor) # Delay increases as acceleration factor decreases
accelerationFactor -= 1 # Decrease acceleration factor
print(accelerationFactor) # Print current acceleration factor

Erwartetes Ergebnis:

ShellMicroPython
Accelerating
2
3
4
...
2000
1999
1998
...
2

Der Zähler wird im Beispiel bei jedem Schritt ausgegeben, sodass der Verlauf exakt ist: Er steigt von 2 auf 2000 an und zählt dann wieder bis 2 zurück.

Der Motor startet fast aus dem Stillstand und beschleunigt. Der erste Schritt wartet eine volle Sekunde, und das Tempo nimmt danach schnell zu, sodass der größte Teil der Laufzeit auf die ersten paar Schritte entfällt. Rechnen Sie damit, dass der gesamte Hochlauf mehrere Sekunden dauert und nicht nur einen Augenblick.

Dieses Beispiel ruft enable() auf, übergibt jedoch niemals einen Enable-Pin an begin(), sodass dieser Aufruf False zurückgibt und nichts bewirkt. Das spielt hier keine Rolle: Der ENABLE-Eingang des Treibers ist aktiv-niedrig mit einem internen Pulldown, sodass ein nicht verdrahteter Pin auf Low-Pegel bleibt, und die Ausgänge werden trotzdem freigegeben.

Verwendete Funktionen​

DRV8825()returns DRV8825

Erstellt das Treiberobjekt. Es nimmt selbst keine Konfiguration vor; jeder Pin wird durch die Funktion „begin()“ eingerichtet.

ReturnsEine neue Treiberinstanz, der noch keine Pins zugewiesen sind.

Parameter

Dieser Konstruktor nimmt keine Parameter entgegen.

begin(DIR, STEP, EN=None, RST=None, SLP=None)returns bool

Weist die Steuerpins zu und konfiguriert sie als Ausgänge. Wird hier nur mit DIR und STEP aufgerufen, wodurch EN, RST und SLP nicht verwaltet werden. RESET und SLEEP müssen dann hardwaremäßig auf High gehalten werden.

ReturnsGilt, sobald die Pins konfiguriert sind.

Parameter

TypNameBeschreibung
intDIRGPIO-Nummer für den Richtungs-Pin.
intSTEPGPIO-Nummer für den Schritt-Pin.
intENGPIO-Nummer für den Freigabe-Pin. Optional, Standardwert ist None.
intRSTGPIO-Nummer für den Reset-Pin. Optional, Standardwert ist None.
intSLPGPIO-Nummer für den Sleep-Pin. Optional, Standardwert ist None.
setStepsPerRotation(steps)returns None

Gibt dem Modul an, wie viele Schritte eine vollständige Umdrehung ausmachen, damit es die Position innerhalb einer Umdrehung verfolgen kann. Ein 1,8-Grad-Motor benötigt bei Vollschrittbetrieb 200 Schritte. Dies hat keinen Einfluss darauf, wie der Motor angesteuert wird.

ReturnsNichts.

Parameter

TypNameBeschreibung
intstepsSchritte pro voller Umdrehung.
setStepPulseLength(length)returns None

Legt fest, wie lange der STEP-Pin innerhalb jedes step()-Aufrufs auf High und anschließend auf Low gehalten wird (in Mikrosekunden). Dies ist die Untergrenze für die Schrittgeschwindigkeit des Motors: Bei 1000 Mikrosekunden dauert jeder step()-Aufruf für sich genommen mindestens 2 ms, noch bevor Sie eine zusätzliche Verzögerung hinzufügen.

ReturnsNichts.

Parameter

TypNameBeschreibung
intlengthImpulslänge in Mikrosekunden.
setDirection(direction)returns bool

Legt den Richtungs-Pin fest. Verwenden Sie die Klassenkonstanten DRV8825.CLOCK_WISE und DRV8825.COUNTER_CLOCK_WISE anstelle von reinen Zahlen. Jeder andere Wert wird abgelehnt und der Pin bleibt unverändert. Die Namen der Konstanten beschreiben den DIR-Pegel, nicht eine garantierte Drehrichtung der Welle, die sich nach der Verdrahtung Ihrer Spule richtet.

ReturnsWahr, wenn die Richtung gültig war, andernfalls Falsch.

Parameter

TypNameBeschreibung
intdirectionDRV8825.CLOCK_WISE (1) oder DRV8825.COUNTER_CLOCK_WISE (0).
enable()returns bool

Aktiviert die Treiberausgänge, indem der ENABLE-Pin auf Low gesetzt wird. Gibt „False“ zurück, wenn bei der Funktion „begin()“ kein Enable-Pin übergeben wurde.

ReturnsWahr, wenn der Pin angesteuert wurde; Falsch, wenn kein Freigabepin konfiguriert ist.

Parameter

Diese Funktion benötigt keine Parameter.

step()returns None

Bewegt den Motor um einen Schritt weiter: STEP-Impulse werden zunächst auf „High“ und dann auf „Low“ gesetzt, wobei bei jedem Pegel die konfigurierte Impulsdauer abgewartet wird. Durch den Aufruf in einer Schleife mit abnehmender Verzögerung entsteht die Rampe.

ReturnsNichts.

Parameter

Diese Funktion nimmt keine Parameter entgegen.

getSteps()returns int

Die Anzahl der Schritte seit dem letzten Zurücksetzen des Zählers. Nützlich, um zu überprüfen, wie weit eine Rampe tatsächlich gekommen ist.

ReturnsGesamtzahl der gezählten Schritte.

Parameter

Diese Funktion nimmt keine Parameter entgegen.

resetSteps(s=0)returns int

Setzt den Schrittzähler zurück und stellt den vorherigen Stand wieder her, sodass Sie eine Bewegung messen können, ohne die bisherige Gesamtzahl zu verlieren.

ReturnsDie Schrittzahl, wie sie vor dem Zurücksetzen war.

Parameter

TypNameBeschreibung
intsNeuer Wert für den Zähler. Optional, Standardwert ist 0.

Zusammenfassung​

sleep(1 / accelerationFactor) bildet die gesamte Beschleunigungskurve. Zu Beginn beträgt der Faktor 1, sodass der Motor zwischen den Schritten eine volle Sekunde wartet. Am Ende beträgt er 2000 und die Wartezeit beträgt eine halbe Millisekunde.

Zu diesem Zeitpunkt bestimmt die Verzögerung nicht mehr die Geschwindigkeit. setStepPulseLength(1000) hält STEP innerhalb jedes step()-Aufruf „STEP“ 1 ms lang auf „High“ und 1 ms lang auf „Low“ gesetzt, sodass ein Schritt, egal wie kurz die Wartezeit wird, nicht weniger als etwa 2 ms dauern kann. Die letzten paar hundert Iterationen der Beschleunigungsphase unterscheiden sich kaum voneinander. Wenn du möchtest, dass das obere Ende tatsächlich schnell ist, verkürze sowohl die Impulslänge als auch die Verzögerung.

Das Hochfahren ist bei Schrittmotoren wichtig. Wenn man einen belasteten Motor auffordert, direkt auf volle Drehzahl zu springen, überspringt er Schritte, und übersprungene Schritte bedeuten, dass die Position, an der man glaubt zu sein, nicht die tatsächliche Position ist. Ein langsamer Start mit anschließender Beschleunigung verhindert dies.

Wenn Sie wissen möchten, wie weit sich der Motor bewegt hat, rufen Sie vor dem Anfahren resetSteps() und danach getSteps() auf.