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.
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)
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.
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.
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ć...
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.
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)...
[...] 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:
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??
1) Jakiego typu jest "i"? bo skoro robisz i-- a potem if i<0 (a i będzie np typu bajt/char) to chwilowo przekręcasz zmienna na 255 i masz syf
2) Gdy pin jest ustawiony jako PWM to nie możesz tak po prostu podać na nim stan 0 bo jest on "odłączony" od sterowania. Musisz wyłączyć PWM dla tego pinu, wtedy odzyskasz nad nim kontrolę i ustawisz go na 0. Tomasz o tym napisał
Tu masz przykład z mojego projektu dla ledów RGB dla Atmega8, timery skonfigurowane jako 8 bit, do tego wygaszanie led gdy PWM=0. Przykład dla jednego wyjścia:
"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).
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%).
Już 2 osoby ci gadają co masz zrobić. W ten sposób nie wymusisz stanu niskiego na pinie PWM, gdy PWM jest na nim włączony bo nie masz takiej kontroli.
Zanim go wyzerujesz WYŁĄCZ PWM NA TYM PINIE. Tylko tyle. Gdy raczysz to zrobić to uzyskasz swoje 0% PWM.
Potem pamiętaj o włączeniu PWM na tym pinie gdy PWM>0.
Assemblera znać nie musisz, wkleiłem to żebyś widział co ładuję do PWM dla 1 pinu żeby go włączać/wyłączać. Zrób tak samo.
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?
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 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.
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
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.
[...]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.
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".
[...]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.