Forum: Mikrocontroller und Digitale Elektronik LED Streifen Fade in / out, light_ws2812


von julius (Gast)


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?

von Christoph S. (mcseven)


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.

: Bearbeitet durch User
von julius (Gast)


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.

von julius (Gast)


Lesenswert?

Sieht nicht schlecht aus.

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.