Nanocounter – dokładny miernik częstotliwości wykorzystujący układy FPGA, STM32 oraz aplikację Android

Tak wygląda mój iskiernik. To odstęp 8 milsów między dwoma zaostrzonymi końcami. Czy działa tak, jak powinien? Nie wiem z pewnością, ale tworzenie iskierników jest darmowe, więc mogę je dodać bez przeszkód. Jeśli nigdy nie widzieliście niczego takiego i nie wiecie, do czego służą, filmik na stronie eevblog wyjaśni wam wszystko, co powinniście wiedzieć i kilka rzeczy, których się nie spodziewacie.

Konstrukcja płytki

Aby skonstruować gotową płytkę, pokryłem pola lutownice cyną i użyłem strumienia gorącego powietrza, aby rozmieścić elementy na ocynowanych polach. Następnie ostrożnie umieściłem płytkę w piecu lutowniczym i wywołałem program lutowania „leaded”. W temperaturze 180°C drobiny lutu stopiły się, a elementy przywarły do pól lutowniczych.

Układ w obudowie QFN stanowi tu największe ryzyko ze względu na pole masy, które jest kompletnie niewidoczne. Pole masy musi być poprawnie połączone i musi też zawierać wiele przelotek do płaszczyzny masy. Problemem jest umieszczenie odpowiedniej ilości lutu, aby układ znajdował się na tym samym poziomie, co sąsiednie pola. Istnieje jednak ryzyko, że lut wleje się do przelotek, pozostawiając puste pole lutownicze. Nie można tego zobaczyć po lutowaniu, nie można też tego poprawić w przypadku niepowodzenia.

Jeśli to pole stanowi jedyne podłączenie układu do masy, można sprawdzić jego ciągłość, przykładając sondę do małych otaczających go fragmentów, które są widoczne na końcu rzędu wyprowadzeń. Z tego powodu bardzo nie lubię obudów QFN, ale występują one powszechnie, więc warto opanować powtarzalny proces montażu.

44

Tak wygląda ukończona płytka – moim zdaniem bardzo dobrze. Zdecydowałem się przylutować moduł HC-06 od spodu za pomocą taśmy dwustronnej i połączyć ją przewodami ze złączem 2,54 mm na głównej płytce. Układ wystaje na około 20 mm, dzięki czemu antena Bluetooth nie jest przesłonięta.

Projekt FPGA

45

Powyżej widać schemat blokowy opisujący działanie FPGA. Jest dość prosty, ale zawiera bardzo szybkie procesy. Algorytm pracy jest następujący:

  1. Mikrokontroler programuje licznik bramki za pomocą interfejsu SPI.
  2. FPGA otrzymuje narastające zbocze na wejściu enable.
  3. Zliczanie rozpoczyna się na następnym narastającym zboczu sygnału mierzonego, a wyjście done przechodzi w stan niski.
  4. Gdy licznik referencyjny osiąga wartość równą maksymalnej zaprogramowanej wartości, zliczanie zostaje przerwane na następnych narastającym zboczu mierzonego sygnału.
  5. Wyjście done przechodzi w stan wysoki.
  6. Mikrokontroler odczytuje wartości obu liczników za pomocą interfejsu SPI.

To wszystko jest dość proste. Kod VHDL można obejrzeć na githubie. Istotnymi elementami systemu są 31-bitowe liczniki, zwłaszcza licznik częstotliwości referencyjnej. Musi on być w stanie pracować z częstotliwością 200 MHz. Wybór rozmiaru licznika to kompromis między jego szybkością a maksymalną reprezentowaną wartością. Rozmiar 31 bitów oznacza do 10 sekund zliczania, zatem taki jest maksymalny czas trwania pomiaru.

Typowy synchroniczny licznik wygenerowany przez program w oparciu o operację dodawania +1 nie jest wystarczająco szybki, aby zliczać z częstotliwością 200 MHz. Taka szybkość wymaga lepszej implementacji – wykorzystałem jedną z dostępnych na stronie opencores.org. Efektem ubocznym stosowania potokowego licznika jest to, że zliczanie wymaga więcej, niż jednego cyklu zegara. Oznacza to, że po upłynięciu czasu zliczania potrzebnych jest kilka kolejnych cykli zegara, aby stan licznika się ustabilizował. Jest to widoczne na symulacji ISIM. Liczniki kontynuują pracę, aby zaktualizować swą wartość kilka cykli zegara po ustawieniu bitu done_counting.

Praca potokowego licznika
Praca potokowego licznika

Symulator Xilinx ISIM zdążył się już zestarzeć. Pod systemem Windows 7 działał stabilnie, ale pod Windows 10 zaczął padać podczas pewnych typowych operacji związanych z interfejsem. Firma Xilinx nie jest zainteresowana naprawą tego narzędzia, wobec czego jedynym rozwiązaniem jest uruchomienie systemu Windows 7 na maszynie wirtualnej.

Wszystkie wymagania zostały spełnione, a projekt może pracować z częstotliwością dużo wyższą, niż zakładane 200 MHz. Nie po co prowadzić dalszej optymizacji – przejdźmy zatem do kolejnej części projektu.

Programy na Android

Rolą mikrokontrolera jest zaprogramowanie układów FPGA i PLL, a następnie ciągła obsługa zadań przychodzących z aplikacji za pośrednictwem sieci Bluetooth. Przyjrzymy się projektowi aplikacji. Oto jej ekran główny:

47

Najbardziej widocznym elementem ekranu jest zmierzona częstotliwość widoczna na górze. Liczbę cyfr po przecinku można ustawić (powyżej nie widać żadnych). Do wyboru jest wyświetlanie wartości w hercach, kilohercach i megahercach. Tabela w środkowej części ekranu pokazuje statystki, które są na bieżąco aktualizowane w miarę wykonywania kolejnych pomiarów.

Wykres na dole pokazuje zmianę zmierzone częstotliwości w czasie i pozwala szybko zorientować się, jak stabilne jest mierzone źródło sygnału.

Trzy liczby w prawym górnym rogu pozwalają porównać zmierzoną częstotliwość z wartością nominalną dla tego źródła i zmierzyć różnicę w jednostkach ppm (części na milion). Błąd wyrażony w milisekundach na godzinę oznacza wartość, o którą należy przesunąć licznik pracujący z tą częstotliwością, aby otrzymać prawidłowy czas.

Wiele ustawień można zmienić za pomocą rozwijalnego menu, które jest dostępne w prawym górnym rogu ekranu:

48

Pierwszy z dwóch ekranów konfiguracyjnych pozwala zmienić sposób wyświetlania informacji. Zmiany w tym ustawieniach są przechowywane lokalnie na urządzeniu obsługującym aplikację. Mogę kontrolować sposób formatowania wyświetlanej częstotliwości, określić idealną (nominalną) częstotliwość i liczbę wartości zapamiętywanych przez wykres na dole ekranu przed jego zresetowaniem.

49

Ustawienia widoczne na drugim ekranie określają, w jaki sposób aplikacja współpracuje z miernikiem Nanocounter. Mogę zmienić identyfikator urządzenia Bluetooth, czas pomiaru wyrażony w sekundach, źródło częstotliwości referencyjnej oraz ustawienia filtru w obu układach LTC6957. Zmiany w tych ustawieniach są zapisywane lokalnie na urządzeniu, ale też przesyłane do mikrokontrolera po zmianie oraz po uruchomieniu aplikacji – dzięki temu mikrokontroler zawsze odpowiednio je aktualizuje.

O autorze