-         

Ergebnis 1 bis 9 von 9

Thema: PWM

  1. #1
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9

    PWM

    Anzeige

    Hallo

    Ich bin grad dabei mich in die Bascom Programmierung reinzuarbeiten und in den Beispielen die ich hier liegen habe wird oft über ein PWM Signal gesprochen. ICh hab mich etwas dadrüber informiert und weiß das ein PWM Signal eine Rechteckspannung ist die je nachdem welches Verhältnis die Ein-und Ausschaltzeiten haben eine unterschiedlich hohe Durchschnittsspannung dabei rum kommt.
    Meine Frage ist nun wie ich im Bascom so ein PWM Signal in einem ATMega32 erzeugen kann, sodass ich das evtl. zum Dimmen einer LED oder für einen Motor für verschiedene Geschwindigkeiten nehmen kann.

    Danke für die Hilfe

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hast du denn mal PWM oben in der Suche eingegeben?
    Da findest du jede Menge Beispiele.
    Außerdem kann der AVR auch Hardware PWM. Die Beschreibung findest in der Hilfe bei Config Timerx.

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    Naja ich hab mich mal ein bischen umgeschaut und hab ich das nun richtig verstanden das diese Zeile

    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
    Pwm1a = 512
    Pwm1b = 512

    das PWM Signal quasi startet? Das man mit Config Timer1 = PWM das PWM Signal startet und mit PWM = 10 die Bit-Zahl festlegt und mit Prescale dann wie bei einem einfachen Timer den Prescale - Wert also z.B. bei nem 4Mhz Quarztakt eine Auflösung von 2us? Was ich dann nur nicht verstehe ist wofür Compare A Pwm = Clear Down und Compare B Pwm = Clear down steht.

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    Ahh hab schon was passendes gefunden

  5. #5
    Hallo hat jamand eine Software PWM lösung ich brauche nähmlich 6 von einander unabhänige (Im PWM Wert) Ausgänge

    mfg Danny1989

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.11.2008
    Ort
    Kapfenberg
    Beiträge
    628
    Hallo!

    Ich hab mal sowas gemacht.

    Code:
    'Name:.............Soft-PWM
    'Version:..........1.0a
    'Datum:............19.02.2009
    'Autor:............Thomas Edlinger
    '---------------------------------
    'Beschreibung: Software-PWM mit 3 Kanälen.
    '
    '              Version 1.0a:  Es wird ein weicher Übergang zwischen den einzelnen
    '                             Kanälen erzeugt. Bei entreteten einer High-Low-Flanke
    '                             an PC6 wird die Geschwindigkeit der Übergänge schneller.
    '
    '              Pinbelegung:
    '              ###########################
    '              # LED rot:  A=PB1 | K=PB0 #
    '              # LED gelb: A=PA0 | K=PB3 #
    '              # LED grün: A=PA3 | K=PA2 #
    '              # Taster:   1=PC7 | 2=PC6 #
    '              ###########################
    
    
    $regfile = "m32def.dat"
    $crystal = 8000000
    
    
    'KONFIGURATION PORTS
    Config Portb = Output
    Config Porta = Output
    Config Portc.7 = Output
    Config Pinc.6 = Input
    Portc.6 = 1
    Portb.0 = 0
    Portb.3 = 0
    Porta.2 = 0
    Portc.7 = 0
    
    
    'ALIAS-ADRESSEN
    Led1 Alias Portb.1
    Led2 Alias Porta.0
    Led3 Alias Porta.3
    Taster Alias Pinc.6
    
    
    'KONFIGURATION ENTPRELLROUTINE
    Config Debounce = 50
    
    
    'KONFIGURATION TIMER
    Config Timer0 = Timer , Prescale = 8
    
    Config Timer1 = Timer , Prescale = 1
    On Timer1 Timer1_isr
    Start Timer1
    Enable Timer1
    
    
    'VARIABLEN
    Dim Led1_value As Byte
    Dim Led2_value As Byte
    Dim Led3_value As Byte
    Dim Programm As Byte
    Dim Richtung1 As Bit
    Dim Richtung2 As Bit
    Dim Richtung3 As Bit
    Dim A1 As Bit
    Dim A2 As Bit
    Dim A3 As Bit
    A1 = 1
    
    
    'INTERRUPTS GLOBAL FREIGEBEN
    Enable Interrupts
    
    
    '### HAUPTSCHLEIFE ###
    Do
    
       If Led1_value <= Timer0 Then Led1 = 0 Else Led1 = 1
       If Led2_value <= Timer0 Then Led2 = 0 Else Led2 = 1
       If Led3_value <= Timer0 Then Led3 = 0 Else Led3 = 1
    
       Debounce Taster , 0 , On_taster , Sub
    
    Loop
    
    
    '### UNTERROUTINEN ###
    Timer1_isr:
    
       If Programm = 0 Then
          If A1 = 1 Then
             If Richtung1 = 0 Then Incr Led1_value Else Decr Led1_value
             If Led1_value = 200 Then Richtung1 = 1
             If Led1_value = 10 Then Richtung1 = 0
          End If
          If A2 = 1 Then
             If Richtung2 = 0 Then Incr Led2_value Else Decr Led2_value
             If Led2_value = 200 Then Richtung2 = 1
             If Led2_value = 10 Then Richtung2 = 0
          End If
          If A3 = 1 Then
             If Richtung3 = 0 Then Incr Led3_value Else Decr Led3_value
             If Led3_value = 200 Then Richtung3 = 1
             If Led3_value = 10 Then Richtung3 = 0
          End If
          If Led1_value = 90 And Richtung1 = 0 Then A2 = 1
          If Led2_value = 90 And Richtung2 = 0 Then A3 = 1
          If Led3_value = 90 And Richtung3 = 0 Then A1 = 1
          If Led1_value = 10 And Richtung1 = 1 Then A1 = 0
          If Led2_value = 10 And Richtung2 = 1 Then A2 = 0
          If Led3_value = 10 And Richtung3 = 1 Then A3 = 0
       End If
    
       If Programm = 1 Then
          If A1 = 1 Then
             If Richtung1 = 0 Then Incr Led1_value Else Decr Led1_value
             If Led1_value = 200 Then Richtung1 = 1
             If Led1_value = 10 Then Richtung1 = 0
          End If
          If A2 = 1 Then
             If Richtung2 = 0 Then Incr Led2_value Else Decr Led2_value
             If Led2_value = 200 Then Richtung2 = 1
             If Led2_value = 10 Then Richtung2 = 0
          End If
          If A3 = 1 Then
             If Richtung3 = 0 Then Incr Led3_value Else Decr Led3_value
             If Led3_value = 200 Then Richtung3 = 1
             If Led3_value = 10 Then Richtung3 = 0
          End If
          If Led1_value = 90 And Richtung1 = 0 Then A2 = 1
          If Led2_value = 90 And Richtung2 = 0 Then A3 = 1
          If Led3_value = 90 And Richtung3 = 0 Then A1 = 1
          If Led1_value = 10 And Richtung1 = 1 Then A1 = 0
          If Led2_value = 10 And Richtung2 = 1 Then A2 = 0
          If Led3_value = 10 And Richtung3 = 1 Then A3 = 0
          Timer1 = 50000
       End If
    
    
    Return
    
    
    On_taster:
    
       Incr Programm
       If Programm = 2 Then Programm = 0
    
    Return
    
    
    End
    Der wirklich relevante Teil ist die Hauptschleife. In den Unterroutinen wird lediglich der Wert für die PWMs nach bestimmten Mustern geändert, um einen Effekt zu erzeugen.

    Grüße
    Thomas

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hallo WeiserDruide,

    versuch mal folgendes:

    Code:
    'Software PWM mit 6 Kanälen
    'läuft auf 12,5kHz
    'erweiterbar auf mehr Kanäle
    'je mehr Kanäle, desto mehr Rechenleistung wird benötigt
    'verwendet einen 8bit-Timer
    
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 60
    $hwstack = 60
    $swstack = 60
    
    
    Config Timer2 = Timer , Prescale = 8
    Timer2 = 96
    On Timer2 Isr_von_timer2
    Enable Timer2
    
    Ddrc = &B11111111
    Portc = &B00000000
    
    Dim Pwm_soft(6) As Byte
    Dim Ist_counter As Byte
    Dim N As Byte
    Dim Pin_num As Byte
    
    
    Enable Interrupts
    
    
    Do
    
    'Mainloop
    
    Loop
    
    End
    
    Isr_von_timer2:
    Timer2 = 96
    Incr Ist_counter
    If Ist_counter = 255 Then Ist_counter = 0
    For N = 1 To 6
    Pin_num = N - 1
    If Pwm_soft(n) <= Ist_counter Then
    Portc.pin_num = 0
    Else
    Portc.pin_num = 1
    End If
    Next N
    Return
    mit den variablen pwm_soft(1-6) werden die PWM-Werte für die jeweiligen Ausgänge eingestellt. Wenn du eine größere Auflösung möchtest, musst du pwm_soft(1-6) und ist_counter als z.b. word (16bit) deklarieren und ein paar zahlen verändern.

    Gruß
    Chris

  8. #8
    Hallo erst mal danke aber wenn man das Programm nicht selber geschrieben hat ist es als neuling zimlich schwer da durch zusteigen also habe ich es doch lieber selbst versucht unter zuhilfe nahme von TomEdl seinen prog die auflösung ist zwar recht grob aber für den zweck ausreichent und leicht zu schreiben ich muss nur noch ne wert änderung über taster einfügen dann habe ich es

    Code:
    $regfile = "m8515.dat"
    $framesize = 8
    $swstack = 8
    $hwstack = 8
    $crystal = 1000000
    
    Config Portc.0 = Output
    Config Portc.1 = Output
    
    Config Pina.7 = Input
    Porta.7 = 1
    Config Pina.5 = Input
    Porta.5 = 1
    
    Config Timer0 = Timer , Prescale = 8                        'Konfiguriere Timer1
    Enable Timer0                                               'schalte den Timer1 ein
    On Timer0 Isr_von_timer0                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Enable Interrupts
    Timer0 = 131                                                'Timer1 soll schon von 34285 wegzählen
    
    Dim X As Byte
    Dim Y As Bit
    
    
    Portc.1 = 0
    
    
    Do
    If 131 <= Timer0 Then Portc.0 = 0 Else Portc.0 = 1
    Loop
    '30
    
    Isr_von_timer0:                                             'ISR von Timer1
    Timer0 = 131
    Return
    131 = 100% 255 =0% sehts euch bitte mal an und sagt mir ob es so i.o. ist

  9. #9
    ich habe das Programm nochmal geändert jetzt funtzt es auch mit verstellung ich habe nur immer wenn ich einen taster betatig kuze aussetzer
    kann das mit Debounce zusammen hängen und kann ich das irgentwie verhindern.
    Code:
    $regfile = "m8515.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    
    Config Portc.0 = Output
    Config Portc.1 = Output
    
    Config Pina.7 = Input
    Porta.7 = 1
    Config Pina.5 = Input
    Porta.5 = 1
    
    Led1 Alias Portc.0
    Led2 Alias Portc.1
    Taster1 Alias Pina.7
    Taster2 Alias Pina.5
    
    
    
    Config Timer0 = Timer , Prescale = 8                        'Konfiguriere Timer1
    Enable Timer0                                               'schalte den Timer1 ein
    On Timer0 Isr_von_timer0                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Enable Interrupts
    Timer0 = 130
    
    Dim X As Integer
    Dim Y As Bit
    
    Led1 = 1
    Led2 = 0
    X = 200
    
    Main:
    
    Do
                                                                          '130 = 100% 255 = 0%
    If X <= Timer0 Then
    Led1 = 0
    Else
    Led1 = 1
    End If
    
    If X >= 140 Then
    Debounce Taster1 , 0 , On_taster1 , Sub
    End If
    
    If X <= 245 Then
    Debounce Taster2 , 0 , On_taster2 , Sub
    End If
    
    Loop
    
    On_taster1:
    X = X - 10
    Goto Main:
    
    
    On_taster2:
    X = X + 10
    Goto Main:
    
    
    Isr_von_timer0:
    Timer0 = 130
    Return

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •