Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega8][C] - Płynne sterowanie jasnością LED przy użyciu pilota RC5

want3d90 07 Lut 2014 22:00 2214 5
  • #1 07 Lut 2014 22:00
    want3d90
    Poziom 5  

    Witam,
    Czy nakierowałby mnie ktoś w jaki sposób wykorzystując PWM można zrealizować płynne sterowanie jasnością diody LED przy użyciu pilota nadającego w standardzie RC5?
    Do tej pory udało mi się zrealizować płynne sterowanie jasnością diody wykorzystując PWM i microswitche - oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod




    oraz uruchomić pilota zgodnie z programem znalezionym w internecie:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Proszę o wyrozumiałość, dopiero zaczynam.

    0 5
  • #2 07 Lut 2014 22:13
    kisielos12
    Poziom 26  

    Ja to bym rozwiązał tak:

    Po odebraniu właściwego kodu z właściwego pilota, dekrementował lub inkrementował Twoją zmienną wypełnienie i tyle.

    0
  • #3 08 Lut 2014 01:39
    want3d90
    Poziom 5  

    Ten "właściwy kod" pilota jest zapisywany w jakiej zmiennej? out?
    Gdzie mam umieścić tę inkrementację/dekrementację?
    Mógłbyś podpowiedzieć coś więcej?

    0
  • #4 08 Lut 2014 16:29
    GanzConrad
    Poziom 21  

    Akurat robiłem coś podobnego, ale bez pilota RC5 bo znalazłem na alledrogo podobne rozwiązanie za 20pln...
    masz w programie opóźnienie 3ms - sprawdź czy nie będzie to kolidować z odczytem pilota. poza tym używasz 2 Timerów, więc dlaczego wprowadzasz procesor w pętlę bezczynności?
    Ustaw przerwanie jednego Timera na 10ms i w nim zmieniaj wypełnienie PWM. Jeśli PWM pracuje w trybie 8 bitowym, to pełne rozjaśnienie diody zajmie procesorowi około 2,5 sek.
    Ja robię to inaczej (cały PWM i jego modulacja w jednym Timerze):
    Timer2 zgłasza przerwanie wg wzoru (tym przerwaniem generuję programowy PWM)
    #define Timer2_Freq (PWM_Freq*PWM_Sampling_Freq)
    następnie wewnątrz przerwania zliczam, aby uzyskać "programowe przerwanie" co 10ms
    #define _10ms_Counter_Limit (Timer2_Freq/100)
    w nim zmieniam jasność diody (RGB) i dodatkowo odczytuję stan przycisku (przyciskiem zmieniam "program świecenia")

    0
  • #5 01 Mar 2014 01:33
    want3d90
    Poziom 5  

    Odswieżam temat i po raz kolejny proszę o pomoc.
    Udaje mi się już sterować jasnością LED przy użyciu pilota RC5. Zrealizowałem to na zasadzie inkrementowania/dekrementowania współczynnika wypełnienia po odebraniu określonego kodu przycisku. W tym miejscu pojawił się kolejny problem. W przypadku, gdy chcę uzyskać możliwie najbardziej płynną regulację, zmieniam współczynnik wypełnienia o 1 w przedziale od 0 do 255. W efekcie rozjaśnianie/przyciemnianie trwa bardzo długo. Kiedy ustawię krok zmiany współczynnika wypełnienia na 5, wiadomo, jest szybciej, ale jasność zmienia się skokowo.
    Na stronie internetowej:
    Link
    jest napisane, że tak długo, jak przycisk będzie wciśnięty, dane będą wysyłane co każde 114ms. Daje to w sumie 114*255/1000=29,07 sekund czasu trwania regulacji jasności od minimum do maksimum, gdy krok jest ustawiony na 1 i 114*255/5/1000=5,814 sekundy gdy krok jest ustawiony na 5.
    Chciałbym, aby sterowanie jasnością od zera do maksimum trwało maksymalnie 3 sekundy, a krok był ustawiony na taki, aby nie było widać skoków.
    Czy mógłby ktoś nakierować mnie, co powinienem wykorzystać, aby to uzyskać?

    0
  • #6 01 Mar 2014 09:45
    BlueDraco
    Specjalista - Mikrokontrolery

    Kilka razy już pokazywałem kod, który to robi - 2 linijki w c.

    Np. odbiór kodu z pilota modyfikuje zmienną green_target, a potem w przerwaniu timera robisz coś takiego:

    if ((pwmval = GREEN_LED_PWM) != green_target)
    GREEN_LED_PWM = pwmval < green_target ? pwmval + 1 : pwmval - 1;

    0