Forum: Mikrocontroller und Digitale Elektronik LED-Fader mit Hardware-PWM für mehrere LEDs


von lolman (Gast)


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
}

von avr (Gast)


Lesenswert?

lolman schrieb:
> Oder bin ich da komplett auf dem Holzweg?

Ja. Erstens hat ein timer meistens mehrere PWM-Kanäle. Zweitens gibt es 
Softpwm.

von lolman (Gast)


Lesenswert?

hättest du da noch paar infos für mich wie ich das realisiere?
irgendwelche links zum reinlesen oder sowas?

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.