Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Fundamentum Propeller SPIN Programmierung

Töne erzeugen mit den NCO Betriebsmodi

NCO steht für numerically controlled oscillator; die Modi lassen sich als single-ended und differential aufrufen. Im single-ended NCO-Modus wird an einen Ausgangspin eine Rechteckspannung gelegt. Bleibt clkfreq konstant, dann wird diese Rechteckspannung „nummerisch gesteuert“ über einen im FRQ-Register eines Kerns abgelegten Zahlenwert.

1 - NCO Modus single-ended

Im single-ended NCO-Modus wird das Zählermodul

 

  • den Inhalt des FRQ-Registers mit jedem Taktimpuls zum PHS-Registerwert addieren.
  • über Bit 31 des PHS-Registers den Zustand am I/O Pin steuern.

Ist Bit 31 des PHS-Registers identisch 1, liegt an dem von ihm gesteuerten I/O Pin ein HIGH-Signal, bei 0 entsprechend ein LOW-Signal.

 

Bleibt clkfreq unverändert konstant, bestimmt die Addition vom FRQ- zum PHS-Registerwert die Schwingungsrate. Die wiederum bestimmt die Frequenz der Rechteckschwingung am Ausgangspin.

Bei vorgegebener Takt- und gewünschter NCO-Frequenz, lässt sich der FRQ-Wert über die folgende Gleichung berechnen:

Auflösen der Gleichung nco_01 nach PHS_Bit31_Frequenz ergibt

Über Gleichung nco_01 lässt sich jetzt der Zahlenwert für das FRQ-Register berechnen, wenn man zum Beispiel eine Frequenz 

  • f = 1000 Hz, bei einer Taktfrequenz von
  • clkfreq = 80 MHz

am Ausgangspin abnehmen möchte. Einsetzen der Werte ergibt

 

  • FRQA = 53687                               (1)

 

Umgekehrt kann über Gleichung nco_02 auch aus dem im FRQ-Register abgelegten Wert auf die Frequenz am Ausgangspin geschlossen werden.

Übung 1 - Schwingungsfrequenz erzeugen im NCO-single-ended Modus

Mit dem folgenden kleinen Programm NCO_Modus_singleEnded.spin wird Berechnung (1) überprüft. FRQA = 53687 sollte am festgelegten Ausgangspin des Propeller Chips eine Schwingung mit einer Frequenz von

  • f = 1.000 Hz = 1 kHz

erzeugen.

Das Programm NCO_Modus_singleEnded.spin

Abb. 0 - Der frqa-Registerinhalt sollte im NCO-Modus single-ended am Ausgangspin eine Rechteckschwingung von 1000 Hz erzeugen. Der Ausgang BPIN hat hier noch keine Bedeutung.

Das Ausgangssignal wurde mit einem USB-Oszilloskop aufgenommen und ist in Abb. 1 dargestellt.

Abb. 1 - Oszillogramm zum Programm aus Abb. 0. Die gemessene Frequenz der Rechteckschwingung liegt bei 1001 Hz.

Wird der Modus auf % 00101 (NCO-differential) geändert, ergibt sich Abb. 2b. Die blaue Kurve ist das APIN-, die rote das BPIN-Ausgangssignal. Das entsprechende SPIN-Programm zeigt Abb. 2a.

Abb. 2a - Der NCO-Modus ist auf "differential" eingestellt (%00101). BPin ist P7, der im Programm in Zeile 13 als Ausgang geschaltet wird. Der Hexadezimalwert $D1B7 entspricht dem Dezimalwert 53687.

Hinweis: Anwendungen, die schnelle Änderungen an FRQA erfordern, wie z. B. bei der  Audioerstellung, sollten in Assembler geschrieben werden, da Spin die Inhalte des FRQA-Register nicht schnell genug für sich schnell ändernde Frequenzen vornehmen kann.

Abb. 2 - NCO-Modus differential ist eingeschaltet. BPIN und APIN verhalten sich zueinander gegenläufig. blau: APIN, rot: BPIN.

2 - Konfigurieren eines Zählermoduls für den NCO-Modus

Der CTRMODE für den NCO Modus ist Abb. 3 zu entnehmen. Wie bereits erwähnt, verfügt der NCO-Modus über die Optionen Single-Ended- und Differential.

 

  • Im Single-Ended-NCO-Modus wird ein Signal, das mit Bit 31 des PHS-Registers übereinstimmt, an APIN übertragen.
  • Im Differential NCO-Modus wird das Signal an APIN und ein invertiertes an BPIN übertragen.

 
Bei den
DUTY-Modi hat das Übertragsflag des Phasenaddierers (Bit 32 des PHS-Registers) den Zustand des I / O-Pins bestimmt. Das führt zu einem Tastverhältnis, das mit dem vom FRQ-Register gespeicherten Wert variiert.

Bei den NCO-Modi steuert Bit 31 des PHS-Registers den I/ O-Pin. Dies führt zu einer Rechteckschwingung, deren Frequenz durch den im FRQ-Register gespeicherten Wert bestimmt wird.

Abb. 3 - Tabelle mit allen CTR-Modi eines Propeller Chips (Auszug aus Propeller Manual Version v1.2 der Fa. Parallax Inc.)

Die Schritte zum Konfigurieren des Zählermoduls für die NCO-Modi ähneln den Schritten für die DUTY-Modi.

 

Die Bitfelder CTRMODE, APIN (und BPIN im Differentialmodus) des CTR-Registers müssen gesetzt werden. Der im FRQ-Register abgelegte Wert legt die NCO-Frequenz fest. Die vom Zählermodul verwendeten I/ O-Pins müssen auf Ausgabe gesetzt werden.
 
Die drei Schritte zum Konfigurieren eines Zählermoduls für den NCO-Modus:

  1.  Konfiguriere das CTRA / B-Register.
  2. Speichere einen Wert im FRQA / B-Register.
  3. Stelle den I/ O-Pin auf Ausgang.

 
Zu Schritt 1

Ein Beispiel, das Zähler A in den Modus NCO Single-Ended setzt, wobei das Signal an P27 übertragen wird.
 

  • ctra [30..26] : = % 00100
  • ctra [5..0]: = 27

 

Zu Schritt 2

Weise dem FRQA / B-Register einen Wert zu, so dass sich eine Rechteckschwingung ergibt, die der Frequenz der Note C7 entspricht.:
 

  •   frqa: = 112_367

 

Zu Schritt 3

Stelle I/ O-Pin P27 auf Ausgang:
 

  •   dira [27] ~~

 

Übung 2 - Der Ton C7 als Rechteckschwingung

Mit dem bereits erworbenen Wissen sollte es jetzt möglich sein, den Ton C7 (7. Oktave über dem Grundton C) als Rechteckschwingung über einen Piezo-Lautsprecher auszugeben.

Übung 2 - Der Ton C7 als Rechteckschwingung

Material

  • 1x  Grundschaltung aus Zählermodule – 2, Abb. 3
  • 2x  Piezo-Lautsprecher
  • Diverse Steckdrähte

Aufgaben

  • Baue die Schaltung nach Schaltvorlage auf und schließe sie an.
  • Übertrage das Objekt Rechteckschwingung.spin in den Propeller-Tool Editor und speichere es ab.
  • Vergleiche das Objekt Rechteckschwingung mit den gerade beschriebenen Schritten 1 bis 3. Welche Programmzeilen lassen sich diesen Schritten zuordnen?
  • Starte das Programm und führe es aus.
  • Überprüfe, ob ein Ton ausgegeben wird.
  • Verändere den Wert von frqa in 224_734. Dies entspricht der Note C8, die eine Oktave höher als C7 liegt. Ist der Höhenunterschied beim Abspielen des Programms zu hören?
  • Welcher Wert müsste in frqa abgelegt werden, damit C6 ertönt?

Schaltungsaufbau

 

 

 

Abb. 4

Schaltungsaufbau zu Übung 2. Der zweite Lautsprecher wird in dieser Übung noch nicht gebraucht und wird deshalb im Programm auch nicht angesprochen.

Das Programm Rechteckschwingung.spin

Abb. 5 - An P8 wird eine Rechteckschwingung mit f = 2093 Hz ausgegeben. Die Lautstärke am Piezo-Lautsprecher ist gering.

3 - Signalübertragung stoppen und fortzusetzen

1) Die Richtung des I/O-Pins auf Eingang ändern. In Rechteckschwingung.spin kann dies entweder mit

  • dira [27]: = 0 oder
  • dira [27] ~

erfolgen. Neu gestartet wird das Signal entweder mit

  • dira [27]: = 1 oder
  • dira [27] ~~.

2) Das Zählermodul stoppen, indem die CTR-Bits 30..26 gelöscht werden. In Rechteckschwingung.spin kann dies mit

  • ctra [30..26]: = 0

erreicht werden. Eine andere Möglichkeit besteht darin, alle Bits im CTRMODE-Bitfeld des ctra-Registers mit

  • ctra [30..26] ~

auf Null zu setzen. In beiden Fällen ist der I/O-Pin immer noch Ausgang, und sein Ausgangszustand kann LOW oder HIGH sein.

 

3) FRQ auf Null setzen und damit die Addition zum PHS-Register neutralisieren. In Rechteckschwingung.spin kann dies entweder mit

  • frqa: = 0 oder
  • frqa ~

erfolgen . Der Zähler würde in diesem Fall weiterlaufen, aber da er mit jedem Takt den Wert zu phsa um Null erhöht, würde sich Bit 31 von phsa nicht ändern, sodass auch der I/O-Pin nicht mehr umschaltet.

Wie beim Stoppen eines Zählers würde der I/O-Pin den Ausgangszustand halten, den er zum Zeitpunkt des Löschens von frqa hatte.

Übung 3 - Ein Staccato-Signal erzeugen

Das folgende Staccato-Objekt schaltet den I/O-Pin P8 zwischen Ausgang und Eingang um, damit der 2,093-kHz-Ton 1 s lang immer wieder gestartet und gestoppt wird. Es verwendet Ansatz (1) zum Stoppen und Neustarten des Signals.

Übung 3 - Ein Staccato-Signal erzeugen

Material

  • Schaltungsaufbau aus Übung 2
  • 1x  USB-Oszilloskop

Aufgaben

  • Baue die Schaltung nach Schaltvorlage auf und schließe sie an.
  • Übertrage das Objekt Staccato.spin in den Propeller-Tool Editor und speichere es ab.
  • Starte das Programm und überzeuge dich, dass ein staccatomäßiger Ton ausgegeben wird.
  • Bestimme
    a) die Frequenz des ausgegebenen Tons
    b) die Pausenzeit zwischen der Tonausgabe
  • Lege vom Programm Staccato.spin zwei Kopien an: Staccato2.spin und Staccato3.spin.
  • Ändere das Programm Staccato2.spin so ab, dass Ansatz 2 (aus 3- Signalübertragung stoppen und fortsetzen) verwendet wird. Verfahre entsprechend bei Staccato3.spin.

Das Programm Staccato.spin

Abb. 6 - Ein Ton der Frequenz 2093 Hz wird staccatomäßig über einen Piezo-Lautsprecher an P8 ausgegeben.

Die Überprüfung der Ausgabewerte Frequenz und Pausenzeit mit Hilfe eines USB-Oszilloskops zeigen die beiden folgenden Oszillogramme.

 

 

 

 

 

 

 

 

Abb. 7 - Die Pausenzeit zwischen zwei Signalen liegt bei 33,34 ms. Die Frequenz, mit der die Pausenzeit ausgegeben wird, liegt bei 15 Hz.

Abb. 8 - Die Frequenz des Ausgabesignaltons liegt gemessen bei 2094 Hz. Es wurden zehn Perioden für die Bestimmung zugrunde gelegt.

Übung 4 - Spielen nach Noten

In dieser Übung wird der Schaltungsaufbau aus Übung 2 und 3 verwendet.

KenntJiAllDatNijeLeid.spin ist ein Übungsbeispiel, in dem das Zählermodul zum Spielen einer Reihe von Noten verwendet wird. Da es in der Zwischenzeit für nichts anderes benötigt wird, wird der I/O-Pin P8, der das Rechtecksignal an den Piezospeaker sendet, während der ¼-Stopps zwischen den Noten auf Eingang gesetzt. Bit 31 des phsa-Registers schaltet während des Viertelstopps immer noch mit einer bestimmten Frequenz um, aber die Pseudo-Note wird nicht abgespielt.


Die tonfrequenzkompatiblen  FRQA-Registerwerte (umgerechnete Notenwerte für eine Taktfrequenz von 80 MHz) werden in einem DAT-Block abgelegt.

Das Programm KenntJiAllDatNijeLeid.spin

Wie arbeitet das Programm?

Die Variable index in der ersten REPEAT-Schleife durchläuft die Werte 0 bis 5 und ruft damit die ersten sechs Noten aus dem DAT-Block ab, kopiert sie in das FRQA-Register und erzeugt am Ausgangspin P8 einen Ton.

 

Die nachfolgende A6-Note hat den Längenwert 0,5. In der zweiten REPEAT-Schleife wird deshalb die Pausenzeit verdoppelt.

 

Die dritte Schleife arbeitet wie die erste Schleife mit den Indexwerten von 7 bis 8. Alle gespielten Noten haben hier den gleichen Längenwert. Die letzte gespielte Note mit dem Indexwert 9 hat wiederum den doppelten Längenwert wie die vorher gespielten Noten, deshalb wird hier die Pausenzeit verdoppelt.

Ein Beispiel für den Zähler-NCO-Modus mit Betrachtung von Bit 3 anstelle von Bit 31

Im NCO-Modus wird der Ausgangszustand des I/O-Pins durch Bit 31 des PHS-Registers gesteuert. Die Ein / Aus-Frequenz für jedes Bit in einer Variablen oder einem Register kann unter Verwendung von nco_03 berechnet werden, unter der Annahme, dass ein konstanter Wert wiederholt mit einer bestimmten Rate hinzugefügt wird:
 

  • fAusgang = (Wert × Rate) / 2 Bit + 1          (2)

Bit 3 Beispiel

  • Mit welcher Frequenz fAusgang wechselt Bit 3 in einer Variablen den Zustand, wenn mit einer Rate von acht Mal pro Sekunde der Zahlenwert 4 hinzugefügt wird?

Lösung

Gegeben sind die Größen: Wert := 4,  Rate := 8 Hz, Bit := 3

Gesucht ist die Frequenz fAusgang.
 

Einsetzen der gegebenen Größen in Gleichung (2) ergibt eine Frequenz von

  • fAusgang = 2 Hz

 

 

 

 

 

 

 

 

 

 

Abb. 9

Die Tabelle zeigt die Bitzustände nach jedem Additionsvorgang. Nach acht Taktimpulsen hat sich der Zustand von Pin 3 viermal verändert, oder anders ausgedrückt: es wurde in 1s eine Periode 2x durchlaufen.

(entnommen: Propeller Education Kit Labs v1.2)

Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf