Anzeige:

Helligkeitssteuerung einer LED mit PWM

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Helligkeitssteuerung einer LED mit PWM

Von Uwe DK1KQ am 04.12.2008 18:52

Ein Lauflicht kann ich programmieren, jedoch nicht verknüpft mit PWM.
Habe nicht verstanden wie man mit Hilfe von PWM eine LED laufend heller und dunkler macht (Fader)
Hat jemand solch ein Programm in der Schublade ?

Möglichst mit guter Kommentierung

Gruß Uwe

Re: Helligkeitssteuerung einer LED mit PWM

Von gerold am 04.12.2008 21:32

Uwe DK1KQ hat folgendes geschrieben:
Ein Lauflicht kann ich programmieren, jedoch nicht verknüpft mit PWM.

Hallo Uwe!

Es gibt mehrere Möglichkeiten, ein PWM-Signal mit einem Lauflicht zu kombinieren. Es hängt ganz von deiner Anwendung ab, welche die einfachst machbare Möglichkeit ist.

Mit dem ATmega8 kannst du drei Hardware-PWM-Signale generieren. Diese sind mit den eingebauten Timern "Timer1" und "Timer2" verbunden. Das ist die schonendste Art, ein PWM-Signal zu erstellen. Das heißt, dass du so das Hauptprogramm des µC nicht belastest. Es muss kein Interrupt abgearbeitet werden. Das Hauptprogramm wird nicht gebremst. Die PWM-Signale werden im Hintergrund vom µC erzeugt.

Nachteile sind, dass du so nur drei PWM-Ausgänge zur Verfügung hast. Mit dem ATmega48 hast du bis zu sechs Hardware-PWM-Signale zur Verfügung.

Willst du z.B. ein Lauflicht mit zehn LEDs mit einem Hardware-PWM-Signal dimmen, dann könntest du die Signale für das Lauflicht mit dem PWM-Signal über UND-Gatter (ICs) verbinden. Das wäre vom Programmtechnischen her die einfachste Lösung. Diese Lösung kann ich empfehlen, wenn du noch nicht so viel Ahnung von der Programmierung mit Bascom hast.

Eine andere Möglichkeit ist z.B. dass du das Lauflicht im Hauptprogramm steuerst und das PWM-Signal mit den Interrupts "OC2" und "TIMER2" steuerst.
Dafür setzt du im Hauptprogramm Variablen für die LEDs ein. Diese Variablen setzt du in einer Schleife so, dass sie dein Lauflicht darstellen. Im OC2-Interrupt-Handler schaltest du alle LEDs AUS. Und im TIMER2-Interrupt-Handler schaltest du die LED(s) EIN, die für dein Lauflicht soeben leuchten soll(en). Die Timer-Interrupts treten so schnell auf, dass du nichts davon merken solltest. Aber durch das extrem schnelle Ein- und Ausschalten der LEDs wird ein Dimmeffekt erreicht.

Es gibt auch die Möglichkeit, auch das Lauflicht über einen Timer zu steuern. So ist auch das Lauflicht sehr genau getaktet. Aber auf das möchte ich im Moment nicht näher eingehen. Es kommt jetzt einfach nur darauf an, was du bereits für Vorkenntnisse hast.

mfg
Gerold
Smile

Von gerold am 04.12.2008 23:24

Hallo Uwe!

Hier ist ein Beispiel. Es ist für einen Anfänger nicht ganz so einfach zu verstehen -- ich weiß.

Code:
'***************************************************
'* Einfaches Lauflicht mit PWM-Dimmer
'***************************************************
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100


'LED1 an PORTC.0
Led1 Alias Portc.0
Config Led1 = Output

'LED2 an PORTC.1
Led2 Alias Portc.1
Config Led2 = Output

'LED3 an PORTC.2
Led3 Alias Portc.2
Config Led3 = Output

'LED4 an PORTC.3
Led4 Alias Portc.3
Config Led4 = Output


'Variablen für den gewünschten Zustand der LEDs
Dim Led1_status As Bit
Dim Led2_status As Bit
Dim Led3_status As Bit
Dim Led4_status As Bit


'Timer konfigurieren
Config Timer2 = Timer , Prescale = 32
On Timer2 On_timer2
On Oc2 On_compare2


'Helligkeit der LEDs (0 = dunkel, 255 = hell)
Compare2 = 50


'Interrrupts einschalten
Enable Timer2
Enable Oc2
Enable Interrupts


'Haupt-Programmschleife
Do
   'Hier wird festgelegt, wie der Zustand der LEDs sein soll
   Led1_status = 1
   Led2_status = 0
   Led3_status = 0
   Led4_status = 0
   Waitms 100
   Led1_status = 0
   Led2_status = 1
   Led3_status = 0
   Led4_status = 0
   Waitms 100
   Led1_status = 0
   Led2_status = 0
   Led3_status = 1
   Led4_status = 0
   Waitms 100
   Led1_status = 0
   Led2_status = 0
   Led3_status = 0
   Led4_status = 1
   Waitms 100
Loop
End


'Timer2 Overflow-Interrupt
On_timer2:
   'LEDs je nach gewünschtem Zustand ein- oder ausschalten
   Led1 = Led1_status
   Led2 = Led2_status
   Led3 = Led3_status
   Led4 = Led4_status
Return


'Timer2 Compare-Interrupt
On_compare2:
   'Alle LEDs ausschalten
   Led1 = 0
   Led2 = 0
   Led3 = 0
   Led4 = 0
Return

mfg
Gerold
Smile

Anzeige: