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:
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 DRV8825Erstellt 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 boolWeist 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
| Typ | Name | Beschreibung |
|---|---|---|
int | DIR | GPIO-Nummer für den Richtungs-Pin. |
int | STEP | GPIO-Nummer für den Schritt-Pin. |
int | EN | GPIO-Nummer für den Freigabe-Pin. Optional, Standardwert ist None. |
int | RST | GPIO-Nummer für den Reset-Pin. Optional, Standardwert ist None. |
int | SLP | GPIO-Nummer für den Sleep-Pin. Optional, Standardwert ist None. |
setStepsPerRotation(steps)returns NoneGibt 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
| Typ | Name | Beschreibung |
|---|---|---|
int | steps | Schritte pro voller Umdrehung. |
setStepPulseLength(length)returns NoneLegt 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
| Typ | Name | Beschreibung |
|---|---|---|
int | length | Impulslänge in Mikrosekunden. |
setDirection(direction)returns boolLegt 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
| Typ | Name | Beschreibung |
|---|---|---|
int | direction | DRV8825.CLOCK_WISE (1) oder DRV8825.COUNTER_CLOCK_WISE (0). |
enable()returns boolAktiviert 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 NoneBewegt 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 intDie 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 intSetzt 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
| Typ | Name | Beschreibung |
|---|---|---|
int | s | Neuer 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.