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

[ATmega16A][C][TIMER0 PWM] - LED w "inverting mode" i "non-invert

GanzConrad 26 Cze 2013 19:54 1839 5
REKLAMA
  • #1 12459627
    GanzConrad
    Poziom 25  
    Posty: 934
    Pomógł: 67
    Ocena: 203
    Witam,
    Mam podłączoną diodę do PB3 i ustawiam sprzętowy PWM dla TIMER0.
    Skrócony schemat podłączenia LED wygląda tak:
    VCC--[rezystor 120]---[LED katodą do PB3]
    chcąc mieć proste powiązanie pomiędzy wypełnieniem PWM i wartością OCR0 powinienem ustawić "inverting mode" (wtedy wartość OCR0 będzie odzwierciedlać poziom jasności LED) . Problem polega na tym, że przy "inverting mode" i ustawieniu OCR0=0 dioda nie gaśnie (świeci się minimalnie).

    dla przypomnienia tabelka trybów z datasheet:
    Cytat:

    Table 14-4. Compare Output Mode, Fast PWM Mode(1)
    COM01 COM00 Description
    0 0 Normal port operation, OC0 disconnected.
    0 1 Reserved
    1 0 Clear OC0 on compare match, set OC0 at BOTTOM, (non-inverting mode)
    1 1 Set OC0 on compare match, clear OC0 at BOTTOM,(inverting mode)


    kody:
    w poniższym przypadku, gdy ustawiam OCR0=0 - LED minimalnie się świeci, 255 - świeci na maxa
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    natomiast w trybie "non-inverting": OCR0=255 - gaśnie; OCR0=0 - świeci na maxa:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    jedyne co mi przychodzi do głowy to jakaś "szpilka" w momencie konfliktu, gdy OCR0=0 i PB3 powinien być w stanie wysokim, ale jest ustawiany na LOW w momencie osiągnięcia przez timer wartości Bottom (czyli też "0"):
    Cytat:

    Set OC0 on compare match, clear OC0 at BOTTOM, (inverting mode) ]

    może mi ktoś wyjaśnić, czy dobrze to rozumiem i nie mogę korzystać z "inveting mode" ?
  • REKLAMA
  • Pomocny post
    #2 12459924
    Steryd3
    Poziom 33  
    Posty: 1641
    Pomógł: 241
    Ocena: 301
    GanzConrad napisał:
    jedyne co mi przychodzi do głowy to jakaś "szpilka" w momencie konfliktu, gdy OCR0=0

    I tak jest! Przy wartości 0 w rejestrze OCR0 odpowiedzialnym za wypełnienie sygnału PWM na wyjściu pojawia się szpilka -już nie pamiętam ile trwa w stosunku do wartości 1 w tymże rejestrze (ale dużo krócej-chyba około 1/5 czasu dla wartości 1 w OCR0). Problem jest opisany i udokumentowany i nic wprost nie da się z tym zrobić- szpilka jest i koniec. Spróbuj zwiększyć wartość rezystora szeregowego-powinno pomóc. Można spróbować z zwiększeniem częstotliwości sygnału PWM lub przesiąść się 16 bitowy na Timer1 -tam chyba nie było tego problemu.
  • REKLAMA
  • #3 12460048
    GanzConrad
    Poziom 25  
    Posty: 934
    Pomógł: 67
    Ocena: 203
    musi być mniejsza od 1 w OCR0 bo jest różnica w jasności pomiędzy wartościami 0 i 1 w OCR0 ("0" jest trochę ciemniejsze). Zwiększenie częstotliwości nic nie daje (nawet z preskalerem =1). rezystor dobrałem, tak aby maxymalnie wykorzystać diodę, więc chyba po prostu będę zmieniał wypełnienie w "non-inverting mode". Pod TIMER1 podpiąłem kolejne 2 LEDy z kompletu RGB.
  • REKLAMA
  • Pomocny post
    #4 12460113
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Datasheet napisał:
    The extreme values for the OCR0 Register represents special cases when generating a PWM waveform output in the fast PWM mode.
    If the OCR0 is set equal to BOTTOM, the output will be a narrow spike for each MAX+1 timer clock cycle. Setting the OCR0 equal to MAX will result in a
    constantly high or low output (depending on the polarity of the output set by the COM01:0 bits.)

    Dla wypełnienia równego zero, należy po prostu wyłączyć wyjście.
  • REKLAMA
  • Pomocny post
    #5 12460136
    Konto nie istnieje
    Poziom 1  
REKLAMA