Scheibenwischer mit Schrittmotor
(und Mikrocontroller HT46F47E)
Scheibenwischer
In dem folgenden Versuch prüfen wir, ob der kleine Mikrocontroller HT46F47E dazu geeignet ist, einen Schrittmotor zu
steuern. Als Anwendungsbeispiel wählen wir dabei einen Scheibenwischer. Sollte dies gelingen, wird der Vorteil einer solchen Lösung
gleich sichtbar. Da man einen Schrittmotor dank Schrittzählung exakt positionieren kann, entfallen die Endlage-Sensoren. Man spart also
an der Sensorik und Verdrahtung. Zusätzlich verringert sich die Zahl der möglichen Störquellen.
Um die Aufgabe zu vereinfachen, wird der Motor mit einem Treiber angetrieben. Damit werden für die eigentliche Ansteuerung des
Motors nur zwei Ausgänge des Mikrocontrollers benötigt. Zwei weitere stehen dann für andere Aufgaben zur Verfügung. Um die Achse des
Motors jeweils in die gewünschte Position zu bringen, müssen die Pulse, die die Anzahl der Schritte des Motors bestimmen, gezählt werden.
Das Hantieren mit Zahlen, die größer als 15 sind, stellt dabei jeden Hobby-Programmierer vor einigen neuen
Herausforderungen.
Bei dem Motor handelt es sich um einen Zweiphasenmotor, der mit einem Treiber gesteuert wird. Damit beschränkt sich unsere
Steuerung auf Steuerung des Motortreibers. Von dem Mikrocontroller führen wir zwei Leitungen zu dem Treiber. Mit DIR wird die
Drehrichtung des Motors bestimmt, mit PUL (Pulse) der Weg und Geschwindigkeit. Der Eingang ENBL (Enable) wird konstant mit 5V versorgt.
Mit mehreren Dipschaltern auf dem Treiber kann man die Strombegrenzung und Auflösung einstellen. Für den Versuch wird die Auflösung
auf 400 Impulse pro Umdrehung eingestellt. Der Strom wird auf ca. 400 mA begrenzt.
Mit dem Schalter S0 wird die Schaltung mit Spannung versorgt. Die Eingangsspannung von 12 VDC wird für die Steuerung mit
einem Spannungsregler mit LM317 auf 5 V runtergeregelt. Als Einspeisung für den Mikrocontroller könnten auch drei Batterien je 1,5 V
verwendet werden. Mit den Tasten S1 und S2 kann der Motor zu Test- und Einstellzwecken manuell bewegt werden. Mit dem rastenden Schalter
S3 wird der automatische Ablauf gestartet. Anstelle des Schalters S3 oder mit ihm kombiniert könnte ein Regensensor angeschlossen werden.
Mit einem Widerstand zwischen den Pins 12 (Vcc) und 13 (Osc1) kann die interne Taktfrequenz des Mikrocontrollers eingestellt werden.
Die maximale Taktfrequenz, die eingestellt werden kann, beträgt 12 MHz. Diese Aufgabe übernimmt in der Schaltung der Widerstand R1.
Zusätzlich wird in der Reihe mit R1 der Potenziometer P1 angeschlossen. Mit dem Potenziometer kann Taktfrequenz im bestimmten Bereich
stufenlos reguliert werden. Die Taktfrequenz wirkt sich dann auf die im Programm eingestellten Zeiten aus. In diesem Fall wird mit dem
Potenziometer die Geschwindigkeit des Motors beeinflusst.
Scheibenwischer - Testschaltung
Das Programm
Der HT46F47E kann sehr gut mit Zahlen 0-15 (0h-Fh) umgehen. Müssen größere Zahlen bearbeitet werden, ist ein zusätzlicher
Programmierungsaufwand notwendig. Bei dem Versuch wollen wir, dass der Motor bei einem Wischvorgang (volle Bewegung in eine Richtung)
ca. eine halbe Umdrehung um eigene Achse absolviert.
Der Treiber ist auf 400 Schritte pro Umdrehung eingestellt. Um das Ziel der halben Drehung zu erreichen, muss der Mikrocontroller pro
einen Wischvorgang ca. 200 Impulse liefern. Einen solchen Wert kann keine der zur Verfügung stehenden Variablen annehmen.
Das Problem wird in dem Unterprogramm ZÄHLER gelöst. Die Zählung der Impulse wird mithilfe der Variablen A, B und C realisiert.
Mit dem Befehl „A“ (C-Schlaufe) wird die Variable C nach jedem Impuls dekrementiert. Davor wird sie mit dem Startwert Fh (Dezimal 15) geladen.
Das Dekrementieren läuft, bis sie den Wert 0 erreicht hat. Pro eine C-Schlaufe werden damit 15 Impulse generiert. Nach jedem Ablauf
der C-Schlaufe wird die Variable A, die mit dem Wert 0 beginnt, um 1 erhöht und die C-Schlaufe neu gestartet. Der Ablauf wiederholt sich,
bis die Variable A den Wert erreicht hat, den wir als Vergleichswert in der Variable B gespeichert haben. Dieser beträgt in dem Beispiel
Dh (Dezimal 13).
Folglich werden pro Bewegung in eine Richtung 13x15=195 Impulse generiert. Mit 195 Impulsen führt der Motor eine (fast)
180° - Drehung aus.
Listing mit Kommentaren
TASTER - ABFRAGE
000 (00h) 11 Blaue LED ein, Steuerung bereit
001 (01h) 80 Sprungbereich festlegen (Seite 0)
002 (02h) C8 Überspringe folgenden Befehl, wenn Taste HAND LINKS betätigt
003 (03h) 95 Springe zur Zeile 5 (Adresse 05h), um Taste HAND RECHTS zu prüfen
004 (04h) 9D Springe zu der Programmsequenz HAND LINKS
005 (05h) C9 Überspringe folgenden Befehl, wenn Taste HAND RECHTS betätigt
006 (06h) 99 Springe zur Zeile 9 (Adresse 09h), um Schalter AUTOMATIK zu prüfen
007 (07h) 81 Sprungbereich festlegen (Seite 1)
008 (08h) 92 Springe zu der Programmsequenz HAND RECHTS
009 (09h) CA Überspringe folgenden Befehl, wenn Schalter AUTOMATIK betätigt
010 (0Ah) 3A Springe zurück -10 auf 0 und wiederhole die Abfragen
011 (0Bh) 81 Setze Sprungbereich (Seite 1)
012 (0Ch) 97 Springe zu der Programmsequenz AUTOMATIK
HAND LINKS
013 (0Dh) 11 Ausgang LINKS auf LOW (LED bleibt an)
014 (0Eh) 83 Sprungbereich festlegen (Seite 3)
015 (0Fh) D0 Unterprogramm SCHRITT LINKS aufrufen
016 (10h) 80 Sprungbereich festlegen (Seite 0)
017 (11h) 90 Springe zurück auf 0
HAND RECHTS
018 (12h) 13 Ausgang RECHTS setzen (LED bleibt an)
019 (13h) 83 Sprungbereich festlegen (Seite 3)
020 (14h) D5 Unterprogramm SCHRITT RECHTS aufrufen
021 (15h) 80 Sprungbereich festlegen (Seite 0)
022 (16h) 90 Springe zurück auf 0
AUTOMATIK
023 (17h) 4D A=D, A wird mit 13 vorbelegt
024 (18h) 51 B=A, Vergleichswert in B laden
025 (19h) 4F A=F, C-Schlaufe
026 (1Ah) 52 C=A, C vorbelegen
027 (1Bh) 40 A=0, Startwert für Variable A
028 (1Ch) 83 Sprungbereich festlegen (Seite 3)
029 (1Dh) D5 Unterprogramm SCHRITT RECHTS aufrufen
030 (1Eh) DA Unterprogramm ZÄHLER aufrufen
031 (1Fh) 81 Sprungbereich festlegen (Seite 1)
032 (20h) C3 Überspringe den folgenden Befehl, wenn A=B
033 (21h) 9C Springe zur Zeile 28 (Adresse 1Ch) und wiederhole alles
034 (22h) 40 A=0, Startwert für Variable A
035 (23h) 83 Sprungbereich festlegen (Seite 3)
036 (24h) D0 Unterprogramm SCHRITT LINKS aufrufen
037 (25h) DA Unterprogramm ZÄHLER aufrufen
038 (26h) 82 Sprungbereich festlegen (Seite 2)
039 (27h) C3 Überspringe den folgenden Befehl, wenn A=B
040 (28h) 93 Springe zur Zeile 35 (Adresse 23h) und wiederhole alles
041 (29h) 80 Sprungbereich festlegen (Seite 0)
042 (2Ah) 90 Zurück zum Anfang
UNTERPROGRAMM SCHRITT LINKS
048 (30h) 15 Impuls HIGH (Ausgang PA2 + LED ein, Richtung aus)
049 (31h) 20 Impulslänge (Wartezeit)
050 (32h) 11 Impuls LOW (Ausgang PA2 aus, LED ein, Richtung bleibt aus)
051 (33h) 20 Wartezeit
052 (34h) E0 RETURN
UNTERPROGRAMM SCHRITT RECHTS
053 (35h) 17 Impuls HIGH (Ausgang PA2 + LED + Richtung ein)
054 (36h) 20 Impulslänge (Wartezeit)
055 (37h) 13 Impuls LOW (Ausgang PA2 aus, LED + Richtung bleiben an)
056 (38h) 20 Wartezeit
057 (39h) E0 RETURN
UNTERPROGRAMM ZÄHLER
058 (3Ah) 83 Sprungbereich festlegen (Seite 3)
059 (3Bh) AD Dekrementiere C, springe auf 3Dh, wenn C noch nicht 0
060 (3Ch) 9E Schlaufe abgelaufen, springe auf 3Eh
061 (3Dh) E0 RETURN
062 (3Eh) 53 D=A, Zwischenspeicherung von A
063 (3Fh) 4F A=F, C-Schlaufe Startwert
064 (40h) 52 C=A, C vorbelegen
065 (41h) 63 A=D, A aktualisieren
066 (42h) 71 A=A+1, erhöhe A um 1
067 (43h) E0 RETURN
11 80 C8 95 9D C9 99 81 92 CA 3A 81 97 11 83 D0 80 90 13 83 D5 80 90 4D 51 4F 52 40 83 D5 DA 81 C3 9C 40 83 D0 DA 82 C3 93 80 90 15 20 11 20 E0 17 20 13 20 E0 83 AD 9E E0 53 4F 52 63 71 E0