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.pdfhttp://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.
...
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.
...
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.
...
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.