LED-Fader mit Hardware-PWM für mehrere LEDs

Gast #2860760
Lesenswert?
• ▲
▼
Hallo,

ich habe bereits mit dem Tutorial 
(http://www.mikrocontroller.net/articles/LED-Fading) erfolgreich einen 
LED-Fader gebaut.
Ich nutze einen AVR Atmega32 welcher mit 8MHz läuft. An PD5 habe ich 
eine LED (rot) mit einem 1kOhm Vorwiderstand angeschlossen.
So habe ich dann dort einen schönen Überblendeffekt (ohne Flackern) 
genauso wie ich es möchte.
Nun habe ich aber das Problem, dass ich diese Schaltung nun auf mehrere 
LEDs umlegen möchte. Dh es sollen am besten 3 verschiedene LEDs getrennt 
von einander "fade-bar" sein. (am besten auch gleichzeitig - dh während 
rot langsam "aus" geht - geht grün langsam an, usw)
Ziel des ganzen soll dann irgendwann mal eine Farbampel werden, wo ich 
aus einer grünen, einer roten und einer gelben LED ein paar mehr Farben 
mischen kann (je nachdem wie hell die einzelnen leuchten) und dies mit 
sanften Farbübergängen umschalten.
Ich habe ja nur 1 16bit Timer zur Verfügung. Wie stelle ich das an? 
Brauch ich einen Mikrocontroller mit 3 16bit Timern? (Ich find maximal 
2)
Oder bin ich da komplett auf dem Holzweg?

Hier noch mein Code (in C):
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3

4
#define F_CPU 8000000L
5
#include <util/delay.h>
6

7
const uint16_t pwmtable[64] PROGMEM =
8
{
9
    0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10,
10
    11, 12, 13, 15, 17, 19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55,
11
    61, 68, 76, 85, 94, 105, 117, 131, 146, 162, 181, 202, 225, 250,
12
    279, 311, 346, 386, 430, 479, 534, 595, 663, 739, 824, 918, 1023
13
};
14

15
void pd5_up ()
16
{
17
  // 10 Bit Fast PWM
18
  TCCR1A = 0x83;
19
  // prescaler 64 -> ~122 Hz PWM frequency
20
  TCCR1B = 0x03;
21
  int16_t tmp;
22
  for (tmp = 0; tmp < 64; tmp++)
23
  {
24
    OCR1A = pgm_read_word (& pwmtable[tmp]);
25
    _delay_ms (25);
26
  }
27
}
28
void pd5_down ()
29
{
30
  // 10 Bit Fast PWM
31
  TCCR1A = 0x83;
32
  // prescaler 64 -> ~122 Hz PWM frequency
33
  TCCR1B = 0x03;
34
  int16_t tmp;
35
  for (tmp = 64-1; tmp >= 0; tmp--)
36
  {
37
    OCR1A = pgm_read_word (& pwmtable[tmp]);
38
    _delay_ms (25);
39
  }
40
}
41

42

43
int main (void)
44
{
45
    // LED uses OC1A
46
    DDRD |= 1 << PD5;
47
 
48
    while (1)
49
    {
50
    pd5_up();
51
    _delay_ms (1000);
52
        pd5_down();
53
    _delay_ms (1000);
54
    }
55
 
56
    return 0;
57
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.