PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM



Kampi
27.11.2009, 20:25
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

for_ro
27.11.2009, 21:20
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.

Kampi
27.11.2009, 21:56
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.

Kampi
27.11.2009, 22:32
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

TomEdl
08.12.2009, 16:44
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