SCHRITTMOTOREN

 

Alle Programme können von hier heruntergeladen werden.


 

Wie funktionieren Schrittmotoren

 

Der Rotor eines Schrittmotors ist magnetisch und benimmt sich wie eine Kompassnadel, bei der eine Seite der Nordpol und die andere Seite der Südpol ist. Der Nordpol dreht sich in der Richtung eines Magnetfeldes H wie die Kompassnadel nach Norden im Magnetfeld der Erde.

stepper6


In einem Schrittmotor wird das Magnetfeld durch zwei rechtwinklig zueinander stehende Spulen A und B erzeugt. Der Rotor befindet sich im Zwischenraum (Spalt) der beiden Magnete und ist wie eine Magnetnadel in der Richtung des resultierenden Magnetfeldes ausgerichtet, das eine Überlagerung (Vektoraddition) der beiden Felder ist.

stepper1

Die beiden Spulen A und B sind mit ihren Mittelanschlüssen mit VCC verbunden. Da das magnetische Feldes einer Spule in Rechtsschraubenrichtung zum Strom in den Wicklungen liegt, kann das Magnetfeld durch Ziehen der einen oder der anderen Seite jeder Spule an Masse (GND) um 180 Grad gedreht werden (Strom fliesst von VCC zu GND, siehe rote Pfeile).

Um den Rotor zu drehen, wird das resultierende Feld im Spalt der beiden Spulen in 90°-Schritten gedreht, indem die richtige Reihenfolge der Spulenströme ausgewählt wird. Aus den untenstehenden Diagrammen kann man entnehmen, wie man eine Drehung im Gegenuhrzeigersinn realisieren kann. Die 4 Eingänge A1, A2, B2, und B2 müssen wie folgt geschaltet werden:

 A1  A2  B1  B2  Richtung(Grad)
 GND  offen  GND  offen  45
 offen  GND  GND  offen  135
 offen  GND  offen  GND  225
 GND  offen  offen  GND  315

stepper2 stepper4
stepper3 stepper5

Die blauen Pfeile zeigen das Magnetfeld jeder Spule (es folgt den Spulenarmen). Das resultierende Magnetfeld im Spalt ist die Überlagerung der beiden Felder (brauner Pfeil).

 

 

Experiment 1: Schrittmotor über den ULN2003A-Treiber ansteuern

 

Ziel:
Schliessen Sie einen kleinen Schrittmotor an den Raspberry Pi an und und drehen Sie die Motorachse kontinuierlich um 180 Grad vorwärts und rückwärts.

Schaltschema:
Schliessen Sie niemals einen Schrittmotor direkt an das GPIO an, sondern verwenden Sie einen der üblichen Treiber mit MOSFETs, bipolaren Transistoren oder dem L293D. Für kleine Motoren eignet sich auch der Darlington Array ULN2003A. Weil es sich dabei um einen invertierenden Verstärker mit Open-Collector-Ausgang handelt, wird der Ausgang bei einem Eingang auf HIGH nach GND gezogen. Ist der Eingang LOW, wird der Ausgang in den hochohmigen Zustand geschaltet (wie offen).

stepper7

Zur Realisation der Linksdrehung gemäss oben stehender Tabelle müssen die Eingänge IN1,...IN4 also hintereinander folgende Pegel aufweisen:

 IN1  IN2  IN3  IN4  Richtung (deg)
 1  0  1  0  45
 0  1  1  0  135
 0  1  0  1  225
 1  0  0  1  315

0 = LOW, 1 = HIGH

Die Funktion setStepper(in1, in2, in3, in4) legt die logischen Werte an den Treiber-Eingängen an. Eine Drehung des Rotors im Gegenuhrzeigersinn ergibt sich daher mit folgender Sequenz:

def forwardStep():
    setStepper(1, 0, 1, 0)
    setStepper(0, 1, 1, 0)
    setStepper(0, 1, 0, 1)
    setStepper(1, 0, 0, 1)

In der Regel ist die Rotorachse mit der Motorwelle über ein Getriebe verbunden und die Anzahl der Aufrufe von forwardStep(), um die Welle um einen gegebenen Winkel zu drehen, ist vom Übersetzungsverhältnis des Getriebes abhängig. In diesem Beispiel werden 512 Aufrufe für eine Drehung der Welle um 360 Grad benötigt.

Programm:[►]

# Stepper1.py

import RPi.GPIO as GPIO
import time

P_A1 = 8  # adapt to your wiring
P_A2 = 10 # ditto
P_B1 = 11 # ditto
P_B2 = 13 # ditto
delay = 0.005 # time to settle

def setup():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(P_A1, GPIO.OUT)
    GPIO.setup(P_A2, GPIO.OUT)
    GPIO.setup(P_B1, GPIO.OUT)
    GPIO.setup(P_B2, GPIO.OUT)

def forwardStep():
    setStepper(1, 0, 1, 0)
    setStepper(0, 1, 1, 0)
    setStepper(0, 1, 0, 1)
    setStepper(1, 0, 0, 1)

def backwardStep():
    setStepper(1, 0, 0, 1)
    setStepper(0, 1, 0, 1)
    setStepper(0, 1, 1, 0)
    setStepper(1, 0, 1, 0)
  
def setStepper(in1, in2, in3, in4):
    GPIO.output(P_A1, in1)
    GPIO.output(P_A2, in2)
    GPIO.output(P_B1, in3)
    GPIO.output(P_B2, in4)
    time.sleep(delay)

setup()
# 512 steps for 360 degrees, adapt to your motor
while True:
    print "forward"
    for i in range(256):
        forwardStep() 
    print "backward"
    for i in range(256):
        backwardStep() 
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

Bemerkungen:
Wenn die delay-Zeit zu kurz ist, hat der Motor nicht genug Zeit, um die neue Position zu erreichen und das Experiment misslingt.