Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega128][C] - Pomiar częstotliwości ok 100 kHz

03 Cze 2016 22:28 1134 9
  • Poziom 9  
    Witam serdecznie forumowiczów.

    Otóż z kolegą mamy do wykonania projekt z pomiarem częstotliwości około 100 kHz i wysłania tego przez RS do komputera. Samo wysyłanie po RS-ie już jest wykonane, jednak zostało wykonanie programu pod sam pomiar.

    Założenia pomiaru są takie:
    - pierwszy licznik (16 bit) liczy od 0 do maks po czym następuje przepełnienie i zresetowanie licznika,
    - drugi licznik (8 bit) zlicza ilość przepełnień licznika pierwszego,
    - jeżeli licznik się nie przepełnił, to nie wysyłamy informacji o tym, jeżeli przepełnił sie raz, to wysyłamy informacje że się przepełnił, jeżeli sie przepełnił 2 i więcej razy to po drugim przepełnieniu zatrzymujemy pomiar i wysyłamy informacje że licznik przepełnił się za dużo razy,
    - sam pomiar polega na tym, że sygnał podajemy na pin ICR1, w przypadku wykrycia zbocza narastającego wywołujemy przerwanie w którym to przechwytujemy aktualną wartość licznika 16 bit, 8 bit oraz flagi przepełnień i zapisujemy te wartości np. do tablicy.
    - tak przygotowane dane bez żadnej obróbki wysyłamy do komputera po RS-ie.

    I tu się zaczynają moje pytania:
    1. Maksymalną wielkość tablicy jaką możemy zadeklarować to około 2000 pomiarów, co jest o wiele za mało. Czy da się jakoś zapisywać te dane do np. pamięci FLASH bez straty na szybkości pomiaru? Bądź w jakiś inny sposób?
    2. Czy Atmega128 będzie w stanie pomierzyć sygnał o częstotliwości 100 kHz?
    3 W jak najlepszy sposób wykryć przepełnienie licznika 16 bit i przekazać tą informacje do licznika 8 bit?

    Liczę na jakieś wskazówki.

    Pozdrawiam,
    Mateusz.
  • Użytkownik usunął konto  
  • Użytkownik usunął konto  
  • Poziom 9  
    Piotrus_999 napisał:
    2. Nie wiem, Nie wiem co rozumiesz przez sygnał.


    Sygnał prostokątny o częstotliwości do 100 kHz.

    Piotrus_999 napisał:
    Myślę że wybrałeś zły sprzęt do tego zadania.


    Sprzęt został narzucony odgórnie i to jest akurat moduł MMmega02

    albertb napisał:
    Moim zdaniem należałoby najpierw przemyśleć co tak naprawdę chcecie mierzyć, jak często, z jaką dokładnością.
    Bo koncepcja pomiaru wydaje się zła.
    Przy dobrym przemyśleniu co chcecie osiągnąć Atmega powinna wystarczyć z zapasem.
    A ta koncepcja jest w stanie zarżnąć nawet najnowszy Mx do ST :-) (przy x zmierzającym do nieskończności)


    Tą koncepcje zarzucił nam Dr który wymyślił ten projekt.
    W tym projekcie najważniejsze jest przesłanie czasów okresów występująych w tym sygnale, bo ten sygnał nie będzie idealnie równy 100 kHz tylko będzie miał tam jakies odchyłki.
  • Użytkownik usunął konto  
  • Poziom 9  
    albertb napisał:

    Stawiam jednak na to, że do końca go nie zrozumieliście.
    Gdyby sygnał był idealnie równy 100kHz to nie byłoby potrzeby go mierzyć, prawda?
    Z tego wyjaśnienia wynika, że nie potrzebujecie mierzyć częstotliwości tylko czasy trwania impulsów, tak?
    Dalej nie wiadomo z jaką dokładnością, i dlaczego chcecie je gromadzić w pamięci urządzenia pomiarowego?

    W tej postaci, którą opisujesz to właściwie wasze urządzenie jest powielaczem ilości danych.
    Zamiast przesłać dwa zbocza sygnału przesyła dwie dane o wielkości proporcjonalnej do wymaganej dokładności pomiaru czasu.

    Albert


    Tak, to właśnie chodzi o czasy trwania impulsów.
    Dokładność jak największa bo pewnie będzie to wykorzystywane przy pomiarach na uczelni.
    Te dane nie musimy gromadzić w pamięci mikrokontrolera tylko, jak pogodzić pomiar z jednoczesnym wysyłaniem danych do komputera po RS-ie? Przecież wysyłanie po RS-ie jest o wiele wolniejsze od samego pomiaru.
  • Moderator Mikrokontrolery Projektowanie
    Weź pod uwagę, że przy 100 kHz i taktowaniu ATMega128 równym 16 MHz, na jeden okres sygnałju badanego przypada zaledwie 160 taktów zegara. A więc rozdzielczość z jaką będziesz mierzył sygnał jest mocno ograniczona. Oczywiście jeśli interesuje cię pomiar szerokości impulsów. Druga sprawa - w jaki sposób planujecie wysyłać po RS te dane? Bo jeśli masz sygnał do 100 kHz, to zajdzie konieczność przesyłania do 100 kB/s, czyli RS musiałby działać z szybkością co najmniej 1 Mb/s. Nie jest to typowa szybkość i raczej trudna realnie do osiągnięcia na ATMega128. Chyba, że zbieracie sample w określonym czasie a potem wyniki przesyłacie do PC. Tylko potrzebny jest spory bufor - ATMega128 ma możliwość podłączenia zewnętrznej pamięci SRAM, więc dało by się w niej zorganizować bufor.
    Rozumiem, że ta ATMega jest z góry narzucona. Bo gdyby nie była to bym wziął jakąć XMEGA, która ma timery popychane do 256 MHz, co daje nam już 2560 taktów na okres, sprzętowy pomiar szerokości impulsu i okresu (jednocześnie) i interfejs USB, którym można realnie dane pomiarowe przepchnąć, a i do 32 kB SRAM ułatwia sprawę buforowania.

    Dodano po 2 [minuty]:

    Warus23 napisał:
    [
    Te dane nie musimy gromadzić w pamięci mikrokontrolera tylko, jak pogodzić pomiar z jednoczesnym wysyłaniem danych do komputera po RS-ie? Przecież wysyłanie po RS-ie jest o wiele wolniejsze od samego pomiaru.


    To akurat jest proste - jeśli RS będzie działał odpowiednio szybko, to w przerwaniu timera po prostu zapisujesz odczytaną wartość do rejestru UDR0/1 i po sprawie. W czasie wykonywania kolejnego pomiaru dane będą się wysyłać.
  • Użytkownik usunął konto  
  • Użytkownik usunął konto  
  • Poziom 14  
    Jeśli wyniki pomiarów się powtarzają można zbierać dane przez 1ms i następnie wysłać "statystyki" z ilością impulsów (dla 100kHz jest 160 imp), dla przykładu ramka:
    157[minimum],7[ilość wartości],2,6,20,32,25,10,5
    oznacza, że:
    157 imp. wystąpiło 2 razy
    158 imp. wystąpiło 6 razy
    159 imp. wystąpiło 20 razy
    160 imp. wystąpiło 32 razy
    161 imp. wystąpiło 25 razy
    162 imp. wystąpiło 10 razy
    163 imp. wystąpiło 5 razy