Für die Steuerung des Pendels müssen dem Motor fortwährend neue Befehle gegeben werden. Da die Berechnung der Befehle auch einige Zeit in Anspruch nimmt, verwendet man normalerweise eine getaktete Ansteuerung. Bei der Steuerung über das neuronale Netz und vor allem beim Lernen des Netzes ist eine sehr genaue Einhaltung dieses Steuertaktes nötig.
Dazu ist auf der Schnittstellenkarte ein Timer eingebaut, der in einem bestimmten Takt, einstellbar sind 100 Hz bis 10 kHz, Interrupts auslösen kann. Diese Interrupts bewirken im Gerätetreiber das Aufrufen der Interruptfunktion pendel_interrupt(), welche bei jedem Takt einen Steuerbefehl an den Motor abliefert und die aktuellen Werte des Pendelsystems von der Hardware einliest. Hiermit ist sichergestellt, daß die Steuerung genau getaktet abläuft.
Der Gerätetreiber muß außerdem die Parameter der Hardware umrechnen, da das
Programm ein anderes Format verwendet. Die Hardware liefert Winkel im
Bereich von -2000 bis 2000, wobei der Winkel des Pendels relativ
zum Antriebsarm gemessen wird. Das Programm bekommt die Winkel über das
Device im Bereich von bis
bezüglich der Vertikalen.
Die vom Steuerprozeß benötigte Winkelgeschwindigkeit wird auch von
der Interruptfunktion berechnet:
Die Variable VCOUNTER wird in der Headerdatei pendulum.h definiert.
Die Steuerimpulse, die vom Interrupt an die Hardware gegeben werden, müssen vorher vom Programm berechnet werden und rechtzeitig zum Interrupt bereitstehen. Falls nicht rechtzeitig ein neuer Steuerbefehl an den Gerätetreiber übergeben wurde, wird nichts gesteuert. Falls mehrere Interrupts hintereinander ohne Steuerung auftreten, bewegt sich das Pendel in dieser Zeit ohne Steuerung, Totzeit genannt, als freischwingendes Pendelsystem. Wenn die Totzeit einen von der Stellung des Antriebsarms und der Kraft des Motors abhängigen Grenzwert übersteigt, wird das Pendel instabil und fällt um. Aus diesem Grund synchronisiert der Gerätetreiber das Programm, was so funktioniert:
Bei einem Lesezugriff auf das Device wird das Programm mit der
sleep() Funktion schlafen gelegt, bis neue Werte der Parameter durch die
Interruptfunktion gelesen wurden. Diese weckt mit wakeup() das
Programm wieder auf. Das Programm berechnet nun aus den gerade gelesen
Werten den neuen Steuerimpuls und übergibt ihn an den Gerätetreiber.
Danach versucht es wieder neue Werte zu lesen. Hier wird es nun wieder
schlafen gelegt usw.. Die Interruptfunktion schickt den vom Programm
übergebenen Steuerimpuls an die Hardware, bevor es das Programm wieder
weckt. Während das Programm schläft, können im System andere Prozesse
laufen. Das Zusammenspiel der einzelnen Teile ist in Abbildung
dargestellt. Im oberen Bereich ist das Pendelsystem
mit seinen Hardwareparametern dargestellt. Der von der Schnittstellenkarte
erzeugte Takt bewirkt jeweils einen Interruptaufruf im Gerätetreiber, welcher
die Parameter des Pendelsystems für das Programm umrechnet, die vom
Programm berechneten Steuerparameter an den Motor übergibt und den
Programmzugriff über das Device synchronisiert. Das
ganze Verfahren kann nur dann in der beschriebenen Weise ablaufen, wenn das
Programm bis zum nächsten Interrupt mit der Berechnung fertig ist.
Andernfalls würde es nicht mehr mit den Steuerimpulsen nachkommen, und es
würden regelmäßig Interrupts ohne Steuerung auftreten.
Abbildung: Zusammenspiel der einzelnen Teile bei der Steuerung