Realisierung der Handsteuerbox
Hardware
Die Handsteuerbox wird mit zwei 72x58 mm großen doppelseitig bestückten Platinen realisiert, die über fünf Kontakte gekoppelt und in Sandwichbauweise miteinander verschraubt sind. Die Aufteilung der gesamten Funktionalität auf zwei Platinen hat sehr einfache Gründe. Bastelprojekte funktionieren selten auf Anhieb und je kleiner die Einheit ist, die im Falle eines Fehlers neu gefertigt werden muss, um so geringer ist der Aufwand. Aber es gibt auch technische Gründe. Durch den Aufbau mit zwei Platinen können die Treiberbausteine vom Controllerbaustein separiert werden. Die Treiberbausteine schaltet Ströme vom einigen hundert mA und das verursacht Störungen auf den Versorgungsleitungen die den empfindlichen Controller stören oder sogar zerstören können. Die Separation der Platinen vereinfacht die erforderliche Entkopplung ganz erheblich. Die Verwendung von doppelseitigen Platinen erleichtert zum einen die Entflechtung und vereinfacht die Kühlung der Treiberbausteine, da die Rückseite der Platine ans Kühlfläche mitgenutzt werden kann.
Die Controllerplatine enthält neben dem Controller mit zugehörigem Oszillator und 3,3 V Spannungsversorgung noch die lokalen Bedienelementen und die USB Schnittstelle. Die Treiberplatine enthält neben den beiden Treiberbausteinen noch die Referenzspannung für den I2C Bus sowie die Wannenstecker für den Anschluss der Schrittmotoren.
Als Controller kommt ein PIC32MX220F zur Anwendung, der über alle erforderlichen Leistungsmerkmale und Schnittstellen verfügt und mit dessen Funktionen und Entwicklungsumgebung ich aus anderen Projekten vertraut bin. Die lokale Schnittstelle umfasst fünf Schalter und zwei Leuchtdioden. Vier der Schalter dienen zum steuern der beiden Motoren in je zwei Richtungen und der fünfte Schalter dient zum ein- und ausschalten der Nachführung. Aus Gründen der Ergonomie sind die fünf Schalter als Mini-Joystick implementiert und zusammen mit den Leuchtdioden auf der Rückseite der Controllerplatine implementiert. Die Verwendung eines Joysticks in SMD Technik vereinfacht sowohl den Aufbau der Schaltung als auch die Verwendung der Handsteuerbox. Die gelbe Leuchtdiode signalisiert den Betriebszustand (Nachführung ein/aus über Blinkfrequenz) der Handsteuerbox während die rote Leuchtdioden Hardwarefehler signalisiert.
Die Versorgungsspannung von 12 Volt wird über SC2 eingespeist und über die X1 Schnittstelle an die Treiberplatine ausgekoppelt. Der Controller selbst benötigt lediglich 3.3 V , die von IC2 zur Verfügung gestellt werden. Weiterhin findet man in der Schaltung neben den lokalen Bedienelementen noch die USB Schnittstelle, den Oszillator und die Kontakte für die ISP-Programmierung. Die X3 Schnittstelle liegt parallel zu den lokalen Bedienelementen und ermöglicht den Anschluss externen Steuermittel (Joysticks , ST4 etc.).
Als Motortreiber kommt der AMIS-30624 Baustein zum Einsatz. Es handelt sich hierbei um einen sehr leistungsfähigen Schrittmotortreiber, der über eine IC2 Schnittstelle angesteuert wird, selbständig positionieren kann und dank der intrigierten H-Bridge Schrittmotoren mit bis zu 800 mA Stromaufnahme direkt ansteuern kann. Darüber hinaus ist er in weiten Bereichen parametrierbar und enthält umfangreiche Überwachungsfunktionen. Die Parametrierung erlaubt es unter anderem zwischen fünf unterschiedlichen Mikroschrittprogrammen zu wählen, den Arbeitsstrom und Haltestrom der Schrittmotoren separat vorzugeben sowie zwischen einer Vielzahl von Geschwindigkeitsprofilen zu wählen. Hierdurch wird nicht nur der Hardwareaufbau sehr einfach sondern auch der Aufbau der Firmware für den Controller gestaltet sich sehr einfach. Diese muss im Wesentlichen die Kommandos der USB Schnittstelle in Treiberkommandos der I2C Schnittstelle umsetzten. Die Überwachungsfunktionalität des AMIS-30624 umfasst die elektrische Verbindung zu den Motoren, die Höhe der Versorgungsspannung wie auch die Temperatur der Treiberbausteine selbst. Die von den Überwachungsfunktionen gefundenen Fehler sind als Statusparameter hinterlegt und können über die IC2 Schnittstelle abgerufen werden.
Neben den beiden Treiber ICs gibt es noch eine 5V Spannungsreferenz (IC2) für die I2C Schnittstelle und es ist ein EEPROM vorgesehen, der aber in der derzeitigen Ausbauvariante noch nicht verwendet wird und daher auch nicht bestückt werden muss. Die Schnittstelle X1 dient der Kopplung mit der Controllerplatine während die Schnittstellen X1 und X3 für den Anschluss der Schrittmotoren vorgesehen ist. Durch die Schnittstelle X4 wird der I2C Bus für spätere Erweiterungen nach außen geführt, so dass die Funktionalität der Handsteuerbox z.B. Um ein LCD Modul erweitert werden kann.
Firmware
Das Hauptprogramm der Firmware geht zunächst in eine Warteschleife ( Delay_us()), um nach Zuschaltung der Versorgungsspannung die Betriebsbereitschaft der I2C Geräte abzuwarten. Danach erfolgt die Initialisierung des USB-Stacks ( USBDeviceInit(), USBDeviceAttach()) und der anwendungsspezifischen Peripherie ( UserInit()).
Die eigentlichen Anwenderfunktionen sind in der System_Task() implementiert, die in einer Endlosschleife zyklisch aufgerufen werden. Neben der zyklisch aufgerufenen System_Task() gibt es noch drei nebenläufige Interrupt-Service Routinen, von welchen die Routine T2Interrupt() die Funktionalität der Firmware ganz wesentlich beeinflusst.
Die Routine T2Interrupt() stellt den zentralen Zeitgeber dar, welcher sowohl die Nachführung als auch alle übrigen Befehle zur Steuerung der Schrittmotoren koordiniert. Mit jedem T2 Interrupt wird ein Flag gesetzt (GC.clock_puls), welches in der Routine System_Task() ausgewertet wird und dazu führt, dass anstehende Positionieranforderungen an die Schrittmotoren in konkrete Befehle an die Motortreiber umgesetzt werden. Im Falle einer Anforderung zur Nachführung kann das ein einzelner Mikroschritt sein, im Falle eines nicht abgeschlossenen GoTo Befehls können das auch viele hundert Mikroschritte sein. Weiterhin werden in der Routine T2Interrupt() lokale Befehle zur Motorsteuerung (Befehle vom Joystick der Handsteuerung) ausgewertet und in entsprechende Flags umgewandelt, die dann ebenfalls in der Routine System_Task() ausgewertet werden.
Das Intervall des T2 Interrupts wird durch die Forderung nach einer möglichst hohen Nachführgenauigkeit bei gegebener Untersetzung der Schrittmotoren bestimmt. Die Ermittlung des T2 Interrupt Intervalls erfolgt über die Berechnung, in welchen periodischen Abständen ein Mikroschritt ausgeführt werden muss, um einen siderischen Tag nachzuführen. Dazu sind folgende "Getriebedaten" von Relevanz
Anzahl der Zähne des Schneckengetriebes bei der EQ5: 144
Untersetzung Schrittmotor aus Schneckenwelle: 36/20
Anzahl Schritte pro Umdrehung Schrittmotor: 200
Anzahl Mikroschritte je Vollschritt: 16
Daraus folgt, dass eine volle Umdrehung der Montierung 144*200*16*36/20 = 829440 Mikroschritte erfordert. Eine volle Umdrehung entspricht einem Tag oder 24*60*60=86400 Sekunden. Damit müssen für die Nachführung die Mikroschritt im zeitlichen Abstand 86400/829440 = 104,16 ms getätigt werden. Beachtet man, dass der siderische Tag um den Faktor 1,0027379 kürzer ist als der bürgerliche Tag, dann ergibt sich das Intervall zu 104,45ms.
Die beiden anderen Interrupt-Service Routinen haben eher untergeordnete Bedeutung. Die Routine T1Interrupt() hat ausschließlich die Aufgabe, die rote Leuchtdiode zurückzusetzen. Insbesondere werden die Aufrufe über die I2C Schnittstelle auf korrekte Ausführung überwacht. Ein Fehler wird über die rote Leuchtdiode signalisiert. Mit der Signalisierung wird gleichzeitig der Timer1 gestartet und wenn dieser das entsprechende Interrupt auslöst, wird die Leuchtdiode wieder gelöscht. Dadurch kann zwischen temporären Fehlern und permanenten Fehlern unterschieden werden. Die dritte Interrupt-Service Routine wird über den lokalen Taster zum Ein- und Ausschalten der Nachführung ausgelöst und setzt das entsprechende Flag in der Software.
Wie oben schon angedeutet, ist die Anwendungsfunktionalität im Wesentlichen in der Routine System_Task() implementiert. Mit jeden Aufruf wird als erstes die Routine APP_DeviceCustomHIDTasks() aufgerufen, welche Anforderungen von der USB Schnittstelle behandelt. Danach wird geprüft, ob ein Takt des zentralen T2 Taktgebers (GC.clock_puls) ansteht und wenn ja, werden anstehende Positionieranforderungen an die Schrittmotoren ausgeführt. Bei den Positionierungsanforderungen ist zu differenzieren zwischen lokalen Anforderungen (Joystick der Handsteuerbox), Anforderungen von der USB Schnittstelle und Anforderungen in Folge der eingeschalteten Nachführung. Höchste Priorität haben lokale Anforderungen, welche anstehende Befehle von der USB Schnittstelle außer Kraft setzen. Danach kommen die Befehle von der USB Schnittstelle und mit letzter Priorität kommen Anforderungen aus der Nachführung. D.h. Nachführbefehle werden nur dann ausgeführt, wenn keine sonstigen Positionieranforderungen anstehen.
Lokale Befehle zur Motorsteuerung sind grundsätzlich sogenannte MOVE Befehle. Die entsprechenden Fahrbefehle an die Schrittmotoren stehen so lange an, so lange der Befehl gegeben wird. Grundsätzlich können über MOVE Befehle kleiner Positionskorrekturen durchgeführt werden aber es können auch vollständige Neuausrichtungen des Teleskops erfolgen. Daher ist der MOVE Befehl in der Firmware progressiv implementiert, d.h. die Wirksamkeit des Befehls steigt je länger der Befehl ansteht. Ein neuer Befehl führt zunächst zu sehr keinen Korrekturen (1 Mikroschritt je Takt), danach wird in eine kontinuierliche Bewegung mit minimaler Fahrgeschwindigkeit gewechselt und wenn der Befehl noch länger ansteht wird auf maximale Fahrgeschwindigkeit beschleunigt und diese Geschwindigkeit wird beibehalten bis der Befehl zurückgenommen wird. Die progressive Ansteuerung gilt auch für MOVE Befehle, die über die USB Schnittstelle veranlasst werden. Damit ist es grundsätzlich auch möglich eine Autoguider an die lokale Bedienschnittstelle anzuschließen, um die Nachführung zu korrigieren.
Zu bemerken ist weiterhin, dass sich die Positioniermöglichkeit der Motortreiber auf Positionen beschränkt, die mit 16 Bit Mikroschrittadressen adressierbar sind. Da dies für die genaue Positionierung nicht ausreichend ist, verwendet die Firmware 32 Bit Mikroschrittadresse und gliedert diese in eine globale 32 Bit Komponente und eine lokale 16 Bit Komponente auf, wobei die lokale16 Bit Komponente der Adresse im Motortreiber entspricht. Die tatsächliche Adresse ergibt sich aus der Summe der globalen und der lokalen Komponente. Weiterhin ist zu bemerken, dass es sich bei den in der Firmware verwalteten Positionen immer um Mikroschrittpositionen handelt, die sich auf einen "Referenzpunkt" beziehen, der mit dem USB Befehl "COMMAND_CALIBRATE" als Nullpunk definiert wird. Die dazu gehörigen absoluten Positionen sind nur der PC Applikation bekannt. Positionieranforderungen der PC Applikation über die USB Schnittstelle werden grundsätzlich in Bogensekunden übergeben und in der Firmware in Mikroschritte umgerechnet. Zur Umrechnung dienen die Getriebeparameter RA_GF und DEC_GF, welche beschreiben, wievielMikroschritte für eine Bewegung vom einer Bogensekunde erforderlich sind.
Die übrigen Funktionen der Firmware dienen im Wesentlichen dem Zweck, die Bedienkommandos an die I2C Schnittstelle sowie an die Treiberbausteine derart zu kapseln, so dass sie einfach handhabbar sind oder sie sind Teil des von Microchip beigestellten USB Stacks.