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

Atmega8A - Miernik częstotliwości - niepoprawne wskazania

dypusz 07 Kwi 2013 12:19 1533 10
  • #1 12167080
    dypusz
    Poziom 16  
    Witam, robię miernik częstotliwości przy taktowaniu 8 MHz, jako generatora używam karty dźwiękowej. Do 16 kHz wszystko jest ok ale powyżej pomiar jest dużo zaniżony. Sygnał podaje na wejście T1 uC. Program poniżej.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Macie jakieś pomysły ?[/code]
  • #2 12167206
    skalsky5000
    Poziom 21  
    A gdzie obsługa tego przerwania ?
  • #3 12167221
    Konto nie istnieje
    Poziom 1  
  • #4 12167250
    dypusz
    Poziom 16  
    Ale 16-bitowy licznik zlicza do 65536 i do takiej częstotliwości powinno jeszcze mierzyć. Jak będzie powyżej to będzie przepełnienie i wystąpi przerwanie.
  • #5 12167296
    skalsky5000
    Poziom 21  
    Zamiast _delay_() użyj timera, i w przerwaniu przepisuj wartość,_delay_ nie jest dobrym pomysłem do odliczania odcinku czasu .
  • #6 12167362
    Szumlus
    Poziom 17  
    Witam,

    Drogi kolego może jakiś schemacik udało by się wrzucić? Fragment kodu też nie wiele mówi. Te 8 Mhz to z kwarcu czy wewnętrzny oscylator RC?
    Kolejna sprawa brak kodu obsługi przerwania timera 1, po co to przerwanie jest odblokowane? Z tego co widzę kolega włącza T1 zlicza impulsy w czasie 1s potem wyświetla wynik. Funkcja delay_ms jest bardzo niedokładna co w połączeniu z wewnętrznym oscylatorem RC daje kosmiczne błędy.
    W kodzie komentarzy tyle co kot napłakał, te które już są niosą ze sobą za mało informacji.

    Należy zrobić inaczej.
    Jeden timer np. T0 odmierza podstawę czasu T1 zlicza impulsy i z tego obliczamy częstotliwość.
    Ponad to używając T1 do zliczania impulsów mamy ograniczenie, przebieg wejściowy musi mieć wypełnienie 50/50 gdyż sygnał jest samplowanya a długość impulsu musi być większa niż długość jednego cyklu zegara systemowego.
    Wszystko jest w datasheet dokładnie opisane a kolega widocznie się z dokumentacją słabo zapoznał....

    Zamiast T1 można użyć któregoś przerwania INT. W kodzie obsługi inkrementować zmienną co przerwanie i mamy liczbę impulsów.

    Pozdrawiam,
    Marcin
  • #7 12167410
    dypusz
    Poziom 16  
    Dzięki wielkie. Używam wewnętrznego kwarcu. Wszystko poprawie zgodnie z waszymi zaleceniami. Schemat to zasilanie i wyświetlacz dlatego nie widzę sensu żeby go wrzucać. Czyli przyczyną niepoprawnego mierzenia są te błędy, które napisaliście ? Czy coś przeoczyłem, że od magicznych 16 kHz są błędne wskazania ?
  • #8 12167517
    Szumlus
    Poziom 17  
    Popraw program zgodnie ze wskazówkami, jeśli nie zadziała to pomogę.
    Najpierw usuń błędy, które wykryłem wtedy, jeśli nie zadziała, poszukamy kolejnych.

    Trzeba się trzymać jakiegoś schematu inaczej będzie groch z kapustą i do niczego nie dojdziemy.

    Zostawmy póki co ten wewnętrzny generator RC w spokoju zmień najpierw podstawę czasu na timer.
  • #9 12168037
    Konto nie istnieje
    Poziom 1  
  • #10 12168130
    dypusz
    Poziom 16  
    Nie mam takiego sprzętu.
    Napisałem coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Teraz mam na wyświetlaczu tylko '1'.
  • #11 12168645
    Konto nie istnieje
    Poziom 1  
REKLAMA