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

Atmega8 PWM - LED nie gaśnie całkowicie po cyklu, co robię źle?

Szaflik 29 Lis 2006 21:32 4048 39
Najlepsze odpowiedzi

Dlaczego dioda LED na ATmega8 nie gaśnie całkowicie przy PWM ustawionym na 0 i jak uzyskać prawdziwe 0% jasności?

W trybie Fast PWM samo wpisanie `OCR2=0` nie daje pełnego zgaśnięcia, bo timer nadal generuje krótkie impulsy na wyjściu OC2, więc dioda może lekko żarzyć [#3278783] Żeby uzyskać rzeczywiste „0”, trzeba wyłączyć PWM albo przełączyć pin OC2 na wejście bez podciągania, zamiast polegać wyłącznie na `OCR2=0` [#3277586][#3278783] Pomogło też przejście na PWM z korekcją fazy i dobranie trybu COM21/COM20 tak, aby skrajna wartość rejestru dawała pełne zgaśnięcie; autor potwierdził potem, że problem leżał w konfiguracji `TCCR2` [#3278738][#3301833] W praktyce oznacza to, że w tej konfiguracji skrajne wartości mogą dawać tylko bardzo słabe świecenie, a nie idealne 0% [#3289347]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 3277385
    Szaflik
    Poziom 20  
    Posty: 543
    Pomógł: 15
    Ocena: 332
    WITAM !! Zaczynam wlasnie zabawe z AVRami. Chciałem stworzy prosty układzik w oparciu o PWM. Zastosowałem do tego celu timer2 skonfigurowany jako fast pwm ... program ma stopniowo w petli zapalac diode LED od 0 do max po czym gasic ja .. no i problem w tym ze po odpaleniu dioda faktycznie zapala sie .. ale potem nie gasnie calkiem :/ poniżej kod zrodlowy tego programu;


    #include <avr/io.h>
    #include <avr/sleep.h>
    #include <util/delay.h>

    int main(void)
    {
    DDRB = 0b11111111; // ustawienie portu B jako wyjscie
    TCCR2 = 0b01101001; //konfiguracja timera2
    int pwm;

    for(pwm=0;pwm<255;pwm++) //petla
    {
    OCR2=pwm;
    _delay_ms(25);
    }
    OCR2=0; // wyzerowanie rejestru ocr
    return 0;
    }

    wygląda to mniej wiecej tak ... jesli ktos ma jakies pomysly to prosze sie nie krepowac ;) :P
  • REKLAMA
  • #2 3277503
    aceman
    Poziom 12  
    Posty: 37
    Pomógł: 1
    Jeżeli masz diodę podłączoną anodą do zasilania, a katodą do uP, to gasisz ją podając 1 na wyjściu uP. Tak więc po skończeniu pętli ustaw stan wysoki na wyjściu.
  • #3 3277522
    Szaflik
    Poziom 20  
    Posty: 543
    Pomógł: 15
    Ocena: 332
    mam anode do procka, katode do masy .. ale wlasnie jest problem ze nawet jak wyzeruje port to ona dalej swieci (delikatnie) :/ jesli wywale linijke TCCR2 = 0b01101001; i petle od pwm to dopiero wtedy gasnie calkiem :/ jesli jest ta linijka i nie ma nawet petli pwm to delikatnie swieci .. no i niewiem w czym problem :/
  • REKLAMA
  • #4 3277586
    aceman
    Poziom 12  
    Posty: 37
    Pomógł: 1
    To może spróbuj na koniec przełączyć dany PORT jako wejście bez podciągania.
  • #6 3278004
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    nie za szybko ustawiłes ten licznik? tzn zliczasz impulsy zegarowe bez preskalera, chociaz i tak powinno dzialac
    a sproboj tak

    TCCR2 = 0b01101010

    lub tak

    TCCR2 = 0b01101011

    Dodano po 47 [sekundy]:

    jaką częstotliwością taktujesz mikrokontroler?
  • #7 3278066
    rokoko
    Poziom 20  
    Posty: 484
    Pomógł: 6
    Ocena: 57
    Koledzy a czy ktos moglby przeltumaczyc ten kod na BASCOMA?? Ccialbym podobny uklad jednak na BASCOMie. Z gory dziekuje
  • #8 3278269
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    rokoko napisał:
    Koledzy a czy ktos moglby przeltumaczyc ten kod na BASCOMA?? Ccialbym podobny uklad jednak na BASCOMie. Z gory dziekuje


    Może nie ten kod ale przykładowy program do generowania kodu PWM w Bascomie.
    Miłej zabawy i pozdrawiam.

    '**************
    '* - PWM - *
    '**************
    Dim A As Byte 'Zlicza lolejne przerwania Timer1
    Dim D As Byte 'Określa % wypelnienia PWM

    P3.7 = 0 'Wstępne wyzerowanie portu generującego PWM
    D = 80 'Przykladowy % wypelnienia PWM

    $crystal = 11059200
    Config Timer1 = Timer , Gate = Internal , Mode = 1
    On Timer1 Timer1_init
    Enable Timer1
    Enable Interrupts
    Start Timer1
    'Okres[sek] PWM: 11059200/12=921600/(256*256)=14,0625
    '100/14,0625=7,1sek

    Do
    'Coś do wykonania np: sterowanie zmienną D
    Loop
    End

    Timer1_init: 'Obsluga przerwania Timer1
    Incr A
    If A < D Then
    P3.7 = 1
    Else
    If A < 100 Then
    P3.7 = 0
    Else 'jeżeli A>100 to A=0
    A = 0
    End If
    End If
    Return
  • #9 3278442
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    a dlaczego programowy PWM ?? '51 ma chyba sprzetowy??
    dla avr to będzie tak


    Config Timer1 = Pwm , Prescale = 8 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
    
    
    For Pwm1a = 0 To 256
    Waitms 10
    Next Pwm1a
    
    For Pwm1b = 0 To 256
    Waitms 10
    Next Pwm1b
    
    Do
    Loop
  • #11 3278559
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    co do problemu kolegi Szaflik'a to bardzo dziwne to jest?? w c to raczej noga jestem wiec niebardzo pomoge ale na forum jest dużo c-koderów i napewno coś doradza. ale ja mam inne pytanko czy dioda napewno jest podłałczona do masy i jakie jest napięcie na koncówce oc2 gdy pwm jest ustawiony na 0.
    niema cudów jak na wyjściu jest 0V i dioda jest podpięta do masy to niemoze swiecić

    wiec jeśli jest dobrze podpięta to pewnie cos z programem.
    ale co ???
  • REKLAMA
  • #15 3278608
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    ale ta pętla wpisuje ci do OCR za każdym razem inne porównanie.
  • REKLAMA
  • #17 3278697
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    To też ci klaruje że to ZERO trwa zaledwie 25ms czego możesz nie zauważyć.
  • #18 3278706
    Szaflik
    Poziom 20  
    Posty: 543
    Pomógł: 15
    Ocena: 332
    nie nie nie .. niezrozumielismy sie :) wpisuje na ostro OCVR2=0 z pominieciem calej tej petli bez zadnych opoznien juz ...

    nt main(void)
    {
    DDRB = 0b11111111; // ustawienie portu B jako wyjscie
    TCCR2 = 0b01101001; //konfiguracja timera2
    int pwm;
    OCR2=0; // wyzerowanie rejestru ocr
    return 0;
    }
  • #21 3278783
    pmichniewski
    Poziom 18  
    Posty: 242
    Pomógł: 22
    Ocena: 5
    PWM w ATmega ma to do siebie, że daje impulsy mimo ustawienia OCR2 na 0. Niestety bez wyłączania PWM po zejściu do 0 tego nie ominiesz.
  • #22 3278791
    Szaflik
    Poziom 20  
    Posty: 543
    Pomógł: 15
    Ocena: 332
    kurka wodna ale na drugim timerze dziala jak nalezy :/ ehhh :P hmm tylko ja to chcialem zastosowac do sciemniacza ... i chcialem regulowac od 0 :/ a tu dioda jarzy sie dosc widocznie .. wiec sam juz niewiem co z tym zrobic ... chyba przesiade sie na ten drugi timer ;) i zrobie 16 bitowy pwm ;] :)


    heh lol .. przy zapisie do OCR 2,5,10, czy nawet 20 nie widac roznicy w "swieceniu" diody ;] niby prosta rzecz a tyle problemow :/
  • #23 3278816
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    na timerze1 możesz wybrać czy chcesz PWM 8, 9 czy 10 bitowy
    jak chcesz wiekszą rozdzielczość to musisz programowo.

    dodatkowo możesz sprawdzić czy jak podłączysz diode do plusa zamiast masy i pwma ustawisz na 255 to będzie swiecić czy nie ??? (na timerze2)
  • #24 3278832
    Szaflik
    Poziom 20  
    Posty: 543
    Pomógł: 15
    Ocena: 332
    przy podłączeniu do plusa i wpisaniu do OCRa2 250 ten sam efekt :( grr :[

    Dodano po 43 [minuty]:

    dobra zrobiłem inny myk .. zastosowałem PWM z korekcja fazy i takie cuda dziwy .. przy ustawieniu bitow com21 com20 "Clear OC2 on Compare Match when up-counting. Set OC2 on Compare
    Match when downcounting" przy wpisaniu 255 do OCR2 gasnie calkiem przy wpisaniu 254 juz delikatnie swieci :| .. natomiast .. co ciekawsze .. przy ustawieniu "Set OC2 on Compare Match when up-counting. Clear OC2 on Compare
    Match when downcounting" jesli wpisze 0 do OCR2 to nie gasnie calkiem ;] lol :) nie wiem co mam o tym myslec ;) :P przydał by sie oscyloskop ;] :)
  • #25 3285530
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Może już nie aktualne ale mam na stole akurat projest w którym zasymulowałem T2 w ten sposób:
    void InitT2 (void)
    {
     TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20)|	   	   //prescaler przez 1024
     	   	 (1<<WGM20)|(1<<WGM21)|				   //Fast PWM
     	   	 (1<<COM21)|(1<<COM20);                //Set OC2
     TIMSK |= (1<<TOIE2);						   //przerwanie od T2
    }
    
    i zmieniam wartość OCR2 z 0 na 255 i dioda pięknie gaśnie (całkowicie) i zapala się na maksa. Nie wiem dlaczego miałeś z tym problem.
  • #26 3285546
    Szaflik
    Poziom 20  
    Posty: 543
    Pomógł: 15
    Ocena: 332
    GienekS napisał:

    TIMSK |= (1<<TOIE2); //przerwanie od T2
    }
    [/code]


    Czy przyczyna mogła tkwic w tej linijce ?? ... a moze to byla po prostu wina zasilania ? zasilam to z game portu komputera ;] jak wroce do wrocławia zapne inny zasilacz :)
  • #27 3285613
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Dla działania PWM nie jest konieczne wykonywania przerwania od danego timera, w moim przypadku obsługuje on dodatkowo zegar, dlatego jest ono włączone.
    Dodam jeszcze że to puszczałem na ATmeg16.
  • #29 3285635
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Jeżeli na procku masz elko to nie powinno to mieć znaczenia, no chyba że jest tam napięcie bardzo odbiegające od zalecanego dla danego procesora.

Podsumowanie tematu

✨ Problem dotyczył sterowania jasnością diody LED za pomocą PWM na mikrokontrolerze Atmega8, gdzie dioda nie gasła całkowicie po ustawieniu wartości OCR2 na 0. Użytkownik stosował timer2 w trybie Fast PWM, ale mimo zerowania rejestru OCR2 dioda pozostawała lekko świecąca. Dyskusja ujawniła, że PWM na timerze2 w Atmega8 generuje impulsy nawet przy OCR2=0, co powoduje minimalne świecenie diody. Proponowano różne rozwiązania, takie jak zmiana konfiguracji rejestru TCCR2, przełączanie portu na wejście bez podciągania, czy użycie innego timera (timer1) z 16-bitowym PWM dla lepszej kontroli. Wskazano również, że ustawienia bitów COM21 i COM20 w TCCR2 mają kluczowe znaczenie dla zachowania sygnału PWM i całkowitego wygaszenia diody. Ostatecznie problem rozwiązano poprzez poprawną konfigurację rejestru TCCR2. Dodatkowo poruszono kwestie wpływu zasilania oraz możliwych zakłóceń, a także różnice w zachowaniu PWM między timerem1 a timerem2. W dyskusji pojawiły się także przykłady kodu w C oraz Bascom, a także sugestie dotyczące testów z oscyloskopem i podłączenia diody do plusa lub masy w celu weryfikacji działania PWM.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA