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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren