Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8]Pytania o sprzętowy PWM

Cataclysm 15 Maj 2010 14:25 2575 9
  • #1 15 Maj 2010 14:25
    Cataclysm
    Poziom 9  

    Witam, mam kilka pytań dotyczących PWM-a w procku atmega8.

    Próbuję ustawić 8bit fast PWM-a na pinie OC1A takim kodem:

    Code:

    ;...
    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.

    0 9
  • #2 15 Maj 2010 15:45
    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.

    Code:

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


    Kod proszę umieszczać w znacznikach code.
    Robak

    0
  • Pomocny post
    #3 15 Maj 2010 16:15
    _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:)

    0
  • #4 15 Maj 2010 17:45
    Cataclysm
    Poziom 9  

    @_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.

    0
  • #5 16 Maj 2010 14:25
    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

    0
  • #6 16 Maj 2010 14:48
    Cataclysm
    Poziom 9  

    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.

    0
  • Pomocny post
    #7 16 Maj 2010 14:57
    grysek
    Poziom 19  

    A jak masz ustawiony Timer? Może pokaż ten fragment kodu :P

    0
  • #8 16 Maj 2010 16:36
    Cataclysm
    Poziom 9  

    PWM ustawiam tak:

    Code:
       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)

    0
  • Pomocny post
    #9 16 Maj 2010 16:59
    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.

    0
  • #10 16 Maj 2010 17:12
    Cataclysm
    Poziom 9  

    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.

    0