Forum: Mikrocontroller und Digitale Elektronik PWM LED dimmern


von Adrian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich hab mal die idee gehabt verschiedene LEDS gleichzeitig 
aufzuhellen und wieder zu dimmen nach einem bestimmten Interrupt sagen 
wir mal alle 10sekunden. Hab mich auch einwenig auf dem GCC-Tutorial 
durchgelesen aber den entscheidenen Hinweis wie ich das umsetzen kann 
hab ich leider nicht gefunden. :( Ich möchte dass die Led nach einem 
bestimmt interrupt langsam aufhellt und beim zweiten interrupt langsam 
dunekel wird.

Ich habs nur geschafft eine led in einem bestimmten intervall an und 
auszublinken mit dem Timer:(

von Karl H. (kbuchegg)


Lesenswert?

Wenns mehrere LED sind, und du die auch hardwaremässig nicht so 
verschaltet kannst, dass du sie alle miteinander von einem einzigen 
PWM-Output Pin dimmen kannst (und du auch nicht genug PWM-Kanäle für 
alle LED einzeln hast), dann wird es wohl auf eine Software-PWM 
rauslaufen.

Also vergiss die Hardware-PWM und bau selber eine in Software auf. Den 
Timer kannst du dann auch gleich für die Eindimm und Aufdimm 
Zeitsteuerung benutzen.

Skizze
1
volatile uint8_t helligkeit;
2
3
ISR( Timer Overflow ISR )
4
{
5
  static uint8_t pwmCount;
6
  static uint8_t helligkeitJetzt;
7
8
  pwmCount++;
9
  if( pwmCount == Anzahl Helligkeitsstufen )
10
    pwmCount = 0;
11
12
  if( pwmCount < helligkeitJetzt)
13
    schalte alle LED ein
14
  else
15
    schalte alle LED aus
16
17
  if( helligkeitJetzt < helligkeit )
18
    helligkeitJetzt++;
19
  else if( helligkeitJetzt > helligkeit )
20
    helligkeitJetzt--;
21
}
22
23
int main()
24
{
25
  ... timer konfigurieren
26
  ... Overflow Interrupt freigeben
27
28
  helligkeit = 0;
29
30
  sei();
31
32
  while( 1 )
33
  {
34
35
    if( irgendwas )
36
      helligkeit = 28;
37
38
    if( irgendwas anderes )
39
      helligkeit = 12;
40
41
    ....
42
  }
43
}

Um die LED auf einen bestimmten Wert zu dimmen, schreibst du den Wert 
einfach in die Variable 'helligkeit'. Der letzte Teil in der 
Overflow-ISR führt dann die tatsächlich gerade zu realisierende 
Helligkeit diesem Wert langsam nach, so dass sich ein aufdimmen, 
abdimmen bzw. umdimmen zwischen verschiedenen Helligkeitsstufen ergibt.

Wie schnell das geht, hängt davon ab, wie du den Timer einstellst und 
wie oft daher die Overflow-ISR pro Sekunde aufgerufen wird. Sollte das 
zu schnell sein, dann kann man diesen Nachführteil auch nur bei jedem 
2.ten ISR aufruf oder noch seltener machen.

von Adrian (Gast)


Angehängte Dateien:

Lesenswert?

was ich gerne möchte ist dass die lampe aufdimmt und wieder abdimmt und 
dass in regelmässigen abständen ohne i-was einzustellen. Moementan macht 
es nur dass es kurzzeitig aufdimmt und dann die ganze zeti hell bleibt 
aber nicht wieder abdimmt. Hier mein quellcode schonmal hoffe ihr könnt 
mir weiter helfen:(

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.