Bug bei Timer0 PWM-Generierung?

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Ja da gibt es auch ein Match.
      Allerdings ist bei OCR0A=0 als beispiel ein schmaler Nadelimpuls übrig.
      Bei ORC0A=255 ist dagegen der Pegel durchgehen High (Nadelimpuls bei Registerwert 254)

      Auch wenn das Signal invertiert ist, bleibt bei OCR0A=0 ein Nadelimpuls, der ist dann aber negativ.
      Bei Wert 255 durchgehend Low (kein Puls).

      Das konnte ich mit dem Oszi beobachten.
      Kaum macht man es richtig - und schon geht's!
    • Wenn man also 0% bzw 100% Einschaltdauer braucht, also ohne Nadeln, muß man sich schon Gedanken machen, wie man das gestaltet.
      Beides geht wohl nicht gleichzeitig, also sowohl 0 bzw 100%.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Doch das geht auch.
      Ich habe das auch schon gemacht. Weiß aber grade nicht mehr wie. Ist schon etwas her.
      Aber ich mach mich mal schlau.

      Ich weiß jetzt nicht, ob im Dual-Slop PWM Mode auch ein Nadelpuls übrig bleibt.
      Das kann ich aber später mal messen. Ist ja alles noch aufgebaut.

      Ich muss auch mal messen, wie breit der Puls ist. Ob das 1/256-tel Teil ist oder die Laufzeit von 1 oder 2 Takten.

      Ich messe das nachher mal.
      Kaum macht man es richtig - und schon geht's!
    • So jetzt kommen die versprochenen Messungen.

      @Guenther
      Es sind definitiv 510 Zählschritte bei PWM Correced Phase.

      Hier der Beweis:
      Systemtakt 8MHz und PWM so konfiguriert:
      Config Timer0 = PWM , Prescale = 8 , Compare_A_PWM = Clear_Up
      OCR0A = 120 ' Tastverhältnis einstellen
      Ist also PWM Phase Corrected Mode (Dual-Slop)

      Rechnerisch soll PWM Frequenz auskommen:
      Frequenz = Systemtakt / Vorteiler / Zählschritte = 8000000MHz / 8 / 510 = 1960,78Hz

      Hier das Oszillogramm, oben rechts die PWM-Frequenz. Gemessen 1960,77Hz1 (Punkt-Landung!)
      PWM_510_Schritte.jpg

      Diese Erkenntnis werde ich so schnell nicht vergessen! Danke für den Hinweis.

      @tschoeatsch
      Ich habe die Messungen auch bezüglich 0% bis 100% ausprobiert.

      Zusammenfassend kann ich Aufgrund der Messungen feststellen, dass im FastPWM-Mode bei OCR0A/B = 0 immer ein Peak übrig bleibt.
      Bei PWM PhaseCorrected ist die Aussteuerung von Bottom-Wert bis Top-Wert möglich.

      Der Peak bei Fast-PWM hat folgende Längen:

      FastPWM ORC0A=0:
      Bei Prescale = 1 ist der Peak genau ein Systemtakt lang. Bei Prescale = 8 ist er 8 Systemtakte lang.

      FastPWM OCR0A=255:
      Pegel bei 100% (entweder Low oder High)

      Hier die Oszillogramme zu den Messungen
      Fast-PWM_Prescale=1_OCR0A=0.jpgFast-PWM_Prescale=8_OCR0A=0.jpg
      Abbildung Links: Prescaler = 1, rechts: Prescaler 8
      Blau ist der Systemtakt am Quarz gemessen, Gelb der Peak bei ORR0A=0 und Compare_a_PWM = Clear_Up
      Kaum macht man es richtig - und schon geht's!
    • Darf ich daraus folgern, bei top gibt es kein match und man muß sich überlegen, wo man den Nadelpuls, der ja garnicht so nadelig ist, am besten verkraftet? Oder halt auf fast pwm verzichten.
      Wobei mir jetzt in der Theorie noch nicht ganz klar ist, dass man da ohne Nadeln auskommt.
      The phase correct PWM mode is based on a dual-slope operation. The counter counts repeatedly from BOTTOM to TOP and then from TOP to BOTTOM. TOP is defined as 0xFF when WGM2:0 = 1, and OCR0A when WGM2:0 = 5. In non-inverting Compare Output mode, the Output Compare (OC0x) is cleared on the compare match between TCNT0 and OCR0x while upcounting, and set on the compare match while downcounting.
      Da kann ein match ja auch bei bottom sein und auf den Wert 0 kommt der timer beim Runterzählen und startet von 0 beim Hochzählen.
      Aber ok, eigentlich ist der timer auf 0 und top nur einen timertakt lang, aber das ist er bei fast pwm ja auch (bei 0). a_27_b277ca12
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Beim Dual-Slop (PWM Phase Corrected) wird einmal beim Hochzählen ein Match stattfinden und dann wieder beim Runterzählen.
      Der OC0A wird also beim Hochzählen z.B. gesetzt und beim runterzählen gelöscht.

      Beim Single-Slop ist das anders.
      Da wird der ORA0 beil 0-Setzen unf einen bestimmten Wert gesetzt und beim Hochzählen wird der Match erreicht. Dort wird dann der Pin invertiert. Bei Top-Wert beginnt das dann wieder von neuem.
      Kaum macht man es richtig - und schon geht's!
    • Schon, beim Hochzählen setzen, beim Runterzählen resetten, mal als Beispiel. Und das soll bei 0 passieren. Timer fängt bei 0 an, ah, es muss gesetzt werden, zählt rauf, zählt runter, kommt bei 0 an, ah, es muss resettet werden. Und weiter? Wird jetzt gesetzt, bevor der timer bei 1 ist? Oder gilt nur das Erreichen eines Wertes zum Ändern des pins, dann schaut's wieder anders aus. Dann wäre in diesem Beispiel der Ausgang immer low (reset). Wird der match jetzt auf 1 gelegt, dann ist der Ausgang ja fast die ganze Zeit high (set), ab 1 bis nauf und wieder runter bis 1.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Du wirfst da was durcheinander.

      Fast-PWM zählt immer ab 0 bis Top-Wert (z.B. 255). Der Mode kann also den Ausgang ORnA/B nur bei Wert 0 und bei Match ändern.

      Beim PWM Phase Correct Mode wird gezählt 0 bis topwert und dann wieder zurück. Es wird also der Matchwert 2x passiert, einmal beim Hochzählen
      und einmal beim Runterzählen. Bei 0 oder TopWert wird nichts am ORnA/B gemacht.

      jetzt verstanden?

      Sonst musst du mal im Datenblatt genau lesen.
      Alternativ im Lexikon den Beitrag "Timerberechnung Tutorial". Könnten aber noch Fehler vorhanden sein!
      Kaum macht man es richtig - und schon geht's!

      The post was edited 1 time, last by Mitch64 ().

    • Also bei correct pwm bei 0 und match wird nix gemacht.
      Bei fast pwm wird bei wenn match=top nix gemacht. Ok.
      Aber wenn bei 1 der match-Wert ist, dann bekommt man ja wieder Nadelpulse, eben dann, wenn der timer beim runter Zählen von 1 nach 0 kommt und dann wieder zur 1. Und wenn 0 der match-Wert ist, dann muss der Ausgang doch auch behandelt werden. In meinem Beispiel müsste der gesetzt werden (raufzählen=setzen).
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch wrote:

      Also bei correct pwm bei 0 und match wird nix gemacht.
      Falsch. Der zählt rauf und runter. Dabei ist 2x der Zählerwert = Match-wert. Und nur zum Matchzeitpunt (2x) wird der Ausgang geändert.

      tschoeatsch wrote:

      Aber wenn bei 1 der match-Wert ist, dann bekommt man ja wieder Nadelpulse, eben dann, wenn der timer beim runter Zählen von 1 nach 0 kommt
      Wenn der runterzählt, dann ist das der Mode PWM Phase Correct. Da ändert sich nur was wenn Zählerwert = match-Wert ist.

      tschoeatsch wrote:

      Und wenn 0 der match-Wert ist, dann muss der Ausgang doch auch behandelt werden.
      Bist du hier bei FastPWM oder bei Phase Correct PWM?

      Falls du Phase Correct meinst, dann müsste der der beim Matchwert 0 setzen und löschen.
      Was da intern passiert, dass da kein Peak entsteht, kann ich dir auch nicht sagen.

      Wenn da aber einer wäre, wäre der am Oszi zu sehen. Und da ist nix.
      Also 0% bis 100% ohne Peak.
      Kaum macht man es richtig - und schon geht's!