Mikro-Controller steuern und regeln. Dazu müssen sie große Leistungen schalten können. Im letzten Teil des Projektes finden Sie daher eine, im wahrsten Sinne des Wortes, „kräftige“ Schaltung: den MIDI8031-Power-Port. Für etwa 20 DM kann Ihr MIDI8031-Mikro-Controller-System damit bis zu 8 * 20 Ampere schalten!
Als Anwendungsbeispiel dazu steuert ein GFA-BASIC-Programm mit Hilfe von MIDI8031 und dem Power-Port zwei Schrittmotoren.
Die Schaltung für den Power-Port ist prinzipiell recht einfach: Jedes der 8 Bits von Port 1 des Mikro-Controllers läuft über einen Inverter, dem jeweils ein SIPMOS-Leistungstransistor nachgeschaltet ist. SIPMOS-Transistoren haben nahezu ideale Schalteigenschaften. Sie lassen sich direkt mit den selben logischen Pegeln ansteuern, wie sie auf der MIDI8031-Platine Vorkommen, also zwischen 0 und 5 Volt. Liegt der Steuereingang „G“ auf logisch 0, sperrt der Transistor, bei logisch 1 wirkt er praktisch wie ein Kurzschluß! Der in der Schaltung verwendete BUZ10A kann bis zu 20 Ampere schalten. Parallel zur jeweiligen Last (im Schaltplan V1 - V8) ist eine Diode geschaltet. Mit ihr hat es folgende Bewandtnis: Fließt ein Strom durch eine Spule (wie etwa ein Relais, entsteht ein Magnetfeld. Wird der Stromkreis mit einem Schalter unterbrochen, ist normalerweise ein kräftiger Funke zwischen den Kontakten des Schalters zu beobachten, da beim Zusammenbrechen des Magnetfeldes kurzzeitig hohe Spannungen genau entgegengesetzt zur vorher angelegten Spannung auftre-ten. Diese sogenannte Freilaufspannung würde den Transistor zerstören. Sie kann aber durch eine Diode kurzgeschlossen werden. In der Schaltung wurde der preiswerte Typ 1N4001 verwendet, der zwar kurzzeitig einige Ampere verträgt, aber bei sehr starken Verbrauchern mit Spulen (zum Beispiel großen Elektromotoren) durch einen geeigneteren Typ ersetzt werden sollte. Dabei sollten Sie auch beachten, daß die Kupferbahnen der Platine aufgrund ihrer Breite nur für eine Belastung von insgesamt etwa 5 Ampere ausgelegt sind. Die Schaltfrequenz des Power-Ports ist sehr hoch: sie liegt im Megahertz-Bereich! Aufgrund der Zykluszeit des 80C31 von einer Mikrosekunde lassen sich Lasten mit bis zu 500 Kilohertz schalten.
Eine interessante Nutzung des Power-Ports ist seine Verwendung als Schrittmotorsteuerung. Sogenannte „unipolare“ Schrittmotoren, wie sie sehr häufig angeboten werden, sind besonders geeignet für den Power-Port. Das Funktionsprinzip eines unipolaren Schrittmotors ist in Bild 4 skizziert. Tatsächlich ist in Wirklichkeit die Winkelauflösung eines Schrittmotors viel höher als in Bild 4, aber darauf soll es hier nicht ankommen, zumal sich am System der Reihenfolge der Spulenströme nichts ändert. Der Widerstand in Bild 4 hat den Zweck, das Drehmoment des Motors bei hohen Drehzahlen zu verbessern: je höher die Spulenspannung ist, desto schneller wird das Magnetfeld aufgebaut. Der Widerstand begrenzt den Maximalstrom auf zulässige Werte. Der Wert des Widerstandes liegt in der Regel im Bereich des ohmschen Widerstandes einer der 4 Spulenhälften. Da zur Steuerung eines Schrittmotors nur 4 Schalter benötigt werden, lassen sich 2 Schrittmotoren an den Power-Port anschließen!
Der Mikro-Controller 80C31 kennt 5 verschiedene Interrupt-Quellen. Zwei Interrupts können jeweils über die beiden Timer T0 und T1 ausgelöst werden. Um die Programmierung von Interrupts auf dem MIDI8031-Mikro-Controller-Board zu demonstrieren, schaut der Timer0-Interupt 3900 mal pro Sekunde nach, ob einer der beiden Motoren einen Schritt weitergeschaltet werden soll. Alle Variablen werden im internen RAM des 80C31 abgelegt. Für jeden Motor gibt es die Variablen speed0/1 und nach0/1. Bei jedem Interrupt springt der 80C31 zur Routine „steppen“. Für jeden Motor addiert er dann dessen Variablen speed und nach und speichert das Ergebnis in nach ab. Überschreitet das Ergebnis die 8-Bit-Grenze, wird das Carry-Flag gesetzt und der betreffende Motor um eine Position vorwärts oder rückwärts bewegt, je nachdem ob das Bit 7 der Variablen speed gesetzt ist oder nicht. Das Hauptprogramm ab go initialisiert den Interrupt und die Variablen. Zu Anfang drehen sich beide Motoren mit minimaler Geschwindigkeit. Das Programm inaktiviert den seriellen Interrupt des 80C31, über den dieser mit dem Entwicklungssystem auf dem ATARI kommuniziert, und verteilt ankommende MIDI-Bytes abwechselnd an die Geschwindigkeitsvariablen der beiden Motoren. Daher sollten Sie das Programm von der Shell des Entwicklungssystems aus mit der Taste „X“ starten und die Shell danach verlassen, ins GFA-B ASIC wechseln und das BASIC-Programm laden und starten. Sofort wird sich emsige Aktivität unterlhren Motoren ausbreiten: vorwärts, rückwärts, schneller, langsamer ... Die Motordrehzahl wird auf dem Bildschirm dargestellt.
So, damit wären wir am Ende des ST-Computer-Mikro-Controller-Projekts. Sicher haben Sie inzwischen schon jede Menge eigene Ideen, die nur darauf drängen, verwirklicht zu werden. MIDI8031 und ATARI sind ein prima Gespann. Wir würden gerne über Ihre Projekte berichten!
Stückliste MIDI8031-POWERPORT
IC1 74HCT240 od. 74HC240 od.74LS240 8-Inverter, DIL2
TI-T8 BUZ10A SIPMOS, Leistungs-MOS-FET50V/22A
D1-D8 1N4001 Diode 50V/1A evtl stärkerer Typ
C1: 100µF/50V axial
C2 100nF Rastermaß 5mm
CON1 Buchsenleiste 10polig
;
; * SCHRITT: Dieses Programm steuert 2 Schritt-
; * motoren. Die Drehzahl der beiden Motoren
; * empfaengt MIDI8031 ueber MIDI (was sonst),
; * dazu dient das Steuerprogramm in GFA-Basic
; * (c)1992 by MAXON-Computer GmbH
; * Autor.- Jürgen Piscol
;
.registers reg51.inc ; 8031-Deklarationen
; *** Variablen Internes RAM, oberhalb Bitfeld
.var.org $30 ; Variablen-PC setzen
speed0: .ds.b 1 ; -64..0..64 Gessch. M. 0
nach0: .ds.b 1 ; Nachkommastellen
pos0: .ds.b 1 ; Magnetfeldpos. (0..3)
speed1: .ds.b 1 ; dto. Motor 1
nach1: .ds.b 1 ; dto.
pos1: .ds.b 1 ; dto.
awert: .ds.b 1 ; Hilfsvariable
stack: ; Ab hier nur noch Stack
; *** Ab hier beginnt der Programmcode ***
.text.org $8000
; *** 'Interruptbereich' wie EPROM ab Adr. $0 ***
ljmp go ; Int.ber.. ueberspringen
int0: reti ; Nicht verwendet...
.ds.b 7
timer0; ljmp steppen ; zum Steppen springen
.ds.b 5
int1: reti ; int0/1, timer1, serial
.ds.b 7 ; werden in diesem Prog.
timer1: reti ; nicht verwendet. Der
.ds.b 7 ; Programmkopf zeigt
serial: reti ; lediglich, welche Inter,
.ds.b 7 ; MIDI8031 alle kennt!
; *** Hier startet das eigentliche Programm ***
; * Initialisierungen: Variablen & Interrupts
go:
mov sp,#stack ; !!! Stack einrichten !!!
setb TCON.4 ; TRO Timer 0 laeuft
anl TM0D,#%11111100 ; Mode-Bits ausblenden
orl TMOD, #%11 ; M0 = 3: Int.frq. 3.9KHz
setb IE.7 ; Gen. Interrupts zulassen
setb IE.1 ; TO Interrupt Ein
setb IP.1 ; TO Int. Hohe Prioritaet
mov speed0,#1 ; Motor1: (längs, vorw.)
mov nach0,#0 ; Nachkommastellen
mov pos0,#0 ; Motor1 an Pos. 0!
mov speed1,#-1 ; Motor2: (langs, rueckw.)
mov nach1,#0 ;
mov pos1,#0 ;
; * Warteschlife: Abwechselnd werden MIDI-Bytes
; * an speed0/1 verteilt.
clr IE.4 ; Seriellen Int. verbieten
clr SCON.0 ; Ser. Buffer loeschen
loop:
cpl P3.5 ; Anzeigen ueber LED
jnb SCON.0,! ; RI=1 abwarten (1: Byte
clr SCON.0 ; angekommen), quittieren
mov speed0,SBUF ; Byte an speed0
jnb SCON.0,!
clr SCON.0
mov speed1,SBUF ; Byte an speed1
sjmp loop
; *** Stepper-Interr., Aufruf mit 3.9kHz ***
steppen:
push ACC ; Akku retten
push PSW ; Flags retten
; * Step-Routine fuer Motor 0 *
mov A,nach0 ; Addieren
add A,speed0 ; des Steps
mov nach0,A ; und Abspeichern...
jnb PSW.2,nstep0 ; Overflow-Flag testen
mov awert,#1 ; Hilfsvar: Vorwaerts
jb ACC.7,vor0 ; >$80: Vorwaerts ist ok
mov awert,#-1 ; sonst Hilfsv = Rueckw.!
vor0:
mov A,pos0 ; Position 0 holen
add A,awert ; 1 Step vor/zurueck
anl A, #1,0021 ; 4 Steps fuer Motor 0
mov pos0,A ; Neue Position merken
nstep0:
; * Step-Routine fuer Motor 1 *
mov A,nach1 ; wie Motor 0
add A,speed1 ; ...
mov nachl,A
jnb PSW.2,nstep1
mov awert,#4 ; Vorw. in 4-er Schritten
jb ACC.7,vorl
mov awert,#-4 ; sonst 4 Rueckwaerts!
vor1:
mov A,pos1 ; Position 1 holen
add A,awert
anl A,#%1100 ; 4 Steps f. M1 (0,4,8,12)
mov posl,A
nstep1:
; * Ausgaenge schalten in Abh. von pos0/1 *
mov A,pos0 ; 0..3 Step 1
add A,pos1 ; 0..15 Step 4
add A,#pot-h1 ; Adressdifferez zur Tab.
move A,@A+pc ; Indiziert aus Tabelle
h1: mov P1,A ; Bitmuster am Port ausg.
pop PSW ; Flags restaurieren
pop ACC ; Akku restaurieren
reti ; Interrupt fertig!
; * Positionstabelle fuer 16 Strommoeglichkeiten *
pot:
.dc.b $AA,$A9,$A5,$A6,$9A,$99,$95,$96
.dc.b $5A,$59,$55,$56,$6A,$69,$65,$66
' *** MIDI8031 Mikrocontrollerboard ***
' Nutzung der MIDI8031-Schrittmotorsteuerung
' ueber GFA-Basic. Drehzahl jedes Motors von
' -100%..0%..+100% separat einstellbar!
'
' (c)1992 by MAXON-Computer GmbH
' Autor: Jürgen Piscol
'
px=10 ! Plotposition X-Achse
max=32 ! Max.geschw. der Mot.
DIM soll(1),ist(1) ! Je 2 SOLL/IST-Werte
PRINT "Ende: <Taste>"
REPEAT
FOR i=0 TO 1 ! Motoren 0 u. 1
IF RND(0)<0.01 ! evtl. SOLL neu
soll(i)=RANDOM(max*4+1)-max*2 ! -max..+max
ENDIF ! IST folgt
ADD ist(i),SGN(soll(i)-ist(i)) ! langsam
PLOT px,100+ist(i)+i*200 ! SOLL.
OUT 3,ist(i)/2 ! SOLL send.
NEXT i ! Fuer jeden Mot.
PAUSE 1 ! Kurze Pause
px=px+0.1 ! Plotpos. etwas weiter
UNTIL INKEY$<>"" ! <Taste>: Ende
OUT 3,0 ! Alle Maschinen STOP!
OUT 3,0 END
Listing 2