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

ATmega8 - PWM RGB - dla wartości PWM=0 dioda wciąż świeci język C

18 Sie 2012 23:21 5859 26
  • Poziom 8  
    Witam.
    Wykonuję sterownik RGB na ATmedze8 w języku C. Używam trzech kanałów PWM (OCR1A (PB1), OCR1B (PB2), OCR2 (PB3)) na TIMER1 i TIMER2 - ustawienia dla FAST PWM i bez preskalera.
    f = 1MHz

    Wszystko działa ładnie tylko przy wartości PWM =0 diody cały czas świecą, a na wyjściu układu odczytuję wartość ~4,7V, tak jakby stan na pinach był cały czas wysoki i napięcie było z mikrokonrolera...
    Oczywiście wcześniej zadeklarowane są rejestry jako wyjścia DDRB=0b11111111;

    Czy może mi ktoś w tym pomóc? Próbowałem przy wartości PWM=0 (czyli np dla OCR1A=0) ustawić warunek, żeby zmieniła się wartość bitu na 0, ale nie pomogło.
  • Poziom 23  
    Bez programu albo jego odpowiedniego fragmentu chyba trudno będzie coś poradzić.

    A to, że pin nie reaguje na ustawianie bitu na 0 nie jest niczym dziwnym przy włączonej generacji sygnału PWM bo przecież po to sie włącza PWM żeby pin robił coś innego niż normalnie :) (czyli jakby nie chciało ci się wyjaśniac co jest źle to wystarczy że zrobisz odpowiedniego ifa i bedziesz właczać i wyłaczać PWM zależnie od tego czy wartość jest 0 i już ci się pin wyzeruje)
  • Poziom 21  
    Cały czas świecą, tzn świecą pełną jasnością? Czy może tlą się tak delikatnie? Czym mierzysz to napięcie i jak masz podłączone LED'y?

    Jeżeli LED'y tlą się tylko dla wartości 0, to to jest normalne działanie układu PWM w tym mikrokontrolerze. Otóż gdzieś tam w nocie jest napisane, że dla zerowej wartości rejestru OCR, przy przepełnieniu licznika, następuje na wyjściu krótka szpilka. I to może być powód dla którego dioda świeci nadal. Rozwiązaniem jest odwrócenie układu, czyli odwrotne podłączenie LED i odwrotne nią sterowanie, albo zastosowanie trybu Phase and Frequency
    Correct PWM Mode.
  • Poziom 8  
    Tlą się delikatnie. Ogólnie mam 3 diody w układzie podłączone między wyjściem mikrokontrolera a wejściem na MOSFETA, które sygnalizują mi PWM... Cały układ jest robiony pod taśmy LED RGB, które zasilane są 12V DC. Po podłączeniu zasilania efekt jest widoczny na taśmie LED.

    Co masz na myśli pisząc o odwróceniu podłączenia LED? Zaraz spróbuje na Phase Correct PWM Mode zrobić...

    Dodano po 6 [minuty]:

    Dla Phase Corrected Timer1, czyli OCR1A i OCR1B działa OK, ale Timer2 (OCR2) nie działa :/ Ustawienia bez preskalera, MODE 1, (0<<WGM21) i (1<<WGM20)

    Dodano po 20 [minuty]:

    OK, nie rozumiem ale dla TIMERA2 ustawiłem tryb CTC -> WGM21=1 i WGM20=0, dla TIMERA1 jest tryb PWM, Phase Corrected 8bit... dopieto przy takiej konfiguracji działa.

    Czy mógłby mi ktoś powiedzieć dlaczego?
  • Poziom 21  
    Cytat:
    Co masz na myśli pisząc o odwróceniu podłączenia LED? Zaraz spróbuje na Phase Correct PWM Mode zrobić...


    Jeżeli sterowałeś LED poziomem "1" czyli zapalała się dla "1" na wyjściu MCU. Oznacza też to, że zwiększając współczynnik wypełnienia wydłużałeś czas zapalenia LED w cyklu, co objawia się zmianą intensywności świecenia. Problemem jest to, że na samym początku każdego cyklu zliczania PWM pojawiała się szpilka w sygnale wyjściowym PWM, a my (ludzie) mamy wzrok mający logarytmiczną charakterystykę czułości. Dzięki temu jesteśmy zdolni wypatrzeć delikatne światełko w ciemności jak i doskonale widzieć w pełnym świetle Słonecznym. Dlatego ta szpilka powoduje efekt tlenia się LED przy zerowym współczynniku wypełnienia sygnału sterującego, co zauważasz i co zapewne Cię wkurza... :)

    Jeżeli teraz zmienisz sterowanie, że dla zerowego współczynnika wypełnienia, LED będzie świecić na max, czyli wiąże się to też ze zmianą obwodu wykonawczego. To nawet przy tym krótkim impulsie, będzie on niezauważalny. A zmiana obwodu to nic innego jak podłączenie LED anodą do zasilania i zapalanie jej poprzez ustawienie "0" na katodzie.

    Cytat:
    OK, nie rozumiem ale dla TIMERA2 ustawiłem tryb CTC -> WGM21=1 i WGM20=0, dla TIMERA1 jest tryb PWM, Phase Corrected 8bit... dopieto przy takiej konfiguracji działa.


    A posprawdzałeś czy wszystko dobrze poustawiałeś? Sprawdź COM21 i COM20 czy dobrze skonfigurowałeś. Zapewne problem leży gdzieś w ustawieniach, bo nie może nie działać... :)
  • Użytkownik usunął konto  
  • Poziom 21  
    Można i też tak, jak pisze kolega wyżej. Ale jak by nie patrzeć, jest to angażowanie rdzenia do tego zadania, a chyba nie po tą są sprzętowe PWM..?

    :)
  • Użytkownik usunął konto  
  • Poziom 8  
    Saabotaz napisał:
    Nic nie kombinuj, wszystko masz dobrze.

    W miejscu gdzie wysyłasz wartość do PWM wstaw wyjątek że:
    - jeśli wartość=0 to ustaw ten pin jako zwykły wyjściowy w stanie 0
    - jeśli wartość>0 to ustaw pin jako PWM i wyślij wartość do PWM
    Stosuje zawsze ta metodę i działa znakomicie.



    Próbowałem nawet przez ustawienie wartości na danym bicie i też to nie pomogło (instrukcja w książce Tomasza Franzuza "Język C" str 228)...
  • Poziom 27  
    Saabotaz napisał:
    [...] jeśli wartość=0 to ustaw ten pin jako zwykły wyjściowy w stanie 0
    Pin może być ustawiony jako wyjście w stanie niskim na etapie inicjalizacji. Później wystarczy "odłączać" ten pin od generatora PWM bitami COM.
    Fragment programu przetwornicy:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 8  
    Electix napisał:
    Cytat:
    Co masz na myśli pisząc o odwróceniu podłączenia LED? Zaraz spróbuje na Phase Correct PWM Mode zrobić...


    Jeżeli sterowałeś LED poziomem "1" czyli zapalała się dla "1" na wyjściu MCU. Oznacza też to, że zwiększając współczynnik wypełnienia wydłużałeś czas zapalenia LED w cyklu, co objawia się zmianą intensywności świecenia. Problemem jest to, że na samym początku każdego cyklu zliczania PWM pojawiała się szpilka w sygnale wyjściowym PWM, a my (ludzie) mamy wzrok mający logarytmiczną charakterystykę czułości. Dzięki temu jesteśmy zdolni wypatrzeć delikatne światełko w ciemności jak i doskonale widzieć w pełnym świetle Słonecznym. Dlatego ta szpilka powoduje efekt tlenia się LED przy zerowym współczynniku wypełnienia sygnału sterującego, co zauważasz i co zapewne Cię wkurza... :)

    Jeżeli teraz zmienisz sterowanie, że dla zerowego współczynnika wypełnienia, LED będzie świecić na max, czyli wiąże się to też ze zmianą obwodu wykonawczego. To nawet przy tym krótkim impulsie, będzie on niezauważalny. A zmiana obwodu to nic innego jak podłączenie LED anodą do zasilania i zapalanie jej poprzez ustawienie "0" na katodzie.

    Cytat:
    OK, nie rozumiem ale dla TIMERA2 ustawiłem tryb CTC -> WGM21=1 i WGM20=0, dla TIMERA1 jest tryb PWM, Phase Corrected 8bit... dopieto przy takiej konfiguracji działa.


    A posprawdzałeś czy wszystko dobrze poustawiałeś? Sprawdź COM21 i COM20 czy dobrze skonfigurowałeś. Zapewne problem leży gdzieś w ustawieniach, bo nie może nie działać... :)



    Układu nie będę teraz zmieniał. Tak jak pisałem układ mi działa tylko nie dla Fast PWM.W Timerze1 ustawienia są na PWM Phase Corrected 8bit bez preskalera:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W Timerze 2 mam ustawienia:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Według informacji, które są dostępne dla takich ustawień Timera 2 jest tryb CTC, który nie za bardzo wiem co znaczy i czy może tak być...

    Jak ustawie Timer 2 na tryb PWM phase corrected, czyli WGM21=0 a WGM20 =1 to mi nie działa ten kanał i nic się nie dzieje...

    Dodano po 1 [minuty]:

    Tomasz Gumny napisał:
    Saabotaz napisał:
    [...] jeśli wartość=0 to ustaw ten pin jako zwykły wyjściowy w stanie 0
    Pin może być ustawiony jako wyjście w stanie niskim na etapie inicjalizacji. Później wystarczy "odłączać" ten pin od generatora PWM bitami COM.


    Ja się cały czas uczę i nie do końca rozumiem co masz na myśli... Czy mógłbym prosić jakiś mały przykład??
  • Użytkownik usunął konto  
  • Poziom 8  
    "i" jest typu int. Dzięki za kod, ale nie jestem biegły w assemblerze...

    Kod: c
    Zaloguj się, aby zobaczyć kod


    mam coś takiego i przy OCR1A=0 świecą...


    Ja bym zostawił ten tryb Phase Corrected, ponieważ działa, tylko chciałbym żeby mi ktoś wytłumaczył o co chodzi z tym Timerem 2 i CTC (o czym pisałem wyżej).
  • Poziom 23  
    Czy przypadkiem nie chodzi o to, że PWM przy timerze 8-bitowym dzieli okres czasu na 256 jednostek a więc możliwych jest 257 stanów (od wypełnienia 0 do wypełnienia 256), i dlatego za pomocą 8-bitowego rejestru nie da się przekazać pełnego zakresu wartości? Zależnie od wybranego trybu albo będziemy mieli wypełnienie od 1/256 do 256/256 (czyli nie da się dojść do 0%) albo od 0/256 do 255/256 (nie da się 100%).
  • Użytkownik usunął konto  
  • Poziom 13  
    szulat napisał:
    Czy przypadkiem nie chodzi o to, że PWM przy timerze 8-bitowym dzieli okres czasu na 256 jednostek a więc możliwych jest 257 stanów (od wypełnienia 0 do wypełnienia 256)


    Abstrahując od meritum sprawy: jak na 8 bitach zapisać liczbę większą niż 255? :)
  • Poziom 23  
    ssl69 napisał:
    Abstrahując od meritum sprawy: jak na 8 bitach zapisać liczbę większą niż 255? :)

    tak samo jak można zapisać liczbę mniejszą niż zero - przyjmując odpowiednią konwencję :D
  • Poziom 8  
    No niestety, nie rozumiem jeszcze tego na tyle, żeby to zadziałało... Jak ustawiam TCCR1A = (0<<COM1A1) to mi nie działa...

    Spróbuję jeszcze później. Dziękuję za pomoc, ale tak jak powiedziałem, jeszcze się uczę i niektórych rzeczy nie rozumiem.
  • Poziom 43  
    Kombinujecie jak koń pod górkę.
    Po co te kombinacje z IFem dla wartości PWM = 0?
    Wystarczy przecież włączyć PWMa w trybie Phase Correct.
    qubak zresztą już do tego doszedł tylko jeszcze nie wie o co tam chodzi.
    Wszystko jest w datasheecie :D
    Ale po krótce wyjaśnię.
    CTC to tryb w którym licznik może mieć (uznajmy że po prostu ma) skrócony cykl. Czyli np. można zrobić PWMa co będzie miał nie 256 poziomów a 100 poziomów. Czasami prościej się wtedy steruje jak np. chcemy mieć regulację od 0 do 100%, bo wtedy procenty bezpośrednio odpowiadają wartościom jakie trzeba wpisać do rejestrów Timera (np. 35 w rejestrze to 35%).
    Phase Correct to tryb w którym licznik zlicza w dwie strony. Czyli najpierw w górę a później w dół (normalnie zlicza tylko w górę i jak zliczy i przewija się od razu do zera). Przy sterowaniu diod nie ma to żadnego znaczenia.
    Ale tryb Phase Correct przy okazji działa lepiej jak tryb Fast PWM bo pozwala uzyskać wypełnienia od 0/255 do max/255. Fast PWM tylko od 1/255 do max/255. Albo od 0/255 do (max-1)/255. (To akurat nie jest zaleta samego trybu tylko tego jak to zrobili w prockach AVR. Bo normalnie to i Fast PWMa można zrobić żeby dawał pełny zakres wypełnień.)
    Dlatego w trybie Phase Correct dioda nie świeci. A w Fast PWM świeci. Bo w Fast PWM nawet jak wpiszesz 0 to wypełnienie jest równe 1/255.
    Przy okazji to CTC i Phase Correct nie mają ze sobą nic wspólnego. Tzn. nie wpływają na siebie. Np. Phase Correct może działać i bez CTC i z CTC.
    W datasheecie zaznaczyli CTC jako osobny tryb (bez PWMa). W praktyce działa on też w PWMach. Trzeba tylko doczytać w jakich Timerach i jakie są wtedy ograniczenia.
  • Poziom 23  
    atom1477 napisał:

    Ale tryb Phase Correct przy okazji działa lepiej jak tryb Fast PWM bo pozwala uzyskać wypełnienia od 0/255 do max/255. Fast PWM tylko od 1/255 do max/255. Albo od 0/255 do (max-1)/255

    Trochę zamotałeś bo z tabelki jaką widzę w datasheecie wynika że w Fast PWM też można zmieniać TOP (ICR1), więc do celów sterowania ledem nie widać specjalnie przewagi phase correct nad fast pwm (a za to fast pwm daje wiekszą czestotliwość).

    I lepiej trzymajmy sie terminologii producenta, w której CTC to nazwa trybu a nie coś co można włączać w różnych trybach, bo potem ktoś czytając to może mieć problem ze znalezieniem w dokumentacji jak włączyć CTC i phase correct równocześnie, a więc nie, CTC i phase correct to nie są rzeczy które właczamy niezależnie od siebie. Ale w niektórych trybach możemy zmieniać wartość TOP co daje taki efekt o którym pisałeś, jak w trybie CTC.

    dondu napisał:
    Mnie pozostało już tylko pokazać praktyczne przykłady "LED vs ludzkie oko": [...]
    Niektórzy z Was wiedzą z praktyki, inni z teorii, a jeszcze inni nie wiedzą, że regulując liniowo wypełnienie PWM, nie otrzymamy liniowego wrażenia zwiększania lub zmniejszania się światła generowanego przez LED.

    Wynika to z faktu, iż każdy LED ma swoją charakterystykę strumienia światła i nie jest ona liniowa. Dodatkowo oko ludzkie także ma nieliniową charakterystykę czułości, na domiar złego zależną od barwy światła.

    Przecież przy sterowaniu PWM LED świeci zawsze z tą samą jasnością - albo nie świeci w ogóle. Nie ma więc okazji na ujawnienie swojej ewentualnej nieliniowej charakterystyki. Druga część twojego wniosku jest słuszna, oko reaguje logarytmicznie, i ma to nawet ma swoją naukową nazwę :) http://pl.wikipedia.org/wiki/Prawo_Webera-Fechnera
  • Poziom 8  
    Dziękuję bardzo za pomoc. Będę to jeszcze zmieniał i sprawdzał co się wydarzy :) Na pewno jak dojdę do pewnych wniosków to się podzielę.
    Pozdrawiam
  • Moderator Mikrokontrolery Projektowanie
    Skoro już odniosłeś się do fragmentu artykułu (niepotrzebnie zresztą, bo nie jest to przedmiotem tego tematu):

    szulat napisał:
    Przecież przy sterowaniu PWM LED świeci zawsze z tą samą jasnością - albo nie świeci w ogóle.
    Nie ma więc okazji na ujawnienie swojej ewentualnej nieliniowej charakterystyki.

    Nie ma idealnych LED'ów, a nieliniowość narastania strumienia światła zawsze występuje i jest zależna od wielu czynników, w tym samej LED: http://pl.wikipedia.org/wiki/Dioda_elektroluminescencyjna
    jak i źródła prądu ją zasilającego w tym wypadku wyjścia mikrokontrolera, którego charakterystyka także nie jest liniowa oraz idąc dalej źródła zasilania mikrokontrolera.

    Jest to układ złożony elektrycznie o nieliniowej charakterystyce końcowej, czyli strumieniu światła.

    PS.
    Jeżeli chcesz dyskutować na temat artykułu, to wykorzystaj system komentarzy, by nie zaśmiecać tematu koledze qubak.
  • Poziom 23  
    dondu napisał:
    Jest to układ złożony elektrycznie o nieliniowej charakterystyce końcowej, czyli strumieniu światła.
    ...ok, nie zauważyłem, już się przenoszę na komentarze :)
  • Poziom 27  
    atom1477 napisał:
    [...]Po co te kombinacje z IFem dla wartości PWM = 0?
    Wystarczy przecież włączyć PWMa w trybie Phase Correct.
    W trybie PhaseCorrect osiągamy dwukrotnie niższą częstotliwość przebiegu PWM co w przypadku przetwornic znacząco wpływa na wielkość dławików.
    W trybie FastPWM a zdaje się, że również w pozostałych trybach dla wyzerowanego OCR na wyjściu OC pojawia się szpilka. Jest ona wystarczająco długa, aby w nieobciążonej przetwornicy przepustowej spowodować niekontrolowany przyrost napięcia na wyjściu.
  • Poziom 21  
    Myślę że stwierdzenie:
    Cytat:
    Przecież przy sterowaniu PWM LED świeci zawsze z tą samą jasnością - albo nie świeci w ogóle. Nie ma więc okazji na ujawnienie swojej ewentualnej nieliniowej charakterystyki.


    Nie jest do końca prawdziwe.

    W sterowaniu PWM (pomimo iż naprzemiennie włączamy i wyłączamy LED, zmieniając tylko proporcję między czasem załączenia a wyłączenia), regulujemy wartość średnią prądu płynącego przez LED. Dzięki temu możemy dowolnie kształtować charakterystykę świecenia LED i sprawić aby intensywność narastała w kolejnych krokach logarytmicznie, a wtedy będzie to postrzegane przez nasze oko "liniowo".
  • Poziom 43  
    Tomasz Gumny napisał:
    atom1477 napisał:
    [...]Po co te kombinacje z IFem dla wartości PWM = 0?
    Wystarczy przecież włączyć PWMa w trybie Phase Correct.
    W trybie PhaseCorrect osiągamy dwukrotnie niższą częstotliwość przebiegu PWM co w przypadku przetwornic znacząco wpływa na wielkość dławików.
    W trybie FastPWM a zdaje się, że również w pozostałych trybach dla wyzerowanego OCR na wyjściu OC pojawia się szpilka. Jest ona wystarczająco długa, aby w nieobciążonej przetwornicy przepustowej spowodować niekontrolowany przyrost napięcia na wyjściu.

    Nie widzę związku.
    Mowa o kombinacjach dotyczyła LEDa.
    Po drugie te kombinacje nie są potrzebne nawet przy przetwornicach. Wystarczy Tryb Phase Correct, albo Fast PWM z zanegowanym sterowaniem wyjścia. Wtedy szpilka owszem jest, ale przy wypełnieniu bliskim 100% (czyli zamiast 100% jest powiedzmy 99,3%). A przetwornica nigdy nie pracuje na 100%. No może obniżająca, ale to już przypadek jak nie działa stabilizacja i przetwornica puszcza wszystko to co ma na wejściu.
    Jak by nie było nie ma tutaj analogii do LED więc nie rozumiem o co Ci chodzi.

    Co do nazwy CTC to może faktycznie. Jest to osobny tryb. Jak by jednak nie było skracać cykl można i w CTC (bo do tego głównie jest CTC), jak i w trybach PWMa gdzie już nie nosi to nazwy CTC.

    A co do tego:
    dondu napisał:
    Nie ma idealnych LED'ów, a nieliniowość narastania strumienia światła zawsze występuje i jest zależna od wielu czynników, w tym samej LED: http://pl.wikipedia.org/wiki/Dioda_elektroluminescencyjna
    jak i źródła prądu ją zasilającego w tym wypadku wyjścia mikrokontrolera, którego charakterystyka także nie jest liniowa oraz idąc dalej źródła zasilania mikrokontrolera.

    Jest to układ złożony elektrycznie o nieliniowej charakterystyce końcowej, czyli strumieniu światła.

    to też się nie zgadzam.
    Nieliniowości układu może i coś by miały do tego, ale nieliniowość LEDa nie ma nic.
    Przecież taki LED w układzie z PWMem zawsze pracuje na 1 punkcie charakterystyki. Gdzie tu więc nieliniowości?
    Prąd i napięcie będzie zawsze takie samo, jedynie czas trwania tego prądu i napięcia będzie się zmieniał.
    Jasność może się zmienić jedynie na przykład dka innej temperatury. Ale zmieni się ona tak samo dla wypełnienia np. 10% i 50%, bo przy obu wypełnieniach będzie płynął taki sam prąd. Inny niż przy innej temperaturze, ale taki sam dla obu współczynników wypełnienia.
    W jednej temperaturze jasność może więc zmieniać się od np. 1klx do 10klx, a w innej od 2klx do 20klx. Ale w obu przypadkach będzie taki sam zakres zmian (10 razy). Pośrednie wartości jasności też zmienią się proporcjonalnie.
    Po przeliczeniu tego na logarytmy (dla obliczenia reakcji oka) wychodzi na to samo: w obu przypadkach będzie taka sama zmiana jasności następująca po takiej samej krzywej (lub po prostej jeżeli zastosujemy korekcję sterowania PWMa).
    Zadanie domowe: w tym układzie demonstracyjnym z filmiku zmieniaj wartość rezystora w diodzie z korekcją. Zobaczysz że zawsze zmiany jasności będą liniowe, inna będzie jedynie końcowa wartość jasności.