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.

Sterowanie diodą RGB, Atmega8

xerxes931 20 Sty 2012 19:58 2474 9
  • #1 20 Sty 2012 19:58
    xerxes931
    Poziom 10  

    Witam!
    Ostatnimi czasy eksperymentuję z Atmegą8 i PWM, co prawda jeszcze sam nie potrafię wyliczać tego wszystkiego, ale działa, i tak się zastanawiam, czy nie dałoby się 3 różnych pinów nastawić na coś w stylu osobnego PWM, żeby można było każdym kolorem diody osobno sterować? Jeśli tak, poprosiłbym bardzo o ukazanie kodu w C, jakby to miało wyglądać.

    0 9
  • #2 20 Sty 2012 20:46
    Zocha24
    Poziom 21  

    Są 2 opcje albo na timerach albo programowo wystarczy poszukać jest pełno opisów i przykładów

    0
  • Pomocny post
    #3 20 Sty 2012 20:52
    tmf
    Moderator Mikrokontrolery Projektowanie

    Najprościej jednak zastosować timery i wyjścia OCx. Można indywidualnie sterować przebiegiem i wypełnieniem, dzięki czemu można dowolnie sterować kolorem diody.

    0
  • #4 20 Sty 2012 21:03
    Press
    Poziom 22  

    Ja to kiedyś robiłem tak, że kolory R, G, B sterowałem PWM programowym na przerwaniu od timera, który równocześnie generował PWM sprzętowy.
    Na sprzętowym podłączona była wspólna elektroda diody.
    W takim połączeniu prócz regulacji programowej każdej barwy z osobna na sprzętowym PWM pięknie działała regulacja sumarycznej mocy diody.

    Pozdro.

    0
  • #5 20 Sty 2012 23:16
    xerxes931
    Poziom 10  

    Działało to w ten sposób, że PWM sprzętowy regulował jasność diody, a programowy przełączał na przemian kolory, w związku z czym można było w 1 takim cyklu dać różne natężenia jasności 3 kolorów?

    0
  • #6 20 Sty 2012 23:24
    Press
    Poziom 22  

    nie do końca...
    Programowych PWM było trzy kanały i regulowały wszystkie trzy kolory równocześnie.
    Sprzętowy dodatkowo czopował jeszcze sumę tych trzech PWM programowych.
    Zrobienie tego wszystkiego na jednym timerze miało na celu prostą synchronizację dzieki czemu niewielka zawartość któregoś z kolorów (małe wypełnienie danego sygnału) nie było gubione, a tak mogłoby się dziać w przypadku wygenerowania PWM programowych w pętli głównej programu.

    0
  • Pomocny post
    #7 20 Sty 2012 23:46
    mianiek13
    Poziom 12  

    Sprawdź sobie tą stronę http://aquaticus.info/pwm na dole strony w zakładce examples są przykłady programów w C które mogą Ci pomóc.

    0
  • #8 21 Sty 2012 12:13
    xerxes931
    Poziom 10  

    Dziękuję za pomoc, aczkolwiek jest jeszcze jedna sprawa. Napisałem taki oto kod, korzystając z komend do ustawienia timer1 i timer2 z tej strony: http://sites.google.com/site/qeewiki/books/avr-guide/pwm-atmega8
    Napisałem taki oto kod:


    #include <avr/io.h>
    #include <util/delay.h>

    int main(void)
    {
    int i = 1;
    DDRB = 0xFF;
    TCCR1A |= (1 << COM1A1);
    TCCR1A |= (1 << WGM11) | (1 << WGM10);
    TCCR1B |= (1 << CS11);

    TCCR2 |= (1 << COM21);
    TCCR2 |= (1 << WGM21) | (1 << WGM20);
    TCCR2 |= (1 << CS21);

    while(1)
    {
    OCR1A = i * 2;
    OCR1B = i * 2;
    OCR2 = i;
    _delay_ms(5);
    i++;
    if(i == 128)
    i = 1;
    }
    }

    I działa ładnie, z tym że przy OCR1x działa tylko ten kanał, który został pierwszy użyty w programie, czyli w tym wypadku PWM jest tylko na pinie OC2 i OC1A. Jak zrobić, żeby było jednocześnie na trzech pinach? Oraz jaki jest maksymalny stopień wypełnienia OCxx = liczba dla timer1 i timer2?

    0
  • Pomocny post
    #9 21 Sty 2012 14:04
    McMonster
    Poziom 32  

    Timer1 ma dwa kanały, a Timer2 jeden kanał. Włączyłeś tylko jeden z dwóch kanałów w Timerze1 ustawiając bit COM1A1 w rejestrze TCCR1A, drugi włącza się analogicznie ustawiając bit COM1B1 w tym samym rejestrze. Wypełnieniem sterujesz przez odpowiednio rejestry OCR1A i OCR1B.

    Timer1 jest 16-bitowy, więc maksymalną wartością jest dla nich 65535, Timer2 jest tylko 8-bitowy, więc dla niego rejestr OCR2 może przyjąć największą wartość 255.

    Więcej szczegółów możesz zawsze znaleźć w nocie katalogowej, w każdym rozdziale w sekcjach "Register description" masz opisane funkcje rejestrów i znaczenie poszczególnych bitów z tabelkami, jaki efekt dają poszczególne ich ustawienia. Warto też czytać dokładne opisy w każdym rozdziale.

    0
  • #10 21 Sty 2012 14:48
    xerxes931
    Poziom 10  

    Wielkie dzięki za pomoc wszystkim, już udało mi się wysterować wypełnienie 3 kanałów PWM osobno, bardzo dziękuję ;)
    Pozdrawiam
    PS. Temat chyba już do zamknięcia

    0