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

[ATMega8][C] Diody RGB na PWM

25 Sie 2008 19:38 8324 17
  • Poziom 21  
    Witam,

    Chciałbym zrobić układ 5 diod RGB (wsp anoda) sterowanych z ATMegi8 przez 3 kanały PWM, na razie proszę o sprawdzenie schematu, z kodem powinienem sobie poradzić, ale to później.

    Głównie chodzi mi o to czy muszę używać tranzystorów, czy mogę katody diod dać prosto do portów procka?

    Na schemacie pogrupowałem końcówki diod kolorami żeby nie krzyżować linii, od góry 5 x R , 5 x G, 5 x B, każda grupa przez tranzystor do osobnego kanału PWM.

    Czy muszę podłączać AVCC, AREF, AGND, gdy ich nie używam?
    Ogólnie jakie pomyłki popełniłem przy projektowaniu? wszystkich chętnie wysłucham :)

    [ATMega8][C] Diody RGB na PWM
  • Computer ControlsComputer Controls
  • Poziom 15  
    Chcesz sterowac kazda dioda z osobna? Bo jesli tak to Ci sie nie uda
  • Poziom 21  
    mog123 napisał:
    Chcesz sterowac kazda dioda z osobna? Bo jesli tak to Ci sie nie uda


    Nie, każdym kolorem z osobna
    pisałem, że
    Cytat:
    5 x R , 5 x G, 5 x B, każda grupa przez tranzystor do osobnego kanału PWM
  • Poziom 42  
    Do każdej diody LED (koloru) dodać rezystor.
  • Computer ControlsComputer Controls
  • Poziom 21  
    oj napisał:
    Do każdej diody LED (koloru) dodać rezystor.


    Dzięki :) rezystory dodałem do każdej diody, zmieniłem schemat w 1 poście.
  • Użytkownik obserwowany
    Siema,
    Wypada dać tranzystory gdyż prąd w każdej z gałęzi bedzie wynosił 100mA (przy założeniu, że kazda struktura dostanie 20mA) a tego linia portu procka nie wytrzyma...
  • Użytkownik usunął konto  
  • Poziom 18  
    Żabek napisał:
    Tak, musisz podłączyć wszystkie piny zasilające, nie ważne czy używasz wewnętrznego ADC czy nie.
    A można wiedzieć w jakim celu? Skoro nie używa ADC to po co podłączać? Zresztą ATMega8 ma wewnętrznie zwarty AVCC z VCC rezystancją około 10om (taki bug) a jak już coś robić z pinem Vref to podłączyć do masy przez kondensator. AGND z GND też jest wewnętrznie podłączony i nie powinno się podłączać tego pinu pod GND w żadnym wypadku nawet jak używasz ADC, bo to zwiększa zakłócenia w obwodzie analogowym.
    Akurat w tym przypadku moża nic z nimi nie robić.

    :arrow: acid12
    Jeżeli mikrokontroler ma tylko diodami sterować to możesz wywalić kwarc i taktować wewnętrznym oscylatorem, bo to przerost formy nad treścią. Jeszcze możesz dać kondensator 100nF pomiędzy RESET, a GND.
  • Poziom 21  
    Żabek napisał:
    Tak, musisz podłączyć wszystkie piny zasilające, nie ważne czy używasz wewnętrznego ADC czy nie.
    już dodane na schemacie, dzięki.

    Jarema napisał:
    Wypada dać tranzystory gdyż prąd w każdej z gałęzi bedzie wynosił 100mA (przy założeniu, że kazda struktura dostanie 20mA) a tego linia portu procka nie wytrzyma...
    bałem się właśnie o prądy, dzięki :)

    rrata napisał:
    Jeżeli mikrokontroler ma tylko diodami sterować to możesz wywalić kwarc i taktować wewnętrznym oscylatorem, bo to przerost formy nad treścią. Jeszcze możesz dać kondensator 100nF pomiędzy RESET, a GND.
    zastanawiałem się nad jakąś komunikacją z PC (kiedyś :D ), ale masz rację jak na same diody to faktycznie go zdejmę


    Chciałbym żebyście sprawdzili funkcję pwm_init(), sprawdzałem z NK rejestry, ale z braku możliwości fizycznego przetestowania, nie wiem czy jest dobrze, a może użyć 'fast PWM' zamiast 'phase correct', jakieś doświadczenia?, który lepiej wygląda na diodach, czy może jest to obojętne w tym przypadku?


    Code:
    void pwm_init(){
    
       //timer 2  -> No prescaling -> CS20 = 1
       //PWM, Phase Correct -> WGM20 = 1
       //Set OC2 on Compare Match when up-counting
       //Clear OC2 on Compare Match when downcounting -> COM21:0 = 3

       TCCR2 = _BV(COM21)|_BV(COM20)|_BV(WGM20)|_BV(CS20);



       //timer 1 -> No prescaling -> CS10
       //PWM,Phase Correct, 8-bit -> WGM10
       //Set OC1A/OC1B on Compare Match when up-counting
       //ClearOC1A/OC1B on Compare Match when downcounting -> COM1x0:1 = 3

       TCCR1A = _BV(WGM10)| _BV(COM1A1)|_BV(COM1A0) | _BV(COM1B1)|_BV(COM1B0);
       TCCR1B = _BV(CS10);
    }
  • Użytkownik usunął konto  
  • Poziom 43  
    A ja już kiedyś podawałem, jak wykorzystać do tego Tiny.

    [ATMega8][C] Diody RGB na PWM
    Link
  • Poziom 21  
    poczytałem tamten temat, ogólnie nic nowego nie wnosi :)
    Na schemacie są hexfety ... nie bardzo potrzebuje takiego wzmocnienia, myślałem o fetach jako że łatwiej sie nimi steruje ale mam w domu parę bc337 i raczej ich użyję.

    wydaje mi sie że bipolarne do PWM się nadają ... (?)



    przygotowałem nowy schemat, jako że układ będzie też sterował normalną żarówką dodałem
    + układ na optotriaku ściągnięty z EP ;)
    + 3 przyciski do sterowania
    - 2 diody (trzy RGB wystarczą zamiast 5 :)

    [ATMega8][C] Diody RGB na PWM
  • Poziom 18  
    :arrow: acid12
    Każdy z pinów PD2, PD3, PD4 (tam gdzie masz przyciski) powinieneś podłączyć przez rezystor do VCC. Tak jak teraz masz nie zadziałają jak trzeba. Dodatkowo kondensator C6 (domyślam się że ma być do resetu, bo na zasilaniu masz C9) wpiąłeś między VCC a GND. Powinien być między GND a RESET (równolegle z przyciskiem S1).

    :arrow: Żabek
    Zrobiłem kiedyś układ, który pracował w miejscu, gdzie są duże zakłócenia i dość często się resetował. Dołożenie tego kondensatora pomogło, bo dodatkowa pojemność zwiększa minimalny wymagany czas trwania impulsu, który spowoduje reset. Oczywiście skoro ktoś używa układu np. w domu to jak najbardziej może tego kondensatora nie dawać. Nic się nie stanie.
    A co do podłączania AVCC to ja i tak nie widzę sensu, tym bardziej, że ten pin jak już pisałem jest podłączony wewnętrznie z VCC (ATMega8 ma taki błąd).
  • Poziom 21  
    rrata napisał:
    :arrow: acid12
    Każdy z pinów PD2, PD3, PD4 (tam gdzie masz przyciski) powinieneś podłączyć przez rezystor do VCC. Tak jak teraz masz nie zadziałają jak trzeba.


    masz na myśli żeby je podciągnąć do Vcc? czy programowe podciągnięcie nie wystarczy?

    Code:
    DDRD &=~ (1 << PD2); 
    
    PORTD |= (1 << PD2);
  • Poziom 18  
    Lepiej nie przyzwyczajaj się do takich akrobacji tylko podłącz porządnie z rezystorami. Programowe może i by było (nigdy tak nie robiłem to nie jestem pewien) ale musiałbyś liczyć się z tym, że czasem mogłoby "coś nie zaskoczyć". Ja trzymam się zasady, że trzeba korzystać z każdej możliwości, która odciąży procesor (tu by miał dodatkowe zadanie bo podciągałby wejścia).

    Twój przykład kodu nie jest poprawny bo ustawiasz port jako wejście i ustawiasz stan wysoki, który na tym pinie nie nastąpi, bo jest właśnie pinem wejściowym. Podciąganie wyglądłoby tak.
    Code:
    DDRD |= ( 1<<PD2 );
    
    PORTD |= ( 1<<PD2 );
    DDRD &=~( 1<<PD2 );
    //Tu sprawdzasz stan pinu
  • Poziom 21  
    nie wydaje mi się by 'podciaganie' spowalniało procesor. To po prostu załącza tranzystor (zachowujący sie jak rezystor podciągający) i wsio, wtedy w stanie spoczynku wejście jest podciągnięte do Vcc, robi się to raz anie w każdym cyklu, (wpisanie wartości do rejestrów DDR i PORT), zawsze używałem wewnętrznego podciągnięcia i było dobrze, działało.

    Ale debata o słuszności używania rezystorów podciągających pojawia się wszędzie gdzie się ich używa :D więc proponowałbym nie rozwijać tej części dyskusji bo na prawdę wiele takowych na elektrodzie.

    Układ nie ma działać w żadnych skrajnych warunkach tylko w domu na półce ;) aczkolwiek Twoja poprzednia uwaga o kondensatorze przy resecie wydaje mi się być cenną :)
    rrata napisał:

    Twój przykład kodu nie jest poprawny bo ustawiasz port jako wejście i ustawiasz stan wysoki, który na tym pinie nie nastąpi, bo jest właśnie pinem wejściowym.


    tu niestety się mylisz,
    po wpisaniu do rejestru DDR 0, dana koncowka staje się wejsciem.
    wpisanie 1 do rejestru PORT powoduje załączenie tranzystora więc gdy końcówka jest jako wyjście to będzie 1, gdy jako wejście to odczytując wartość z rejestru PIN będzie 1, gdy przyciskiem zewrzemy pin do masy, to popłynie prąd (odblokujemy tranzystor) i w rejestrze PIN będzie 0.

    to 'ustawianie pinu wejściowego na 1' tj właśnie wewnętrzne podciąganie
  • Poziom 18  
    acid12 napisał:
    tu niestety się mylisz,
    po wpisaniu do rejestru DDR 0, dana koncowka staje się wejsciem.
    wpisanie 1 do rejestru PORT powoduje załączenie tranzystora więc gdy końcówka jest jako wyjście to będzie 1, gdy jako wejście to odczytując wartość z rejestru PIN będzie 1, gdy przyciskiem zewrzemy pin do masy, to popłynie prąd (odblokujemy tranzystor) i w rejestrze PIN będzie 0.

    to 'ustawianie pinu wejściowego na 1' tj właśnie wewnętrzne podciąganie
    W takim razie przepraszam za wprowadzenie w błąd. Jak już pisałem nigdy tego nie używałem więc mogłem się pomylić. Skoro tak to moja poprzednia uwaga i zabieraniu czasu przocesora też jest chybiona :cry: bo można ten pin ustawić raz.
    Chociaż jak ja czytałem o podciąganiu wejść programowo to właśnie to się robiło tak jak ja pisałem, ale skoro u Ciebie działa twój sposób no to OK.
  • Poziom 43  
    acid12 napisał:
    poczytałem tamten temat, ogólnie nic nowego nie wnosi :)
    Na schemacie są hexfety ... nie bardzo potrzebuje takiego wzmocnienia, myślałem o fetach jako że łatwiej sie nimi steruje ale mam w domu parę bc337 i raczej ich użyję.

    wydaje mi sie że bipolarne do PWM się nadają ... (?)
    ..............


    Dałem Ci po prostu przyukład jak zrobić to bardzo prosto, w tamtym temacie jest też wersja źródlowa programiku PWM. Hexfety wcale nie są przesadą, a są bardzo tanie. Układ podałem bo wtedy nic jeszcze nie pisałeś o żarówkach i przyciskach, choś tu są jeszcze wolne piny. Układ jest genialny w swojej prostocie. Autor opublikował go jako płytkę, hhmmm, chyba uniwersalną.

    [ATMega8][C] Diody RGB na PWM

    [ATMega8][C] Diody RGB na PWM