Hallo, ich möchte mit einem ATMEGA einen kleinen Synthesizer emulieren, der aus 8 NE555 Oszillatoren besteht. Im Original werden die einzelnen NE555 durch ein 8-Bit Shiftregister aktiviert und geben dann jeweils den per Poti eingestellten Ton (Rechteck) ab. Auf YouTube gibt es ein Video von dem Teil: https://www.youtube.com/watch?v=gxlMlioAomg Wie man EIN Rechteck Signal mit dem ATMEGA erzeugt, ist für mich kein Problem. Port Pin auf 1 -> warten -> Port Pin auf 0 -> warten -> usw. Aber wie könnte ich das auf 8 Pins bewerkstelligen und dann auch noch mit unterschiedlichen Frequenzen pro Pin? Hat da jemand eine Idee?
> Hat da jemand eine Idee?
Kuckst Du Datenplatt, grob Abschnitt Timer und PWM.
HTH
Moin, lass doch eine Schleife laufen und für jeden Pin einen extra Zähler rauf- oder runter zählen. Für die Zähler je nach Frequenz einen anderen Wert nehmen. Und noch ein Flag was für "Ton soll ausgeben werden" steht.
:
Bearbeitet durch User
Sebastian V. schrieb: > ich möchte mit einem ATMEGA einen kleinen Synthesizer emulieren, der aus > 8 NE555 Oszillatoren besteht. Hmmm.. aus meiner Sicht fehlen die wichtigsten Eckdaten: - Welcher Frequenzbereich (von bis)? - Welche Frequenzauflösung? - Welche Frequenzgenauigkeit? - Soll das Rechteck stets symmetrisch sein?
@ Sebastian V. (n8falter74) >Aber wie könnte ich das auf 8 Pins bewerkstelligen und dann auch noch >mit unterschiedlichen Frequenzen pro Pin? Mit 8x DDS in Software. Ist aber nicht ganz das Richtige für Programmieranfänger.
@Volker Das mit den Zählern ist eine gute Idee, nur wie könnte ich da stabile Frequenzen hinkriegen? Da müsste ich ja wissen wie schnell die Schleife läuft, oder? @Markus Frequenzbereich: 0 bis 5000Hz Frequenzauflösung: was meinst Du damit? Frequenzgenauigkeit: keine Ahnung, +/- 1% reicht da sicher, ist ja eher LoFI Musik ;-) symetrisches Rechteck sollte für den Anfang reichen. Es wäre ggf. später interessant die Pulsbreite pro Kanal zu ändern.
@Falk Brunner DDS ist sicher für mich als Anfänger zu hoch, da hast Du natürlich recht. Aber braucht es für sowas überhaupt DDS? Es soll ja nur 0 und 1 ausgegeben werden.
Hallo Sebastian, danke für die nachgelieferten Eckdaten! Sebastian V. schrieb: > Frequenzauflösung: was meinst Du damit? Damit ist die Frage gemeint, wie genau die Frequenz einstellbar sein soll. 5000 Hz ist sicher kein Problem, Aber müssen auch 4999,9 Hz möglich sein? Oder reichen Schritte von 100 Hz, also ein Raster von z.B. 4600, 4700, 4800, 4900, 5000?
@ Sebastian V. (n8falter74) >Das mit den Zählern ist eine gute Idee, nur wie könnte ich da stabile >Frequenzen hinkriegen? Mit einem Timer. >Frequenzbereich: 0 bis 5000Hz >Frequenzauflösung: was meinst Du damit? Wie fein die Frequenz einstellbar sein muss. >symetrisches Rechteck sollte für den Anfang reichen. Es wäre ggf. später >interessant die Pulsbreite pro Kanal zu ändern. Dann hast du aber 8 Kanäle, die du entweder auf 8 Lautsprecher geben musst oder wieder zusammen auf einen Lautsprecher. Da ist es meist sinnvoller, das gleich im Controller zu mischen. http://elm-chan.org/he_a_e.html
@ Sebastian V. (n8falter74) >recht. Aber braucht es für sowas überhaupt DDS? Es soll ja nur 0 und 1 >ausgegeben werden. Ja, aber 8 mal. Und wenn der Controller keine 8 Timer in Hardware hat, muss es per Software sein.
Markus Weber schrieb: > Hallo Sebastian, danke für die nachgelieferten Eckdaten! > > Sebastian V. schrieb: >> Frequenzauflösung: was meinst Du damit? > > Damit ist die Frage gemeint, wie genau die Frequenz einstellbar sein > soll. > > 5000 Hz ist sicher kein Problem, Aber müssen auch 4999,9 Hz möglich > sein? Oder reichen Schritte von 100 Hz, also ein Raster von z.B. 4600, > 4700, 4800, 4900, 5000? 100Hz sind sicher etwas zu grob für Musik :-) 1Hz Schritte wären aber sicher ausreichend.
Falk Brunner schrieb: > @ Sebastian V. (n8falter74) > >>recht. Aber braucht es für sowas überhaupt DDS? Es soll ja nur 0 und 1 >>ausgegeben werden. > > Ja, aber 8 mal. Und wenn der Controller keine 8 Timer in Hardware hat, > muss es per Software sein. Oha, gibt es einen ATMEGA mit 8 Timern? Ich glaube nicht und wenn dann sicher nur als SMD version mit 180 Pins. :-)
Sebastian V. schrieb: > Oha, gibt es einen ATMEGA mit 8 Timern? Mit 8 Timern wüsste ich nicht, aber mit 8 PWM-Ausgängen (4 Timer) schon, den ATmega1284P, ist in DIP ein 40-Pinner. Oder, ist aber SMD (aber auch kleiner als 180 Pins), einen Xmega. Oder 2 kleinere ATmega miteinander koppeln (per UART, I²C, SPI). Mit freundlichen Grüßen - Martin
Falk Brunner (falk) schrieb >Mit 8x DDS in Software. Ist aber nicht ganz das Richtige für >Programmieranfänger. Mit einer DDS wird es schierig, einen gutes Rechtecksignal mit beliebiger Frequenz zu erzeugen: Beitrag "Nicht-Sinus DDS"
guckst du z.B. hier: http://arduino.cc/en/Main/ArduinoBoardMega2560 Da musst du dann auch nicht so viel löten...
Sebastian V. schrieb: > DDS ist sicher für mich als Anfänger zu hoch, da hast Du natürlich > recht. Aber braucht es für sowas überhaupt DDS? Dann guck dir mal das Prinzip an. http://www.myplace.nu/avr/minidds/index.htm Die paar Programmzeilen sind doch hin zu kriegen, wenn man erstmal das Prinzip verstanden hat. Und für die Ausgabe von 0 und 1 braucht man nicht mal irgendwelche Tabellen.
Sebastian V. schrieb: > 100Hz sind sicher etwas zu grob für Musik :-) > 1Hz Schritte wären aber sicher ausreichend. Das hatte ich befürchtet... Mit einem AVR lässt sich bei diesen Vorgaben ein sauberes Rechtecksignal gar nicht erzeugen. Wenn ich mich jetzt nicht verrechnet habe, bräuchte man mindestens 50 MHz Takt, und da ist die Verwaltung noch nicht einmal eingerechnet: KgV(5000,4999) = ca. 25 Mio. Mal 2 Halbwellen macht das dann 50 Mio. -> Klappt nicht - egal ob Arduino und auch egal mit welchem anderen AVR-Board du das probierst. Oder hab ich mich verrechnet?
Markus Weber schrieb: > -> Klappt nicht - egal ob Arduino und auch egal mit welchem anderen > AVR-Board du das probierst. Dann guck dir mal den Arduino Due an. Da hast du etwas mehr Reserven ;-)
Ich meine man könnte die 555 auch weg lassen und statdessen alles mit dem ATMEGA machen. Entweder gekonnt programmiert oder die Multitasking Libary nehmen (Timer 1). Oder halt Dattenblatt! LH
X. H. schrieb: > Ich meine man könnte die 555 auch weg lassen und statdessen alles mit > dem ATMEGA machen. Wirklich? War DAS nicht gerade das Problem des TO?
X. H. schrieb: > man könnte die 555 auch weg lassen Was an dem Wort "emulieren" hast du nicht verstanden?
Wolfgang A. schrieb: > Dann guck dir mal den Arduino Due an. Da hast du etwas mehr Reserven ;-) Wenn ich das richtig lese, hat der auch nur 84 MHz Takt. Ich möchte fast wetten, dass das damit auch nicht klappen wird.
Mein Gott, noch 25 Beiträge mehr und die Sache ist selbst mit ein Quad Core nicht lösbar . . .
Falk Brunner schrieb: > Mein Gott, noch 25 Beiträge mehr und die Sache ist selbst mit ein Quad > Core nicht lösbar . . . Kann gut passieren, wenn vom TO noch höhere Anforderungen nachgereicht werden. Dafür kann ich dann aber nix. :-)
Markus Weber schrieb: > Falk Brunner schrieb: >> Mein Gott, noch 25 Beiträge mehr und die Sache ist selbst mit ein Quad >> Core nicht lösbar . . . > > Kann gut passieren, wenn vom TO noch höhere Anforderungen nachgereicht > werden. Dafür kann ich dann aber nix. :-) Hmm, das mit dem KgV habe ich so nicht betrachtet. Wenn man die Grenze bei 3khz setzt, kommt man zu einem KgV (3000,2999) von ca. 9 Mio. Das wäre ja dann wieder im Bereich des Möglichen. Aber vielleicht ist das auch schon wieder zu "korrekt" gedacht. Es geht ja um ein LoFI Musikgerät und nicht um ein hi-end DSS Modul. Ich kann mir gut vorstellen, das kleinere "Glitsches" sogar ganz interessant klingen. Ich glaube mit einem 5 fachen "Oversampling" sollte man schon ganz gute Ergebnisse erzielen können. Dann wären das "nur" rund 50000 Durchläufe in der Sekunde.
>Auf YouTube gibt es ein Video von dem Teil: >Youtube-Video "Milgram 555 Demo" Jetzt habe ich mir das "Gepiepse" in dem Video mal angehört. Naja. Hier mal ein Beispiel, was man sonst noch für Sounds mit einem Atmega erzeugen kann: Auf YouTube gibt es ein Video von dem Teil: http://sensorium.github.io/Mozzi/examples/
@Sebastian V.: Ja, man muss herausfinden, wie lange die Schleife läuft. Entweder messen oder loggen oder anhand der benötigten Takte ermitteln. Die Schleife muss in der Tat so aufgebaut sein, dass sie immer gleich lange läuft. Dafür wäre sie prinzipiell so aufzubauen, dass kontrolliert wird: "Gibt es was zu tun?" und wenn es nichts zu tun gibt muss so lange gewartet werden als gäbe es etwas zu tun. Beispiel: Irgendwann ist der Zähler runter gelaufen, dann muss man entweder die Zählrichtung ändern oder den Zähler wieder auf den Startwert setzen. Das kann man mit einer Bedingung (IF...) machen, aber für alle Fälle, wo das Zurücksetzen nicht notwendig ist, muss man einen entsprechenden Moment lang warten. Also "IF (Zähler runter gezählt) THEN (wechsele den zu setzenden Pegelwert und setzte Zähler auf Startwert) ELSE (warte so lange wie die Aktivitäten in der vorherigen Klammer dauern würden)". Dafür muss man natürlich nachsehen, wieviele Takte für das "THEN" benötigt werden... Alternative: Du lässt in dem ELSE-Teil einen Dummy-Wert wechseln und setzt einen Dummy-Zähler. Also eine äquivalente Aktivität, die aber ansonsten keine Auswirkung hat.
:
Bearbeitet durch User
Wie wäre diese Idee: - Timer wird zB. 50.000 mal die Sekunde aufgerufen - Immer wenn der Timer auslöst werden 8 Variablen inkrementiert - OSC1 ... OSC8 - jede Variable wird dann auf einen Endwert geprüft und toogelt ein Bit - wenn das Bit getoogelt wird, wird auch die Variable auf 0 zurückgesetzt.
1 | OSC1 ... OSC8 = Integer |
2 | OSC1 ++ |
3 | . |
4 | . |
5 | . |
6 | OSC8 ++ |
7 | |
8 | Wenn OSC1 >= Endwert1 dann toogle bit1 und OSC1 = 0 |
9 | . |
10 | . |
11 | . |
12 | Wenn OSC8 >= Endwert8 dann toogle bit8 und OSC8 = 0 |
Der Endwert müsste dann nur der halben Zielfrequenz entsprechen. Endwert = 25.000 gibt 1 Hz Endwert = 2.500 gibt 100 Hz Endwert = 250 gibt 1.000 Hz Endwert = 25 gibt 10.000 Hz Die Frage ist halt, ob es ein ATMEGA bei 16 oder 20 MHz schafft, 50.000 mal 8 16Bit Variablen zu inkrementieren, auf einen Endwert zu prüfen und 8 Portbits zu toogeln.
@ Sebastian V. (n8falter74) >- Timer wird zB. 50.000 mal die Sekunde aufgerufen >- Immer wenn der Timer auslöst werden 8 Variablen inkrementiert >- OSC1 ... OSC8 >- jede Variable wird dann auf einen Endwert geprüft und toogelt ein Bit >- wenn das Bit getoogelt wird, wird auch die Variable auf 0 >zurückgesetzt. Das ist im wesentlich eine DDS. >Die Frage ist halt, ob es ein ATMEGA bei 16 oder 20 MHz schafft, 50.000 >mal 8 16Bit Variablen zu inkrementieren, auf einen Endwert zu prüfen und >8 Portbits zu toogeln. Bei 20 MHz und 50kHz Interruptfrequenz hat man immerhin 400 Takte/Durchlauf. Das ist reichlich. Das klappt fast schon in C, in ASM auf jeden Fall.
Vor langer Zeit gab es auch schon mal so eine Diskussion, dabei hab ich mal einen einfachen Synthesizer programmiert. Siehe Anhang. Hat zwar nur 10 kHz Samplingfrequenz, sollte für einen ersten Test aber reichen.
> Der Endwert müsste dann nur der halben Zielfrequenz entsprechen. > Endwert = 25.000 gibt 1 Hz > Endwert = 2.500 gibt 100 Hz > Endwert = 250 gibt 1.000 Hz > Endwert = 25 gibt 10.000 Hz Wie man aus obiger Tabelle sieht, kann man bis 100 Hz die Frequenz sehr fein einstellen. Zwischen 1Hz und 100Hz gibt es dann 22.500 Abstufungen. Zwischen 100Hz und 1KHz sind es nur noch 2.250 unterschiedliche Frequenzen. Danach wir es noch schlimmer :-) Die anfangs geforderte 1Hz Genauigkeit geht also recht schnell verloren. Wenn man sich aber mal die Notenfrequenzen ansieht ( http://tnotes.de/NotenFrequenzen ) dann ist das, glaube ich, nicht mehr so wichtig. Ein Ton mit ca. 2KHz entspricht einem C7 und das ist schon ein recht hoher Ton. Ähnlich einem Rauchmelder-Piepsen! Die Obergrenze würde ich also von 5.000 Hz auf 2.000 bis 2.500 Hz runtersetzen.
:
Bearbeitet durch User
Sebastian V. schrieb: [...] > Wenn man sich aber mal die Notenfrequenzen ansieht ( > http://tnotes.de/NotenFrequenzen ) dann ist das, glaube ich, nicht mehr > so wichtig. Ein Ton mit ca. 2KHz entspricht einem C7 und das ist schon > ein recht hoher Ton. Bei Musik sind normalerweise die Abstände in Notenwerten wichtig. Also wieviel Halbtonschritte zwischen zwei einstellbaren Werten liegen. Da stört es dann überhaupt nicht, wenn bei der vierfachen Frequenz auch die Schritte viermal so groß werden.
Hallo, mehr als ein CD-Signal mit 44 kHz braucht man in keinem Fall, also wieso sich überhaupt auf Rechteck beschränken? Ich würde eine Ausgabe von 16 bit mit 44 kHz einrichten und die gewünschten Frequenzen als Sinuswerte aus Tabellen addieren und ausgeben. Wäre sogar Hifi-tauglich, und Probleme mit der Rechenleistung sehe ich nicht, schnelle Prozessoren könnten sogar die Sinuswerte in Echtzeit rechnen. Georg
Georg schrieb: > mehr als ein CD-Signal mit 44 kHz braucht man in keinem Fall, also wieso > sich überhaupt auf Rechteck beschränken? Ich würde eine Ausgabe von 16 > bit mit 44 kHz einrichten und die gewünschten Frequenzen als Sinuswerte > aus Tabellen addieren und ausgeben. Wenn man denn Sinus will. Ich glaube, Sebastian ist mit seinem Rechteck schon auf dem richtigen Weg. Hab mir inzwischen das Video angeschaut, ein sauberer Sinus wär hier irgendwie fehl am Platz. :-) Falls es trotzdem ein bisschen in Richtung Sinus gehen soll, reichen wahrscheinlich 4 Bit, also 16 Stufen. Dann könnte man sich auch überlegen, ob man Dreieck und Sägezahn als weitere Tonformen ebenfalls ermöglicht. Alles locker machbar mit einem einfachen ATtiny oder ATmega (wie auch mit jedem kleinen PIC oder ähnlichen Mikrocontrollern). Wenn man bei Frequenzen von 5 kHz auch eine etwas größere Toleranz akzeptiert, z.B. 5 Hz, gibts eh keine Probleme. Alles in allem: ein schönes Projekt! Wie werden Frequenzen und Geschwindigkeiten eingestellt? Dreh-Encoder?
Sebastian V. schrieb: >> Der Endwert müsste dann nur der halben Zielfrequenz entsprechen. >> Endwert = 25.000 gibt 1 Hz >> Endwert = 2.500 gibt 100 Hz >> Endwert = 250 gibt 1.000 Hz >> Endwert = 25 gibt 10.000 Hz > > Wie man aus obiger Tabelle sieht, kann man bis 100 Hz die Frequenz sehr > fein einstellen. Zwischen 1Hz und 100Hz gibt es dann 22.500 Abstufungen. Deshalb macht man es ja geschickterweise auch genau umgekehrt: Der Maximalwert bei dem der Zähler überläuft ist immer konstant (also nimmt man zum Beispiel einen uint16_t und lässt den bei der Addition einfach überlaufen) und das ist dann für jeden der 8 Kanäle genau gleich, der Wert jedoch der bei jedem Interrupt zu jedem dieser Zähler hinzugezählt wird ist variabel und bestimmt die Frequenz eines jeden Kanals und der ist dann direkt proportional zur Frequenz. Als Ausgangssignal dieser simplen Rechteck-DDS könnte man einfach für jeden Kanal das jeweils höchstwertige Bit seines jeweiligen Zählers nehmen und direkt an je einem Portpin rausführen. Wenn Du also mit 50kHz taktest, der Zähler bei 0xffff überläuft und Du bei jedem Takt immer 0x8000 hinzuzählst hast Du die maximale Frequenz: das oberste Bit wackelt mit 25kHz und wenn Du nur 1 hinzuzählst kommst Du runter bis auf 25000/32768 Hz, man kann also über den ganzen Bereich hinweg mit weniger als 1Hz Auflösung die Frequenz einstellen. Gerade bei den niedrigen Frequenzen ist das sehr präzise.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.