Robię sobie lampkę RGB i poległem na teoretycznie prostej rzeczy: gradacji kolorów.
Mam Atmega8, timery skonfigurowane na 8 bit, podłączony led RGB, program działa jak trzeba, mogę zmieniać kolory na jakie chcę, łatwizna.
Jednak od kilku dni walczę z problemem jak rozwiązać gradację kolorów. Mam tabelę gdzie kolorom np 1-50 sa przypisane wartości RGB w zakresie od 0 do 255.
Przyjmijmy że włączyłem kolor nr 1 który ma takie nastawy dla PWM:
R: 255
G: 27
B: 0
I teraz zmieniam na kolor np nr 8 który ma nastawy:
R: 130
G: 54
B: 11
Oczywiście mój program działa i kolory zmieni. Robi to poprzez dodawanie/odejmowanie liczby 1 od wartości każdego kanału aż wartość dla kanału zrówna się z nowa zaplanowaną wartością. Jest to więc najbardziej prymitywny sposób sterowania LED RGB.
Jednak bez uwzględnienia gradacji będzie to przejście "wizualnie kiepskie".
Innym problemem jest wygaszanie. Mam np nastawy:
R: 45
G: 168
B: 4
I teraz wygaszam wszystkie kanały do wartości 0. Jak widać kanał B najszybciej osiągnie 0. Potem będzie R. No i na końcu LED będzie świecił na zielono aż powoli wygaśnie bo G ma największa wartość. Z dorobioną gradacją w LED powinny się wygasić wszystkie kolory w 1 momencie.
Najprostszy algorytm to:
R_aktualne = R_aktualne + (R_końcowe - R_początkowe) / ilość_kroków_gradacji
(to jest przykład zwiększania jasności dla kanału R, ilość kroków np 64)
Problem w tym że operuje na liczbach 0-255, a ilość kroków mniejsza niż 64 da zbyt skokowy widok jasności. Oczywiście po dzieleniu przez 64 wyjdą mi liczby ułamkowe co właśnie jest wadą tego problemu.
Ma ktoś pomysł jak to najprościej rozwiązać? Programuję w asm więc stopień trudności jest wysoki. Nie szukam gotowca tylko jakiegos ogólnego pomysłu jak najprościej to rozwiązać.
Mam Atmega8, timery skonfigurowane na 8 bit, podłączony led RGB, program działa jak trzeba, mogę zmieniać kolory na jakie chcę, łatwizna.
Jednak od kilku dni walczę z problemem jak rozwiązać gradację kolorów. Mam tabelę gdzie kolorom np 1-50 sa przypisane wartości RGB w zakresie od 0 do 255.
Przyjmijmy że włączyłem kolor nr 1 który ma takie nastawy dla PWM:
R: 255
G: 27
B: 0
I teraz zmieniam na kolor np nr 8 który ma nastawy:
R: 130
G: 54
B: 11
Oczywiście mój program działa i kolory zmieni. Robi to poprzez dodawanie/odejmowanie liczby 1 od wartości każdego kanału aż wartość dla kanału zrówna się z nowa zaplanowaną wartością. Jest to więc najbardziej prymitywny sposób sterowania LED RGB.
Jednak bez uwzględnienia gradacji będzie to przejście "wizualnie kiepskie".
Innym problemem jest wygaszanie. Mam np nastawy:
R: 45
G: 168
B: 4
I teraz wygaszam wszystkie kanały do wartości 0. Jak widać kanał B najszybciej osiągnie 0. Potem będzie R. No i na końcu LED będzie świecił na zielono aż powoli wygaśnie bo G ma największa wartość. Z dorobioną gradacją w LED powinny się wygasić wszystkie kolory w 1 momencie.
Najprostszy algorytm to:
R_aktualne = R_aktualne + (R_końcowe - R_początkowe) / ilość_kroków_gradacji
(to jest przykład zwiększania jasności dla kanału R, ilość kroków np 64)
Problem w tym że operuje na liczbach 0-255, a ilość kroków mniejsza niż 64 da zbyt skokowy widok jasności. Oczywiście po dzieleniu przez 64 wyjdą mi liczby ułamkowe co właśnie jest wadą tego problemu.
Ma ktoś pomysł jak to najprościej rozwiązać? Programuję w asm więc stopień trudności jest wysoki. Nie szukam gotowca tylko jakiegos ogólnego pomysłu jak najprościej to rozwiązać.
