Logo BugSoft Modellbau
 
Startseite
 
Flugzeuge
 
Schiffe/Boote
 
Autos
 
Hubschrauber
 
Elektronik
 
Airbrush
 
Links
 
Kontakt/Impressum
 
| BugSoft Modellbau | Elektronik | M.I.S.T.

M.I.S.T.

 ÜbersichtSchaltungProgrammNachbauDownloadVersions-Verlauf 


Das Programm ist noch unstrukuriert und unvollständig. Daher wird es noch nicht in seiner ganzen Schönheit enthüllt. Die einzelnen Teile erkläre ich aber schonmal:

Der Inkrementalgeber

Das Auslesen eines solchen Geräts ist einigermaßen einfach, wenn man weiß, wie es geht ;-)
Es gibt dazu verschiedene Ansätze. Der Artikel auf mikrocontroller.net beschreibt eine gut funktionierende Methode, und erläutert auch, warum andere Methoden nicht so gut geeignet sind. Hierbei wird in einem Timer-Interrupt der Zustand des Drehgebers kontinuierlich abgefragt. Diesen Code habe ich bei meinem Servotester Mk.II erfolgreich eingesetzt.
Hier möchte ich jedoch versuchen, einen anderen Weg zu gehen. Die Gründe dafür sind:
  • Ich möchte den Drehgeber nicht dauernd abfragen, auch wenn er sich gar nicht bewegt hat
  • Auch ein Update des Displays ist nicht dauernd nötig, wenn sich der Wert nicht ändert
  • Mit ein klein wenig Prellen können wir in unserem Fall leben. Wir wollen ja ein einfaches Menü bedienen bzw. nur einen Wert ändern, und keinen Servomotor mikrometergenau positionieren. Außerdem gibt es noch die Möglichkeit, hardwaremäßig etwas zu entprellen. Damit verkleinert sich das einzige Problem, was noch übrig ist.
Wer sich etwas auskennt, liest direkt ab, auf welche Methode ich schiele: Auswertung per Hardware-Interrupt! Dies wird zur Zeit entwickelt.

Das Display

Ein Display-Modul hatte ich ja auch schon bei meinem Servotester Mk.II erfolgreich eingesetzt. Dafür wurde der Code aus dem AVR-GCC-Tutorial von mikrocontroller.net eingesetzt. Daran gab es nichts auzusetzen, und mit dem neuen, kleineren, hintergrundbeleuchteten Modul des M.I.S.T. funktioniert er auch ganz hervorragend. Hier habe ich lediglich einige Delays anpassen müssen und die Port-Definitionen auf PORTB umgebaut, da auf den Port-Pins von PORTD die ADC-Pins liegen, und die brauche ich für die Spannungs- und Strommessungen.
Auch hier trumpft M.I.S.T. jedoch im direkten Vergleich zu seinem Vorgänger mit einem kleinen Sahnehäubchen auf. Eigentlich nur Kosmetik, hat aber Spass gemacht. Man kann dem Display-modul nämlich bis zu 8 frei definierbare Zeichen beibringen. Eins habe ich für ein Batterie-Symbol genommen, weitere 6...Naja. Seht selbst. Ein Bild sagt mehr als 1.000 Worte:



Die Sache ist eigentlich recht einfach. Die folgende Funktion macht die Zeichen auf dem Modul verfügbar. Sie können dann einfach mit den ASCII-Codes 0-7 angezeigt werden:



Die Zeichen werden einfach in einem Array als Bitmuster abgelegt. Wer genau hinguckt, erkennt sie wieder! Danach folgt der befehl ans Display, jetzt ins sogenannte CGRAM(Character Generator Random Access Memory) zu schreiben. Diesen kann man im Datenblatt des auf dem Modul verwendeten Controllers KS007b nachlesen (Tipp: alldatasheet.com). Danach schieben wir die Bits einfach zum Display und das wars! Das geht hier so einfach, weil die CGRAM-Adressen für die Zeichen bei 0 anfangen und direkt hintereinander liegen. Das kann je nach Diplay-Controller auch anders sein! Ein Großteil der Displays verwendet aber nicht mehr den originalen HD4470, sondern eben besagten KS007x. Sollte also passen. Wenn man bei Nachbau das Selbe Modul bestellt wie ich, sowieso.

Der Analog/Digital-Konverter

Er wird gebraucht, um die Betriebsspannung sowie den Servostrom zu messen. Beides wird über die Spannung an einem der ADC-Pins realisiert. Die folgende Funktion nimmt als Parameter den ADC-Kanal an, also den entsprechenden Pin, und gibt die an diesem Pin anliegende Spannung in Volt zurück:



Als erstes wird der Kanal gewählt. Dann wird der ADC an sich aktiviert. Der Prescaler, also der takt, mit dem der ADC läuft, wird auf 1/128 des Prozessortaktes eingestellt. Dies ist für unsere Anwendung schnell genug.
Dann wird eine Messung durchgeführt und verworfen. Bei der ersten Messung wird der ADC initialisiert, was zu Messfehlern führen kann(siehe Datenblatt!). Danach folgen in einer Schleife 5 Messungen, die aufaddiert werden. Danach wird der Wert durch 5 geteilt, um den Mittelwert aus den 5 Messungen zu erhalten. In der gleichen Zeile wird der Wert auch noch in Volt umgerechnet(laut Formel aus dem Datenblatt) und zurückgegeben. Die Konstante VREF enthält den Wert der Referenzspannung, also 2,5V.

Spannungsmessung

Damit ist es nun ein leichtes, an die Betriebsspannung zu kommen. Dazu habe ich folgende Funktion geschrieben:



Die Funktion macht nichts anderes, als den Wert mit den Werten des Spannungsteilers(siehe Schaltung) umzurechnen und so die tatsächliche Betriebsspannung zurückzugeben.

Strommessung

Analog dazu gibt es eine Funktion für die Strommessung. Ich denke diese ist selbsterklärend. Zur Berechnung des Stroms siehe Schaltung.



Zu den 3 Funktionen werden die entsprechenden Konstanten übersichtlich in einem Header File eingestellt.

Erzeugung des Servo-Impulses

Kommen wir zur eigentlichen Funktionalität des Geräts. Bevor man da heran geht, sollte man sich klar machen: Was will ich überhaupt erzeugen?
Folgendermaßen sollte so ein Servosignal aussehen:



Es soll also alle 20ms ein Impuls mit einer Länge zwischen 1 und 2ms erzeugt werden. 1ms entspricht der linken Endstellung(-100%) des Servos, 2ms der rechten Endstellung(100%), und ein 1,5ms langer Impuls wird unser Servo in die Neutralposition(0%) fahren. Soweit die Definiton. So gut wie alle aktuellen Computer-Sender erlauben aber eine Einstellung des Servowegs von -150% bis +150%, also von 0,75ms bis 2,25ms. Damit wir das mit unserem Tester auch simulieren können, machen wir das auch! Später soll noch ein Piepser/Summer vor Über- bzw. Unterschreiten der 100% bzw. -100% warnen.
Auch diesen Teil des Programms habe ich von meinen früheren Servotester-Projekten übernommen, sie haben nämlich sehr schön funktioniert. Bis ich dies ordentlich strukturiert und kommentiert habe, soll eine einfache Beschreibung an dieser Stelle ausreichen.
Es wird der 16Bit Timer des AVR im CTC-Modus verwendet. Über den Vergleichswert A, der im Register OCR1A zu finden bzw. zu setzen ist, wird eine Periodendauer von 20ms eingestellt. In der dazugehörigen Interrupt-Routine wird der Pin für das Ausgangssignal auf logisch 1 gesetzt. In der Interrupt-Routine für den Vergleichwert B wird der Ausgnag wieder auf 0 gesetzt. Die Impulslänge kann nun über den im Register OCR1B befindlichen Vergleichswert B bestimmt werden. Die Sache wird also zum Selbstläufer. Einfach OCR1B ändern, und das Servo fährt in die entsprechende Position.