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]Pytania o sprzętowy PWM

Cataclysm 15 Maj 2010 14:25 2791 9
REKLAMA
  • #1 8078224
    Cataclysm
    Poziom 10  
    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  
    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  
    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  
    @_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.
  • #5 8082161
    grysek
    Poziom 19  
    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
  • REKLAMA
  • #6 8082283
    Cataclysm
    Poziom 10  
    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.
  • Pomocny post
    #7 8082318
    grysek
    Poziom 19  
    A jak masz ustawiony Timer? Może pokaż ten fragment kodu :P
  • #8 8082755
    Cataclysm
    Poziom 10  
    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)
  • REKLAMA
  • Pomocny post
    #9 8082859
    MacGyver 7
    Poziom 21  
    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  
    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.
REKLAMA