Control Logic

Herangenehsweise und Schaltungsideen

Unsere Aufgabe ist es Steuerspannungen für die Oszillator Schaltung so zu generieren, dass diese in Töne bzw. Melodien umgewandelt werden konnen. Mit dieser Aufgabenstellungergaben sich die folgenden Fragen:

  • Wie soll unterschieden werden, welche/r Melodie/Ton abgespielt werden soll ?
  • Wie sollen die Steuerspannungen generiert werden ? 

Für die Beantwortung der ersten Frage benötigten wir zuerst eine konkrete Vorstellung von den Signalen welche unserer Schaltung vermitteln sollten, was passieren soll. Diesbezüglich einigten wir uns mit den hierfür verantwortlichen Kleingruppen (Eingabe und Spiellogik) auf einfache Bit Signale. Mit diesem Wissen konnten wir uns genauer überlegen wie die Unterscheidung der einzlenen Zustände ablaufen könnte. Wir entwarfen hierfür zunachst ein Schaltnetz, welches je nach anliegendem Eingangszustand wie ein Multiplexer agieren und so eine Steuerspannung auswählen sollte. Dieser Entwurf wurde allerdings verworfen, da das Schaltnetz in etwa den Umfang von zwei doppelseitig bestuckten Europlatinen gehabt hätte und somit sehr aufwändig zu bestücken gewesen wäre und es außerdem deutlich unflexibler als ein Mikrocontroller gewesen wäre. Genau aus diesem Grund entschieden wir uns letztlich für einen solchen.

Die benötigten Steuerspannungen wollten wir mit einem mit verschiedenen Spannungsteiler erzeugen und anschließend an einen Ausgang weitergeben. Dabei ergab sich die folgende Frage:

  • Welches Bauteil wählt zwischen den zu Verfügung stehenden Spannungen und schaltet diese an den Ausgang weiter ?

Unser erste Gedanke galt Mosfet Transistoren welche wir als Schalter benutzen wollten. Diese könnten wir mit dem Mikroprozessor ansteuern. Eine andere Idee war es einen Demultiplexer zu verwenden welche je nach dem wie seine Steuerleitungen liegen eine an ihm
anliegende Spannung an den Ausgang weiterschaltet. Wir hielten den Demultiplexer für die elegantere Lösung, da dieser weniger Steuerleitungen vom Mikroprozessor gesetzt bekommen müsste (je Mosfet wäre eine Schaltung benötigt worden).

Zur Vermeidung von Schwankungen der Versorgungsspannung, welche letztlich in einem Variieren der Frequenz eines Tones resultiert hätten, riet uns unser Tutor noch dazu einen Spannungswandler in die Schaltung zu integrieren. Zusätzlich wären bei unserer momentanen Schaltungsidee die Ausgangsspannungen nicht belastbar gewesen, was denkbar ungünstig für alle von den Steuerspannungen Gebrauch machenden Schaltungen gewesen wäre. Deswegen entschieden wir uns noch einen Operationsverstärker in die Schaltung mit einzubauen. Damit waren die Entscheidungen über alle Kernelemente getroffen. Es sei jedoch gesagt, dass diese Entscheidungen zumeist während des Schaltungsentwurfes und nicht alle im Voraus getroffen worden waren.

Schnittstellen

Damit aus den, im vorherigen Abschnitt geschilderten, Ideen eine Schaltung entworfen werden konnte, benötigten wir konkretes Wissen über die Schnittstellen, unserer Schaltung mit denen von anderen Gruppen. Wir hatten uns zu Beginn auf Bits als Signale bzgl. des jeweils nliegenden Zustandes geeinigt aber nicht auf eine konkrete Anzahl an Bitleitungen sowie eine Codierung der einzelnen Bits. Des Weiteren musste geklärt werden welche Versorgungsspanungen unsere Bauteile benötigen würden. Die Klärung ergab die in der folgenden Tabelle aufgeführte Bitcodierung, gleichzeitig wurde die Anzahl der Bits welche wir von der Spiellogik erhalten wurden auf 3 und die, welche wir von der Eingabe erhalten werden würden, auf 4 festgelegt.

CodierungTabelle 1: Codierung

Zu den in der Tabelle genannten Zuständen sei noch folgendes gesagt. Die Zustände „Ton1“ bis
„Ton4“ stehen für einzelne Töne, von denen jeder je einem Buzzer zugeordnet wird. Der Zustand „Lose“ steht für einen Ton welcher abgespielt werden soll, sobald ein Spiel endet. Der Zustand „An“ beschreibt eine Melodie welche beim Anschalten des Gerätes abgespielt werden soll. Liegt Zustand „Highscore“ an so wird von der Spiellogik eine Melodie welche das Setzen eines neuen Highscores charakterisiert, gefordert. Der Zustand „Silent“ beschreibt nun den Fall, für den unsere Schaltung nichts tun soll. Was die Versorgungsspannung angeht, so stellte, die uns dafür zuständige Gruppe, zwei Spannung von je 5 bzw. 10 V zur Verfügung.

Zusätzlich zu den „globalen“ Schnittstellen haben wir noch eine interne Schnittstelle, über welche der Oszillator Platine zwei Signale (Tonenable und VCO) übergeben werden.

Schaltungsentwurf

Mit dem Wissen über die elektrischen Bauteile, welche wir verwenden wollten, ergaben sich konkretere Fragen über deren Beschaltung. Beispielsweise benötigten alle von uns verwendeten ICs, Entkoppelkondensatoren. Nachdem die Beschaltung aller Bauteile geklärt war, konnte der Schaltplan „aufgesetzt“ werden. Das Resultat war das in dem folgenden Bild dargestellte:

FresherPlanYoAbbildung 1: Sound Logik Schaltplan

Zum genaueren Verständnis des Schaltplans seien an dieser Stelle noch ein paar Worte erwähnt. In der Ecke oben links befindet sich ein 6-Pin ISP Stecker, dieser dient als Schnittstelle zum Austausch von Signalen zwischen den Sound Platinen. Rechts daneben befindet sich der bereits erwähnte Spannungsregler (LM7805), welcher die Versorgungsspannung des sich rechts neben ihm befindlichen Spannungsteilers glättet. Der Spannungsteiler besteht aus fünf Potentiometern, dies ist praktischer als fixe Widerstände, da so noch nachträglich „gestimmt“ werden kann. Wieder weiter rechts davon, ist ein Block aus, für die Schaltung nicht relevanten, Operationsverstarkern zu sehen. Diese sitzen auf demselben IC wie der von uns verwendete Operationsverstärker. Damit die unbeschalteten OPVs nicht hin- und herschwingen und so die Haltbarkeit des ICs deutlich verringern, wurden diese noch mit der Masse Leitung verbunden. Der von uns verwendete IC ist ganz links zu finden. Die Beschaltung mit zwei in Reihe geschalteten Widerständen führt zu einer Verstärkung um den Faktor 2, welche erforderlich war um Steuerspannungen zu erzeugen, welche in den Ansteuerungsbereich des Oszillators voll ausnutzten. Der Demultiplexer (74hc/hct4054) ist links mittig platziert. Zu seiner Beschaltung lässt sich nicht viel sagen, außer das er wie alle anderen ICs mit einem Entkoppelkondensator bestückt ist, welcher zwischen seinem Massen und Versorgungsspannungspin geschaltet ist. Das letzte Bauteil stellt den von uns verwendeten Mikrocontroller (Atmega8 -16p) dar. Ihm zugehörig ist noch eine, sich im Schaltplan unter ihm befindliche, 6-Pin Schnittstelle über welcher sich der Controller programmieren lässt. Zu guter Letzt ist am linken Rand noch die „globale“ Schnittstelle zu sehen, über welchen unsere Bauteile Ihre Versorgungsspannungen etc. erhalten.

Testaufbau

Der Testaufbau wurde wie üblich auf einem Steckbrett verwirklicht. Hierbei sind wir wie folgt schrittweise vorgegangen:

  • Beschaltung des Microcontrollers

Wir beschalteten zunächst mit die nötigen Pins des Microcontrollers zur Programmierung und legten die Versorgungsspannung U_V = 5V an, danach führten wir die Programmierung durch. Zur Simulation der Eingangssignale (insgesamt 7 bit) benutzten wir einen 8-fachen Schalter, um die Ausgangssignale (insgesamt 4 bit) zu verdeutlichen wurden 4 LEDs angesteuert.

  • Ergänzung des A/D-Wandlers

Der nächste Schritt beinhaltete die Einbindung des A/D-Wandlers und der Steuerspannungsteiler. Das 5 Töne erzeugt werden mussten, wurden 5 Potentiometer von jeweils 10 kOhm auf Eingang 1-5 des A/D-Wandlers geschaltet, Eingang 0 musste aufgrund des Programms des Microcontrollers freigelassen werden. Die Eingangssignale wurden erneut per Schalter erzeugt, die Ausgangsspannungen wurden dieses mal direkt gemessen, um sie den vorher eingestellten Potentiometer zuordnen zu können. Lediglich das TonEnable-Bit wurde erneut per LED visualisiert.

  • Linearregler und Operationsverstärker

Zuletzt mussten nur noch der Linearregler zur Glättung/Stabilisierung der Versorgungsspannung der Potentiometer und der Operationsverstärker zur Gewährleistung einer konstanten Ausgangsleistung hinzugefügt werden.

Nachdem unsere Schaltung auf dem Steckbrett realisiert wurde, konnten wir die drei Untergruppen Logik, Oszillator und Verstärker verschalten und mittels eines Lautsprechers die 5 Töne und 2 Melodien ausgeben.

Quellcode

Der Programmcode kann in folgende Blöcke zusammengefasst werden:

  1. Defines

defines

Mithilfe dieser Gruppe können Bezeichnungen für den Verlauf des Programmes festgelegt werden, die eine nachträgliche Korrektur erleichtern. Außerdem werden Funktionen und benötigte Parameter aufgerufen, Hilfvariablen (state1 und state2) deklariert, welche für die spätere if-Verzweigung von Nutzen sind, und Hilfskonstanten für Berechnungen erzeugt.

2.  Main- und while-Funktion

mainundwhile

Im main-Abschnitt des Programms werden Ein- und Ausgangspins deklariert sowie interne Pull-Up Widerstande aktiviert. Nun wird die while-Schleife aufgerufen und die Hilfsvariablen werden initialisiert. Die an den Eingangspins anliegenden Zustände werden nun ausgelesen, mithilfe der Hilfskonstanten verrechnet und anschließend in den Hilfsvariablen gespeichert. Danach wird eine kurze Verzögerung ausgeführt um der Spiellogik die Möglichkeit zu geben, bei falschem Knopfdruck den „Lose“ Ton abzuspielen.

3.  Töne durch Logik

erstesif

In diesem Block sind die „Töne“ definiert. Per if-Bedingung wird geprüft, ob die Spiellogik einen Ton oder eine Melodie spielen möchte, mit der switch-Funktion und der zuvor berechneten Hilfsvariable state1 wird der passende „case“ ausgewählt. Nun werden im jeweiligen „case“ die passenden Ausgänge gesetzt, für 500ms gehalten und wieder auf null gesetzt. Anschließend springt das Programm wieder an den Anfang der while-Schleife und es werden die state-Variablen neu berechnet.

4.  Melodie durch Logik

melodien

Dieser Block gehört noch zum Logik-Zweig der if-Verzweigung und erzeugt die Melodien. Dies geschieht analog zur Tonerzeugung, nur werden die Töne aus akustischen Gründen halb so lang gehalten.

5.  Töne durch Buzzer

Abschließend steht der if-Zweig für die Buzzer-Töne, der lediglich aus den 4 „cases“ der Grundtöne besteht. Allerdings haben diese eine eher unübliche Bezeichnung, da state2 einen binären Wert gespeichert hat, der aufgrund der Programmarchitektur erst an dritter Stelle eine Zahl ungleich eins annehmen kann. Die für die „cases“ bezeichnenden Dezimalzahlen sind somit 7, 11, 13 und 14.

zweitesif

Platine und Layout

Bei allen, im Voraus gemachten, theoretischen Überlegung, zählt letztlich nur eine die gestellten Aufgaben erfüllende, funktionierende Platine vorweisen zu können. Das für diese benötigte Layout wird mit dem Program Eagle erstellt. Was nach einem einfachen Vorgang klingt, war in der Praxis aüßerst Nerven aufreibend, da einem die Funktionsweise des Programms zu Beginn nicht gleich erschließt, sodass es einige zeitaufwändige Anläufe bedurfte bis unser Tutor mit dem Layout zufrieden war. Das Resultat ist in der folgenden Abbildung zu sehen:

FancyEagleLayoutYo

Abbildung 2: Sound Logik Board

Fertigung und Test

Unser Eagle-Layout wurde mittels Ätzung auf eine doppelseitigen Europlatine übertragen. Zwei Seiten waren deshalb notwendig, weil unter anderem durch die willkürliche Verteilung der Eingangspins des A/D-Wandlers nur so sich überkreuzende Leitungen vermieden werden konnten. Somit mussten zusätzlich zu den Bohrungen für die Bauteile auch welche für seitenwechselnde Leiterbahnen gesetzt werden, die anschließend mit einem Draht und Lötzinn
leitend gemacht wurden.
Um die Funktion der Platine zu testen bauten wir wieder einen 8-fachen Schalter auf einem Steckbrett auf und versorgten einen Test BUS mit den notwendigen Signalen und Spannungen, jedoch mussten wir nach mehrmaligem Probieren den Schalter verwerfen und schalteten nur direkt alle Eingänge entweder auf 5V oder auf Masse, je nach dem was wir testen wollten. Die Steuerspannung und das TonEnable-Bit ließen wir direkt über ein Oszilloskop anzeigen. Der Test war hilfreich, da er uns erst auf zwei fehlerhafte Lötstellen aufmerksam machte, aber auch zeigte, dass unser verwendeter Microcontroller vermutlich bei einem Kurzschluss kaputt gegangen sein muss. Nachdem dieser ausgewechselt und programmiert war funktionierte die Platine wie gewünscht.

Auftretende Probleme

  • Schalter

Es gelang uns zuerst nicht, Eingangssignale zu erzeugen, da wir die Schalter fehlerhaft verschaltet hatten. Lösung: Die Schalter mussten auf Masse anstatt auf Versorgungsspannung geschaltet werden.

  • Programmierung 1

Unser erster Programmentwurf war fehlerhaft, sodass der Microcontroller in der ersten Stufe des Testaufbaus kein Ausgangssignal ausgab. Lösung: Interne Pull-Up Widerstände mussten per Programmcode aktiviert werden.

  • Programmierung 2

Unser Micorcontroller war zuerst nicht in der Lage, Töne fur die zugehörigen simulierten Buzzer-Eingangssignale zu erzeugen. Lösung: Die verwendete Funktion switch(state2) rechnet die Variable state2 in eine Dezimalzahl um und springt in den case, der durch diese Zahl markiert ist. Da die Buzzer-Bits nicht wie bei der Logik an den ersten Stellen einer binaren Zahl stehen, mussten wir jeweils die zugehörigen Dezimalzahlen ausrechnen und unsere cases dementsprechend benennen.

  • A/D-Wandler

Unser erster A/D-Wandler arbeitete nach der Beschaltung vollkommen willkürlich bis wir merkten, dass dieser nicht nur maximal 5V als Versorgungsspannung verträgt, sondern auch nur maximal 5V durchschalten kann. Lösung: Die Potentiometer wurden nun mehr mit 5V verschaltet und die ursprüngliche Verstärkung des Operationsverstärkers wurde von 1 auf 2 erhöht, um trotzdem eine genügend große Steuerspannung zu erhalten. Die 5V Spannung für die Potentiometer wurden vom Linearregler erzeugt, der die 10V Versorgungsspannung auf 5V zuschneiden musste. Die auftretende Verlustleistung liegt jedoch im zweistelligen mW-Bereich.

  • Operationsverstärker

Der ursprüngliche Operationsverstärker konnte nicht den gewünschten Verstärkungsfaktor von 1 gewährleisten. Lösung: Es wurde ein anderes, leistungsstärkeres Modell verwendet.