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

Miernik częstotliwości ATMEGA8 i MB510 (max 2,1GHz)

06 Sie 2007 11:51 6110 16
  • Poziom 28  
    W ręce wpadła mi jedna sztuka preskalera MB510 (2,7Ghz) więc od razu zrodził się pomysł wykonania miernika częstotliwości. Scalaka znalazłem w głowicy od tunera satelitarnego. Mam kilka sztuk ATMEGA8 więc chciałbym wykorzystać właśnie takiego proca w projekcie. Już jakiś czas bawię się AVR więc pora wykonać coś użytecznego. Najbardziej martwi mnie napisanie dobrego "serca" programu miernika bo nadal mam problemy ze zrozumieniem zasady działania timerów :( dlatego później bedę prosił o pomoc bardziej doświadczonych kolegów. Środowisko w jakim narazie piszę to niestety bascom.

    Teraz do sedna. Doczytałem, że atmega może zliczać "połowę" wartości zegara jakim jest taktowana. Tylko już straciłem pewność czy max taktowania atmegi8 to 8 czy 16 MHz (proszę o podpowiedz, chyba były dwie wersje różniące się literką "L")? No powiedzmy niech będzie taktowanie 8MHz czyli użyteczne 4MHz. MB510 ma max podziału przez 272, czyli 272 x 4MHz to już pokaźne 1,088GHz. Dla taktowania 16MHz, czyli 8 x 272 ... 2,176GHz a to już zdrowo :D Tylko jak przypuszczam nie jest tak różowo bo trzeba by użyć do tego projektu zewnętrznego zegara z solidną stabilnością i tak sobie szukałem aż natrafiłem na to:
    http://209.85.129.104/search?q=cache:xog7j6Kp...b510&hl=pl&ct=clnk&cd=7&gl=pl
    Gdzie kolega proponuje użycie wzorca z komórki:
    Cytat:
    The timebase is a very high quality 9MHz TCXO from Ericsson mobile phone equipment. It never wanders more than 1Hz away from my 10MHz oven controlled oscillator.
    Z tego co zrozumiałem odchyłka wynosi 1Hz na każde 10MHz wiec ok 100Hz na 1GHz :D a zakres pomiarowy to ok 1,224GHz ale to tylko teoria. W praktyce chciałbym osiągnąć jak najlepszy zakres pomiarowy więc potrzeba by wzorca 16MHz ale czy zwykły generator kwarcowy podoła zadaniu? Chyba nie. Czekam na Wasze przemyslenia. Pozdrawiam.

    W linku dokumentacja od preskalera:
    http://f5ad.free.fr/Docs_Composants/MB510.pdf

    Dodano:
    Przeglądając różne fora napotkałem się na cos takiego:
    Cytat:
    Each half period of the external clock applied must be longer than one
    system clock
    cycle to ensure correct sampling. The external clock must be guaranteed to
    have less
    than half the system clock frequency (f ExtClk < f clk_I/O /2) given a
    50/50% duty cycle.

    Czyli wynika z tego że < 8MHz .

    it is recommended that maximum frequency of an
    external clock source is less than f clk_I/O /2.5.

    Czyli mniej niż 6.4 MHz .
  • PCBway
  • Pomocny post
    Poziom 16  
    Tak jak podejrzewasz - ATmega8 jest w dwóch wersjach: ATmega8L (niskonapięciowa) - max 8MHz i zwykła ATmega8 - max 16MHz.

    A co powiesz na AVC9107C jako generator zegara? Taki lub podobny układ można znaleźć na płycie głównej komputera (ja znalazłem na płycie od 386).
    Generally, the AV9107C-07 can produce
    frequencies within 0.1% of the desired output.
  • Poziom 28  
    No faktycznie scalaczek bardzo prosty i przyzwoity. Dobrze by było mieć wersję AV9107C-03 lub C-11 bo obie posiadają 16 i 20MHz. Można by pomysleć o innym procu, takim którego można taktować 20MHz wtedy dało by rade uzyskać realnie zakres bliski 2,2GHz. Tylko czy jeszcze znajdę gdzieś w moich rupieciach 486 :) kiedyś miałem tego aż za duzo ale śmietniki były głodne ... :)

    Link do noty katalogowej AV9107C:
    http://www.ortodoxism.ro/datasheets/icst/AV9107C.pdf
  • PCBway
  • Pomocny post
    Poziom 16  
    Myślę, że nie będzie dużego problemu ze znalezieniem, może niekoniecznie dokładnie taki, ale jakiś generator zegara się znajdzie na płycie głównej.
    A jak naprawdę będzie problem ze znalezieniem - mogę udostępnić AV9107-05 (na 99,9% sprawny, wydaje mi się że to niskoawaryjny element).
  • Poziom 28  
    Dziekuję za dobre chęci kolego :) ale z aplikacji chyba wynika, że C-05 pracuje z minimalną 40MHz :( może pomogło by wstawienie mniejszego kwarcu, ale puki nie sprawdzę osobiście to nie bedę nic gadał :D
  • Pomocny post
    Poziom 21  
    ATmega88 może działać do 20MHz. Zacząłem pisać taki miernik, nie dokończyłem, ale może dokończę. Piszę w ASM, który jest naprawdę prosty, po co sobie ograniczać możliwości baskupą. Takie krytyczne czasowo projekty to tylko w asm.
    Co do tego co napisałem, działa to z kwarcem 16384khz, bramkowanie co 0,5 i 10sek. Nie obsługuje jeszcze preskalerów, wynik wyświetla na zwykłym LCD 2x16, mogę się podzielić.
    Widziałem gdzieś projekt na PICu z kwarcem 4mhz, który mógł przyjmować na nóżkę procesora częstotliwość do 30MHz, z tego by wynikało, że PIC się lepiej do tego nadaje, ale ja PICow nie znam.
  • Poziom 28  
    Racja co do atmegi88 :) musze posiedzieć nad datasheetem i poczytać, porównać. W sumie nie jest też droga. Do tego miernika potrzebuje jak przypuszczam prosty kawałek programu który będzie zliczał impulsy i mnożył je razy 272 po czym wyświetlał wynik. Tylko właśnie nie czaje timerów. Narazie trzeba solidnie wszystko przemyśleć, zakupić potrzebne elementy i poskładać :) przyjdzie czas na soft. Podeślij do mnie na maila jeżeli masz coś ciekawego. Pozdrawiam.
  • Pomocny post
    Poziom 21  
    272 to taka nieciekawa wartość do mnożenia. Ja zrobiłem tak:
    Przerwania z TIM0 i TIM1
    TIM0 zlicza impulsy z wejścia zliczającego, i gdy się przepełni jest króciutkie przerwanie inkrementujące parę 3 rejestrów.
    TIM1 zgłasza przerwanie równiutko co pół sekundy. Na samym początku obsługi przerwania jest odczytywana wartość impulsów z TIM0, i jest on resetowany. W efekcie otrzymujemy jakąś liczbę w 3 rejestrach+czwartym skopiowaną z tim0. Daje nam to liczbę 32 bitową. Obok tego działa mi jeszcze jedno liczenie, tylko z bramkowaniem 10sekundowym, dając dokładniejszy wynik poniżej 1Hz (oczywiście dokładność zależy od oscylatora, w moim przypadku niestety zwykły kwarc 16384khz)
    Później jest wyświetlenie na LCD. Timery są proste, pisałem kiedyś w baskupie, i za cholerę nie mogłem tam ustawić timera tak jak chciałem, po prostu nie działało, pomogła wstawka asemblerowa konfigurująca rejestry. ASMa nauczyłem się w 2 dni, naprawdę polecam spróbować. Od tamtej pory wszystko w nim piszę, i baskupie mówię nigdy więcej!
  • Poziom 28  
    Można też przez 256 żeby była łatwiejsza matematyka :) akurat ten preskaler ma do wyboru cztery podziały, tylko wiadomo wtedy będzie mniejszy zakres pomiaru. Niestety na składzie nie mam obecnie żadnego 486 ale jutro poszukam po pobliskich dziuplach.

    djbpm w jakim dokładnie programie piszesz?
  • Pomocny post
    Poziom 21  
    AVR studio 4.12 SP4,
    Po instalacji mamy w jej katalogu sporo przykładowych programów .asm które się kompilują. Od ich przeglądnięcia zaczynałem.
    http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725
    oraz bardzo przydatne PDFy:

    Składnia asm: http://www.atmel.com/atmel/acrobat/doc1022.pdf

    Pełna lista instrukcji z opisem i przykładami użycia
    http://www.atmel.com/atmel/acrobat/doc0856.pdf

    Do pisania potrzebny jest jeszcze 1 pdf, od układu na który piszemy.

    256 to bardzo dobra liczba:) na początek można by na niej działać.
  • Pomocny post
    Poziom 15  
    polecam pisać ten program w C. Kompilator opanujesz w kilka dni, a wygoda w stosunku do asm jest nieporónywalnie większa, przede wszystkim szybkość pisania kodu. W razie konieczności można użyć wstawek asm. Jak zajdzie potrzeba poznania nowego procka (np. ARM) lub przeniesienia kodu na inną machinę, to się nie namęczysz przy translacji kodu, tak jak to jest w asm, często niewykonalne w rozsądnym czasie.

    Ja też kiedyś pisałem miernik częstoliwości, tyle że na '51 (pomiar częstotliwości sieci 50 Hz z dokładnością 4 pozycji po przecinku). Metoda pomiaru: pomiar okresu - najbardziej precyzyjna w przypadku niewielkich częstotliwości, z szybszymi zegarami (szczególnie jak jest to w okolicy fclk/2 procka) to jest problem, zawsze kilka taktów można zgubić po drodze. Obsługa timerów i bramkowanie impulsów w wielu mikrokontrolerach jest trochę kłopotliwe, jeśli zależy nam na wysokiej precyzji pomiaru. Przy szybkich sygnałach zlicza się liczbę impulsów, a przy wolnych mierzy się okres. Inną metodą jest połączenie tych dwóch technik w jeden algorytm, ale to trzeba narysować na bramkach, jak się chce mierzyć z dokładnością lepszą niż 1 hz i trzeba dysponować zegarem znacznie szybszym niż sygnał pomiarowy.
    Kiedyś napisałem komponent do pomiaru freq na FPGA Altery, czysto sprzętowe rozwiązanie. Podstawa czasu była 100MHz, pomiar chodził do około 50MHz, dokładność była chyba 1hz. Niestety nie miałem możliwości zweryfikowania jego jakości, z resztą zegar był na kwarcu 50ppm, mizernie. Natomiast sam układ logiczny bramkował 1s i zliczał takty sygnału wejściowego - prosto i skutecznie. Wynik był odczytywany przez procka i wrzucany na lcd. Sygnały wolnozmienne niestety były obarczone dużym błędem ze względu na metodę pomiaru. Choć możnaby przerobić logikę na pomiar okresu + bramkowane zliczanie impulsów - procek by sobie to wyliczał i decydował, który wynik pasuje.

    tu jest jakiś projekcik w tym temacie:
    http://www.cappels.org/dproj/30MHzfmeter/30MhzFmtr.html
  • Poziom 28  
    Czyli na chłopski rozum trzeba by pozostać przy założeniu, że jesteśmy w stanie wykorzystać ok 40% zegara taktujacego ...
    24MHz - 60% = 9,6Mhz x 256 --> zakres 2,45GHz więc trzeba by pozostać np przy atmedze88 :)
  • Pomocny post
    Poziom 27  
    Zapomnieli koledzy o tym, że niektóre ATmelki maja petęlki... PLL i TIMERKi mogą chodzić do 64MHz :)
    Pozdrawiam
  • Pomocny post
    Poziom 34  
    Równie dobrze można dołączyć dodatkowy zewnętrzny prescaler. Skoro sygnał ma już częstoliwość 256 razy mniejszą, to kolejny prescaler będzie na mniejszą częstotliwość, do procka będzie dochodzić jeszcze wolniejszy sygnał.. jeśli chodzi o pomiar samej częstotliwości, to taki zabieg niczemu nie zaszkodzi, a może nawet sprawić, że będzie można mierzyć duże częstotliwości poprzez mierzenie okresu sygnału wielokrotnie podzielonego..
  • Poziom 28  
    No jakiś drobny podział przez 2 by nie zaszkodził, więcej już chyba nie ma po co :D Od poniedziałku biorę się ostro do pracy bo będzie 7 dni urlopu, jutro zamawiam elementy.
  • Pomocny post
    Poziom 27  
    kolejne preskalery wpływają na dokładność pomiaru. Do Waszych zastosowań wystarczy Tiny26 który z preskalerem *256 spokojnie może zliczyć nawet 5GHz. Piny zwykłych I/O pracują z połową częstotliwości systemowej z powodu bufora, a pin licznika na pewno bedzie pracować poprawnie z f mniejszym około 2krotnie od f timera czyli powiedzmy 20Msamples/s
    Pozdrawiam
  • Poziom 21  
    Ch.M. napisał:
    Piny zwykłych I/O pracują z połową częstotliwości systemowej z powodu bufora, a pin licznika na pewno bedzie pracować poprawnie z f mniejszym około 2krotnie od f timera czyli powiedzmy 20Msamples/sPozdrawiam


    W pdf do atmega88 strona 137 napisano:

    Cytat:
    External Clock Source
    An external clock source applied to the T1/T0 pin can be used as Timer/Counter clock. The T1/T0 pin is sampled once every system clock cycle by the pin synchronization logic. The synchronized (sampled) signal is then passed through the edge detector.
    [...]
    Each half period of the external clock applied must be longer than one system clock cycle to ensure correct sampling. The external clock must be guaranteed to have less than half the system clock frequency given a 50/50% duty cycle.



    A więc ATmega88 się do tego nie nadaje.
    A w tym tiny26, to rzeczywiście można taktować zegar timera z wewnętrznej petli PLL.

    PDF do tiny26

    strona 25:
    Cytat:

    The internal PLL in ATtiny26(L) generates a clock frequency that is 64x multiplied from nominally 1 MHz input.

    strona 66:
    Cytat:

    Timer/Counter0 clock (CK) as the clock timebase. The Timer/Counter1 has two clocking modes, a synchronous mode and an asynchronous mode. The synchronous mode uses the system clock (CK) as the clock timebase and asynchronous mode uses the fast peripheral clock (PCK) as the clock time base.