Autoren:
Datum: 31.01.1996
Das Stichwortregister steht hier.Zusammenfassung:
In diesem Dokument soll die Funktionalität des Gamma-Knotens vorgestellt werden, dessen Aufgabe das korrekte Setzen eines Lenkwinkels ist. Der Bericht gliedert sich dabei grob in die 2 Punkte: Soft- und Hardwareentwicklung.
Im ersten Teil erfolgt eine Beschreibung des Programms, der verwendeten Algorithmen sowie eine Einführung in die Funktionsweise des MC P8xC592 hinsichlich der Analog-Digital-Konvertierung und der Pulsweiten-Modulation, soweit dies für das Verständnis der Programme erforderlich ist. Anschließend sollen die notwendigen Hardwareanpassungen für die Lenkwinkelauswertung und -ansteuerung dargestellt werden.
Die folgende, informelle Spezifikation der Aufgaben dieses Knotens soll einen Einstieg in die sich anschließende Beschreibung des Programm-Codes geben. Ferner ist die hier vorgestellte Schnittstellenbeschreibung bindend für die Kommunikation mit dem Gamma-Knoten.
Die Werte der im folgenden erwähnten Konstanten können im Kap. Konstanten nachgeschlagen werden. Weiterhin gilt, daß alle Nachrichten, die von oder zu dem Gamma-Knoten gesendet werden, den Identifier GAMMA_ID tragen müssen.
Ein neu zu setzender Lenkwinkel kann zum MC mit der Sub-ID STR_ANGLE gesendet werden. Das erste Datenbyte der Nachricht muß den gewünschten Lenkwinkel beinhalten. Die Lenkwinkel-Darstellung kann der Tabelle PC-Lenkwinkel entnommen werden. Wichtig in diesem Zusammenhang ist, daß der Knoten lediglich dafür sorgt, daß das Setzen eines Lenkwinkels unabhängig von der Belastung und dem Untergrund des Rollstuhls zu einem (bis auf Toleranz) gleichen Lenkeinschlag der Räder führt. Die Auflösung des linken und rechten Lenkwinkelbereichs ist dabei nichtlinear und unsymetrisch.
Sobald der gewünschte Lenkwinkel anliegt, wird dieses mit einer Mitteilung (Sub-ID = ANGLE_SET) bekanntgegeben.
Das auf dem MC verfügbare MICRO/C-51 ("Kernighan & Ritchie C") läßt eine Definition eigener Datentypen oder die Einschränkung von Wertebereichen vorhandener Datentypen nicht zu. Aus diesem Grund mußten z.B. Boolsche-Variablen, wie newangle, als char deklariert werden. Zum besseren Verständnis wurden jedoch die einzelnen, bedeutsamen Werte derartiger Variablen als Konstanten definiert. Überdies sind alle anderen als char definierten Variablen in diesem Programm als "Byte"-Werte zu interpretieren.
In mccan.h sind Prozeduren zum Senden und Empfangen von Nachrichten über den CAN-Bus vereinigt. Dieses Programm benötigt aus mccan.h: CANPutBuffer, CANTrRequest, CANRecBuffer, CANGetBuffer, CANReleaseBuffer, initCAN. Auf diese Prozeduren wird im folgenden nur oberflächlich eingegangen. Eine genaue Beschreibung liefert die Dokumentation zum "mccan.h"-Modul.
Zur übersichtlichen und flexiblen Handhabung des Programms folgt nun die Definition einiger Konstanten. Die zugewiesenen Werte ergeben sich aus ...
Da dem Timer-Interrupt keine Variablen übergeben werden können, ist es notwendig Variablen, die sowohl im Hauptprogramm als auch in der Interrupt-Routine benötigt werden, global zu definieren. Beispiele derartiger Variablen sind : angle, newangle ... . Überdies mußten Variablen, deren Werte bis zum nächsten Interruptaufruf erhalten bleiben sollten (static), global deklariert werden (sec und degree).
Eine exakte Beschreibung der Funktionsweise des Timer-0-Interrupts (= Interrupt 1) ist in der Dokumentation zum Beta-Knoten (wizab96 ) enthalten. Hier sei nur soviel erwähnt, daß bei jedem Überlauf des TL0-Registers ein Timer-Interrupt ausgelöst wird.
Die Verwendung des Timer-Interrupts für das Setzen des Lenkwinkels dient dazu, die Anpassung an einen neu angeforderten Lenkwinkel in geregelten Korrekturschritten zu vollziehen. Hierbei ist es entscheidend, daß zum einen die Ermittlung und der Vollzug der notwendigen Änderung bei jedem Schritt nicht zu schnell erfolgt, damit die Änderung der Radstellung, die beim vorherigen Schritt ermittelt wurde, erst ausgeführt werden kann. Andererseits ist aber auch eine zügige Anpassung an den geforderten Lenkwinkel wünschenswert.
Das ADCON-Register steuert die Analog-Digital-Wandlung . Diese wird benötigt, um das analoge Lenkwinkelsignal, das von der werkseitig vorgesehenen Lenkwinkelsteuerung des Rollstuhls abgegriffen wird und den tatsächlichen Einschlag der beiden Räder repräsentiert, in ein digitales Signal zu konvertieren. Der Aufbau des ADCON-Registers geht aus der Tabelle ADCON hervor (exakte Beschreibung: ).
| BIT | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SYMBOL | ADC.1 | ADC.0 | ADEX | ADCI | ADCS | AADR2 | AADR1 | AADR0 |
Diese und die Festlegung des Input-Pins müssen nur einmal beim Programmstart definiert werden. Deshalb werden diese Einstellungen im Rahmen der sogenannten Register-Initialisierung (Kap. Register-Initialisierung) des Hauptprogramms vorgenommen.
Mit ADCON = ADCON & 239 wird das ADC-Interrupt-Flag (ADCI) zunächst zurückgesetzt, damit es später die Beendigung der Konventierung signalisieren kann. Anschließend wird die AD-Wandlung gestartet, indem ADCS gesetzt wird. Solange der Konvertierungsvorgang arbeitet wird aktiv auf das Ende gewartet.
| LINKS | MITTE | RECHTS | ||
| max | max | |||
| 57 (ca.) .. | .. 127,-128 .. | .. -70 (ca.) .. | .. -1 | |
| LINKS | MITTE | RECHTS | ||
| max | max | |||
| 57 (ca.) .. | .. 127, 128 .. | .. 186 (ca.) .. | .. 255 | |
| ADCLEFT | ADCCENTER | |||
Wie bereits in der Spezifikation angesprochen, ist eine wesentliche Aufgabe des Gamma-Knotens, das Setzen eines Lenkwinkels zu ermöglichen. Mit den PWM-Ausgängen (Pulse-Width-Modulation) des Knotens kann dazu über die Lenkwinkelsteuerung des Rollstuhls der Lenkeinschlag beider Räder gesteuert werden. Diese ausschließlich über den PWM-Ausgang geregelte Lenkung wird jedoch sowohl von der Belastung und Geschwindigkeit des Rollstuhls als auch vom jeweilige Untergrund beeinflußt, d.h. die Abgabe einer bestimmtem Leistung kann in einer Situation einen maximalen und unter etwas anderen Bedingungen einen weitaus geringeren Lenkeinschlag bedeuten. Um unabhängig von den jeweiligen Rahmenbedingungen einen gewünschten Lenkwinkel exakt setzen zu können, mußte zusätzlich noch der tatsächlich anliegende Winkel mit einbezogen werden. Dieser konnte aus einem Potentiometer der Lenkwinkelsteuerung abgegriffen werden. Der tatsächliche Lenkeinschlag (Istwinkel) wird, wie zuvor beschrieben, in adcresult gespeichert und bildet eine verläßliche Interpretationsgrundlage im Hinblick auf die Ausrichtung der Lenkräder. Wird nun die Auflösung des Sollwinkels angle noch der des Istwinkels angeglichen (Vgl. Abb. angleadc im Hauptprogramm), können Soll- und Istwinkel miteinander verglichen werden, was Grundlage für eine Nachregulierung und damit für den Regelkreis ist.
Der Aufbau eines Regelkreises ist erforderlich, da keine direkte Relation zwischen Sollwinkel und der mit PWM geregelten Lenkung hergestellt werden kann, weil die Motoraktion von den bereits erwähnten äußeren und damit unbestimmbaren Einflußfaktoren (Rollstuhlbelastung, Untergrund, etc.) abhängt. Die Aufgabe des Regelkreises ist es somit, die notwendige Änderung der zu setzenden PWM schrittweise an die tatsächlich gewünschte Änderung des Lenkwinkels (diff = Sollwinkel - Istwinkel) anzunähern. Die Variable degree beinhaltet den Lenkwinkel, der schließlich an das PWM-Register übergeben wird, wobei zu beachten ist, daß die Auflösung von degree eine andere als die des Ist- bzw. Sollwinkels ist. Der Wertebereich von degree und seine Bedeutung stimmt aber dahingehend mit angle und adcresult überein, daß kleinere Werte links von größeren liegen (Vgl. Tabelle degree).
| LINKS | MITTE | RECHTS | ||
| 0.. | .. | .. 255 | ||
Die Ansteuerung des Motors für die Lenkräder erfolgt über die PWM-Ausgänge des Kontens. Die Pulsweiten-Modulation hat eine Auflösung von 8 Bit, wobei die Leistungsabgabe über das Verhältnis von Puls (High-Pegel) und Wellenlänge gesteuert wird. Es gibt insgesamt 2 PWM-Ausgänge auf dem MC. Diese werden gemeinsam gesteuert durch das PWMP-Register, das die Wiederholungsfrequenz definiert, indem es die Taktfrequenz für den PWM-Zähler festlegt. Der 8-Bit Zähler zählt modulo 255. Der Wert des Zählers wird mit den Inhalten der Register PWM0 und PWM1 verglichen. Ist ein Wert dieser Register größer als der Zähler, wird der Output des entsprechenden PWM0- oder PWM1-Ausgangs auf LOW gesetzt, anderenfalls auf HIGH. (Beschreibung: )
Da es für die Ansteuerung der Lenkräder notwendig ist, die Bereiche links und rechts von der mittleren Radstellung zu unterscheiden, muß durch Setzen bzw. Rücksetzen zweier Schalter zunächst mitgeteilt werden, ob der an die PWM-Register übergebene Wert einen linken oder rechten Lenkwinkel darstellen soll. Insofern haben wir eine Auflösung von 2 x 255 Einheiten. Diese Schalter sind 2 Pins des 4. Ports und werden im Folgenden als STR_LEFT und STR_RIGHT bezeichnet. Wird bspw. STR_LEFT auf HIGH gesetzt und STR_RIGHT auf LOW bedeutet dies, daß es sich um einen linken Lenkwinkel handeln soll.
Ein degree-Wert von kleiner DEGREECENTER bedeutet, daß die Räder von der Mittelstellung aus gesehen absolut nach links ausgerichtet werden müssen. Mit ADAP_DIFF wird lediglich eine Toleranz angegeben, da der Lenkwinkelbereich so hoch aufgelöst wird, daß sehr nah nebeneinanderliegende Werte praktisch die gleiche Radstellung bedeuten. Nachdem die Richtungsschalter entsprechend gesetzt sind, kann anschließend der degree-Wert in das PWM1-Register geschrieben werden. Dabei ist zu berücksichtigen, daß aufgrund der Funktionsweise der Pulsweiten-Modulation gilt: Je höher der Wert im PWM-Register ist, desto kürzere Impulse werden produziert, d.h. desto geringer ist der Lenkausschlag. Für den linken Lenkwinkelbereich entspricht diese Darstellung der von degree, jedoch muß der linke Wertebereich von degree (0 bis ca. DEGREECENTER) noch nach oben verschoben werden, damit auch Radstellungen nahe der Mittelstellung realisiert werden können. Mit (degree-DEGREECENTER) kann die Verschiebung vorgenommen werden, da die resultierenden negativen Werte im Register P4 wie positive behandelt werden. Beim rechten Lenkeinschlag muß der Wertebereich zusätzlich gespiegelt werden, bevor er ins PWM-Register übernommen werden kann. Ist degree etwa DEGREECENTER (Mittelstellung), können beide Richtungsschalter ausgestellt werden. Auch das Setzen eines PWM-Wertes entfällt in diesem Fall, da dies die Normalstellung des Lenkwinkelmotors darstellt.
Fällt die verbleibende Lenkwinkeländerung unter einem bestimmten Toleranzbereich (ADAP_DIFF) und bestand eine Anforderung einen neuen Lenkwinkel zu setzen (newangle=TRUE), dann wird das Anliegen des gewünschten Lenkwinkels gemeldet.
Am Ende der Interrupt-Routine werden die Interrupts wieder zugelassen.
Beginn des Hauptprogramms, das im wesentlichen für das Empfangen und Auswerten von Nachrichten zuständig ist. Dies bedarf jedoch zuvor der Deklaration einiger Variablen.
Bemerkenswert dabei ist, daß das Array data[8] im Programm nie benutzt wird, jedoch das Fehlen dieser Deklaration den Empfang von Nachrichten verhindert. Ohne das Array sind sämtliche nachfolgend definierte Variablen bei der Entgegennahme von (korrekt versendeten) Nachrichten mit der Funktion CANGetBuffer(...) stets Null, was dementsprechend eine Auswertung von Nachrichten unmöglich macht. Mit der Deklaration des Feldes tritt dieser Fehler nicht auf.
Der Interrupt-Zähler für den Lenkwinkel wird mit Null initialisiert.
Das newangle-Flag wird auf FALSE gesetzt, da es nur signalisieren soll, wenn eine Lenkwinkelanforderung vom PC empfangen wurde.
Im Analog-Digital-Kontrollregister ADCON bestimmen die ersten 3 Bits den Port-Pin von Port 5, an welchem ein analoges Signal gemessen werden soll. Die Konstante ANGLEPIN beinhaltet den Port-Pin des Lenkwinkelsignals und wird dem ADCON-Register zugewiesen. Weiterhin muß das 5. Bit von ADCON zurückgesetzt werden, damit die Konvertierung per Software gestartet werden kann (Vgl. Kap. AD-Wandlung>).
Im folgenden sollen ankommende Nachrichten entgegengenommen und ausgewertet werden. Diese Aufgabe des Knotens muß stets wiederholt werden, so daß der Algorithmus in eine Endlos-Schleife eingeschlossen wird.
| LINKS | MITTE | RECHTS | ||
| max | max | |||
| -128.. | ..-64.. | ..0.. | ..64.. | ..127 |
| LINKS | MITTE | RECHTS | ||
| max | max | |||
| 0.. | ..64.. | ..128.. | ..192.. | ..255 |
Sei der maximale linke Lenkausschlag von adcresult in der Konstanten
ADCLEFT und die Mittelstellung in ADCCENTER gespeichert. Dann
ergibt sich folgendes Bild (Abb.
angleadc).
(Abbildung:
angle=ADCLEFT+angle*(ADCCENTER-ADCLEFT)/128
ausgedrückt werden kann. Der Umrechnungsfaktor für den rechten Lenkwinkelbereich berechnet sich analog mit (255-ADCCENTER)/(255-128). Es muß jedoch beachtet werden, daß lediglich der Anteil von angle multipliziert wird, der den rechten Lenkausschlag repräsentiert, also (angle-128). Daraus folgt, daß sich die Angleichung der rechten Seite mit der Zeile :
angle=ADCCENTER+(angle-128)*(255-ADCCENTER)/128
angeben läßt.
Mit dem Setzen des Flags newangle auf TRUE, wird der Interrupt-Routine signalisiert, daß ein neuer Lenkwinkel angefordert wurde.
In diesem Kapitel soll zunächst auf einige allgemeine Eigenarten der verwendeten Knoten eingegangen werden. Anschließend erfolgt dann die Hardwarebeschreibung des Gamma-Knotens.
Man muß darauf achten, daß die reale Belegung der Positionen der Pfostenleiste des "analogen Steckverbinders" nicht der entspricht, die auf den losen Schaltplänen angegeben ist. Vielmehr kann man die korrekte Anschlußbelegung für die Analog-Digital-Wandlung aus den Phytec-Unterlagen mit der Klebebindung entnehmen.
Der Gamma-Knoten ist ausschließlich für die Realisierung des
Lenkwinkel-Regelkreises zuständig.
Dies bedeutet im einzelnen, daß der Lenkwinkelmotor einen Sollwert in
Form einer Spannung erhält, die vom PWM-Port 1 (also dem zweiten Pulsweiten-Modulation s-Port) abgegeben wird. Die tatsächliche Reaktion wird dann über den
analogen Portpin P5.7 (s.o.) eingelesen. Die Software regelt dann bei Bedarf
nach und paßt die PWM-Ausgangsspannung der Differenz zwischen Soll-
und Ist-Lenkeinschlag an.
(Abbildung:
Die Ansteuerungselektronik des Rollstuhl funktioniert leider nicht "linear", also nicht so daß bei kleinen Spannungen große Ausschläge nach links und bei großen Spannungen große Ausschläge nach rechts zu verzeichnen wären. Dies würde uns angesichts des Bereiches von 0V - 5V, den die PWM-Ausgänge abdecken, am weitesten entgegenkommen. Stattdessen gibt es zwei Eingänge auf der Seite der Motorelektronik, so daß die Höhe der Spannung (immer positiv) die Stärke des Ausschlags und der jeweilige Eingang die Richtung angibt. Geradeausfahren entspricht 0 V auf beiden Eingängen, 2,5 V auf dem einen Eingang führt zu einem mittleren Einschlag in die eine Richtung, 5 V auf dem anderen Eingang führt zum vollen Einschlag in die andere Richtung. Die Eingänge "zerren" also gegeneinander, wobei der Rollstuhl bei einem Gleichgewicht der Spannungen geradeaus fährt.
Da die beiden PWM-Register nicht vollkommen unabhängig voneinander angesteuert werden können, mußten wir zwei Transistoren einsetzen die - über die digitalen Ports P4.2 und P4.3 angesteuert - wechselweise (Vgl. Kapitel PWM) als Schalter (oder quasi Relais) Strom je nach gewünschter Lenkrichtung auf den einen oder den anderen Eingang der Motorelektronik geben (Siehe Abbildung Schaltskizze). Die zunächst realisierte Glättung des PWM-Signals über eine RC-Brücke erwies sich nachträglich als unnötig.
Da über den AD-Wandler Strom abfließt und somit das Meßergebnis anfangs verfälscht wurde, mußten wir recht große Widerstände für den Spannungsteiler einsetzen (110 bzw. 200 kOhm). Der Einsatz kleinerer Widerstände hatte zur Folge, daß der Lenkwinkel sich schon allein durch Anschluß der CAN-Karte um ca. die Hälfte des maximalen Lenkeinschlages veränderte. Zunächst hatten wir auch noch einen Operationsverstärker vorgesehen, der so geschaltet sein sollte, daß er eine Spannungsverstärkung von 1 (also einen identischen Spannungswert) erzeugt, aber einen sehr hohen Eingangswiderstand gehabt hätte. Aber auch dieser erwies sich durch die Verwendung der großen Widerstände als überflüssig.