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.

[C] Miernik częstotliwości ATmega8

irus32 14 Sty 2013 23:37 1698 4
  • #1 14 Sty 2013 23:37
    irus32
    Poziom 9  

    Witam

    Planuje zrobić sobie miernik częstotliwości różnych kształtów napięcia: sinus, prostokąt, trójkąt. Zamianę sinusa i trójkąta na prostokąt mam już zaplanowaną. Zostało mi tylko zmierzenie częstotliwości sygnału prostokątnego o amplitudzie 5V i przedziale częstotliwości od około 10 kHz do 500 kHz. Chciałbym to zrobić na mikrokontrolerze ATmega8 (ponieważ mam takie i już pisałem na nie proste programy). Znalazłem informacje, że ATmega8 ma 2 timery/liczniki 8-bitowe i jeden timer/licznik 16-bitowy. Chcę napisać program który będzie działał w następujący sposób:
    Timer 0 wykrywa opadające zbocze sygnału mierzonego, w tym czasie 16-bitowy Timer2 zaczyna zliczać impulsy zegara taktującego mikrokontroler. Gdy Timer0 wykryje następne zbocze opadające (czyli po upływie czasu równym okresowi przebiegu mierzonego), Timer2 jest zatrzymywany a jego wartość zapisywana jest do zmiennej „czas”. W ten sposób w tej zmiennej mam ilość taktów zegara przypadającą na okres sygnału mierzonego i za pomocą odpowiednich obliczeń mogę wyliczyć jego częstotliwość.
    Czy przedstawiony poniżej algorytm pomiaru częstotliwości jest poprawny?
    Napisałem też fragment kodu w języku C, który jest realizacją tego algorytmu. Niestety ponieważ nie zbudowałem tego układu to nie mogę sprawdzić czy działa, proszę wiec o skomentowanie tego kodu.
    [C] Miernik częstotliwości ATmega8
    PS
    Wiem, że bardziej profesjonalnie byłoby zrobić detekcje zbocza opadającego na przerwaniach niż na instrukcjach „if”, ale niestety nie umiem posługiwać się przerwaniami

    0 4
  • #2 15 Sty 2013 10:32
    BlueDraco
    Specjalista - Mikrokontrolery

    To nie zadziała dla dużych częstotliwości. Użyj 16-bitowego timera w trybie licznika zliczającego impulsy. Drugiego timera użyj do odmierzenia 1/10 sekundy. Ponieważ nie masz już dhyba drugiego timera 16-bitowego, możesz zaprogramować 8-bitowy np. na 1/100 sekundy i odliczyć do 10 w przerwaniu z tego timera.

    0
  • #4 15 Sty 2013 12:59
    piotrva
    Moderator na urlopie...

    Metoda pomiarów dokładnie opisana przez kol. BlueDraco
    Tylko jeszcze parę uwag:
    1. Nie umieszczaj kodu jako screena - od czego jest znacznik syntax na forum
    2. Nie stosuj zapisu typu:

    Code:

    TCCR0A = 154;

    to jest nieczytelne i rozszyfrowanie takiego zapisu jest kłopotliwe
    zamiast tego pisz:
    Code:

    TCCR0A = (1<<CS00);

    Od razu wtedy wiadomo o co chodzi.

    0
  • #5 15 Sty 2013 14:15
    irus32
    Poziom 9  

    Dziękuje za uwagi.

    Mikrokontroler taktuje z zewnętrznego kwarcu 16Mhz

    0