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
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.
Ahh hab schon was passendes gefunden
Hallo hat jamand eine Software PWM lösung ich brauche nähmlich 6 von einander unabhänige (Im PWM Wert) Ausgänge
mfg Danny1989
Hallo!
Ich hab mal sowas gemacht.
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.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
Grüße
Thomas
Hallo WeiserDruide,
versuch mal folgendes:
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.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
Gruß
Chris
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
131 = 100% 255 =0% sehts euch bitte mal an und sagt mir ob es so i.o. istCode:$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
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
Lesezeichen