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.

Atmega328p, zmiana częstotliwośći PWM

markaj5495 27 Paź 2013 22:50 1209 5
  • #1 27 Paź 2013 22:50
    markaj5495
    Poziom 6  

    Witam!

    Potrzebuję wygenerować falę prostokątną o różnych częstotliwościach (w zakresie 3k - 50kHz) na jednym z pinów Atmegi328p w celu obsługi filtra przestrajanego zewnętrzną częstotliwością. Wiem, że można łatwo ustawić preskaler, jednak nie to rozwiązanie daje zbyt małą ilość dostępnych częstotliwości. Chcę ustawić w trybie CTC w rejestrze OCR1A ilość skoków, potrzebną do uzyskania danego odstępu czasu i wydaje mi się, że zgodnie z datasheetem rejestry są skonfigurowane poprawnie. Jednak na wyjściu pinu OC1A uzyskuję falę prostokątną, której współczynnik wypełnienia zależy od stałej przypisanej do OCR1A, a jej częstotliwość nie zmienia się. Nie wiem, czy przypadkiem przyczyną nie jest nie zerowanie się licznika, choć zgodnie z dokumentacją tryb CTC ma taką funkcjonalność. Załączam wycinek kodu i proszę o pomoc.


    DDRB = 0x02; // ustawienie OC1A jako wyjście
    TCCR1A = TCCR1A | 0xf0; // konfiguracja CTC
    TCCR1B = TCCR1B | 0x09; // -||-||-
    OCR1A = 0x0000; // wartość stała porównywana ze stanem licznika (match)


    Pozdrawiam:)

    0 5
  • Pomocny post
    #2 28 Paź 2013 17:47
    kicajbas
    Poziom 25  

    Witam
    .. a może spróbować takiej konfiguracji

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Pisane na podst. dataschetu - nie sprawdzane.
    Nawiasem mówiąc nie meczy Cię przeliczanie wpisu w rejestry na kod HEX ?.
    Co do szerokiego przestrajania poczytaj o timerach programowych.
    Pozdr.

    0
  • #3 28 Paź 2013 19:09
    markaj5495
    Poziom 6  

    U mnie nie działa... Sam nie wiem, podobno można to w łatwy sposób rozwiązać sprzętowo. No nic, będę dalej próbował. Co rejestrów to jakoś tak się nauczyłem, a jak mam większą liczbę to z pomocą przychodzi mi kalkulator:) Chociaż pewnie przesunięcie bitowe jest łatwiejszą operacją. Dzięki z pomoc. Pzdr

    0
  • Pomocny post
    #4 28 Paź 2013 23:11
    emarcus
    Poziom 34  

    markaj5495 napisał:
    U mnie nie działa... Sam nie wiem, podobno można to w łatwy sposób rozwiązać sprzętowo. No nic, będę dalej próbował.


    Przesudiuj te tut's:

    https://sites.google.com/site/qeewiki/books/avr-guide/timers-on-the-atmega328
    http://hekilledmywire.wordpress.com/2011/05/28/introduction-to-timers-tutorial-part-6/
    http://appusajeev.wordpress.com/2010/07/16/programming-the-timers-in-avr-avr-gcc/

    e marcus

    0
  • Pomocny post
    #5 29 Paź 2013 07:07
    kicajbas
    Poziom 25  

    Witam
    jeszcze

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 30 Paź 2013 22:20
    markaj5495
    Poziom 6  

    Temat zamknięty. Wystarczyło wymusić wyzerowanie konkretnych bitów. Widocznie jakieś śmieci tam siedziały i rejestr źle się konfigurował. Pozdrawiam

    0