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

Dowolna częstotliwość przebiegu PWM w ATMega48

jacek13 27 Sie 2010 23:11 2290 10
REKLAMA
  • #1 8446878
    jacek13
    Poziom 15  
    Witam
    Chciałbym uzyskać dowolną częstotliwość przebiegu PWM a nie tylko wynikającą z częstotliwości oscylatora i preskalera. W ATTiny26 istnieje taka możliwość przy użyciu parametru "OCR1C" który powoduje "skrócenie" licznika PWM i tym samym dowolną zmianę częstotliwości. ATMega48 nie posiada takiego parametru. Czy istnieje inna możliwość dokonania zmiany częstotliwości PWM ?
    Pozdrawiam Jacek
  • REKLAMA
  • #2 8446897
    mario06
    Poziom 15  
    Zapoznaj się z trybami przedstawionymi w tabeli na stronie 131 (w przypadku licznika 1) dokumentacji Atmegi48.
  • #3 8447590
    jacek13
    Poziom 15  
    Witam
    Ta informacja niewiele mi dała - brak znajomości języka angielskiego.
    Kombinacje na "czuja" nic nie dały.
    Proszę o szczegółową informację dla PWM Timer1 8bit.
    Pozdrawiam Jacek
  • REKLAMA
  • #4 8447653
    dj_west
    Poziom 17  
    Sprawdź rejestry OCR1A i ICR1, w zależności od trybu PWM (strona 133, tabela 15-4; wbrew pozorom nie trzeba biegłej znajomości angielskiego, żeby zatrybić).
  • #5 8447685
    mirekk36
    Poziom 42  
    jacek13 napisał:
    Witam
    Ta informacja niewiele mi dała - brak znajomości języka angielskiego.
    Kombinacje na "czuja" nic nie dały.
    ...


    Bez podstawowj przynajmniej umiejętności czytania tylko po angielsku not aplikacyjnych układów - to ty lepiej nie bierz się nawet za elektronikę.

    Tym bardziej, że tak jak ktoś wyżej powiedział - nie trzeba do tego biegłej znajomości w mowie i piśmie.
  • REKLAMA
  • #6 8447725
    Andrzej__S
    Poziom 28  
    Dla timera 1: ustawić w tryb pracy CTC (Clear Timer on Compare Match), czyli bity WGM13:WGM12:WGM11:WGM10 w rejestrach TCCR1A i TCCR1B na wartość:
    0100 - licznik będzie się zerował po osiągnięciu wartości zawartej w rejestrze OCR1A,
    1100 - licznik będzie się zerował po osiągnięciu wartości rejestru ICR1.
    Później wystarczy wpisać odpowiednią wartość do OCR1A lub ICR1 w zależności od wybranej opcji (no i oczywiście włączyć taktowanie :) - bity CS12:CS11:CS10).

    No i tak jak powiedział mirekk36, zainwestuj w angielski, bo w elektronice daleko bez tego nie zajedziesz.
  • #7 8448063
    jacek13
    Poziom 15  
    $regfile = "m48def.dat"
    $crystal = 8000000
    Config Portb.1 = 1 'wyjscie (dla OC1A)
    Portb.1 = 0
    Tccr1a = &B10000001
    Tccr1b = &B00000011

    Do

    Ocr1a = 128 'wypełnienie 50%

    Loop
    End
    Przy powyższym programie mam poprawny sygnał PWM o częstotliwości wynikającej z oscylatora i prescalera.
    Gdy pozmieniałem bity dotyczące WGM10/11/12/13 (na wszystkie możliwe sposoby) i dopisaniu do programu "ICR1 = 100" nie uzyskałem wymaganego efektu.
    Proszę o podanie gdzie jest błąd.
    Pozdrawiam Jacek

    Proszę użyć znaczników code!
    Robak
  • REKLAMA
  • Pomocny post
    #8 8448255
    Andrzej__S
    Poziom 28  
    Wpisując wartość 100 do ICR1 powodujesz, że licznik będzie zliczał do 100, po czym się wyzeruje. Jeżeli w rejestrze OCR1A masz wartość większą od 100 to warunek porównania nigdy nie zastąpi. Ustaw ICR1 np. na 255, OCR1A na 100 WGM13 i WGM12 na 1 oraz WGM11 i WGM10 na 0, czyli:
    TCCR1A = &B10000000
    TCCR1B = &B00011011
    ICR1 = 255
    OCR1A = 100

    Dla ścisłości dodam, że Timer/Counter 1 jest 16-bitowy. Do rejestrów ICR1 i OCR1A można więc też wpisywać wartości 16-bitowe.
  • #9 8448488
    jacek13
    Poziom 15  
    Musi być błąd w propozycji. Po zmianie programu na proponowany przez Andrzej_S
    brak jest sygnału na wyjściu.

    Dodano po 44 [minuty]:

    Po zmianie na:
    TCCR1B = &b00010011
    t.j. WGM13=1 a WGM12/11/10=0 wszystko jest OK.
    Dzięki za pomoc.
  • #10 8448787
    Andrzej__S
    Poziom 28  
    jacek13 napisał:

    Musi być błąd w propozycji. Po zmianie programu na proponowany przez Andrzej_S
    brak jest sygnału na wyjściu.

    No faktycznie powinno być:
    TCCR1A = &B10000010
    TCCR1B = &B00011011
    Tryb Fast PWM z wartością TOP w ICR1. Ty zastosowałeś tryb Phase and Frequency Correct i będziesz miał częstotliwość PWM mniej więcej o połowę mniejszą, niż tą wynikającą z ustawienia ICR1. Nie wiem, czy to Ci robi różnicę :)
  • #11 8448918
    janbernat
    Poziom 38  
    Taki zapis jest chyba wygodniejszy- chociaż bardziej rozwlekły.
    
    $regfile "m88def.dat"
    $crystal = 8000000
    Config Portb = Output
    
    
    Set Tccr1a.com1a0
    set Tccr1a.COM1A1
    Set Tccr1a.com1b0
    set Tccr1a.COM1B1
    Set Tccr1a.com1b1
    'Set Tccr1a.wgm11
    'Set Tccr1a.wgm10
    
    Set Tccr1b.cs00
    Set Tccr1b.wgm13
    'Set Tccr1b.wgm12
    
    Icr1 = 851
    Ocr1a = 250
    Ocr1b = 150

    Potem patrzysz na table15-4 na str.136 i ustawiasz jak chcesz.
    I uczysz się angielskiego- samo wchodzi.
    :D
REKLAMA