Forum: Mikrocontroller und Digitale Elektronik PWM -> Sinus, tiny13 - welcher modus?


von Jochen (Gast)


Lesenswert?

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.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

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.   ;-)))

von Michael U. (Gast)


Lesenswert?

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

von Jochen (Gast)


Lesenswert?

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?

von Marius S. (lupin) Benutzerseite


Lesenswert?

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

von Jochen (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Jochen (Gast)


Lesenswert?

Ok, dann hat sich das vorerst erledigt und ich benutze nur Rechteck. 
Vielen Dank!

von Jochen (Gast)


Lesenswert?

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!

von Marius S. (lupin) Benutzerseite


Lesenswert?

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).

von Hannes L. (hannes)


Lesenswert?

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.

...

von Hannes L. (hannes)


Lesenswert?

Achja, wenn Du mal alle Varianten der Melodie-Spielerei durchgehst 
(analysierst), dann erübrigen sich viele Deiner Fragen.

...

von Jochen (Gast)


Lesenswert?

Das mit dem tiny45 ist ein guter Tipp, den hab ich nämlich zufällig in 
der Bastelkiste. Danke!

von Jochen (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Christoph H. (Gast)


Lesenswert?

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

von Jochen (Gast)


Lesenswert?

> 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.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Jochen (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Jochen (Gast)


Lesenswert?

"Meinst Du nicht, dass ich Deine Lernresistenz ... lange genug toleriert 
habe ..."

Lächerlich!

von Jochen (Gast)


Lesenswert?

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"

von Jochen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.