logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

qubak 18 Sie 2012 23:21 6495 26
  • #1 11222938
    qubak
    Poziom 9  
    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.
  • #2 11223190
    szulat
    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)
  • #3 11223201
    Electix
    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.
  • #4 11223218
    qubak
    Poziom 9  
    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?
  • #5 11223557
    Electix
    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ć... :)
  • #6 11223567
    Konto nie istnieje
    Konto nie istnieje  
  • #7 11223638
    Electix
    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..?

    :)
  • #8 11223870
    Konto nie istnieje
    Konto nie istnieje  
  • #9 11223927
    qubak
    Poziom 9  
    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)...
  • #10 11223957
    Tomasz Gumny
    Poziom 28  
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • #11 11223961
    qubak
    Poziom 9  
    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 / C++
    Zaloguj się, aby zobaczyć kod


    W Timerze 2 mam ustawienia:

    Kod: C / 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??
  • #12 11223997
    Konto nie istnieje
    Konto nie istnieje  
  • #13 11224080
    qubak
    Poziom 9  
    "i" jest typu int. Dzięki za kod, ale nie jestem biegły w assemblerze...

    Kod: C / 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).
  • #14 11224125
    szulat
    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%).
  • #15 11224346
    Konto nie istnieje
    Konto nie istnieje  
  • #16 11224503
    ssl69
    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? :)
  • #17 11224530
    szulat
    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
  • #18 11224552
    qubak
    Poziom 9  
    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.
  • #19 11224579
    Konto nie istnieje
    Poziom 1  
  • #21 11224706
    szulat
    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
  • #22 11224742
    qubak
    Poziom 9  
    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
  • #23 11224778
    dondu
    Moderator na urlopie...
    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.
  • #24 11224896
    szulat
    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 :)
  • #25 11224906
    Tomasz Gumny
    Poziom 28  
    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.
  • #26 11224911
    Electix
    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".
  • #27 11225783
    Konto nie istnieje
    Poziom 1  
REKLAMA