Forum: Mikrocontroller und Digitale Elektronik Wie könnte man mit einem ATMEGA einen 8-fachen Rechteckgenerator erstellen?


von Sebastian V. (n8falter74)


Lesenswert?

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?

von g457 (Gast)


Lesenswert?

> Hat da jemand eine Idee?

Kuckst Du Datenplatt, grob Abschnitt Timer und PWM.

HTH

von Volker S. (vso)


Lesenswert?

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
von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ 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.

von Sebastian V. (n8falter74)


Lesenswert?

@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.

von Sebastian V. (n8falter74)


Lesenswert?

@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.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ 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

von Falk B. (falk)


Lesenswert?

@ 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.

von Sebastian V. (n8falter74)


Lesenswert?

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.

von Sebastian V. (n8falter74)


Lesenswert?

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. :-)

von Martin S. (led_martin)


Lesenswert?

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

von chris_ (Gast)


Lesenswert?

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"

von Wayne (Gast)


Lesenswert?

guckst du z.B. hier: http://arduino.cc/en/Main/ArduinoBoardMega2560
Da musst du dann auch nicht so viel löten...

von Wolfgang A. (Gast)


Lesenswert?

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.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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?

von Wolfgang A. (Gast)


Lesenswert?

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 ;-)

von Leonard H. (Gast)


Lesenswert?

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

von VEB Kraftverkehr Acapulco (Gast)


Lesenswert?

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?

von Max M. (jens2001)


Lesenswert?

X. H. schrieb:
> man könnte die 555 auch weg lassen

Was an dem Wort "emulieren" hast du nicht verstanden?

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Mein Gott, noch 25 Beiträge mehr und die Sache ist selbst mit ein Quad 
Core nicht lösbar . . .

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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. :-)

von Sebastian V. (n8falter74)


Lesenswert?

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.

von Holist (Gast)


Lesenswert?

>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/

von Volker S. (vso)


Lesenswert?

@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
von Sebastian V. (n8falter74)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

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.

von Sebastian V. (n8falter74)


Lesenswert?

> 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
von Ralf D. (doeblitz)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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?

von Bernd K. (prof7bit)


Lesenswert?

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
Noch kein Account? Hier anmelden.