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

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
Links

Copyright-Bestimmungen: siehe Über diese Seite