Miernik częstotliwości na AVR – od 1Hz do 10MHz

Miernik częstotliwości o całkiem niezłych parametrach, bo potrafiący mierzyć częstotliwości od 1Hz do 10MHz (9,999,999Hz) z rozdzielczością 1Hz w całym zakresie. Idealny do generatorów funkcyjnych lub jako zwykły miernik. Do tego tani i prosty w wykonaniu, z ogólnodostępnych części, a małe wymiary pozwolą go zamontować w panelu dowolnego urządzenia.

Konstrukcja

Układ składa się z siedmu wyświetlaczy 7-segmentowych, uProcesora AVR Attiny2313, oraz garści tranzsytorów i rezystorów. Całą pracę wykonuje AVR i nie są tutaj potrzebne inne układy. Działanie jest proste, układ zlicza impulsy podane na wejście w czasie 1 sekundy i wyświetla wynik. Najważniejszą rzeczą jest bardzo dokładna podstawa czasu, której odliczaniem zajmuje się 16 bitowy Timer1 w trybie CTC. Drugi, 8 bitowy timer pracuje w roli licznika Counter0 i zlicza on impulsy podawane na jego wejście, t.j. pin T0. Co 256 impulsów wywołuje przerwanie w którym program zwiększa mnożnik. Po nadejściu przerwania 1 sekundy, zawartość tego mnożnika jest mnożona przez 256 (przesuwana w lewo o 8 bitów). Reszta impulsów które zdążył nabić licznik jest z niego spisywana i dodawana do wyniku mnożenia. Następnie wartość ta jest rozbijana na pojedyncze cyfry aby można było je wyświetlić na pojedynczych wyświetlaczach. Po tym, zaraz przed wyjściem z przerwania 1 sekundy, jednocześnie zerowane są oba liczniki i pomiar rozpoczyna się od nowa. W wolnym czasie procesor zajmuje się multipleksowaniem wyświetlaczy. Więcej szczegółów w kodzie źródłowym który zamieszczam w załączniku.

Rozdzielczość vs dokładność:
f-meter-6Dokładność zależy od źródła zegarowego jakim jest taktowany miernik. Sam kod może sporadycznie dodać jeden impuls przy bardzo wysokich częstotliwościach ale jest to praktycznie pomijalne. Kwarc jaki zastosujemy powinien być dobrej jakości, i mieć możliwie małe ppm (tolerancję). Najlepiej jeśli jego częstotliwość będzie podzielna przez 1024, np kwarce 16MHz lub 22.1184MHz. Aby uzyskać pomiar do 10MHz, należy użyć kwarcu powyżej 21MHz, np wcześniej wymieniony 22.1184Mhz. Miernik potrafi mierzyć częstotliwość do około 47% wartości kwarcu, więc dla 20MHz uzyskamy nie całe 10MHz, a dla 16MHz nie całe 8MHz – dla tego kwarc 22.1184Mhz będzie idealny i warto się w taki zaopatrzyć. Niestety nie jest on zbyt popularny, i jeśli taki znajdziemy, to będzie miał tolerancję rzędu 100ppm co się nie nadaje jako jakikolwiek wzorzec do pomiaru. Jeśli mamy inne urządzenie dokładnie mierzące częstotliwość (np oscyloskop ze sprzętowym pomiarem), możemy nasz układ skalibrować poprzez dołączenie małego trymerka (rzędu 1p-10p) do jednej z nóg kwarcu i do masy, i nim podregulować częstotliwość oscylacji w taki sposób aby pomiar pokrywał się z pomiarem oscyloskopu. Jeśli nie mamy takiej możliwości, musimy poszukać kwarcu z małym ppm, użyć generatora kwarcowego, lub po prostu założyć że kwarc będzie pracował równo z tym co podaje producent.

W załączniku znajdują się skompilowane wsady pod różne kwarce, ale możemy skompilować go sami pod własny. W Crystal wpisujemy częstotliwość kwarcu, a w Compare wpisujemy wynik dzielenia tej częstotliwości przez 1024, (nie wpisujemy reszty po kropce jeśli kwarc nie jest podzielny przez 1024).

Sygnał, ograniczenia:
Na wejście można podać w zasadzie dowolny przebieg 0-5V, nie tylko prostokąt. Układ świetnie zlicza sinus czy trójkąt, zliczenie jest dokonywane podczas zbocza opadającego przy napięciu 0.8V. Należy mieć na uwadze że wejście nie jest w żaden sposób zabezpieczone przed wyższymi napięciami. Wejście nie jest podciągnięte do zasilania, jest to wejście o wysokiej impedancji więc nie obciąży mierzonego układu – przysuwając palec, miernik pokaże 50Hz z sieci :)

Czy można jeszcze więcej wycisnąć ze zwykłego AVR? Nie. Po pierwsze krytyczne fragmenty kodu (obsługa przerwań) zostały napisane w języku maszynowym i wykonują się najkrócej jak to tylko możliwe umożliwiając pomiar do około 47% pracy kwarcu układu. Po drugie, sprzętowe wejście licznika może zliczać z maksymalną prędkością 1/2 wartości kwarcu układu, o ile wypełnienie sygnału będzie wynosiło idealnie 50% – jak mówi nota katalogowa, każda połówka podanego impulsu nie może być krótsza niż jeden takt zegarowy układu. Zaleca się nawet aby jeden impuls nie trwał krócej niż 2,5 takty. Wniosek z tego taki, że czym bardziej częstotliwość badanego sygnału zbliża się do górnej granicy zakresu pomiarowego, tym wypełnienie tego sygnału musi coraz bardziej przybierać wartość 50%.

Rozbudowa:
Miernik można rozbudować o pomiar do 100MHz z 10Hz krokiem, 1GHz z 100Hz krokiem, lub w innych kombinacjach. W takim przypadku na wejście należy dołączyć odpowiednio szybki dzielnik (preskaler) częstotliwości. Przy podziale przez 10 lub 100, wystarczy że przesuniemy kropkę na wyświetlaczu, ale takie dzielniki są rzadko dostępne. Zwykle dostaniemy dzielnik dzielący przez wielokrotność 2, np /128 lub /256. Używając dzielnika /256 teoretycznie uzyskamy zakres pomiarowy do 2,56GHz – teoretycznie, bo zastosowany dzielnik musi sobie radzić z takimi częstotliwościami przy żądanej czułości. Wtedy, aby zachować prawidłowy wynik, należy zmodyfikować program mnożąc przed wyświetleniem wynik przez 256 (przesunąć w lewo o 8 bitów) lub o inną wartość zależną od preskalera. Dodatkowo, należy przesunąć wynik o odpowiednią ilość miejsc na wyświetlaczu, dla dzielnika /256 uzyskamy maksymalny zakres do 2.560.000 kHz przy czym właśnie ostatnia cyfra nie będzie wskazywała 1Hz ale 1kHz. W sprawie takiej modyfikacji programu zapraszam do kontaktu ze mną, ponadto być może powstanie druga wersja miernika obsługująca preskaler z przełącznikiem liczby dzielącej – program samodzielnie dobierałby dzielnik aby zapewnić jak najlepszą rozdzielczość pomiaru w danym zakresie pomiarowym.


Wyświetlacz:
Siedem wyświetlaczy 7-segmentowych sterowanych naprzemiennie, ze wspólną anodą (wspólny plus). Jeśli jasność jest zbyt niska, można zmienić rezystory ograniczające prąd segmentów na mocniejsze, należy jednak pamiętać aby nie przekroczyć 40mA w impulsie dla jednego pinu mikrokontrolera. Również zastosowane wyświetlacze mają swoj limit prądu chwilowego i należałoby się do tego stosować. Domyślnie rezystory te wynoszą 100ohm. Wyświetlacze niepotrzebne, t.j. te które wskazują zera są wygaszone aby ułatwić odczyt. Przykładowo dla wyniku „0.000.980” zobaczymy tylko „980” – kropki są również gaszone. Odświeżanie pomiaru odbywa się co sekundę, ponieważ podstawa czasu to 1 sekunda.

Płytka:
f-meter-2Dwustronna płytka o wymiarach 109mm x 23mm – niestety siódmy wyświetlacz nie zmieścił się w darmowej wersji Eagle, dla tego w projekcie jest on narysowany od ręki. Na płytce należy wykonać 3 połączenia przewodem, pierwsze na wierzchniej stronie płytki, należy doprowadzić zasilanie do pinu VCC procesora – to połączenie jest pokazane na warstwie opisowej. Dwa kolejne to połączenia do kropek wyświetlaczy, należy połączyć je przewodem do rezystora 330ohm znajdującego się na spodniej stronie płytki. U góry płytki znajdują się pady krawędziowego złącza ISP w standardzie Atmel ISP-6, patrząc od góry, pin pierwszy to ten od strony kwarcu. Złącza nie trzeba lutować na stałe, lub w ogóle go nie lutować, układ można zaprogramować dowolną metodą. Wyświetlacze należy montować w pewnym odstępie od płytki, tak aby możliwe było przylutowanie padów wierzchniej strony (4 pady na każdy wyświetlacz). Sam projekt płytki nie przewiduje montażu wcześniej wspomnianego trymera, jeśli jest potrzebny, należy go dolutować we własnym zakresie, np tak jak na zdjęciach. Płytka na zdjęciach różni się od tej z załącznika, to pierwsza wersja 1.0 która zakładała pomiar do 1MHz.

Galeria:

Pliki:
POBIERZ – Pliki źródłowe .BAS oraz pliki wsadowe wersja 1.1; Projekt płytki Eagle 6.4.0 oraz PDF wersja 1.1


F_meter_7_1 18.10.2013 – wersja obsługująca wyświetlacz LCD ze sterownikiem HD44780, dzięki uprzejmości Waldka, który również wykonał wersję LED. Na chwilę obecną nie istnieje jeszcze projekt płytki, całość uruchomiona na płytce stykowej. Obsługa wyświetlacza znajduje się w przerwaniu „1s”, pętla główna programu jest pusta. Format i zawartość tekstu wyświetlacza można zmodyfikować w kodzie źródłowym. Z powodu braku przestrajanego generatora powyżej 500KHz, wyższe częstotliwości testowane były tylko punktowo (1, 4, 6, 8MHz) – kod powinien wskazywać ten sam pomiar co wersja LED.

POBIERZ – Pliki źródłowe .BAS oraz pliki wsadowe wersja 1.1 dla LCD; schemat wersja 1.1 dla LCD



4.14 avg. rating (84% score) - 7 votes

97 komentarzy

  1. Jakie są ustawienia fusbitów w wersji z LCD.

    • No to Waldek jestes moim idolem :)))
      Zadaj jeszcze jakies pytanie, prosze.

Odpowiedz na „WaldekAnuluj pisanie odpowiedzi

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Proszę pozostawić te dwa pola tak jak są: