Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM
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
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.
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 :D
WeiserDruide
08.12.2009, 16:23
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.
'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
Che Guevara
08.12.2009, 16:56
Hallo WeiserDruide,
versuch mal folgendes:
'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
WeiserDruide
08.12.2009, 19:36
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
$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
WeiserDruide
10.12.2009, 19:01
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.
$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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.