Wie könnte man mit einem ATMEGA einen 8-fachen Rechteckgenerator erstellen?

OP #4043096
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?
OP #4043221
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.
(Firma: guloshop.de) #4043227
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?
#4043229
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
OP #4043242
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.
OP #4043248
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. :-)
Gast #4043268
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.
(Firma: guloshop.de) #4043305
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?
Gast #4043314
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
OP #4043385
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.
#4043975
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.
OP #4044052
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.
#4044054
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.
OP #4044066
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.
#4044289
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.
Gast #4044291
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
(Firma: guloshop.de) #4044708
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?
#4044742
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren