Microcontroller

Die Gruppe Tonerzeugung verarbeitet die eingehenden Signale von der Gruppe 1 – Saiten. Diese stellt 8 x TTL-Eingänge (0V/5V TTL-Pegel) zur Verfügung. Aus den übermittelten Signalen werden zum einen die Frequenzen für die Wellenformen generiert und zum anderen eine charakteristische Klangfarbe (ADSR-Hüllkurve) eines Instruments erzeugt. Die Wellenform und die Hüllkurve werden durch eine analoge Schaltung multipliziert und als Summe (5Vpp) an die nächste Gruppe weitergegeben. In folgender Abbildung ist das Blockschaltbild unserer Teilgruppe Tonerzeugung dargestellt.

VCO_BSB

Die Microkontrollergruppe hat sich lange über die Umsetzung des Programmiercodes Gedanken gemacht. Nach gefühlten Ewigkeiten sind wir beim Programmieren. Das Problem lag darin, dass wir den Sinus, den wir digital ausgeben möchten, so berechnen, dass keinerlei hörbare Sprünge in der Funktion auftreten.
Der erste Gedanke, der verfolgt wurde, war der, dass eine Sinustabelle mit einer optimalen Anzahl von Sinuswerten unterschiedlich schnell durchlaufen wird. Da der Atmega32 mit drei Timern ausgestattet ist und nur drei Frequenzen parallel ausgegeben werden müssen, sollte also jede Frequenz durch einen Timer erzeugt werden, der immer in den richtigen Zeitabständen einen Interrupt auslöst, durch den der richtige Sinuswert ausgegeben wird. Auf diese Weise wäre allerdings die Umsetzung mit den Interrupts nicht sehr genau realisierbar. Wenn nämlich ein Timer eine andere Frequenz steuern soll, da eine andere Saite betätigt wurde, kann erst in der Interruptroutine der aktualisierte Compare-Wert des Timers geändert werden. Daher soll jetzt das Konzept geändert werden, sodass nur ein Timer mit der immer gleichen Frequenz Interrupts auslöst.
Je nach Frequenz wird dann jeder Wert, jeder 2. bzw.jeder x-te Wert der Sinustabelle ausgegeben.

Das Ziel ist es, dass der Microkontroller einen digitalen Sinus ausgibt der dann von den Digital-Analogwandlern in einen analogen Sinus umgewandelt wird. Auf unserem Schaltplan sind diese rechts neben dem uc zu sehen. Für die Signalweitergabe innerhalb der Gruppe haben wir uns auf ein 10 poliges Flachbandkabel geeinigt im Schaltplan gut zu sehen sind die dafür gedachten Anschluss.Desweiteren besitzt der uc einen jtag Anschluss zum Programmieren und Debuggen. Es werden 8 TTL-Eingangssignale von der Saiten-Gruppe erwartet. Ausgegeben werden ein gruppeninternes ADSR-Steuersignal und die drei Frequenzen an die Effekte-Gruppe.

Nach dem Erstellen der optimalen Sinustabelle, wird zum Testen der SPI-Funktionsweise mithilfe der im Projektlabor schon vorhandenen Testplatine über das SPI ein einfaches Dreiecksignal ausgegeben.

Die lookup tables wurden so angelegt, dass eine Periode dargestellt wird und die Länge der Tabelle einer Zweierpotenz entspricht, sodass gemäß der direkten digitalen Synthese (DDS) die unterschiedlichen Frequenzen erzeugt werden können.

Bei dieser Methode wird nicht je nach Frequenz strikt jeder x-te Wert der lookup-table im Interrupt-Takt ausgegeben. Stattdessen wird der Fehler (zwischen mathematisch berechneter und auf ganze Zahlen gerundeter Schrittweite) aufsummiert und ab einer signifikanten Abweichung eine andere Schrittweite eingestellt. Die Rundung wird dadurch erzielt, dass der Zähler, der für jede Frequenz unterschiedlich ist, nicht als ganzes die Schrittweite angibt, mit der das Array durchlaufen wird. Der Zähler wird so gewählt, dass er mehr Bits lang ist, als zur Adressierung des Arrays nötig sind und dann soweit geshiftet, dass die obersten Bits das Array adressieren können.

Die Frequenzauflösung ist unter anderem dadurch begrenzt, dass die Frequenz, mit der die Interrupts ausgelöst werden, nicht zu groß gewählt werden darf. Ansonsten ist die Übermittlung der Daten für die drei DACs noch nicht abgeschlossen, bevor der nächste Interrupt ausgelöst wird.
Besonderheiten:

Die lookup-tables werden standardmäßig nicht in dem Programmspeicher abgelegt, sondern in dem zu kleinen Datenspeicher.
Durch das Einbinden der Datei „avr/pgmspace.h“ können allerdings konstante Variablen auf dem Programmspeicher abgelegt
werden, was die Implementierung mehrerer Signalformen mithilfe von lookup-tables ermöglicht.

Nachdem die Sinustabelle in richtiger Form angelegt war, konnten innerhalb kurzer Zeit die anderen Signalformen (Rechteck und Sägezahn) implementiert werden, indem jeweils eine weitere Tabelle angelegt wurde. Desweiteren wurden noch jeweils eine Oktave tiefer und eine Oktave höher implementiert, welche dann über einen Schalter am Gehäuse ausgewählt werden können.

Der Tonumfang ist technisch nur dadurch begrenzt, dass nur 8  “Lichtsaiten“ gebaut werden. In der Startmusik, die einmal gespielt wird, sobald der uC mit Spannung versorgt wird, können deshalb auch Halbtöne usw. verwendet werden.