Realisierung: Software, Hardware: (Developmentboard Erweiterungen, Schaltplanentwicklung, Gehäuse, Platinenlayout), Prototyp Erstellung, Prototyp Test, Kapitelzusammenfassung

Realisierung

Software

Anfänglich wurde sehr umständlich programmiert und erst durch die Verwendung des JTAG Interfaces, war es nach einiger Zeit möglich effizienter zu programmieren. Die Softwareprogrammierung fand immer parralel mit den Hardwareentwicklungen statt. Der hierbei entstandene Programmcode wird in den nächsten Unterkapiteln vorgestellt.

Code-unabhängige Einführung
Zunächst initialisiert die Software die Hardware. Nun wird mit den Startwerten die Pulsdauer berechnet. Mit der berechneten Pulsdauer wird daraufhin die PWM gestartet und die Startwerte auf dem LCD ausgegeben. Anschließend werden in einer Endlosschleife die Benutzereingaben verarbeitet (Drehgeber), oder gegebenenfalls neue Pulsdauern berechnet und an die PWM übergeben. Ebenfalls werden die neuen Werte auf dem Display ausgegeben.


Abbildung 5: Gesamtprogramm

main.c
Nach dem Start wird zunächst mit dem Unterprogramm calc_pulse_time aus den Startwerten die Pulsdauer berechnet, mit pwm_start dann die PWM initialisiert und gestartet.

Nun wird das LCD initialisiert und die Startwerte mittels print_lcd_rpm auf dem Display ausgegeben. Auf die Abläufe bei der Ausgabe der Daten auf dem Display wird später noch genauer eingegangen.

Alle folgenden Programmteile laufen nun in einer Endlosschleife ab.

Es werden als erstes in jedem Durchlauf der Endlosschleife die Zustände der I/O Pins eingelesen.

Da die PWM nur beeinflusst werden darf wenn sichergestellt werden kann, dass sie sich am Anfang der Periode befindet, wird dies nun mit Hilfe von pwm_check geprüft.

Hierbei wird geprüft ob sich der Ausgang der PWM gerade in der high-Phase befindet und ob er zusätzlich bei der letzten Kontrolle low war. Sind diese beiden Vorgaben erfüllt, befindet man sich irgendwo am Anfang der high-Phase und es kann sichergestellt werden, dass mindestens 1 ms für die Änderung der Gesamtpulszeit zur Verfügung stehen. Es wird damit nun also die PWM beeinflusst und sich gemerkt das diese Änderung abgearbeitet wurde. Sollte sich der Ausgang in der low-phase befinden, wird sich lediglich dieses gemerkt um bei nächsten Durchlauf prüfen zu können ob der Ausgang vorher low war.

Nach der Rückkehr zum Hauptprogramm wird nun geprüft ob bereits 1000 Durchläufe seit dem Start bzw. nach dem letzten Ausführen der nun folgenden Programmteile durchgeführt wurden. Sollte dies der Fall sein und die Werte haben sich geändert, werden die aktuellen Werte der Umdrehungen auf dem Display ausgegeben (print_lcd_rpm), eine neue Pulszeit berechnet (calc_pulse_time) und die 1000 Durchläufe ab dem Zeitpunkt neu gezählt.

Anschließend wir nun mit Hilfe von read_rotary_encoder geprüft ob Benutzereingaben mittels des Drehgebers vorliegen.

Zunächst wird nun geprüft ob die Eingänge sich seit der letzten Kontrolle geändert haben. Sollte dies der Fall sein wird geprüft ob Eingang A high ist und ob er bei der letzten Kontrolle low war, also ob an A eine Flanke vorlag. Wenn so eine Flanke an A detektiert wurde, wird geprüft ob B vorher high war also die Flanke dort vorher vorlag, so kann die Drehrichtung festgestellt werden. War an B vorher eine Flanke und es wird sich eine Erhöhung gemerkt, wird der Erniedrigungszähler zurückgesetzt und der Umdrehungswert über rounds_per_min_plus erhöht. Wurde an B vorher keine Flanke detektiert so wird, eine Erniedrigung gemerkt, der Erhöhungzähler zurückgesetzt und der Umdrehungswert mittels rounds_per_min_minus erniedrigt. In den Unterprogrammen wird lediglich geprüft ob die neuen Werte den Vorgaben für minimale bzw. maximale Pulszeit entsprechen und diese dann beeinflusst. Auf den Nutzen der Zähler wird später bei deren Auswertung noch näher eingegangen.

Nun wird im Hauptprogramm, nachdem gleichen Prinzip wie bei der 1000 Durchlaufprüfung, geprüft ob 5000 Durchläufe erreicht sind. Sind diese erreicht wird mit check_speed_re geprüft ob seit der letzten Kontrolle mehrere Eingaben erfolgten und gegebenenfalls durch eine Verstärkung der Erhöhung bzw. der Erniedrigung darauf reagiert.

Mittels der bereits erwähnten Zähler wird nun geprüft ob mehr als 6 Erhöhungen bzw. Erniedrigungen vorliegen. Ist dies der Fall so werden diese quadriert und verdoppelt und die Umdrehungen mittel rounds_per_min_plus oder rounds_per_min_minus um den errechneten Wert erhöht oder erniedrigt. Sollten weniger als 6 Erhöhungen aber mehr als 3 vorliegen so wird genauso verfahren der Wert aber nur quadriert und nicht zusätzlich verdoppelt. Diese Funktion dient der Vereinfachung der Bedienung durch schnelleres Durchschreiten der Werte bei schnellerer Drehung. Es ist also lediglich eine Komfortfunktion.

Nach dieser Prüfung startet die Endlosschleife erneut.

Auf der folgenden Abbildung kann dieser Ablauf, durch verfolgen der Pfeile in die Unterprogramme und zurück, nachvollzogen werden.


Abbildung 6: Beziehungen zwischen Haupt- und Unterprogrammen der main.c
(Für eine vergrösserte Ansicht bitte auf die Abbildung klicken)

lcd.c
Nachdem aus dem Ablauf des Hauptprogramms das Unterprogramm print_lcd_prm aufgerufen wurde. Läuft die Umwandlung der Werte und deren Ausgabe auf dem Display in zwei Stufen ab. Zunächst erfolgt die Umwandlung des Wertes für die Umdrehungen pro Minute und dessen Ausgabe, im Anschluss das selbe für die Umdrehungen pro Sekunde. Für die Umwandlung und anschließende Ausgabe der Umdrehungen pro Minute wird das Unterprogramm int_to_char_min gestartet.

Hier werden zwei Arrays angelegt. Im ersten werden die bei der Umrechnung von int in einzelne chars entstehenden Werte gespeichert. Dies geschieht durch das Teilen des int-Wertes durch zehn und des Konvertieren des Restes in chars. Dies wird solange fortgesetzt bis alle Stellen ermittelt sind. Im zweiten Schritt werden die Werte in umgekehrter Reihenfolge in das zweite Array geschrieben und gegebenenfalls ein Tausenderpunkt eingefügt. Außerdem wird sichergestellt das das Ende des so entstandenen Strings durch eine binäre Null gekennzeichnet wird.

Ist dies geschehen wird das Unterprogramm lcd_print_rounds_min aufgerufen.

Hier wird mittels des Unterprogramms lcd_print der Text „U/min“ ab der Aktuellen Stelle auf das Display geschrieben. Da der Cursor nicht bewegt wurde ist dies in Zeile 1 links. Im Anschluss wird lcd_print_line_right aufgerufen dort mittels lcd_cursor_mid der Cursor auf die Mitte der Zeile gesetzt und der Aktuelle Wert der Umdrehungen pro Minute durch lcd_print auf die rechte Seite von Zeile 1 des Displays geschrieben.

Nach der Rückkehr zu print_lcd_rpm wird der fast gleiche Vorgang für die Umdrehungen pro Sekunde wiederholt. Dies geschieht zunächst durch das Starten von int_to_char_sek.

Hier werden ähnlich wie bei int_to_char_min. Zwei Arrays erzeugt die Werte durch Teilen durch 10 errechnet und umgewandelt und in das zweite Array einsortiert. Allerdings wird hier ein Komma eingesetzt und bei Werten unter Eins eine Null vorm Komma eingefügt.

Nach Abschluss der Umwandlung wird lcd_print_rounds_sek aufgerufen.

Dort wird nun per cursor_line2 der Cursor auf die erste Stelle der zweiten Zeile gesetzt und mit lcd_print der Text „U/sek“ dort ausgeben. Um nun den ermittelten Wert der Umdrehungen pro Sekunde auszugeben, wird lcd_print_line2_right gestartet. Dieses Unterprogramm setzt durch cursor_line2 den Cursor auf die zweite Zeile, dann mittels lcd_cursor_mid auf die Mitte dieser und gibt dort den aktuellen Wert mit Hilfe von lcd_print aus.

Damit sind ist die Ausgabe abgeschlossen und es wird von print_lcd_rpm aus zu dem es aufrufenden Programmteil zurückgekehrt. Die Aufrufe und Programmwege lassen sich ebenfalls wie bei der main.c in der folgenden Abbildung durch die Pfeile nachvollziehen.


Abbildung 7: Beziehungen zwischen Haupt- und Unterprogrammen der lcd.c
(Für eine vergrösserte Ansicht bitte auf die Abbildung klicken)

Hardware

Die Soft- und die Hardware Konstruktion fand immer zusammen statt und deswegen wurde das Development Board auch laufend erweitert. Den aktuellen Stand der Erweiterungen, sowie auf die Dimensionierung der Bauteile wird in dem nächsten Punkt genauer eingegangen.

Developmentboard Erweiterungen

Die erste Erweiterung war das herausführen der Debugjumper und Resettaster, da bei den Flashvorgängen der Jumper enabled/disabled werden mussten, was aufgrund der Bauform des Boards doch sehr umständlich war. Zudem wurde die Spannungsversorgung auf eine Lochrasterplatine platziert, um ebenfalls eine bessere Arbeitsumgebung zu schaffen.


Abbildung 8: Erste Erweiterungen auf einer Lochrasterplatine

Anschließend wurden die Ports P0.15 und P0.16, 5 V Versorgungsspannung und Ground (GND), sowie der Port P0.8/PWM4 herausgeführt. Die Ports P0.15 und P0.16 wurden mit den Ausgängen A und B des Drehgebers verbunden und dieser wurde mit den 5 V versorgt. An die PWM4 Leitung wurde eine grüne LED mit Vorwiderstand angeschossen, um den PWM-Ausgang überwachen zu können.

Nachdem die PWM softwareseitig funktionierte und auch die LED gepulst werden konnte, wurde mit der Dimensionierung des Prototypen weitergemacht.


Abbildung 9: Spannungsversorgungsstrang für die Blitz-LED

Auf der nachfolgenden Lochrasterplatine wurde die entwickelte Schaltung aufgebaut um die Funktion zu testen. Der PWM4 Ausgang des Mikrocontrollers ist mit dem Gate eines N-Kanal MOSFETs verbunden der bei einer anliegenden logischen Eins die Kathode der Power-LED mit Ground Potenzial verbindet und so den Flash freigibt.

Da die PWM4 Leitung durch einen Schalter unterbrochen werden kann, um die Power-LED ein und aus zu schalten, wird uber einen Pulldown-Widerstand sichergestellt das in diesem Fall der Gate Anschluss auf Ground Potenzial gezogen wird und die Power-LED aus ist.

Die Versorgungsspannung der Power-LED wird durch einen 5 V LDO-Reglers realisiert, dessen Ausgangsstrom mittels Widerstanden (6,8 Ohm) begrenzt wird. Da aber der fur die LED benotigte Strom hoher ist, wird mittels eines (680 uF) Kondensators gepuffert und danach die LED uber Vorwiderstande (1,2 Ohm) damit versorgt.


Abbildung 10: Aufbau des Blitz-LED Strangs auf Lochrasterplatine

Erste Tests mit einem Gehäuse-Lüfter verliefen überaus positiv. Bei normaler Raumhelligkeit ist der markierte Streifen immer noch gut sichtbar.


Abbildung 11: Test mit 120mm Lüfter

Schaltplanentwicklung

Um eine komplette Schaltung für einen Prototypen zu entwickeln, wurde der von Olimex bereitgestellte Schaltplan des Developmentboards analysiert sowie auf die Bedürfnisse eines batteriebetrieben Gerätes angepasst und die zusätzlich entwickelten Schaltungen der neuen Peripherie hinzugefügt. Außerdem wurde nicht benötigte Hardware entfernt und der Baustein der RS-232 Schnittstelle auf eine optionale Zusatzplatine ausgelagert.


Abbildung 12: Olimex Schaltungslayout des MT-LPC-2106 [OLI-11]
(Für eine vergrösserte Ansicht bitte auf die Abbildung klicken)


Abbildung 13: Selbstentwickelter Schaltplan mit den dimensionierten Bauteilen
(Für eine vergrösserte Ansicht bitte auf die Abbildung klicken)

Die Versorgungsspannung (Batterie oder externes Netzteil) wird mittels vier LDO Reglern in die auf dem Board benötigten Spannungen (2 mal 5 V, 3,3 V und 1,8 V) gewandelt. Die 5 V Versorgungsspannung dienen einmal zur Versorgung des LCD-Displays und des Drehgebers und mittels des zweiten LDO 5 V Reglers zur Versorgung der Power-LED. Mit den 3,3 V werden der Mikrocontroller und dessen Schnittstellen versorgt. Die 1,8 V sind die Versorgungsspannung des Mikroprozessorkerns. Die Power-LED Schaltung wurde bereits in Kapitel 5.2.1 erläutert, deswegen wird an dieser Stelle darauf nicht näher eingegangen.

Die Beschaltung des Mikrocontrollers bzw. dessen Jumper-Ports und der Schnittstellen, wurden weitestgehend vom Olimex Developmentboard übernommen. Es wurde sich aber auf die benötigten Schnittstellen beschränkt. (JTAG Interface und RS-232 über optionale Zusatzplatine)

Das Alphanummerische LCD-Display wird über vier Datenleitungen und die Steuerleitung mit den Port des Mikrocontrollers verbunden. Damit keine Änderungen der Software nötig wurden, blieb die Belegung identisch mit der des Developmentboard.

Die Ausgänge des Drehgebers wurden an die Ports P0.15 und P0.16 angeschlossen. Da die fünf Taster nicht benötigt werden, wurde auf sie vollständig verzichtet.

Gehäuse

Nachdem die Entscheidung für ein Gehäuse aufgrund für uns passender Außenmaße, passendendem Displayauschnitt, einer guten Lieferbarkeit, einem Batteriefach für ein 9 V Block und dem Support eines großen Herstellers (Detailierte Zeichnungen, 3D-Modelle und Materialangaben) auf das BOS751 von Bopla gefallen war, wurde mit den durch das Gehäuse festgelegten Außenmaßen mit dem Design des Layouts begonnen.

Da nun durch das Gehäuse sowohl die Maße, als auch die Positionen des Displays, der Schalter und Taster, des Drehgebers, der Power-LED und den Anschlüssen vorgegeben waren, wurden diese Zwecks Realisierbarkeit in ein 3D-Modell übernommen, welches mit Google Sketchup angefertigt wurde.


Abbildung 14: Google Sketchup 3D Modell

Platinenlayout

Die aus dem 3D-Modell festgelegten Abmessungen und Positionen wurden ins Layout übernommen und die Bauteile, im Besonderen die Buchsen- und Steckleisten, wurden entsprechend positioniert.


Abbildung 15: Eagle Platinenlayout

Da unter dem Display aufgrund der Bauhöhe und der Erreichbarkeit nur die liegenden Steckkontakte verwendet werden konnten, wurde der dort ungenutzte Platz für den Mikrocontroller verwendet. Die mit vielen Datenleitungen angebundenen Steckverbinder (LCD und JTAG Interface) wurden so positioniert, dass deren Verbindung zum Mikrocontroller mit möglichst wenigen Brücken realisiert werden konnte.

Ähnlich dem Schaltplan wurde die Schaltung für die Power-LED einzeln und ohne Überkreuzungen mit den restlichen Schaltkreisen ausgeführt. Die Spannungs-versorgung wird über eine zwei-polige Steckleiste am unteren Rand der Platine aufgelegt und dort direkt auf die LDO Regler verteilt.

Die untere Seite der Platine (Layer 2) wird zur Realisierung notwendiger Brücken und als durchgehende Massefläche verwendet. Der oberste Teil der Platine wird zur Befestigung und Versorgung der Power-LED deren Kühlung und der Fixierung des dazugehörigen Reflektors verwendet. Sie kann abgetrennt und so an der senkrechten Oberseite des Gehäuses positioniert werden.

Die Anschlüsse der Taster und Schalter bzw. der Spannungsversorgung, der Power-LED und des Drehgebers werden über gewinkelte Steckverbinder ausgeführt. Das JTAG Interface wird über einen der JTAG -ARM Norm gerechte Steckleiste realisiert. Die benötigten Jumper und die optionale RS-232 Zusatzplatine werden über einfache Jumperleisten aufgesteckt.

Prototyp Erstellung

Das unter Kapitel 5.2 entwickelte Layout der Platine wurde zur weiteren Erstellung bei der Firma PCB-Pool in Auftrag gegeben. Durch das Zusammenlegen mehrere Aufträge garantiert PCB-Pool eine kostengünstige Produktion. Zudem wird zu jeder Platine ein Stancil mitgeliefert, der für die spätere Montage der SMD-Bauteile verwendet werden kann. Mit Hilfe dieses Stancils kann die Lötpaste gleichmäßig auf den Kontaktierungen gleichmäßig verteilt werden. Anschließen werden die SMD-Bauteile dann mit einer Pinzette oder einer Saugvorrichtung sauber auf die Lötpaste platziert.


Abbildung 16: SMD-Vorbereitung mit Stancil


Abbildung 17: Kontaktierungen mit Lötpaste

In dieser Abbildung sind die SMD-Kontaktierungen mit der grauen Lötpaste versehen worden und konnten daraufhin bestückt werden. Anschließend wurden die Bauteile mit der Platine in einem Reflow-Ofen verlötet.


Abbildung 18: Reflow-Ofen


Abbildung 20: Temperaturanzeige


Abbildung 19: Platine mit bestückten SMD-Bauteilen

In Abbildung 18 ist der Reflow-Ofen zu erkennen indem die bestückte Platine zum verlöten für sieben Minuten, die die in Abbildung 20 gezeigte Temperaturkurve durchläuft. Abhängig von dem eingesetzten Material sowie den Bauteilen verlaufen die Kurven dann anders. Das Ergebnis kann in Abbildung 19 betrachtet werden. Die Bauteile sowie der Mikrocontroller wurden auf diese Weise sauber mit der Platine verlötet.

Die Durchsteckmontage der übrigen Bauteile erfolgte zu einem späteren Zeitpunkt und wurde konventionell mit einer Lötstation von Hand verlötet.


Abbildung 21: Fertig bestückte Platine

Prototyp Test

Der Prototyp wurde nach der Fertigstellung an diversen Lüftern getestet, da diese jedoch keine stabilen Werte lieferten wurde das Gerät an einem Kleinantrieb getestet. Dieser getestete Kleinantrieb steht in dem Antriebelabor von Herrn Schenke. Über eine PC-Software kann eine genaue Drehzahl eingestellt werden.


Abbildung 22: Mit der Software wurden 1200 upm eingestellt


Abbildung 23: Kleinantrieb bei 1200 upm

Als Referenz wurde das „alte“ Drehzahlstoboskop von Herrn Schenke verwendet und der Wert von 1199-1200 konnte ziemlich genau bestimmt werden. Mit dem Nachbau konnte der Wert 1191 ermittelt werden. Daraufhin wurde eine Messreihe aufgenommen die folgendes Ergebnisse lieferte:


Tabelle 3: Messreihe 1 - Drehzahlen in upm

Der Nachbau des Drehzahlstroboskops liegt um genau 7,5 ‰ daneben. Diese konnten jedoch über die Änderung, der für die Pulszeiten zuständigen konstanten onems (eine Millisekunde), oneflash (Zeit des Blitzes entspricht einer halben Millisekunde) sowie oneminute (eine Minute) angepasst und somit ausgeglichen werden, sodass eine weitere Messung an dem gleichen Testaufbau folgendes Ergebnis lieferte:


Tabelle 4: Messreihe 2 - Drehzahlen in upm

Somit konnten die ersten Ungenauigkeiten eingestellt werden und das Drehzahlstroboskop arbeitet einwandfrei.

Kapitelzusammenfassung

Die Software Ride7 und der JTAG Adapter von Raisonance waren der richtige Ansatz, um das Projekt zum Abschluss bringen zu können. Die vorher erstellten Lochrasterplatinen mit den Schaltern ermöglichten komfortableres Arbeiten. Ein riesen zeitlichen Vorteil brachte auch das Live-Debuggen per JTAG Interface. Der Quellcode konnte leicht über Ride7 direkt in den RAM des LPC-2106 geladen werden und nebenbei wurden noch Schreibzyklen für das flashen des Chips gespart, sodass neben der Zeit auch noch wirtschaftlicheres Arbeiten möglich war.

Grade am Anfang des Projektes machte die mangelhafte Entwicklungsumgebung das Arbeiten sehr mühselig und Demotivation machte sich breit. Als dann auch noch eine andere Gruppe die zeitgleich mit dem gleichen Board programmierte aufgab, packte uns erneut der Ehrgeiz und es war möglich in nur wenigen Wochen die ersten lauffähigen Erweiterungen herzustellen.