Dimmer per PWM ansteuern

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

    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!

    • Dimmer per PWM ansteuern

      Hallo,

      ich wollte mal ein PWM Dimmer Modul verwenden um einen Lüfter (230V 60W) anzusteuern, da ich aber noch nie etwas mit PWM gemacht habe, bräuchte ich mal ein bischen Hilfe wie das mit PWM Grundsätzlich funktioniert. Habe diesen Code aus dem Netz, verstehe aber nicht genau wie ich das PWM SIgnal von 1-500Hz erzeugen kann wie es das Dimmer Modul benötigt. Auch wird in jedem Beispiel im Netz andere Variablen und Register verwendet ( Pwm0a = 0 , OC0A = 64 , Compare0a= 255 usw.) so das ich überhaupt nicht mehr durchblicke. Auch Google und die Bascom Hilfe ist da leider nicht sehr hilfreich.

      Könnte es mir mal einer für dummys erklären oder mir einen Link geben wo man es nachlesen kann.

      Gruß Jörg

      BASCOM Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 80
      4. $swstack = 120
      5. $framesize = 64
      6. $baud = 115200
      7. Config Timer0 = Pwm , Pwm = On , Prescale = 1024 , Compare A Pwm = Clear_up
      8. Config PortD.6 = Output
      9. Dim A As Byte
      10. 'hell für 2 Sekunden:
      11. Compare0a = 255
      12. Wait 2
      13. 'dunkel für 2 Sekunden:
      14. Pwm0a = 50
      15. Wait 2
      16. Do
      17. For A = 255 To 1 Step -10
      18. Compare0a = A
      19. Waitms 50
      20. Next A
      21. For A = 1 To 255 Step 10
      22. Compare0a = A
      23. Waitms 50
      24. Next A
      25. Loop
      26. End
      Display All
    • Hast du mal hier reingeschaut Timer-Berechnung - Tutorial
      Da ist es recht gut erklärt. Dein Vorteil ist ja das die Frequenz gar nicht mal so wichtig ist, das Modul braucht ja nur 0-5V sprich 0-100% Duty cyle.
      Genauer müsste es werden wenn du selber nen Dimmer konstruierst, da muss man dann das Timing schon seher genau auf den Nulldurchgang bringen.
      Nur malmgenerell: Die Register können je nach verwendetem Timer/Prozessor unterschiedlich sein

      Tobias
    • JOJO150272 wrote:

      und die Bascom Hilfe ist da leider nicht sehr hilfreich.
      das stimmt in dem Fall leider

      JOJO150272 wrote:

      Pwm0a = 0 , OC0A = 64 , Compare0a= 255
      ist das selbe Register nur mit unterschiedlichen Namen. Leider hilft auch der Simulator nur bedingt weiter, jedoch zeigt er zuverlässig wie die Register mit dem Config beschrieben werden. Ob damit das gewünschte erreicht wird muß dann ein Blick ins Datenblatt oder ein Versuch zeigen. Ich würde einen Versuch vorziehen. Wenn der nicht funktioniert noch mal im Datenblatt nach "Fallen" suchen. In manchen Modes ist z.B. nur toggeln möglich.
      Eine Frequenzänderung ist auch machbar: Oc0b toggelt während Oc0a den Top des Zählers bestimmt, Aber das nennt mann dann nicht mehr PWM

      JOJO150272 wrote:

      OCR0A = 0 also Nix
      auch kontrollieren. In einigen Modes wird es nicht Nix sondern ein Pix bleibt. Bei dem Dimmer vielleicht nur ein Brummen in einem Netzteil fatal :D
    • Für meine 1-500Hz PWM verwende ich dann Prescale = 64 was so 490Hz ergeben sollte.

      Welcher Mode sollte ich den verwenden bzw. welchen habe ich mit meinem Config eingestellt?

      Wie macht man es den eigentlich wenn je nach Mode bei OCR0A = 0 noch ein Pixel bleibt ?

      Auch habe ich noch nicht genau verstanden wie ich das PWM Signal ganz abschalten kann wenn ich es mal bräuchte?

      So ich denke das ich es jetzt so weit verstanden habe, um es die Tage mal mit 230V zu probieren, werde erstmal eine echte Glühbirne als Last
      verwenden. Wenn das so funktioniert werde ich den Lüfter mal verwenden.

      Wenn ich noch was ändern sollte bitte melden.
    • JOJO150272 wrote:

      Wie macht man es den eigentlich wenn je nach Mode bei OCR0A = 0 noch ein Pixel bleibt ?
      Bei einem Tiny13 mußte ich das Signal negieren so wurde 255 zu Null und dann wirklich aus.
      Jedoch kommt es hier nicht auf max Frequenz an da sollte sich ein passender Mode finden lassen.
      In Deinem Code wird der Mode 1 ein geschaltet. Wenn ich mich recht erinnere schaltet der bei 0 wirklich aus ist jedoch halb so schnell, ca 250 Hz im grünen Bereich :D
      Geade mal getestet:
      Ein Mega 8 mit Timer2 geht von ganz aus (0) bis voll an (255) im Mode 1
      Sein Timer0 hat kein Pwm und beim Timer1 kann ich die 16Bit Register Lowbytes nicht "von draußen" setzen. Ein 238 ist gerade nicht hier.

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

    • Zu Deiner Frage, welchen Mode Du eingestellt hast:
      Sowas kannst Du mit dem Simulator und dem Datenblatt ermitteln.
      Lässt man Dein Programm im Simulator über die "Config Timer" Zeile laufen, erkannt man, welche Register Bascom setzt.


      Sim_PWM_Mode.jpg



      Anschließend suchen wir die Register im Datenblatt des entsprechenden uC's. Hier werden die gesetzten Bits beim Namen genannt.

      TCCR0A.jpg

      TCCR0B.jpg


      Nun schauen wir, wofür die einzelnen Bits zuständig sind.
      Die CS0n Bits (Clock Select Bits für Timer0) sind für den Prescaler verantwortlich. Anhand der Tabelle im Datenblatt sehen wir: 101 entspricht einem Prescale von 1024.

      CS_Bits.jpg



      Die WGM0n Bits (Wave Generator Mode für Timer0) sind für den Timer-Mode zuständig. Sie sind nicht alle im selben Register, daher müssen hier beide Register gleichzeitig betrachtet werden. Sie stehen auf 001. Der Timer läuft also im Mode 1 (PWM, Phase Correct).

      WGM_Bits.jpg



      Als letztes sind noch die COM0xn (Compare Output Mode) Bits interessant. Sie sind verantwortlich für das Pin-Verhalten bei einem Compare-Match. Für diese Bits gibt es mehrere Tabellen im Datenblatt, weil sie je nach verwendetem Timer Mode (WGM0n Bits) unterschiedliches Verhalten auslösen. Da wir Phase Correct PWM ausgewählt haben, ist folgende Tabelle relevant:

      COM0_Bits.jpg


      Wenn man nun einen Timer-Mode benötigt, welcher nicht durch eine Config-Zeile gesetzt werden kann, setzt Du die entsprechenden Bits in den Registern einfach selbst. ;)


      Zu der Frage nach dem "Ausschalten" der PWM:
      Je nach Anwendungsfall könntest Du COMA1 und COM0A2 auf 0 setzen. Damit trennst Du den Pin vom PWM und es ist ein ganz normaler Output Pin.
      Oder Du verwendest "Stop Timer0", um den Timer anzuhalten und somit die PWM zu pausieren (dies setzt die CS0-Bits auf 000 bzw beim Starten wieder auf die ursprüngliche Einstellung von 101). Allerdings kannst Du bei letztgenannter Methode nicht vorhersagen, ob der PWM-Pin beim Ausschalten auf high oder low steht.

      Hier noch ein Code für den Simulator:

      BASCOM Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 80
      4. $swstack = 120
      5. $framesize = 64
      6. $baud = 115200
      7. $sim
      8. ' To avoid confusion in simulator:
      9. ' In Bascom-Simulator register...
      10. ' ...TCCR0B is labled as "TCCR0 &H45" <- "B" is missing !!!
      11. ' ...TCCR0A is labled as "TCCR0A &H44"
      12. ' --------------------------------------------------------
      13. ' Timer0 Config for HW_PWM (Mode 1, Phase Correct PWM)
      14. ' --------------------------------------------------------
      15. Config Timer0 = Pwm , Pwm = On , Prescale = 1024 , Compare_A_Pwm = Clear_up
      16. ' This Config-Timer0-line set register TCCR0A and TCCR0B as followed:
      17. ' 7 6 5 4 3 2 1 0
      18. ' -------------------------------------------------------------------------
      19. ' I COM0A1 I COM0A0 I COM0B1 I COM0B0 I - I - I WGM01 I WGM00 I TCCR0A
      20. ' -------------------------------------------------------------------------
      21. ' 1 0 0 0 0 0 0 1
      22. ' 7 6 5 4 3 2 1 0
      23. ' -------------------------------------------------------------------------
      24. ' I FOC0A I FOC0B I - I - I WGM02 I CS02 I CS01 I CS00 I TCCR0B
      25. ' -------------------------------------------------------------------------
      26. ' 0 0 0 0 0 1 0 1
      27. ' Instead of this config line you can alternatively use:
      28. TCCR0A = &b10000001
      29. TCCR0B = &b00000101
      30. ' Explanation:
      31. ' COM0xn Bits are responsible for pin-behavior (i.e. Clear_Up, Clear_Down etc)
      32. ' WGM0x Bits are responsible for the different possible Timer0 modes
      33. ' CS0x Bits are responsible for the Prescaler
      34. Do
      35. Stop Timer0
      36. !nop
      37. Start Timer0
      38. !Nop
      39. Loop
      40. End
      Display All