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] Ustawienia 8-bitowego fast PWM na pinie OC1A - błędy i pytania

Cataclysm 15 Maj 2010 14:25 2854 9
REKLAMA
  • #1 8078224
    Cataclysm
    Poziom 10  
    Posty: 33
    Pomógł: 1
    Witam, mam kilka pytań dotyczących PWM-a w procku atmega8.

    Próbuję ustawić 8bit fast PWM-a na pinie OC1A takim kodem:
    
    ;...
    ldi   r16,(1<<PB1)
    out   DDRB, r16
    ldi   r16, (1<<WGM10|1<<COM1A1);mode 5 (8bit fast pwm)
    out   TCCR1A, r16
    ldi   r16, (1<<WGM12|1<<CS10)
    out   TCCR1B, r16
    ldi   r16, 120;wypelnienie 120/255
    out   OCR1AL, r16
    
    loop:
    rjmp loop
    

    I efektem takiego ustawienia (w symulatorze)wartość TCNT1 rośnie do 255 i zamiast zacząć od zera liczy w dół. W nocie pisze, że "The counter counts from BOTTOM to TOP then restarts to BOTTOM" więc chyba gdzieś popełniam błąd.

    Nie za bardzo też rozumiem jak ustawić bity COM1A1 i COM1A0 w rejestrze TCCR1A. Nie rozumiem dwóch ostatnich wierszy w tabeli 37(datasheet)

    Trzecia wątpliwość to czym różnią się te tryby PWM:
    1. Normal?
    2. Fast PWM - tu większość rozumiem
    3. Phase Correct PWM?
    4. Phase and Frequency Correct PWM?

    Szukając na forum znalazłem prawie same przykładowe kody uruchomienia PWM-a które nic nie mówią o wymienionych wyżej problemach.
    Pozdrawiam.
  • REKLAMA
  • #2 8078468
    MacGyver 7
    Poziom 21  
    Posty: 417
    Pomógł: 37
    Ocena: 41
    Dzieje się tak dlatego że uruchomiłeś licznik w trybie PWM poprawnej fazy. Zobacz w nocie katalogowej jak ustawić bity WGM aby uruchomić licznik w trybie w jakim ma pracować.

    ps, rejestr OCR1AL jest rejestrem podwójnie buforowanym, co oznacza że musisz jednocześnie załadować wartości do OCR1AL i OCR1AH.

    
    ldi R16, high(120)
    ldi R17, low(120)
    out OCR1AH, R16
    out OCR1AL, R17
    


    Kod proszę umieszczać w znacznikach code.
    Robak
  • REKLAMA
  • Pomocny post
    #3 8078575
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Nie wgłębiałem się w kod, ale weź od razu poprawkę na to że w symulatorze PWMy są skopane, chyba że coś w tej materii się zmieniło a ja nie wiem:)
  • #4 8078897
    Cataclysm
    Poziom 10  
    Posty: 33
    Pomógł: 1
    @_Robak_: ok, przyjmuję to do wiadomości ale inaczej nie mam jak sprawdzić czy PWM działa (brak oscyloskopu)

    @MacGyver. 7: Chyba mam jakąś inna notę ale w mojej nocie do atmegi8 jest napisane, że aby użyć trybu nr 5 - fast PWM, 8-bit muszę ustawić bity WGM10 i WGM12 (Datasheet str.98)


    Co do tego całego kodu to PWM w symulatorze działa, tak jak mówiłem licznik zamiast przy wartości 0xFF resetować się to liczy w dół.

    Zaraz sprawdzę jak jest przy kodzie użytkownika zumek z jednego tematu.



    Sprawdziłem, przy jego kodzie także licznik zamiast zacząć od zera cofa się. (tryb Fast PWM, mode 14)

    Przy działaniu takim jak teraz pokazuje symulator częstotliwość przebiegu będzie 2 razy mniejsza co mi w sumie nie przeszkadza, bo wypełnienie jest poprawne. Lecz jeśli będę chciał zrobić sprzętowy PWM z zadaną częst. to nie będę wiedział czy przebieg jest poprawnie generowany.
  • REKLAMA
  • #5 8082161
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    No bo na tym chyba polega idea PWM że nie liczy cały czas ode zera tylko do przodu i do tyłu. Jak chcesz otrzymać taki efekt to uruchamiasz w normalnmym trybie Timer i ładujesz do niego jakąś wartośc i zaznaczasz żeby odwracało Ci stan pinu przy przepełnieniu :P I do tego nie potzrebujesz PWM, a pwm liczy od dołu do góry i spowrotem :P Oczywiście mogę się mylić :P
  • #6 8082283
    Cataclysm
    Poziom 10  
    Posty: 33
    Pomógł: 1
    No nie wiem jak to ma być rzeczywiście z tym licznikiem. Po wgraniu programu do uC dowiedziałem się kilka rzeczy: mój miernik do niczego się nie nadaje i/lub nie umiem się nim obsłużyć i/lub jest jednak jakiś problem z PWM-em (dioda LED czerwona i rezystor 600_z_kawałkiem Ohm podłączona do PB1):
    -wypełnienie 0/255, woltomierz pokazuje 24,4mV a dioda tli się.
    -wypełnienie 10/255, woltomierz pokazuje 211mV a dioda pali się już normalnie.

    Napięcie zasilania 4.96V. Miernik ustawiony na napięcie stałe i jego wskazania w sumie się zgadzają, dziwi mnie zachowanie diody. Czemu tak się dzieje?

    Pozdrawiam, pomógł dostaną odpowiednie osoby gdy uznam temat za zamknięty.
  • REKLAMA
  • Pomocny post
    #7 8082318
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    A jak masz ustawiony Timer? Może pokaż ten fragment kodu :P
  • #8 8082755
    Cataclysm
    Poziom 10  
    Posty: 33
    Pomógł: 1
    PWM ustawiam tak:
    	ldi 	r16,(1<<PB1)			;pb1 jako wyjscie
    	out 	DDRB, r16
    	ldi		r16, (1<<WGM10|1<<COM1A1);mode 5 - 8bit fast pwm
    	out		TCCR1A, r16
    	ldi		r16, (1<<WGM12|1<<CS10)
    	out		TCCR1B, r16
    	ldi 	r16, 120;poczatkowe wypelnienie wypelnienie 120/255
    	clr		r17
    	out 	OCR1AL, r16	
    	out 	OCR1AH, r17


    Przed chwilą próbowałem podać sygnał PWM na bazę tranzystora i nawet bez rezystora prąd bazy nie przekraczał 0.33 mA (chciałem coś koło 10 mA)
  • Pomocny post
    #9 8082859
    MacGyver 7
    Poziom 21  
    Posty: 417
    Pomógł: 37
    Ocena: 41
    grysek napisał:
    No bo na tym chyba polega idea PWM że nie liczy cały czas ode zera tylko do przodu i do tyłu. Jak chcesz otrzymać taki efekt to uruchamiasz w normalnmym trybie Timer i ładujesz do niego jakąś wartośc i zaznaczasz żeby odwracało Ci stan pinu przy przepełnieniu :P I do tego nie potzrebujesz PWM, a pwm liczy od dołu do góry i spowrotem :P Oczywiście mogę się mylić :P


    Niekoniecznie. W mikrokontrolerach AVR PWM działa w trzech trybach:
    - Szybki tryb PWM licznik liczy do końca, po czym jest automatycznie zerowany i
    znowu liczy od zera do końca. Jeżeli aktualny stan licznika jest mniejszy niż rejestru OCRn to na wyjściu OCn jest zero, jeśli większy lub różny to jeden;
    - Tryb poprawnej fazy, licznik liczy od zera do max wartości, po czym liczy od max do zera i tak w kółko. Stan wyjścia OCn jak poprzednio;
    - Tryb poprawnej fazy i częstotliwości, licznik liczy w obie strony, jak poprzednio. Jednak przy zmianie wartości rejestru OCRnx faktycznie zmienia on
    swoją wartość dopiero gdy licznik będzie równy zero.

    Pierw zapisuje się rejestr OCR1AH, potem OCR1AL, wbrew pozorom to ma znaczenie, ale postępuje się tak tylko przy buforowanych rejestrach w licznikach 16-bitowych. Podczas odczytu należy wpierw odczytać L potem H.
  • #10 8082903
    Cataclysm
    Poziom 10  
    Posty: 33
    Pomógł: 1
    MacGyver 7 napisał:

    Jeżeli aktualny stan licznika jest mniejszy niż rejestru OCRn to na wyjściu OCn jest zero, jeśli większy lub różny to jeden;

    Niekoniecznie, to zależy chyba od ustawienia bitów COM w rejestrze TCCR1A

    MacGyver 7 napisał:

    Pierw zapisuje się rejestr OCR1AH, potem OCR1AL, wbrew pozorom to ma znaczenie, ale postępuje się tak tylko przy buforowanych rejestrach w licznikach 16-bitowych. Podczas odczytu należy wpierw odczytać L potem H.

    Zaraz wgram poprawiony program i zobaczę czy coś to zmienia.


    @Edit: Nic się nie zmieniło.


    @EDIT2: Dobra, mniejsza o to. Dostajecie po pomógł i zamykam temat. Dzięki za pomoc.

Podsumowanie tematu

✨ Użytkownik zadał pytania dotyczące konfiguracji 8-bitowego fast PWM na pinie OC1A w mikrokontrolerze Atmega8. Wskazał, że licznik TCNT1 zamiast resetować się do zera, liczy w dół, co jest sprzeczne z dokumentacją. Otrzymał porady dotyczące ustawienia bitów WGM w rejestrze TCCR1A oraz konieczności załadowania wartości do rejestrów OCR1AL i OCR1AH jednocześnie. Dyskutowano również o różnych trybach PWM, takich jak Normal, Fast PWM, Phase Correct PWM oraz Phase and Frequency Correct PWM. Użytkownik zauważył problemy z pomiarem napięcia na diodzie LED, co sugeruje, że jego miernik może być niewłaściwie używany lub uszkodzony.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA