LED Streifen Fade in / out, light_ws2812

Gast #4417496
Lesenswert?

Hi,


nachdem die ersten light_ws2812 bastelein funktionieren würde ich gerne 
Led's ein/aus faden.

Ein ganz stupider Ansatz wie der hier:
1
#include <util/delay.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include "light_ws2812.h"
5

6

7
//const uint8_t NUM_LEDS = 24; // Anzahl Leds
8
#define NUM_LEDS 1
9
struct cRGB leds[NUM_LEDS];
10

11
int main(void)
12
{
13
  while(1)
14
  {
15
    for(uint8_t step = 0; step < 255; step++)
16
    {
17
      // Led einschalten
18
      leds[0].r = 0;
19
      leds[0].g = 0;
20
      leds[0].b = step;
21
      ws2812_setleds(leds, NUM_LEDS);
22

23
      _delay_ms(100);
24

25
    }
26
  }
27
}

funktioniert natürlich nich.


In diesem Artikel:
https://www.mikrocontroller.net/articles/LED-Fading

wird beschrieben wie man Leds vernünftig ein/aus faded.
Funktioniert auch für eine Led ganz toll, da aber der ws2812 controller 
die Leuchtdauer/Intensität der Led kontrolliert kann man nicht einfach 
+5v des Led Streifens kontrollieren.



Eine Idee wäre in der Funktion:
1
void pwm_up_down (const uint16_t pwm_table[], int16_t size, uint16_t delay)
2
{
3
    int16_t tmp;
4
 
5
    for (tmp = 0; tmp < size; tmp++)
6
    {
7
        OCR1A = pgm_read_word (& pwm_table[tmp]);
8
        ws2812_setleds(leds, NUM_LEDS);
9
        my_delay (delay);
10
    }
11
 
12
    for (tmp = size-1; tmp >= 0; tmp--)
13
    {
14
        OCR1A = pgm_read_word (& pwm_table[tmp]);
15
        ws2812_setleds(leds, NUM_LEDS);
16
        my_delay (delay);
17
    }
18
}

 ws2812_setleds(leds, NUM_LEDS);
einzubauen, und damit die Led komplett ein/auszuschalten.

bin mir hier aber nicht ganz sicher wie man den festen PWM Pin mit dem 
Pin der für ws2812 definiert wird kombinieren kann?
1
#define ws2812_port B     // Data port 
2
#define ws2812_pin  1     // Data out pin

Hat da jemand eine Idee?
#4417671
Lesenswert?

hmmm, ungetestet sowas?
1
#include <util/delay.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include "light_ws2812.h"
5

6

7
//const uint8_t NUM_LEDS = 24; // Anzahl Leds
8
#define NUM_LEDS 1
9
struct cRGB leds[NUM_LEDS];
10
const uint8_t gammaTable18[32] = { 0, 1, 2, 4, 6, 10, 13, 18, 22, 28, 33, 39, 46, 53, 61, 69, 78, 86, 96, 106, 116, 126, 138, 149, 161, 173, 186, 199, 212, 226, 240, 255};
11

12
int main(void)
13
{
14
  while(1)
15
  {
16
    for(uint8_t step = 0; step < 32; step++)
17
    {
18
      // Led einschalten
19
      leds[0].r = 0;
20
      leds[0].g = 0;
21
      leds[0].b = gammaTable18[step];
22
      ws2812_setleds(leds, NUM_LEDS);
23

24
      _delay_ms(100);
25

26
    }
27
  }
28
}

Die Leds des WS2812 haben zwar 256 Stufen, aber sind nicht 
Gamma-korrigiert. Effektiv bedeutet das, du hast nur 32 Stufen zur 
Verfügung. Eventuell auch 48, aber der Flaschenhals sind nun mal die für 
das menschliche Auge "großen" Unterschiede in den dunklen Stufen.
Gast #4417814
Lesenswert?

Hatte den pwmtable der 16bit pwm aus dem oben genanntem Led fade Artikel 
getestet, das funktionierte aber nicht weil die Werte bis 1024 laufen.
Die Led aber nur bis 255 geht.

Werde deins mal kompilieren.

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