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

Jak uzyskać dokładne 10 Hz z timerem 16-bitowym AVR?

valstus 21 Wrz 2011 18:15 2184 13
REKLAMA
  • #1 9949750
    valstus
    Poziom 21  
    Posty: 665
    Ocena: 13
    Timery 16 bitowe mają 65553 wolnego na zliczanie , czas do przerwania obliczamy dzieląc czestotliwośc która wychodzi z preskalera przez 65553 co jesli ta czestotliwośc jest wieksza od tych 65553 ?? mi wychodza wieksze wartości żędu powyzej 1 Hz czy dobrze rozumuje a co jesli zaloże sobie częstotliwośc
    10 Hz jak to zrównac za pomocą licznika bo gdy mamy np wartośc mniejsze od tych 65553 to możemy to wykonac a co jesli wieksze??? i jak np uzykać te 10 Hz w sytuacji gdy po podziale wychodzi np. 5.7 Hz jak dorównuje sie te wartości.
  • REKLAMA
  • #2 9949768
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Tryb CTC umożliwi ci uzyskanie dokładniejszych czasów.
  • REKLAMA
  • #4 9949813
    valstus
    Poziom 21  
    Posty: 665
    Ocena: 13
    Witaj jestem pocztkujący dopiero w to wchodze ale rejestr ocr trybu ctc porównuje wartość licznika z wartością która jest w rejestrze ocr zapisana jako liczba. Dobrze tylko co jesli masz np do osiągniecia częstotliowośc przerwanai 10 Hz
    12000000Hz / 8 /65553 = 22Hz
    12000000Hz/ 32 /65553 = 5.7 Hz jak tą wartośc zrównac do 10 Hz skoro nie moge użyć licznika i nie moge użyc trybu ctc ponieważ liczba po podziale przez 32 jest wieksza od 65553 wiec z jaką wartością milaby być niby przyrównywana?
  • REKLAMA
  • #6 9949901
    valstus
    Poziom 21  
    Posty: 665
    Ocena: 13
    Po prostu chce uzyskac przerwanie 10 razy na sekunde czyli 10 Hz a nie moge tego obliczyć przykładowo
    12000000Hz/1024/65536 = 0.17 Hz za mało
    12000000Hz/256/65536 = 0.71 Hz za mało
    12000000Hz/128/65536 = 1.4 Hz za mało
    12000000Hz/64/65536 = 2.8 Hz za mało
    12000000Hz/32/65536 = 5.7 Hz za mało ta opcja najodpowiedniesza ale to nie 10 Hz???
    12000000Hz/8/65536 = 22.8 Hz za dużo
  • #7 9949914
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Powtórzę. Tryb CTC jest rozwiązaniem twojego problemu.
  • #10 9949925
    McMonster
    Poziom 32  
    Posty: 1942
    Pomógł: 182
    Ocena: 57
    Alternatywne rozwiązanie, to niektóre układy mają timer, do którego możesz podłączyć osobny kwarc zegarkowy, a nim zliczać równe sekundy niezależnie od głównego zegara mikrokontrolera. Ale nie wszystkie to mają i tracisz dwa piny na dodatkowy kwarc, więc lepiej zrobić, jak wyżej radzą.
  • #11 9949950
    Wojtek75
    Poziom 25  
    Posty: 531
    Pomógł: 91
    Ocena: 36
    valstus napisał:
    tak ale wychodzi 2.8 Hz przy 12 MHz i przeliczniku preskalera 64 wychodzi 2.8 Hz
    Kolego bo zafiksowałeś się na maksymalnej wartości jaką możesz wpisać do 16 bitowego licznika a chodzi o to że możesz tam wpisać każą wartość od 0 do 65535. W trybie CTC jest jeszcze prościej bo wpisujesz interesującą cię wartość do odpowiedniego rejestru tylko raz.
  • #12 9949954
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    valstus napisał:
    tak ale wychodzi 2.8 Hz przy 12 MHz i przeliczniku preskalera 64 wychodzi 2.8 Hz

    Jeżeli nie poczytasz wreszcie o trybie CTC to narażasz się na wywalenie tematu do kosza przez moderatora. Po raz trzeci Ci na to zwracamy uwagę.

    Po drugie, podałem Ci link do kalkulatorów które to za Ciebie policzą i pozwolą zrozumieć co i jak.

    Po trzecie, ponownie informuję Ciebie, że powyżej załączyłem screen ze wszystkimi informacjami Ci potrzebnymi policzony dla zegara 12MHz i żądanych 10Hz. Masz tam wszystko podane jak na patelni, łącznie z ustawieniami wymaganych rejestrów.
  • REKLAMA
  • #13 9949958
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    Ja stosuje taką technikę, że w przerwaniu od OCR wpisuje do rejestru OCR następną wartość określającą kiedy ma być zgłoszone przerwanie. Dzięki temu przerwania wcale nie muszą być zgłaszane ze stała częstotliwością i nie musi to mieć żadnego związku z częstotliwościa przepełniania licznika. Licznik pracuje sobie w pełnym 16-bitowym cyklu. Ponieważ są dwa rejestry OCR można łatwo mieć dwie równoległe, niezależne serie przerwań. Trochę więcej kodowania i nawet jeden OCR wystarczyłby. Jednocześnie na tak pracującym timerze można używać ICR, można też implementować pętlę oczekiwania badając zawartość licznika itp. W zasadzie wszystkie potrzebne zależności czasowe można załatwić jednym takim timerem.
  • #14 9969266
    matte1
    Poziom 10  
    Posty: 17
    Jeśli chodzi o uzyskanie dokładnej liczby np spróbuj rozwiązać to programowo:
    ja robię następująco tylko że w 8 bitowym ale przerobisz to na 16 i będzie śmigać


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik pyta, jak uzyskać dokładne 10 Hz z 16-bitowego timera AVR, biorąc pod uwagę ograniczenia związane z maksymalną wartością licznika wynoszącą 65536. W odpowiedziach podkreślono, że tryb CTC (Clear Timer on Compare Match) jest kluczowym rozwiązaniem, które pozwala na ustawienie wartości w rejestrze OCR, co umożliwia uzyskanie pożądanej częstotliwości przerwań. Użytkownik zauważa trudności w obliczeniach, gdyż przy różnych ustawieniach preskalera (np. 64, 32) uzyskuje wartości poniżej 10 Hz. Wskazano również na możliwość użycia zewnętrznego kwarcu zegarkowego do uzyskania dokładnych sekund, chociaż nie wszystkie układy to wspierają. Dodatkowo, zaproponowano programowe podejście do generowania przerwań, które nie muszą być zgłaszane z stałą częstotliwością.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA