Gruppe 4

Gruppe 4: Anzeige + Lichteffekte

BSB

Wir befinden uns nun im grünen Bereich

Es gibt 3 verschiedene Anzeigen:

  • Anzeige für den Ton (C,D,E,F,G,A,H)
  • Anzeige für die Tonabweichung
  • Anzeige für die Oktave

1. Notenbestimmung

 

Die Untergruppe Notenbestimmung beschäftigt sich mit der Aufgabe, die aktuell gespielte Grundnote zu bestimmen. Hierzu wird das Signal nach dem Mixer abgegriffen, elektronisch aufbereitet und einem Mikrocontroller zugeführt.

 

2. Nulldurchgangserkennung

 

Dieser Abschnitt beschäftigt sich mit der Aufbereitung des Signals. Diese hat zum Ziel den Wechselspannungsanteil zu entfernen und die steigenden Flanken des sinusförmigen Signals scharf zu erkennen. Da die Frequenzbestimmung darauf basiert die Dauer einer Periode anhand der gleichartigen Flanken zu messen, ist es wichtig, dies bei einem genau definierten Signalpegel zu tun. Um zwei Zustände voneinander unterscheiden zu können ist es sinnvoll, das Signal an seiner steilsten Stelle abzutasten. Beim Sinus ist das genau dann, wenn die Amplitude gleich null ist. Hierzu wird eine sogenannte Nulldurchgangserkennung verwendet. Diese schaltet einen Logikpegel beim ersten Nulldurchgang einer Periode auf HIGH und beim nächsten wieder LOW. Das ermöglicht dem Mikroprozessor, eine sehr steile Flanke an den internen Komparator zu legen. 

 

Zunächst wird das relativ schwache Signal mithilfe eines nichtinvertierenden Verstärkers auf einen Pegel von ca 10 Volt angehoben. Dies ist nötig, umden darauf folgenden Transistor sauber durchzuschalten. Der nichtinvertierende Verstärker wird mit +/- 12 Volt Betriebsspannung versorgt und sein invertierender Eingang auf Masse gelegt. An den nicht invertierenden Eingang wird das Signal angelegt.Das so verstärkte Signal wird über einen 10 kOhm Widerstand R1 zur Strombegrenzung auf die Basis des Transistors T1 geführt. Dazwischen geschaltet sind noch ein Kondensator C2 zur Auskoppelung der Gleichstromanteile und ein Potentiometer R8 um einen Basisstrom einzuprägen. Dieser npn-Transistor in Emitterschaltung wird als Schalter betrieben und schaltet bei ca. +1Volt Basis-Emitter Spannung ganz durch, der Kollektor Emitter Widerstand wird nahezu null und es fällt keine Spannung zwischen Kollektor und Emitter ab. Da diese Strecke parallel zum Ausgang gegen Masse geschaltet ist fällt auch am Ausgang nahezu keine Spannung ab und der Pegel ist LOW. Wenn die Spannung an der Basis kleiner als 1 Volt ist sperrt der Transistor und der Widerstand wird näherungsweise unendlich. Dadurch fallen die gesamten 5 Volt über dem Ausgang ab und der Pegel ist HIGH. Die Zenerdiode D1 dient zum Schutz vor Überspannung am Eingangspin. Der OPV IC2B wird als Spannungsfolger beschaltet. Er dient keinem speziellen Zweck, sondern war „übrig“, da es den gewünschten OPV nur im Doppelpack gab. Um kein unnötiges Schalten und damit Störungen auf der Versorgungsleitung zu produzieren wurde der OPV nicht unbeschaltet gelassen.Die Schaltung basiert auf eigenen Überlegungen und wurde zunächst ausgiebig in SIMetrix getestet.

 

Anschließend wurden die Bauteile erworben und die Schaltung auf einem Steckbrett in Betrieb genommen. Nachdem es beim beim ersten Aufbau zu einigen Schwierigkeiten kam wurde die Stromversorgung der einzelnen Komponenten getrennt, um die Spannungseinbrüche beim Schalten möglichst gering zu halten. Da die Probleme damit beseitigt wurden konnte mit der Planung des Layouts begonnen werden.

 

1

 

3. Notenberechnung im Mikrocontroller

2

 

 

Aus dem aufbereiteten Signal sollen die Note und Oktave, denen die aktuelle Frequenz am ehesten entspricht, sowie die Abweichung von der exakten Frequenz als relativer Wert berechnet werden. Die gleichstufige Stimmung enthält 12 Halbtonschritte pro Oktave. Der hörbare Bereich wird von Oktave 0 bis Oktave 9 abgedeckt 16,3516Hz bis 15804,28 Hz. Wir verwenden hierbei ausschließlich die englische Oktavennummerierung, da die deutsche Nummerierung zur Unterscheidung der Oktaven Groß- und Kleinschreibung der Notennamen sowie hochgestellte und tiefgestellte Indizes verwendet und daher sowohl für den Laien verwirrend als auch schwieriger darzustellen ist.

 

 Für eine saubere Frequenzerkennung wird das aufbereitete Signal, welches möglichst einem Rechtecksignal zwischen 0 Volt und 5 Volt entsprechen sollte, dem Interrupt Eingang INT0 unseres ATmega32 zugeführt. Dieser wird so konfiguriert, dass er bei steigende Flanke ein Interrupt auslöst, welches nun vom Mikrocontroller zur Bestimmung der Periodenlänge verwendet werden kann. Als Referenz verwenden wir den 16bit-Timer TIMER0. Der ATmega32 ist mit 8MHz getaktet, wir setzen den Vorteiler des Timer auf 8, der Timer ist also mit 1 MHz getaktet.

 

Jedoch können wir nicht bei der Auswertung einer einzelnen Periode bleiben. Bei höheren Frequenzen können leichte Abweichungen des Zeitpunktes, zu dem der Interrupt registriert wird, sowie die begrenzte Timerauflösung das Ergebnis zu stark verfälschen. Wir haben uns daher dafür entschieden, die Anzahl der zu betrachtenden Perioden dynamisch zu wählen. Das mag erst etwas kompliziert klingen, erleichtert aber einige Dinge. 

 

Da wir an der Frequenz nicht direkt interessiert sind, lassen wir diese außer Acht und berechnen die Noten direkt. Jede Note entspricht einer Anzahl Ticks unseres Timers, die Noten einer Oktave lassen sich also durch zwölf verschiedene Timerstände darstellen. Die Noten der nächsthöheren Oktave werden durch dieselben Werte dargestellt. Der Unterschied dabei ist, dass wir die doppelte Anzahl steigender Flanken abwarten. Wir überprüfen also bei jeder steigenden Flanke, ob die Anzahl der bisher registrierten Flanken 2^n entsprechen und ob ein minimaler Timerstand erreicht ist. N ist unsere Oktave und der Timerstand wird mit der Tabelle zur Notenbestimmung abgeglichen. Der Timer wird zurückgesetzt und die Notenbestimmung kann erneut beginnen. Der interne Oszillator des Mikrocontrollers stellte sich als für unsere Zwecke zu ungenau heraus. In einem Test erhielten wir eine Abweichung von etwa 2% (der Kammerton von 440Hz wurde bei einer tatsächlichen Frequenz von etwa 448Hz registriert). Da zwischen zwei Halbtönen ein Frequenzunterschied von etwa 6% besteht, ist eine solche Abweichung inakzeptabel. Daher verbauten wir einen 8Hz Quarz-Oszillator, welcher in folgenden Tests dafür sorgte, dass keine merkliche Abweichung mehr bestand.

 

Es ist sinnlos, einen exakten Timerstand zu erwarten, da dieser so gut wie nie erreicht wird. Um unnötige Berechnungen im uC zu vermeiden, speichern wir in unserer Tabelle statt exakter Werte die Grenzen für Bereiche ab. Außerdem soll die Abweichung vom Sollwert bestimmt werden, welches in Form einer Anzeige mit 7 diskreten Werten geschieht. Es ist also sinnvoll, in der Tabelle 7*12=84 Werte zu speichern. Hierfür haben wir ein Scilab-Script geschrieben, welches die 84 Tabellenwerte und den Timer-Minimalwert ausgibt.

 

 Da sich der Timer genauso lange unterhalb des Minimalwertes befindet wie innerhalb des Auswertbereiches, kann es passieren dass der Auswertbereich wieder verlassen wird, bevor die nächste Zweierpotenz aufgetreten ist, wenn sich die Frequenz verringert während wir uns im Auswertbereich befinden. Dies wird überprüft und beim Erkennen dieses Falls wird der Timerstand halbiert und die Oktave um eins verringert, dann wird mit den erhaltenen Werten die Notenbestimmung durchgeführt.

Ändert sich die Frequenz schnell genug, kann das oben beschriebene Problem dazu führen, dass der Timer überläuft. In diesem Fall wird der Aktuelle Stand des Timers halbiert und 2^15, also die Hälfte des maximalen Timerstandes +1 addiert, sowie die Oktave um 1 dekrementiert. Diese Werte werden dann zur Berechnung verwendet.

 

3

Platinen Layout EALGE Board

4

4. Oktaven-Anzeige

Der Entwurf der Schaltung für die Lichteffekte gliedert sich in mehrere Phasen:

  1. Gestaltung
  2. Planung der Ansteuerung
  3. Steuervorgang

 4.1 Gestaltung

Die erste Phase ist ein Brainstorming in dem erste Ideen fuer die Gestaltung gesammelt werden. Folgende Ideen für die Umsetzung sind entstanden:

  1. Die erste mögliche Umsetzung besteht aus drei 7-Segment-Anzeigen, die die Abweichung zum nächsten Ton und den aktuellen Ton anzeigen, sowie die Oktave ausgeben.
  2. Die zweite Umsetzungsmöglichkeit besteht aus einer 7-Segment-Anzeige fuer die Oktavenanzeige und Einzel LED’s fuer die anderen Anzeigen.

7 8

 

 

 

 

 

4.2 Planung der Ansteuerung

In der zweiten Phase wird die Umsetzung der Ansteuerung diskutiert. Hierbei gibt es drei Möglichkeiten:

  1. eine direkte Einzelansteuerung der LEDs
  2. eine Logikschaltung, die die benötigten Pins des Mikrocontrollers reduziert und
  3. eine Kombination aus direkter Einzelansteuerung und Logik

Eine direkte Ansteuerung bietet die Vorteile einer einfacheren Umsetzung sowie einer robusteren, da simpleren Gesamtschaltung. Die Alternative, eine Logikschaltung die mit den Pin-Signalen gesteuert wird, stellt zwar einen Mehraufwand an Planung  und Umsetzung dar, ermöglicht aber mehr Ports / Pins für andere Zwecke freizuhalten. Die dritte Alternative stellt einen Kompromiss  aus beidem dar. Dabei wird der Abweichungs- und Tonteil mit einer Logik gesteuert und die 7-Segmentanzeige für die Oktave direkt durch die Pins.  Diese Möglichkeit hält genug Pins frei für eventuelle Anwendungen und hält dabei den Aufwand möglichst gering. Aus diesen Gründen wird die dritte Möglichkeit gewählt.

 

3. Steuervorgang

 

In der dritten Phase wird der eigentliche Steuervorgang des Aktivierens beziehungsweise Deaktivierens entschieden. Folgende Möglichkeiten werden in Betracht gezogen:

 

  1. eine Spannungsgesteuerte LED Aktivierung durch MOSFETS und
  2. als Alternative dazu eine Stromgesteuerte LED Aktivierung durch Bipolar-Transistoren

 

 

Vorteile der MOSFET-Lösung sind die nicht vorhandene Stromaufnahme, da Spannungsgesteuert und die hohe Energieeffizienz. Da allerdings die Stromaufnahme des Darlinton-Arrays so gering ist, dass die Nachteile einer nicht Spannungsgesteuerten LED-Schaltung sich nicht auswirken und diese bereits in Form eines Darlington-Arrays verfügbar ist, wird in diesem Projekt die Umsetzung mit Bipolar-Transistoren gewählt.

  

Umsetzung – 7 Segment-Oktaven-Anzeige

 

Für die Umsetzung der Schaltung wird mit der Software Eagle ein Schaltungslayout entworfen. Das zentrale Bauteil der Umsetzung ist das Darlington-Array, das als Schaltwerk fungiert. Der grundlegende Aufbau eines solchen Arrays besteht aus mehreren Darlington Paaren. Ein Darlington Paar besteht aus zwei Transistoren, wobei die Basis des zweiten mit dem Emitter des ersten Transistors verbunden ist. Dabei fungiert die erste Stufe als Stromverstärker, sodass die Basis der zweiten Stufe gesättigt wird und als Schalter für die LED dient. Wird ein Input-Pin auf High-Potential gesetzt, sorgt das Array dafür, dass der jeweilige Output-Pin des Arrays auf Ground gelegt und somit der Stromkreis geschlossen wird. Vorwiderstände sind in diesem Fall nicht notwendig, da diese bereits in den Bauteilen integriert sind. Die genutzte Versorgungsspannung beträgt +12.0V. Um die Anzeige in einem für das Auge angenehmen Helligkeitsbereich zu betreiben, wird die Spannung durch einen Spannungsregler (im Schaltbild unten rechts zu finden) auf 7.5V eingestellt.

 

Der Schaltplan der entstandenen Platine ist in der folgenden Abbildung zu finden.

9

 

Die Zuordnung der Pins des Mikrocontrollers in Binärdarstellung zu den LED’s der 7-Segment-Anzeige, also die Liste welche Pin-Kombinationen den einzelnen Ziffern der Oktaven-Anzeige entsprechen, kann der unten stehenden Tabelle entnommen werden.

Zuordnung Pins – Ziffern:

0  =  0b01110111

1  =  0b01000100

2  =  0b01101011

3  =  0b01111100

4  =  0b01011100

5  =  0b00111110

6  =  0b00111111

7  =  0b01100100

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Die Zuordnung der Pins des Mikrocontrollers in Binaerdarstellung zu den LED’s der 7-Segment-Anzeige, also die Liste welche Pin-Kombinationen den einzelnen Ziffern der Oktaven-Anzeige entsprechen, kann der unten stehenden Tabelle entnommen werden.

Zuordnung Pins – Ziffern:

0  =  0b01110111;

1  =  0b01000100;

2  =  0b01101011;

3  =  0b01111100;

4  =  0b01011100;

5  =  0b00111110;

6  =  0b00111111;

7  =  0b01100100;

8  =  0b01111111;

9  =  0b01111110;