PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tonerzeugung / Frequenzerzeugung



Florian
08.09.2004, 20:10
Hi! :o)
Ich bin gerade dabei einen Soundgenerator für meinen AT Mega8 zu programmieren.
Ich habe jetzt schon mit Delay-Schleifen und Timern Töne erzeugt.
Das funktioniert auch gut, aber es beansprucht den AVR zu sehr, ich möchte nebenbei noch LED's ansteuern und noch andere Sachen machen.
Ich habe mal gehört, dass man mit PWM auch Töne an z.B. PB1/OC1A ausgeben kann, geht das wirklich, PWM ist doch eher um "Analog-Signale" (stimmt ja nicht direkt) ausgeben zu können?
Wie funktioniert PWM?
Ich habe mich schon auf www.mc-project.de und im datasheet informiert, aber hab noch nicht herausgefunden, wie's geht!
Ich benutze Asm und ich finde keine Beispiele, oder kennt jemand welche für PWM?
Kann man mit PWM überhaupt Frequenzen von ungefähr 61,74Hz bis 4,18601 kHz erzeugen?
PWM (hardwaremäßig) läuft doch im Hintergrund, oder?

Danke für Eure Hilfe! :o)

Matthias
08.09.2004, 20:25
Möchtest du mehrehre Töne z.B. ne melodie) oder nur nen Signalton abspielen? Bei einem Könnte mann's mit nem 555 machen, bei mehreren vielleicht auch noch über nen Wiederstandsnetzwerk für den R zwischen pin8 und 7 (nartürlich dann nicht an 8 sondern an den digiport hängen).

Florian
08.09.2004, 20:36
Hi Matthias! :o)
Ich möchte den Ton ja extra mit dem AVR erzeugen, Spielerei! ;o)
Der soll z.B. HappyBirthday spielen! *ja, lach ruhig*
Der soll wenn möglich alle Töne von 'H über Kammerton a' bis hin zu c''''' können!
Mit Timern gehts auf alle Fälle!

Florian
08.09.2004, 20:40
Wäre es eigentlich einfacher mit OC2 zu arbeiten?

Frank
08.09.2004, 21:18
Tja, in Bascom gibts dafür Sound Befehl :-) Aber Assembler-Fan´s mögen es ja etwas aufwendiger :-)
Aber du müsstest doch nur eine Routine schreiben die den Timer entsprechend auf die 2xTonfrequenz stellt. Im Timer Interrupt kannst du dann Piezo-Toggeln (erzeugt Tonfrequenz). Nach kurze Wartezeit schaltest du Timer wieder aus. Und schon könnte nächste Note gespielt werden. Mehr macht der Sound Befehl auch nicht.

Du könntest Piezo auch an den Pwm anschließen. Du müsstest dann die PWM Frequenz pro Ton umprogrammieren.

Gruß Frank

Florian
08.09.2004, 21:32
Hi Frank!
Ich bin ein bekennender ASM-Fan! ;o)
Ja, so habe ich das bisher gemacht, aber was heißt Toggeln? *g*
Ich dachte, dass es vielleicht mit PWM besser/schneller/unkomplizierter ginge!?
Naja, mache ich's halt weiter mit den Timern! :o)
Aber ich muss eh demnächst einen Motor mit PWM takten, wie geht das also?

Danke für eure Hilfe! :o)

Frank
08.09.2004, 23:00
"Toggle" ist ein befehl von bascom und de rmacht nichts weiter als Zustand eines Portes umkehren. "Toggeln" sollte also umschalten heißen :-)
Glaub nicht das Sound ansonsten mit PWM einfacher geht. Man kann sich nur die Interrupt-Routine sparen, weil bei pwm ja automatisch bei einem bestimmten Wert der Port "getoggelt" wird ;-) Ansonsten ist es das gleiche in grün.

Florian
09.09.2004, 00:02
Hi Frank! *gähn , müde sei , Schulzeit*
Jetzt hab ich's verstanden, also invertieren auf Deutsch gesagt, oder ist das überhaupt Deutsch, wahrscheinlich Latein von invertere!? *lol*
Trotzdem, wie kann man PWM generieren?
Ich sehe mir heute (ist ja schon nach 0.00 Uhr) nochmal das datasheet an und probier n bischen rum!
Mal sehn, ob ich's verstehe, ansonsten melde ich mich nochmal! :o)

Danke für eure Hilfe und gute Nacht! :o)

Frank
09.09.2004, 00:16
Hi,
ich nehm da gern die High Level Bascom Befehle, die werden dir da in Assembler wenig nützen. Man kann es in Bascom zwar auch mit den Registern programmieren, aber warum soll man sich die Mühe machen.
Du musst dir also wohl oder Übel die Register vom 16 Bit Timer anschaun. Ist aber recht einfach, müssten sich auch irgendwo ASM Beispiele finden.
Ja schon wieder spät geworden

09.09.2004, 07:51
Hallo Florian, habe es zwar auf meiner Seite nur in C demonstriert, aber die von dir benötigten Frequenzen kann man ohne Probleme erzeugen. Wie die Initialisierung auszusehen hast, kannst du bei den Projekten (z.B. Ultraschall) sehen. Mit dem Timer1 sollte die Lösung kein Problem sein. Die C-Befehle in Assembler umzuändern dürfte für dich auch keine Hürde sein.
Falls du konkrete Fragen zur Erzeugung bestimmter Frequenzen hast, so kann ich dir gerne aushelfen.

Gruß, Alex

09.09.2004, 10:12
Hallo Alex,
kannst du vielleicht Beispiel hier nochmal posten?

09.09.2004, 11:17
Ist zwar nicht im hörbaren Bereich, aber durch Verringern der oberen Grenze (ICR1) bzw. erhöhen des Prescalers kommt man da ohne Probleme hin. Falls du die Timerproblematik verstanden hast, sollte dir das folgende helfen:

void _40khz_init (void) {
TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(WGM11);
TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS10);
OCR1A = 100;
ICR1 = 200;
}

//36kHz Träger
TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(WGM11);
TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS10);
OCR1A = 111;
ICR1 = 222;

Falls dir die Berechnung der Timereinstellungen unklar ist, dann schau hier:
http://mc-project.de/Pages/rc5.html

Gruß, Alex

avatar
09.09.2004, 11:38
Hi Florian,

ich habe schon mal ein Programm zu spielen von Melodien geschrieben (nicht AVR). Um die zwölf Töne eine Oktave zu berechnen musst du jeweils immer die Frequenz des vorherigen Tones mit 1,0594631 multiplizieren.

Wenn man diese Zahl zwölf mal mit sich selber multiplizierst, kommt 2,0 raus. Es ist nämlich die zwölfte Wurzel aus 2. Die Länge von Orgelpfeifen kann man mit der gleichen, einfachen Formel berechnen. Ein Intervall von einer Oktave entspricht genau einer Verdoppelung bzw. Halbierung der Frequenz.

:-({|=

Mehr:
http://www.musikverein-himmelsthuer.de/musikwissen/10594631/

tobimc
09.09.2004, 12:28
HI Florian!

Ist jetzt vielleicht ne doofe Idee, da du das ja mit dem µC machen willst
usw. Aber probier's doch mal mit dem Speak Jet!

Wenn ich richtig informiert bin, kann man dem über UART
Frequenzen zukommen lassen und der schiebt sie dann raus.

Ist nur ne Idee...

Und was ist, wenn du in den Schleifen, also in den Pausen zwischen
dem aus- und einschalten des Pins deine LEDs steuerst?
Ist zwar etwas aufwendig aber könnte gehen.
Du musst dann die Schleife um die Zeit, die die LED-action
braucht verkürzen.

KEEP MUSIC! :-({|= :D

(Ich habe mit dem RCX von Lego damals sogar
die Melodie von Starlight Express programmiert...
und die Kleine Nachtmusik.
Meech hat jetzt so ein MC22(RC-Fernsteuerung von Graupner) -Gepiepse
wenn man ihn einschaltet.)

Viele liebe Grüße,
Tobi

Frank
09.09.2004, 13:07
Wenn es nur um ganz einfache Töne geht, dann ist die Lösung mit Timer doch die günstigere.
Die genauen Einstellungen für den Timer kann man, wie schon von Sonic gesagt, mit dem Tool hier https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169 ganz schnell berechnen.
Das Tool generiert auch ein Bascom-Beispielprogramm.
Wenn mir jemand die ASM und/oder C-Übersetzung des generierten Beispieles postet, dann kann ich das Tool gerne so erweitern das es auch diesen Code für alle frequenzen generiert.

Gruß Frank

Florian
09.09.2004, 18:18
Danke für eure Hilfe, ich werde jetzt alles in Ruhe durchsehen und mich dann nochmal melden! ;o)

Florian
09.09.2004, 20:48
Hi!
Welcher Ausgang (OC1A/OC1B/OC2) ist am Besten für Tonerzeugung und welcher Ausgang gehört zu welchem Timer und wie hoch ist die Auflösung des PWM (8bit/10bit/16bit)?

Gottfreak
10.09.2004, 08:25
Die Ausgänge sind im Prinzip gleich gut geeignet. Welchen du nimmst, hängt bloß davon ab, welchen Timer du gerne verwenden würdest.
OC1A/B "gehören" beide zu Timer1, OC2 zu Timer2.
Die Auflösung des PWM kannst du einstellen(ich glaube 8-10 bit).
Hast du eigentlich das Datenblatt zum Mega8? Da steht das alles ziemlich genau drin(wenn auch etwas verteilt).

avatar
10.09.2004, 11:50
hast du eigentlich das Datenblatt zum Mega8?Eine übersichtliche und aktuelle Datenblattsammlung gibt es hier:
http://www.avr-consultant.de/datenblaetter.php

Die meisten Datenblätter sind sogar in zwei Versionen vorhanden. "Kurzfassung" und ausführliche Fassung ("Komplett"). Zu einigen Datenblättern gibt es noch Ergänzungen und Berichtigungen ("Errata")

Florian
10.09.2004, 14:01
Hi! :o)
@ avatar:
Ich beziehe meine Datenblätter direkt von Atmel, www.atmel.com, da sind sie glaube ich am aktuellsten! ;o)

@ Gottfreak:
Ich verwende das Datenblatt Complete:
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

Ich habe mich im Datenblatt schon sehr genau umgeschaut, habe aber noch nicht die Zeit gehabt alles durchzulesen! *faultier*

Ich nehme jetzt also OC1A! :o)
Was für ein PWM-Mode ist für Tonerzeugung geeignet und welcher Mode für Motoren?

Danke für eure Hilfe! :o)

Gottfreak
10.09.2004, 14:17
Für Motoren empfehlen die im Datenblatt den Phase-Correct-Mode(oder den Phase&Frequency-Correct-Mode), warum auch immer, hab' ich mich nie mit beschäftigt.
Für die Tonerzeugung sollte das nicht so wichtig sein(schließlich kann man das Tastverhältnis nicht hören, sondern nur die Frequenz.) ?

Florian
10.09.2004, 14:25
Danke!