Hallo, es gibt hier ja massenhaft Beiträge zum Thema PWM, aber ich habe leider noch nichts gefunden, was mich meinem Ziel näher bringt. In Beitrag "DC -> AC mit Kondensator" habe ich gelernt, wie man einen Lautsprecher entkoppelt, so daß er nur den AC Anteil eines Signals abbekommt, und dann schön schwingen kann. Jetzt probiere ich gerade, ein Signal per PWM zu erzeugen, aber das funktioniert nicht so richtig. Bevor ich jetzt stundenlang herumexperimentiere wollte ich mal fragen, was denn überhaupt für meinen Zweck das geeignete Vorgehen ist, bzw. was machbar ist. Als Ziel möchte ich eine Melodie ausgeben, aber eben kein Rechteck, sondern weich klingend. Optional auch aggressive Rechtecktöne. Jetzt steige ich aber durch den PWM-Wald nicht durch. Theoretisch brauche ich eine sehr hohe PWM-Frequenz, und das Tastverhältnis bestimmt in dem Augenblick den Punkt auf der erzeugten Sinuskurve. Ich möchte deshalb den internen 9.6MHz Takt benutzen, und ich vermute dass fast-pwm der richtige modus ist. damit könnte dann eine pwm frequenz von 37.5kHz herauskommen, wo in einer periode das tastverhältnis mit 8 bit bestimmt werden kann. aber was will ich dann: es gibt anscheinend sogar 2 fast-pwm modi, und will ich, dass der pin toggelt, oder was anderes? vielen dank auch für verweise auf threads, wo das schonmal erklärt wurde.
Hallo Jochen, Hier ird die Sache haarig, denn du must die PWM per SW mit dem Sinus des gewünschten Tones modulieren, um so die gewünschte Hüllkurve zu generieren. pro PWm Canal liese sich ein monfoner ton generieren. Das ist bestimmt nen unerhörter Aufwand. Außerdem geben Sinustöne ohne Oberton kaum nen wirklichen Hörgenuss. Ich habe gerade der Tage auf ner alten ISA-Soundkarte nen separaten Yamaha-Soundchip entteckt, der ist bestimmt bei weitem besser geeignet und lässt sich bestimmt auch vonn nem µC erregen. ;-)))
Hallo, @Winfried Jaeckel: noch "gemeiner": ein altes Sondblaster-Wavetable mit dem Yamaha XG50 besorgen... Da geht nur Midi mit TTL-Pegel rein und hinten kommt Musik raus. Dann muß der AVR nur Midi-Files abspielen, hat das eigentlich schonmal jemand programmiert? Gruß aus Berlin Michael
Also ich erzeuge jetzt unhörbare 36.x kHz und kann das Tastverhätlnis über OCR0a setzen. Ist ein tiny13 @ 9.6Mhz
1 | //Timer/Counter Control Register A
|
2 | TCCR0A = 1<<COM0A1 | 1<<WGM01 | 1<<WGM00; |
3 | //Timer/Counter Control Register A
|
4 | TCCR0B = T0_CLK_1; |
5 | // Interrupts (OCIE0B,OCIE0A,TOIE0)
|
6 | //TIMSK0 |= 1<<TOIE0;
|
7 | |
8 | OCR0A = 100; |
Ich hoffe das ist soweit die richtige Vorraussetzng. Damit aber die PWM tatsächlich zum D/A Wandler wird, brauche ich noch einen Tiefpass, oder? Wie macht ihr das so? Das ganze muss dann schnell genug sein, um die Sinusstufen abzuschreiten. Macht man das in der overflow-isr?
Also du hast jetzt deine PWM >20KHz, das Register für das Tastverhältnis lädst du in einen anderen Timer IRQ immer wieder neu mit den aktuellen Sinuswert. Wie schnell du die Sinuskurve durchläufst ergibt dann die Frequenz des hörbaren Signalanteils. Den Tiefpass würde ich als RC Filter auslegen mit einer Grenzfrequenz von 10-15kHz
Hallo, gleich wieder ein paar Fragen: Ich benutze den 'Verstärker' von Hannes Lux: http://hanneslux.de/avr/divers/melody/melody04.html (mit gemeinsamen 1K Basiswiderstand) Mir schwant aber, dass der sich möglicherweise gar nicht mit einem Filter verträgt, weil die Transistoren ja eigentlich nur schalten. Oder sollte dann am Transistorausgang gefiltert werden? Aber da ist ja ein bißchen Leistung im Spiel. (Leider habe ich auch von Filtern noch keine Ahnung. Verluste?) Marius: Danke, ich habe jetzt mal die Sinus-Tabelle von http://www.microsyl.com/doorbell/doorbell.html genommen, aber noch keinen Filter...es klingt sehr dreckig. Und wie erreicht man denn eine andere Frequenz, man kann doch keine halben Schritte durch die Sinus-Tabelle machen, und irgendwie ist man doch auch an die PWM-Frequenz gebunden, was das Einstellen eines neuen Tastverhätlnisses angeht. Das kann doch eigentlich nur sinvoll im Overflow passieren, oder? Was kann denn bei der PWM Frequenz überhaupt theoretisch für eine Signalfrequenz erzeugt werden? Danke für Deine Hilfe! Jochen AVR131: Using the AVR’s High-speed PWM http://www.atmel.com/dyn/resources/prod_documents/doc2542.pdf http://de.wikipedia.org/wiki/Tiefpass
Dieser 'Verstärker' ist ein reiner Schaltverstärker und nicht für 'echte' NF geeignet. Denn meine Spielerei mit Tiny15 nutzt den Highspeed-PWM-Ausgang des Tiny15 (hat der Tiny13 nicht), erzeugt also keine echte Sinusform, sondern reine PWM (Rechteck), aber eben sauschnell. Als Filter dient die Induktivität und Trägheit des Lautsprechers. Bei langsamerer PWM funktioniert das nicht. Da muss man eben Tiefpass und "echten' NF-Verstärker einsetzen. ...
Ok, dann hat sich das vorerst erledigt und ich benutze nur Rechteck. Vielen Dank!
Das war zu voreilig: Welchen PWM Modus nimmt man denn so, wenn über das Compare-Register die Frequenz eingestellt werden soll? Tastverhältnis ist dann ja 50%. Mange Tak!
die frequenz passt du an indem du die Frequenz des Timers ändert, der die Werte nach lädt. Die Tonfrequenz ist dann Frequenz des timers geteilt durch Anzahl der Sinussamplewerte. Der Tiny15 hat eine geniale PWM Einheit... Du solltest bei deiner PWM Frequenz erst ein RC Glied schalten (dimensionierung ist nicht sooo wichtig, hauptsache die Grenzfrequenz stimmt) und dahinter einen OP-Amp der das Signal analog verstärkt. Durch den hohen Eingangswiderstand des OP-Amps kommst du mit hohen R und kleinen C aus (ich würd mal so 1µF nehmen und den R entsprechend berechnen, das gibt es noch als Keramik).
Der Timer des Tiny13 ist für die Ausgabe von PWM-codierter Sinus-NF zu langsam. Außerdem fehlt ein zweiter Timer, der das Weiterschalten in der Sinustabelle steuert. Selbst wenn Du nur Rechteck erzeugen willst, also bei Compare-Match nur den Pin toggeln lässt, wäre ein zweiter Timer für die exakte Steuerung der Tonlängen nicht zu verachten. Gut, man kann dazu den ADC-Interrupt als Timer missbrauchen, hat dann aber nur ein sehr grobes Zeitraster zur Auswahl. Du fragst, welcher PWM-Modus geeignet ist. Der, in dem der angeschlossene Pin getoggelt wird und der Timer auf 0 gesetzt wird. Einzelheiten weiß vermutlich das Datenblatt, denn jeder AVR-Typ ist da etwas anders ausgestattet. Man hat mir übrigens im Zusammenhang mit den oben genannten Spielereien nahegelegt, ich solle doch statt des ungeeigneten Tiny15 den bedeutend besser geeigneten Tiny45 oder Tiny85 benutzen. ...
Achja, wenn Du mal alle Varianten der Melodie-Spielerei durchgehst (analysierst), dann erübrigen sich viele Deiner Fragen. ...
Das mit dem tiny45 ist ein guter Tipp, den hab ich nämlich zufällig in der Bastelkiste. Danke!
Puuh, ich glaube man kann sich abschminken auf diese Weise harmonische Töne zu erzeugen. Wenn eine Sinus-Periode mit 64 Schritten aufgelöst wird muß also der PWM-Wert mit dem 64-fachen der gewünschten Frequenz gesetzt werden. Bei 800Hz sind das mal eben 51,2kHz! Das ist ja noch zu schaffen, aber wie man in einem brauchbaren Bereich auf exakte Werte kommen kann sehe ich gerade nicht wirklich.
Jochen wrote: > Puuh, ich glaube man kann sich abschminken auf diese Weise harmonische > Töne zu erzeugen. Auf welche Weise? > Wenn eine Sinus-Periode mit 64 Schritten aufgelöst > wird muß also der PWM-Wert mit dem 64-fachen der gewünschten Frequenz > gesetzt werden. Bei 800Hz sind das mal eben 51,2kHz! Richtig. Wobei das die (tonhöhenabhängige) Änderungsrate des Tastgrades ist, nicht die eigentliche PWM-Frequenz, die ist höher und konstant. > Das ist ja noch zu > schaffen, aber wie man in einem brauchbaren Bereich auf exakte Werte > kommen kann sehe ich gerade nicht wirklich. Wo genau ist Dein Verständnisproblem? - Der ADC wird als Timer missbraucht und steuert (neben anderen Aufgaben) die Tondauer, die Tonfolge (auch Pausen), die Dämfung und das Melodieende. - Timer0 erzeugt mit dem 64-fachem der gerade benötigten Tonfrequenz Interrupts, in denen der nächste Sinus-Augenblickswert geholt, manipuliert (gedämpft) und ins PWM-Tastgrad-Register geschrieben wird. - Timer1 klappert mit maximalem Takt vor sich hin, erzeugt aber keine Interrupts, sondern "nur" eine PWM am Portpin, deren Tastgrad ständig von der Timer0-ISR aktualisiert wird. ...
Man kann mit dem Attiny 13 locker 3 Sinusgeneratoren parallel in C-Programmieren und auf den PWM-Ausgang ausgeben. Gibt schöne Harmonische ( je nach Frequenzen ). Es funktioniert nach dem selben Prinzip wie das hier: http://www.roboterclub-freiburg.de/atmega_sound/atmegaSID.html Stichworte: DDS, Sinustabelle Gruss, Christoph
> Timer0 erzeugt mit dem 64-fachem der gerade benötigten Tonfrequenz > Interrupts, in denen der nächste Sinus-Augenblickswert geholt, > manipuliert (gedämpft) und ins PWM-Tastgrad-Register geschrieben wird. Ich verstehe nicht, wie man diese Interrupts exakt erzeugen kann. Z.B. für ein A 440Hz mal 64 = 28160 Hz entsprechend 35.51 Mikrosekunden. Das macht schon 1% Abweichung (8MHz / 8). Mit höherem Timertakt wird's zwar genauer, aber der nutzbare Bereich wird kleiner. Bei niedrigen Werten ist die Abstufung sowieso praktisch nicht zu gebrauchen. Danke für die Hilfe.
Jochen wrote: >> Timer0 erzeugt mit dem 64-fachem der gerade benötigten Tonfrequenz >> Interrupts, in denen der nächste Sinus-Augenblickswert geholt, >> manipuliert (gedämpft) und ins PWM-Tastgrad-Register geschrieben wird. > > Ich verstehe nicht, wie man diese Interrupts exakt erzeugen kann. Z.B. > für ein A 440Hz mal 64 = 28160 Hz entsprechend 35.51 Mikrosekunden. Und weil Du es nicht verstehst, funktioniert es nicht??? > Das macht schon 1% Abweichung (8MHz / 8). Es gibt beim Tiny15 keine 8MHz. > Mit höherem Timertakt wird's zwar genauer, aber der nutzbare Bereich > wird kleiner. Bei niedrigen Werten ist die Abstufung sowieso praktisch > nicht zu gebrauchen. Wie kommst Du zu dieser Aussage? > > Danke für die Hilfe. Tip: Ehe Du die Projekte anderer Leute schlecht redest, weil Du sie mangels Wissen und fehlendem logischen Denken nicht verstehst, solltest Du lieber Deinen Horizont erweitern oder zumindest die Schaltung aufbauen, das Programm in den Tiny15 reinladen und die Sache ausprobieren. Du wirst erstaunt sein, wie genau uns stabil die Tonerzeugung über einen Bereich ist, der das Abspielen von Melodien durchaus erlaubt. ...
Ich benutze mittlerweile den tiny45, der hat auch 8MHz (danke nochmal für deinen Hinweis). Eine kurze Erklärung des Prinzips wäre übrigens netter, als mich so anzumachen. Ich würde ich mich jedenfalls über eine Erklärung freuen.
Jochen wrote: > Ich benutze mittlerweile den tiny45, der hat auch 8MHz (danke nochmal > für deinen Hinweis). Soll ich jetzt wegen Dir einen Tiny45 kaufen und das Programm umschreiben? Das ist meiner Meinung nach etwas viel verlangt. > Eine kurze Erklärung des Prinzips wäre übrigens netter, als mich so > anzumachen. Meinst Du nicht, dass ich Deine Lernresistenz (auch in den anderen Threads) lange genug toleriert habe und Dir geduldig auf nette Art die primitivsten Dinge erklärt habe? Doch irgendwann kommt der Punkt, wo Deine Mitarbeit erforderlich ist. Soviel zum Thema "anmachen". > Ich würde ich mich jedenfalls über eine Erklärung freuen. Ich denke, dass auf meiner Webseite alles so erklärt ist, dass man es auch verstehen kann. Wenn Du es beim ersten Lesen nicht verstehst, dann lies nochmal, wenn Du es gar nicht verstehst, dann kann ich da auch nichts für... Sorry, aber ein bissel mitdenken musst Du schon selbst. ...
"Meinst Du nicht, dass ich Deine Lernresistenz ... lange genug toleriert habe ..." Lächerlich!
Christoph H. hatte es eigentlich schon auf den Punkt gebracht, Stichwort DDS. Dabei wird nicht die Abspielfrequenz verändert, um unterschiedliche Frequenzen zu erzeugen, sondern die Wellenform. Weiteres und Links dazu finden sich z.B. in Beitrag "Tonfrequenzen (Noten) erzeugen mit tiny45 in C"
Hannes, könntest du eine Aufnahme deiner Melodie von http://hanneslux.de/avr/divers/melody/melody04.html hier reinstellen? Ich bin sicher, dass eine Hörprobe auch andere interessiert. Meine Bedenken bezüglich der genau einstellbaren Frequenzen werden in http://www.freescale.com/files/microcontrollers/doc/app_note/AN1771.pdf auf der zweiten Seite im dritten Absatz angesprochen. Ich verstehe aber immer noch nicht, wie du alle Töne triffst. Schreibst Du auf deiner homepage noch mehr zum "... einstellen der Parameter Tonfrequenz ..."? Ich konnte dazu nicht mehr finden.
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.