PWM , Sinusfrequenz berechnen , Verständnisfrage

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • PWM , Sinusfrequenz berechnen , Verständnisfrage

      Hallo,
      ich habe mit dem Tiny13 und PWM einen Sinusgenerator gebastelt.
      Funktioniert auch, aber ich weis nicht , wie die Sinusfrequenz entsteht, und wie man
      so etwas berechnen kann.
      Der Tiny tickert mit 9,6 MHz . Wenn ich davon ausgehe, das der Timer0 von 0 bis 255
      zählt, und dann wieder bis 0 zurück, dann ergäbe sich eine Periodenzeit von
      9600000/512=18750, bei Prescaler =1. Ich habe eine Tabelle mit 128 Sinuswerten, die
      nacheiander eingelesen werden. Ergäbe im günstigsten Fall eine Frequenz von
      18750/128=146,48 Hz. Am Oszi sind es 5 Teiler(1 ms) für eine Schwingung . Frequenzzähler
      sagt 198,..Hz . Und jetzt stehe ich im Wald. Gerechnet ca. 150, tatsächlich 200 Hz. ?????

      BASCOM-Quellcode

      1. Sinus:
      2. For I = 0 To 127
      3. Pwm0a = Lookup(i , Sinusdata)
      4. Waitus W
      5. Next I
      6. Return

      Ich habe auch noch eine Wartezeit W eingefügt, um die Frequenz ändern zu können.
      Aber bevor ich das hier nicht verstanden habe, brauche ich auch nicht weitermachen.

      So ist der Timer configuriert.


      BASCOM-Quellcode

      1. Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
      2. Start Timer0
      3. Enable Interrupts

      Ich hoffe, ihr könnt mir etwas auf die Sprünge helfen. a_64_3a718cae
      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Deinen Sinus erhältst du doch durch das periodische Ausgeben von Spannungen, deren Höhe einem Sinusverlauf entsprechen. Wenn du jetzt 128 Werte hast, bilden die eine Halbwelle (Vollwelle). Die Frequenz von diesem Sinus ist abhängig, wie schnell du die einzelnen Spannungswerte aus gibst. Die Pwm verwendest du, um überhaupt verschiedene Spannungen zu erhalten, deren Frequenz sollte so hoch sein, das jeder gerade angelegte Wert von der Sinuskurve, ich würde sagen, 2x ausgegeben wird. Die Pwm macht also nicht die Frequenz des Sinus, begrenzt aber die Sinusfrequenz.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo Tschoeatsch,
      wie aus den verschieden langen Highs und Lows am Tiefpass die Spannung entsteht,
      ist mir bekannt. Wie ich deinen Worten entnehme, ist die FOR- NEXT- Schleife direkt
      für die Frequenz der erzeugten Sinusspannung zuständig.?
      Wenn jeder Tabellenwert, wie du empfielst, zwei PWM Perioden anstehen sollte,
      müsste die Frequenz doch wesentlich tiefer sein.
      Wenn aber bei jeder PWM Periode ein Tabellenwert gelesen wird, dürfte die Frequenz
      doch maximal ca. 150Hz betragen (rein rechnerisch), oder sehe ich das ganz falsch ???
      Das wiederum würde ja bedeuten, das in einer PWM Periode mehrere Tabellenwerte
      gelesen würden. Das würde aber nach meiner Meinung kein sauberes Signal erzeugen.

      Geht das Grübeln also weiter.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Wie ist das jetzt mit deinen Werten in der Tabelle, sind die jetzt für eine Vollwelle? Schon, sonst hast du ja eine 'gleichgerichtete' Sinuswelle.
      Und ja, deine for..next ist die Frequenz des Sinus. An die PWM zu koppeln geht schon auch irgendwie, aber dann hast du ja nur eine Frequenz, gut, und die, die mit prescale noch zu erzeugen sind.
      Hast du jetzt deine for..next an den timer gekoppelt?


      Wegen der Frequenzabweichung, hast du mal die Taktfrequenz überprüft? Ist ja nur ein RC-Oszillator, vielleicht hast du Glück und der geht sau gut?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Dekaman schrieb:

      Der Tiny tickert mit 9,6 MHz . Wenn ich davon ausgehe, das der Timer0 von 0 bis 255
      zählt, und dann wieder bis 0 zurück, dann ergäbe sich eine Periodenzeit von
      9600000/512=18750, bei Prescaler =1.
      Ist mir nicht bekannt, dass der timer rückwärts zählt. Für mich ist eine Perioden 9600000/256=37500 Takte lang, also 37,5 kHz. Deine Ausgangsfrequenz liegt nur in der Laufzeit der for..next.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Sorry, Children ante Porta.

      tschoeatsch schrieb:

      Wie ist das jetzt mit deinen Werten in der Tabelle, sind die jetzt für eine Vollwelle
      Es ist eine Vollwelle, Werte von 0 bis 255 und wieder bis 0.

      tschoeatsch schrieb:

      Hast du jetzt deine for..next an den timer gekoppelt?
      nein.


      tschoeatsch schrieb:

      hast du mal die Taktfrequenz überprüft
      Noch nicht, aber ich glaube, so groß kann der Unterschied nicht sein.
      wäre ja ein Verhältnis von 4/3. ( 9,6 zu 7,2 MHz)

      Fazit: For - Next - Schleife legt die Sinusfrequenz fest. Mit dem Waitus
      kann ich die Frequenz noch verringern(beeinflussen).
      Eine Berechnung wäre nur möglich, wenn ich wüsste, wie viele Systemtakte
      bis zum nächsten Tabellenwert einlesen vergehen. oder ??

      Detlef

      Ps: habe deinen letzten Post erst jetzt gesehen.

      tschoeatsch schrieb:

      Ist mir nicht bekannt, dass der timer rückwärts zählt.
      So habe ich es aber gelesen. Es gibt ja wohl verschiedene PWM Modi.
      Vielleicht muss man da noch was einstellen. ??

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Dekaman ()

    • Ja, du hast recht, timer kann auch runter zählen. Das wird beim Phase Correct PWM Mode gemacht. Da ist aber nach meinem Verständnis eine Periode doppelt so lange. (So interpretieren ich das Datenblatt)

      Das mit der Frequenz berechnen geht vielleicht mit dem Simulator. Da kannst du die Zeit für einen for..next anzeigen/aufsummieren lassen. Die steht bei dir in einer sub, warum? Zwischen den for..next sollte doch nicht viel passieren.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Die steht bei dir in einer sub, warum? Zwischen den for..next sollte doch nicht viel passieren.
      Das hat sich so ergeben. Es sollte mal was größeres werden.

      BASCOM-Quellcode

      1. Do
      2. Restore Sinusdata 'Tabellenanfang
      3. Gosub Sinus
      4. Loop
      5. End
      Aber eine Frage habe ich noch, ich frage ja die Tabelle mit LOOKUP ab.
      Ist es denn notwendig, die Datentabelle zu restoren, die Position wird ja über
      den Index definiert. Bei DATA wird ja fortlaufend gelesen, da ist es schon wichtig,
      wenn man von vorn anfangen muss.
      Wenn ich das Restore nicht brauche, kann ich das ja alles in die DO-LOOP - Schleife schreiben.

      Mit dem Simulator habe ich noch nicht gearbeitet. Ein kleiner Wegweiser wäre auch nicht verkehrt.


      tschoeatsch schrieb:

      Das wird beim Phase Correct PWM Mode gemacht. Da ist aber nach meinem Verständnis eine Periode doppelt so lange. (So interpretieren ich das Datenblatt)
      Das habe ich schon in meinem 1. Post geschrieben. Drum auch die Systemtaktteilung durch 512.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Restore ist bei lookup nicht nötig.
      Schau mal hier mikrocontroller.net/articles/AVR_PWM, da steht bisschen was über Pwm. Das phase correct ist hier nicht nötig (glaub ich)
      Schnellanleitung zum Simulator:
      compilieren, Simulator aufrufen
      Programm starten, dims und so Zeug durchlaufen lassen und dann 'Pause' drücken
      Programmabschnitt suchen, den man untersuchen will
      Zeile mit rechts anklicken und 'Start ab Zeile' auswählen, blauer Pfeil steht auf dieser Zeile
      unten links stehen 'cycl' und Zeit, die kann man mit einem Rechtsklick auf 0 stellen. Jetzt mit Einzelschritt (F8) eine Zeile nach der anderen abarbeiten lassen, die dazu nötige Zeit wird unten aufsummiert
      oder man geht auf die letzte Zeile des zu untersuchenden Programmbereichs und setzt hier (rechter Klick einen breakpoint mit 'toggle breakpoint')
      Jetzt kann man statt Einzelschritt den Programmablauf mit 'start' durchlaufen lassen und er bleibt beim breakpoint stehen. Unten steht dann die benötigte Zeit.
      Das war jetzt aus dem Kopf formuliert, ohne Gewähr und Funktionsgarantie!
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Wünsch ich dir auch. Ich leg' mal einen genordeten Kronenkorken auf meinen Bauch und lass' noch einen Energiestrom in mich fließen trinkende-smileys-211
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @tschoeatsch
      musste heute leider in mehreren Wartezimmern den Grippeviren zusehen. Bin deshalb
      nicht richtig zum Zug (keine eisenbahn) gekommen. Habe aber das Programm (For Next Schleife)
      nach deiner Kurzanleitung simuliert.
      Ich bin zu folgendem Ergebnis gekommen. Ein Durchlauf der For Next Schleife dauert ca. 37,5 µs.
      Mal genommen mit 128 (Daten) ergibt eine Zeit von 4800 µs.´Das umgerechnet in Frequenz,
      komme ich auf 208 Hz. Das entspricht i.e. der Realität.
      Fazit: Die Sinusfrequenz ist also abhängig von der Durchlaufzeit der FOR NEXT Schleife.
      Die rechnerischen Abweichungen mit den tatsächlichen Werten führe ich auf die "genaue" Quarzfrequenz
      zurück. Auch werden manchmal zwei Werte innerhalb einer PWM Phase eingelesen, sonst könnte
      die Frequenz nicht so hoch sein. Das das nicht wirklich auffällt, liegt bestimmt daran, das benachbarte
      Werte kaum unterschiedlich sind.

      PWM ist warscheinlich nicht das Optimum zur Erzeugung durchstimmbarer Sinusfrequenzen.

      Ich bleib aber dran.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Hallo Dekamann,

      wenn Du eine Sinusspannung erzeugen willst, dann musst Du in möglichst vielen Schritten die Impulsbreite nach der Sinusfunktion (siehe Abbildung) verändern.
      Dann hast Du zunächst eine sinusförmige Spannung. Wenn Du daraus eine Frequenz machen willst, dann musst Du diese festgelegte Anzahl von Schritten so oft wiederholen wie die gewünschte Frequenz sein soll. Je mehr Schritte für eine Periode festgelegt werden, desto reiner ist die Sinuskurve.
      Die Amplitude kann man auch verändern, dann müssen die Impulszeiten insgesamt kürzer oder länger werden.
      Siehe auch hier den Link
      Viele Grüße
      Dateien
      • PWM.JPG

        (11,9 kB, 6 mal heruntergeladen, zuletzt: )
    • @Dieter
      Mir ist aber bekannt, wie aus dem Verhältnis Hi-Lo der Sinus entsteht. Die Frage war ja, ob es möglich ist, mittels PWM(Hardware) die Sinusfrequenz drchstimmbar zu machen.
      Habe mich in meinem Thred Titel vielleicht nicht korrekt ausgedrückt.
      Unter Fazit habe ich meine Erkenntnisse beschrieben.
      Vielen Dank für deine Bemühungen. Bin aber trotzdem offen für Anregungen und Hinweise.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Hallo, mir lässt die ganze Sache keine Ruhe. Habe mich jetzt mit dem Datenblatt des Tiny13A
      beschäftigt, speziell mit PWM. Mir erschließt sich noch nicht alles. Mein englisch ist auch nicht das,
      was man zum Verständnis gebrauchen könnte.
      Was ich gefunden habe: Auf Seite 73 , Tabelle 11-8 sind die verschiedenen Modi der PWM gelistet.
      Da gibt es WGM00, WGM01 und WGM02. Wenn ich das jetzt richtig interpretiere,sind
      WGM00 und WGM01 die Bits 0 und 1 des Registers TCCR0A , und WGM02 ist Bit 3 von TCCR0B.
      Um jetzt einen bestimmten PWM Modus zu programmieren, muss ich also die se Bits manipulieren.
      ? Bevor ich den Timer als PWM confiruriere, oder nachher ??
      Modus 1 und 5 sind Phase correct PWM . Beide unterscheiden sichnur in der Spalte TOP. Bei Modus 1
      steht in TOP 0xFF, heißt das, gezählt wird 0 -> ff -> 0 ??
      Das würde ja bedeuten , in Modus 5 wird gezählt 0 -> OCRA -> 0 ? ? Wie erzeuge ich dann aber Hi und LO ??
      Das gleiche träfe dann ja auch bei Fast PWM zu.??
      Das Datenblatt ist bestimmt ijotensicher verfasst, aber wie gesagt, mein englisch reicht um eine Tasse Tee
      zu bestellen, oder nach der nächsten U-Bahn Station zu fragen.

      Hier, denke ich, werden meine Fragen auch in der mir eigenen Sprache beantwortet.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Dekaman schrieb:

      ...Was ich gefunden habe: Auf Seite 73 , Tabelle 11-8 sind die verschiedenen Modi der PWM gelistet.
      Da gibt es WGM00, WGM01 und WGM02. Wenn ich das jetzt richtig interpretiere,sind
      WGM00 und WGM01 die Bits 0 und 1 des Registers TCCR0A , und WGM02 ist Bit 3 von TCCR0B.
      Um jetzt einen bestimmten PWM Modus zu programmieren, muss ich also die se Bits manipulieren.
      ? Bevor ich den Timer als PWM confiruriere, oder nachher ??
      Modus 1 und 5 sind Phase correct PWM . Beide unterscheiden sichnur in der Spalte TOP. Bei Modus 1
      steht in TOP 0xFF, heißt das, gezählt wird 0 -> ff -> 0 ??
      Das würde ja bedeuten , in Modus 5 wird gezählt 0 -> OCRA -> 0 ? ? Wie erzeuge ich dann aber Hi und LO ??
      Das gleiche träfe dann ja auch bei Fast PWM zu.??
      ---

      Genau, über die WGM Bits definierst du den Modus.
      Du kannst theoretisch erst den Config Timer Befehl eingeben und danach noch einzelne Bits setzen. Oder gleich alles selber machen.
      Im Modus 5 ist OCR0A der Top Wert, damit steht OC0A nicht mehr zur Verfügung. Du kannst dann nur noch über Kanal B eine Ausgabe machen. Also OCR0B das Tastverhältnis (muss dann kleiner als OCR0A sein) und die Ausgabe an OC0B. Beim Raufzählen schaltet der Ausgang z.B. auf High und beim Runterzählen auf Low (Clear_Down).
      Bei FastPWM zählt der Timer nur bis zum TOP rauf und springt dann wieder auf 0. Dabei wird der Ausgang wieder umgeschaltet.
    • Hallo Detlef,
      mit dem Tiny13 kannst du die PWM für eine feste Frequenz des Sinus wohl erzeugen.
      Wenn die Frequenz aber variabel sein soll, dann wird es schwierig. Das funktioniert mit einem 16-bit Timer halt einfacher, weil du da einen relativ großen Bereich der PWM Frequenz zur Verfügung hast.
      Bei einem 8-bit Timer kannst du die Frequenz, außer über den Prescale, ja nur in einem kleinen Bereich variieren. Denn mit kleineren OCR0A Werten wird dann die Auflösung kleiner, sodass OCR0A unter 50 knapp wird. Du musst dann immer schauen, ob du einen Prescale findest, der zusammen mit einem möglichst großen OCR0A und der wahrscheinlich festen Anzahl von Stützpunkten deine gewünschte Frequenz erzeugt.
      Ich glaube übrigens nicht, dass deine Methode mit dem Waitus in der Schleife zielführend ist, weil du dabei unterschiedlich lange Schrittweiten bekommst und deine Stützpunkte nicht mehr gleichmäßig über die Periode verteilt sind. Mit einem 16-bit Timer könntest du die PWM Periode so groß machen, dass sie immer genau einmal pro Stützpunkt geht.
    • hero schrieb:

      Ich glaube übrigens nicht, dass deine Methode mit dem Waitus in der Schleife zielführend ist, weil du dabei unterschiedlich lange Schrittweiten bekommst und deine Stützpunkte nicht mehr gleichmäßig über die Periode verteilt sind.
      Zu dieser Erkenntnis bin auch schon gekommen. Das mit dem Waitus habe ich "abgekupfert".

      Dekaman schrieb:

      PWM ist warscheinlich nicht das Optimum zur Erzeugung durchstimmbarer Sinusfrequenzen.
      Und davon bin ich nach jetzigem Wissensstand überzeugt.
      Denn wenn ich was reproduzierbares haben will, muss ich versuchen, meine Frequenz irgendwie
      mit der PWM zu "synchronisieren". Das heißt aber, das ich nur Frequenzen erzeugen kann, die in einem
      bestimmten Verhältnis zum Systemtakt und Prescaler stehen.

      Ich werde jetzt mal versuchen, mich mit R-2R- Netzwerk auseinander zu setzen und ausloten, in wieweit
      das für diesen Zweck nutzbar ist. Ist dann zwar ein Widerstandsgrab, führt aber bestimmt zu neuen Erkenntnissen.
      Heißt aber auch, größeren AVR (mehr Portpins).

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • @hero das verstehe ich nicht. Die Sinusfrequenz ist abhängig von der Häufigkeit der Nulldurchgänge und die sind in der data-Tabelle hinterlegt. Also ist die Laufzeit der for..next, die diese datas ausliest das Mass der Frequenz. Diese datas entsprechen der Spannung, die am Ausgang anliegen sollen. Um verschiedene Spannungen zu haben, nimmt man pwm. Wenn einem 8 bit in der Auflösung langen, reicht timer0. Nur sollte zu einen gelesenen data-Wert auch die passende Spannung zugeordnet werden können, dadurch begrenzt die Periodenzeit der pwm die Frequenz des Sinus. Das Strecken der Sinusfrequenz mit waitus geht schon, nur werden die Stufen in den Spannungssprüngen immer länger, dass das RC-Glied am Ausgang immer schlechter arbeitet. Für niedrige Frequenzen wäre eine größere data-Tabelle sinnvoller.
      Was jetzt mit einem 16bit timer besser gehen soll, erkenne ich nicht.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------