← ST-Computer 09 / 1992

MIDI8031 Micro-Controller-Entwicklungssystem, Teil 3: Power-Port

Hardware

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.

Bild 1: Schaltplan

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!

Bild 2: Platine

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.

Bild 3: Bestückungsliste

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

Bild 4: Funktionsschema eines unipolaren Schrittmotors
; ; * 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

Jürgen Piscol