Python exemplarisch |
Alle Programme können von hier heruntergeladen werden. |
Ansteuerung von DC-Motoren mit einer H-Brückenschaltung |
| |||||||||||||||||||||||||||||||||||||||||||||||||||
Ein Gleichstrommotor (DC-Motor) ist eine wichtige und lehrreiche technische Anwendung eines fundamentalen physikalischen Gesetzes. Dieses sagt aus, dass eine bewegte Ladung, hier der Elektronenstrom in einem Draht, eine Kraft (Lorentzkraft) erfährt, wenn ein Magnetfeld angelegt wird. Mit anderen Worten, wenn ein Strom durch einen Draht fliesst, der sich in einem Magnetfeld befindet, so erfährt der Draht eine Kraft. Durch die spezielle Motorkonstruktion mit einem drehbaren Anker wird diese Kraft in ein Drehmoment umgewandelt, das die Motorwelle antreibt. Wenn der Strom in der umgekehrten Richtung fliesst, so dreht sich der Motor entsprechend in der entgegengesetzten Richtung. Um die Richtung des Stromes umzudrehen, wird bei Kleinmotoren oft eine Schaltung verwendet, die dem Buchstaben "H" gleicht. Diese wird auch als H-Brücke bezeichnet. Das Funktionsschema sieht wie folgt aus: Durch Schliessen der richtigen Schalter kann die Versorgungsspannung des Motors Null sein oder positive bzw. negative Polarität haben.
Nicht alle Schalterkombinationen sind zulässig. Das Schliessen von S1 und S2 oder S3 und S4 verursacht einen Kurzschluss. In der Elektronik wird eine H-Brücke meist mit einem Treiber aufgebaut, der den Ausgang Q entweder auf GND oder VCC zieht oder offen lässt (3 Zustände). Die Schaltung hat zwei Eingänge A und En (Enable) und einen Ausgang Q gemäss folgender Wahrheitstafel und wird als "Halbe H-Brücke" (half H-bridge) bezeichnet Halbe H-Brücke:
Zwei halbe H-Brücken können die Funktion einer H-Brücke zur Ansteuerung eines Motors übernehmen:
Da der Motor mit der Spannung zwischen Q1 und Q2 versorgt wird, stoppt er immer, wenn Q1 und Q2 gleiche Pegel haben. Daher werden die Eingänge En1 und En2 gar nicht gebraucht und können immer auf HIGH (enable) gesetzt sein. Der Motor wird allein durch die zwei Eingänge A1 und A2 gesteuert:
|
Experiment 1: Vorwärts/Rückwärts-Steuerung mit zwei Motoren |
Ziel:
Verwenden Sie das weit verbreitete Bauelement L293D und schliessen Sie zwei DC-Motoren an. Führen Sie irgendeine Bewegungssequenz aus. (Falls Sie keine Motoren haben, können Sie diese mit zwei LEDs simulieren.)
Schaltschema:
Programm:[►] # Motor1.py # Motor forward & backward import RPi.GPIO as GPIO import time P_MOTA1 = 18 P_MOTA2 = 22 def forward(): GPIO.output(P_MOTA1, GPIO.HIGH) GPIO.output(P_MOTA2, GPIO.LOW) def backward(): GPIO.output(P_MOTA1, GPIO.LOW) GPIO.output(P_MOTA2, GPIO.HIGH) def stop(): GPIO.output(P_MOTA1, GPIO.LOW) GPIO.output(P_MOTA2, GPIO.LOW) def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_MOTA1, GPIO.OUT) GPIO.setup(P_MOTA2, GPIO.OUT) print "starting" setup() while True: print "forward" forward() time.sleep(2) print "backward" backward() time.sleep(2) print "stop" stop() time.sleep(2) Bemerkungen: Wenn Sie kleine 5-6 V Motoren (z.B. Micro Metal Gear Motoren von Pololu, PIROMONI und anderen) haben, können Sie diese direkt über die 5V-Versorgung des Raspberry (Pin #2) betreiben. |
Experiment 2: Geschwindigkeitsregelung mit PWM |
Ziel: Der Motor wird wie eine LED aufgefasst, die man mit PWM dimmt. Lesen Sie im Kapitel LED-Dimmen, wie man mit PWM umgeht. Schaltschema: Programm:[►] # Motor2.py # Motor speed & direction import RPi.GPIO as GPIO import time P_MOTA1 = 18 P_MOTA2 = 22 fPWM = 50 # Hz (not higher with software PWM) def forward(speed): pwm1.ChangeDutyCycle(speed) pwm2.ChangeDutyCycle(0) def backward(speed): pwm1.ChangeDutyCycle(0) pwm2.ChangeDutyCycle(speed) def stop(): pwm1.ChangeDutyCycle(0) pwm2.ChangeDutyCycle(0) def setup(): global pwm1, pwm2 GPIO.setmode(GPIO.BOARD) GPIO.setup(P_MOTA1, GPIO.OUT) pwm1 = GPIO.PWM(P_MOTA1, fPWM) pwm1.start(0) GPIO.setup(P_MOTA2, GPIO.OUT) pwm2 = GPIO.PWM(P_MOTA2, fPWM) pwm2.start(0) print "starting" setup() for speed in range(10, 101, 10): print "forward with speed", speed forward(speed) time.sleep(2) for speed in range(10, 101, 10): print "backward with speed", speed backward(speed) time.sleep(2) print "stopping" stop() GPIO.cleanup() print "done" Bemerkung: |
Experiment 3: Motorsteuerung mit einem optischen Rotationsencoder |
(to be done) |