Forum: Mikrocontroller und Digitale Elektronik Tonausgabe Attiny26?


von Imke G. (imke152)


Lesenswert?

Hi,
habe da mal eione Frage.Müssen von der Schule aus mit dem Attiny 26
eine tonausgabe verwirklichen.
Nun wissen wir nicht ob wir Tiefpässe brauchen oder direkt von dem
ausgang an die boxen gehen können.
Und wäre nett wenn uns jemand sagen könnte, wie das geht das er
generell Töne heraus gibt.
Und ob einer vielleicht schon weiß wie das C+ Programm heisst, oder uns
ein Beispiel geben kann.
Vielen Dank im vorraus.
Imke

von Rupplyn (Gast)


Lesenswert?

verschiedene möglichkeiten, die mir psontan einfallen:

1. Port togglen
2. PWM
3. D/A-Wandler

benutz mal die Boardsuche. da findet sich auf jeden fall was...

von Dominik (Gast)


Lesenswert?

Ich würds mit PWM machen! Geht ganz gut!

von Imke G. (imke152)


Lesenswert?

was wäre denn das einfachste?
Ist PWM leicht?
Kann die Box direkt an den Ausgang oder müssen irgendwelche Schaltungen
bzw Bauteile vor geschaltet werden?
Kannst du mir vielleicht ein Beispiel geben oder eine seite oder eine
Anleitung,wäre echt sehr hilfreich?
Weil wir müssen das in 2 wochen ab geben und ehrlich gesagt, haben wir
nicht gerade viel ahnung davon!
Vielen dank schonmal für eure hilfe

von Rupplyn (Gast)


Lesenswert?

Am einfachsten ist sicherlich einen Port in der gewünschten frequenz zu
toggeln, wird sich aber ohne weitere beschaltung nicht so toll
anhören... das mindeste wär mal n stützkondenstator um den ausgang zu
glätten... die pc-lautsprecherboxen kannst du direkt dranhängen. deren
verstärker müsste eigentlich ausreichen. mit pwm wirst du
wahrscheinlich klanglich das beste ergebnis erzielen... im board hier
gibt's genügend beipsiele für so was. raussuchen tu ich dir das jetz
nich...

von Dominik (Gast)


Lesenswert?

Hier wär mal der Link zu dem PWM-Artikel:

http://www.mikrocontroller.net/articles/PWM

Entweder du hänst wie gesagt ne Box mit nem Verstärker ran oder so'n
Mini-Lautsprecher (der Piepser vom PC) geht auch so normal!

Des bekommsch du schon hin, PWM isch echt net so schwer! Gibt genug
Beispiele!
Such mal nach... tonerzeugung oder sowas in der Art, da findest du
genug Zeug.

mfg

von Dennis Kleine-Beck (Gast)


Lesenswert?


von Imke G. (imke152)


Lesenswert?

vielen vielen dank für eure hilfe,das ist echt nett von euch.
Nur eins ist noch,ich kenn mich mit der sache echt sozusagen null aus.
Also euer stand ist bei 9 oder 10 und meiner ist bei 0 vielleicht sogar
1.
habe auch sachen hier über tonausgabe gefunden, nur die schreiben als
wenn die tag und nacht nichts anderes machen als das.Also ich versteh
da net wirklich wat von.

von Wolfram (Gast)


Lesenswert?

Dann geh in die Bibliothek,lies ein paar Bücher und bring deinen
Wissensstand zumindest auf 5.
Stichwörter wären
PWM ,Schwingungen,Tiefpass, Programmierung?...

1.Überlege dir wie muss ein Signal das in den Lautsprecher reingeht
aussehen.
2.Wie kann ich dieses Signal erzeugen?

von Imke G. (imke152)


Lesenswert?

ja es muss ein rechtecksignal sein
das hab ich mittlerweise mit bekommen
und ich kann es mit mehreren sachen erzeugen
is ja net gleich ein grund mich an zu machen

von Rahul (Gast)


Lesenswert?

@Wolfram:
Welches Buch zum Thema PWM würdest du denn empfehlen?

@Imke: Vielleicht kann Euch Euer Lehrer Literatur-Hinweise geben.
Die Datenblätter (Complete) von Atmel sind übrigens gespickt mit
Beispielen...

von Wolfram (Gast)


Lesenswert?

Ej man Ej das war aber jetzt keine Anmache...

Mal schaun ob dein Wissensstand wirklich bei 0 ist.
Warum ein RechteckSignal? Ein Ton (eine Frequenz) ist doch eigentlich
ein Sinussignal.
Welche Frequenz sollte das (Rechteck?)signal besitzen wenn du einen Ton
mit der Frequenz 440Hz erzeigen willst?

von peter dannegger (Gast)


Lesenswert?

Du kannst auch erstmal ganz profan eine Zählschleife zur Zeitverzögerung
nehmen und einen Pin togglen.

Und danach dann den Timer mit dem "toggle pin und clear on
compare"-Modus.

Die PWM-Modies sind nicht so das richtige, wenn es nur darum geht, die
Frequenz zu ändern.


Peter

von Thomas O. (Gast)


Lesenswert?

Hallo,

das ist falsch Boxen mögen keine Rechtecksignale vor allem die
Hochtöner nicht, weil hier das Membran zu abrupt gestoppt wird. Bei
einer Schwingung hingegen wird es langsammer abgebremst. Ich müsst also
Filter bauen der die Rechtecksignale abrundet wenns sichs auch nach
etwas anhöhren soll. Leider ist ein Filter nur für bestimmte frequenzen
ausgelegt.

Googel also auch mal nach Sinuston. Ich würde das per D/A-Wandler
machen  wird sich um einiges besser anhören als PWM wird aber von der
Programmierung etwas aufwendiger sein.

von Rahul (Gast)


Lesenswert?

[OT]
...Modies... Mehrzahl der Mehrzahl des Modus...
Ist nicht böse gemeint, brachte mich nur zum Schmunzeln.
[/OT]

von peter dannegger (Gast)


Lesenswert?

@Thomas

"das ist falsch Boxen mögen keine Rechtecksignale vor allem die
Hochtöner nicht, weil hier das Membran zu abrupt gestoppt wird."


Das ist auch falsch !

Die Boxen mögen nur nicht, wenn Du hinter den AVR nen 100W-Verstärker
auf Vollanschlag schaltest.
Die Signalform ist dabei egal, nur das Frequenzspektrum ist
entscheidend.
Ein 100W-Box ist für 100W über das ganze Hörspektrum ausgelegt, d.h.
100W weißes Rauschen überlebt sie.
Der Hochtöner ist aber nur etwa 15W-fest, d.h. bei 100W und 10kHz geht
der hops, egal ob Sinus oder Rechteck.


Peter

von Thomas O. (Gast)


Lesenswert?

aha und warum verrecken Höchtöner an schwächeren Verstärker eher als
welche an stärkeren Verstärkern? Weil die Schwachen Verstärker immer
total übersteuert angefahren werden damit überhaupt was rauskommt. Und
was dann bei hohen Frequenzen rauskommt ist eher ein Rechteck als ein
Sinus.

von Rahul (Gast)


Lesenswert?

dann packt man halt einen (aktive) Tiefpass hinter den AVR-Pin und setzt
die Grenzfrequenz auf 15kHz.
Meistens gehen Boxen deswegen über den Jordan, weil irgendein Mensch
damit was zutun hat...(Bedienerfehler)

von Imke G. (imke152)


Lesenswert?

also jetzt doch ein rechtecksignal?
Ich dachte das das impulspausenverhältnis unterschiedlich ist und so
die einzelnen töne durch verscheidene frequenzen entstehen?
Oder jetzt doch sinus?
Arrrrrr!
Kennt ihr net jemanden der das schon mal gemacht hat?
Ich mein wie ihr euch damit aus kennt ist das doch sicherlich kein
problem für euch und irgend jemand wird sowas doch mal zusammen
gefuchtelt haben!
Und jetzt doch ein tiefpass hinter den AVR-Pin anschliessen?
Ich bedanke mich noch mal für eure hilfe

von Rahul (Gast)


Lesenswert?

das mit dem Tiefpass war eher für Thomas gedacht...

von Hannes L. (hannes)


Lesenswert?

Wenn's erstmal nur piepsen soll und keine Car-Hifi-Qualität
erforderlich ist, dann könnte man sich hier mal orientieren:

http://www.hanneslux.de/avr/divers/index.html

...

von Imke G. (imke152)


Lesenswert?

thx

von Axel R. (Gast)


Lesenswert?

Hi,
ich würde eine Tabelle im Flash ablegen und am Port mit einer R2R
Widerstandskette die resultierende Spannung abgreifen. Sieht mit
16Stufen schon recht passabel aus.
Im Timerinterrupt fährst Du dann deine Tabelle durch.
Ist genauso einfach, wie PWM zu programmieren und das Ergebnis um ein
vielfaches besser.

vy73
DG1RTO

DL1RON silent key RIM

von struberg (Gast)


Lesenswert?

Wenn ihr einen Tiny26 verwendet, dann habt ihr hoffentlich genügend
ports frei um die Töne nicht mit PWM ausgeben zu müssen!
Um einen 10 kHz Sinus auszugeben müßtet ihr laut Shannon Theorem mit
mindestens 20kHz quantisieren. Da ein einziger Quantisierungsschritt in
PWM allerdings mit mindestens 5 Impulsen erzeugt werden sollte um
annähernd eine erträgliche Qualität zu erlangen, wären etwa 100kHz PWM
Frequenz notwendig. Da macht der uC aber sonst nichts mehr anderes.

Viel einfacher:

Nimm einfach n Ausgänge und bau dir einen DA Wandler mit einer
Widerstands-Cascade auf:
              R3
O3 -------[===]-----+
              R2    |
O2 -------[===]-----+
              R1    |
O1 -------[===]-----+
              R0    |
O0 -------[===]-----+---------+------ out
                    |         |
                    -         |
                   | |       ---
                   | |Rx     ---Cx
                   | |        |
                    -         |
                    |         |
                   GND       GND

von Lupin (Gast)


Lesenswert?

Wenn man kein software PWM benutzt ist der controller doch nicht
ausgelastet.

R2R ist aber auch nicht das wahre, 16 bit Qualität bekommst du damit
auch nicht hin. Ich denke mal 8 bit ist maximum und das kann man mit
einen schnellen hardware PWM auch machen ohne das es sich wirklich
schlimm anhört.

von peter dannegger (Gast)


Lesenswert?

Also Jungs, es geht um einen Anfänger, also immer Schritt für Schritt.

Er muß ja auch Erfolgserlebnisse haben, d.h. erstmal den Rechteck zum
Laufen kriegen.

Sinus geht mit dem Tiny26 auch prima, der hat ja ne PLL, also kann man
die PWM-Frequenz bis zu 250kHz hochsetzen, das hört kein Mensch mehr
und der Lautsprecher wirkt automatisch als Tiefpaß.

Ein externer DAC ist also völlig überflüssig bzw. mit normalen
1%-Widerständen kriegt man nicht mal 8 Bit hin.

Für den Sinus legt man eine Tabelle mit 1/4 Schwingung im Flash ab
(z.B. 16 Werte) und gibt die dann entsprechend der gewünschten Frequenz
nacheinander auf die PWM, z.B. im T0-Interrupt.


Peter

von Profi (Gast)


Lesenswert?

Wenn es Sinus und evtl. mehrere Töne gleichzeitig sein dürfen:
Suche mal nach "direkte digitale Synthese"
http://www.mikrocontroller.net/forum/read-1-134540.html#134581
und alle anderen Links in diesem Thread.

Der Clou ist: eine Sinus-Tabelle z.B. mit 256 Einträgen.
Der Zugriff auf  diese Tabelle geschieht mit einem Pointer, der ein
Vorkomma- und ein Nachkomma-Byte hat.
Wir wollen z.B. 440 Hz erzeugen, die Samplefrequenz sei 10 kHz, also
habe ich 10000 / 440 = 22,7272 Samples für eine Sinusvollwelle.
also addiere ich in das Nachkommabyte jedesmal 256*0,7272=186,1632 ->
186  und dann mit Carry die 22 in das Vorkommabyte, das dann als Index
in die Tabelle zeigt.
Die genaue Frequenz ist 10000/(22+186/256)=440,01375 Hz.

So kann man leicht n Töne gleichzeitig erzeugen, für jeden braucht man
die 2 Additionswerte und dir 2 "Akkumulator"-Bytes.
Das hochwertige Akku-Byte zeigt in die Tabelle (die braucht man nur
einmal), die n Tabellenwerte werden addiert und ausgegeben (egal ob PWM
oder ADC).

von Thomas O. (Gast)


Lesenswert?

die Möglichkeit mit dem da Wandler ist auch nicht besonderst schwierig.

Man schalten einem Port einen 8bit D/A-Wandler nach.
Dann legt man die Werte einer Sinuskurve ab die man dann einfach am
Port ausgibt, je nach Wartezeiten bis man den nächsten Wert übergibt
ändert sich automatisch die Frequenz. Evtl. noch ein Transistor
dahinter der die Leistung etwas anhebt.

Und ein 8bit Sinuston ist halt doch was anderes als ein kratzender
PWM-Ton. Außerdem hat mal halt bei PWM das Problem das der
Tiefpassfilter ja nur auf eine bestimmt Frequenz eingestellt wird. Um
man dann ganz komische Lautstärkeverhältnisse abhängig vom Frequenzgang
bekommt.

von Lupin (Gast)


Lesenswert?

Genau so hatte ich mir das auch gedacht... man kann bei 250 kHz PWM
einen sound mit bis zu 3 bit pro sample ausgeben weil 250000Hz/(2^3) =
31250Hz und das sollte man nicht mehr hören. Wenn dieser Wert unter
20000Hz geht hört man ein hintergrund-piepsen.

Erstmal würde ich aber versuchen per PWM einfach irgend eine hörbare
Frequenz auszugeben um einfach ein piepsen zu haben.

von Profi (Gast)


Lesenswert?

Es spricht doch einiges dafür, die PWM-Frequenz noch höher zu legen,
z.B. 8MHz, dann habe ich bei 8-bit-PWM ebenfalls 31250Hz.

@Thomas warum sollte PWM irgendwie kratzend sein??
Da die Samplerate - wie oben beschrieben - konstant ist, hat der
Tiefpassfilter (nahezu) keinen Einfluss auf die Lautstärke.

... je nach Wartezeiten bis man den nächsten Wert übergibt
ändert sich automatisch die Frequenz.
Das ist bei der o.g. Methode eben nicht so. Man gibt immer mit der
konstanten maximalen Sample-Frequenz (idealerweise ist die gleich mit
der PWM-Frequenz) die online-berechneten - besser gesagt gelookten -
Werte aus der Tabelle aus. Dabei überspringt man jedesmal mehrere (im
oberen Beispiel 22-23) Tabelleneinträge.

Vorteil der DDS: man kann nahezu jede beliebige Frequenz mit hoher
Genauigkeit erzeugen. Bei anderen Methoden gelingt das - vor allem bei
hohen Frequenzen - nicht mehr, da bei kleinen Teilern der Sprung um 1
eine große Frequenz-Änderung ergibt.

von peter dannegger (Gast)


Lesenswert?

@Lupin

"Genau so hatte ich mir das auch gedacht... man kann bei 250 kHz PWM
einen sound mit bis zu 3 bit pro sample ausgeben"

???

Die 250kHz hast Du bei vollen 8Bit (PLL = 64MHz), damit kannst Du
selbst einen guten 20kHz Sinus basteln (bloß hören wird den kaum
einer).



"Erstmal würde ich aber versuchen per PWM einfach irgend eine
hörbare Frequenz auszugeben um einfach ein piepsen zu haben."

Meine Rede !

Ignorier erstmal die vielen Sinus-Tips und machn Rechteck.

Man kann den Berg nicht mit einem Schritt besteigen.


Peter

von Lupin (Gast)


Lesenswert?

Achso, ich dachte der tiny hat eine max pwm freq von 250kHz, hab mich
schon gewundert :)

Ich kenne mich halt nicht damit aus. Bei 64 MHz PWM ist 8 bit ja
absolut kein Problem mehr. Dann währen 11 bit theoretisches Maximum und
das ist schon echt gut, wenn man bedenkt das man dafür keine externe
Hardware benötigt!

von Hannes L. (hannes)


Lesenswert?

Hier ist ein weiteres Beispiel mit dem Tiny15. Es werden Melodien
abgespielt, deren Einzeltöne gedämpfte Sinus-Schwingungen sind. Die
Ausgabe erfolgt über PWM mit 100kHz.

http://www.hanneslux.de/avr/divers/melody/melody04.html

Dank an AR. und Peter D. für die Inspiration...

...

von Edward Cardew (Gast)


Lesenswert?

Vielleicht passt das hier zum thema?

http://elm-chan.org/works/mxb/report_e.html

Klingt sehr schoen und laeuft mit fasst keine Hardware.

Edward

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.