Opisywane urządzenie służy do generowania precyzyjnych sygnałów wzorcowych o częstotliwościach 16MHz, 8MHz, 1MHz i 1Hz. Przez modyfikację oprogramowania możliwe jest uzyskanie innych częstotliwości, na przykład 32768Hz do taktowania zegara RTC, czy 10MHz dla generatorów lub oscyloskopów. Może więc znaleźć różne zastosowania.
Opisywany generator był budowany z myślą o liczniku częstotliwości i czasu AVT3275 taktowanym częstotliwością 8MHz oraz młodszych braci AVT3278 i AVT5575, które będą taktowane zegarem 16MHz. Z tego powodu generator wytwarza właśnie te dwie częstotliwości. Wzorzec 1MHz był swego rodzaju standardem w starszych urządzeniach, dlatego generator wytwarza go, aby mogły odzyskać „życie” posiadane wzorce, które pewnie dawno temu straciły swoją precyzję. Wyjście kontrolne 1Hz może służyć do pomiaru precyzji generatora.
Dlaczego precyzyjny wzorzec ma tak duże znaczenie? Za przykład wezmę wersję ze standardowym, tanim kwarcem układu AVT3275, którego pole odczytowe składa się z ośmiu cyfr. Typowa dokładność kwarcu to ±30ppm, w gorszej jakości generatorach ±50ppm. Co to oznacza w praktyce w liczniku częstotliwości? Oznacza, że mierząc częstotliwość 1MHz, licznik może zliczyć ±30 impulsów w przypadku generatora 30ppm. Miernik może więc wskazać częstotliwość z zakresu 999970...1000030Hz. Przy pomiarze 40MHz miernik może pokazać 9999700...10000300Hz. Widać wyraźnie, że tylko pierwsze cztery cyfry zachowują precyzję, pozostałe cztery w przypadku 10MHz nie mają znaczenia. Miernik taktowany standardowym kwarcem można ograniczyć do czterech cyfr, co uczyniono w przypadku AVT5575, ewentualnie można pokazać pięć cyfr, gdzie ostatnia będzie pokazywać fluktacje sygnału mierzonego.
A jak zmieni się sytuacja, gdy użyjemy generatora TCXO o dokładności ±2ppm? W tym przypadku pomiar 1MHz może dać wynik z zakresu 9999998...1000002 (w praktyce trzeba doliczyć niedokładność zliczania ±1). W przypadku takiego generatora sześć cyfr wyniku (dokładniej 6,8 cyfry), pokazuje precyzyjny wynik. Taki miernik może mieć wyświetlacz z siedmioma, a nawet ośmioma cyframi. Na tym można by skończyć rozważania, bo TCXO 2ppm można kupić za około 50zł. Wystarczy zamiast kwarcu użyć generatora. Czy aby na pewno? Szukając TCXO, którego częstotliwość wynosi 8MHz lub jej wielokrotność, najczęściej trafimy na generatory 32MHz. To jest pierwsza przeszkoda, bo często mikrokontolery mają taktowanie ograniczone do wartości niższej niż te 32MHz. Generatory TCXO najczęściej na swoim wyjściu generują sinusoidę albo trapez. Z tym poradzi sobie bramka z wejściem Schmitta, ale raczej nie poradzi sobie z amplitudą sygnału 0,8V, jak to najczęściej występuje na wyjściu TCXO. Oczywiście stosując komparatory i dzielniki, można uzyskać wymagany sygnał, dlaczego więc powstała konstrukcja przedstawiona w artykule?
Głównym jej celem było zbudowanie taniego i precyzyjnego generatora dla większego brata AVT3278, który będzie miał wyświetlacz składający się z dwunastu cyfr. Zakup generatora o precyzji poniżej 1ppm to wydatek kilkuset złotych do nawet dwóch tysięcy dla 0,1ppm! Biorąc pod uwagę fakt, że częstotliwość TCXO można w wąskim zakresie zmieniać napięciem oraz dobrą stabilność krótkoterminową takiego generatora, można go okresowo dostroić do wzorcowego sygnału na przykład pochodzącego z GPS. Takie dostrajanie może odbywać się ręcznie co jakiś czas, ale dla wygody powstał AVT3276. Mierzy on wzorcowy sygnał 1Hz i porównuje z częstotliwością TCXO. W razie potrzeby częstotliwość TCXO jest korygowana. Domyślnym wzorcem jest sygnał 1pps pochodzący z modułu GPS, ale może to być dowolny inny wzorzec, nawet sygnał DCF77. Występuje w nim co prawda przerwa synchronizująca (2 sekundy), ale AVT3276 uznaje sygnał za poprawny, gdy zawiera się w granicach ±100ppm i 0,5Hz nie zostanie uznane za wzorzec. Dzięki dopuszczalnej odchyłce ±100ppm można użyć tanich generatorów VCO o małej precyzji, które można kupić za około 10zł. Wyniki pomiaru są wyświetlane na małym wyświetlaczu OLED, sygnalizowanie diodami LED oraz wysyłane przez UART, a także dostępne przez interfejs I²C.
W przypadku generatorów należałoby poruszyć temat stabilności długo- i krótkoterminowej oraz różnice pomiędzy stabilnością a dokładnością. Temat jest bardziej złożony, niżby się wydawało, zwłaszcza gdy dodać do tego stabilność napięcia zasilania, która ma wpływ na generowaną częstotliwość, gdy jest korygowana napięciem. Ze względu na to, że zagadnienie to zajęłoby pewnie kilka stron w czasopiśmie, temat może zostać poruszony w przyszłości, o ile Czytelnicy e-mailami do redakcji wykażą zainteresowanie tym tematem.
Opis układu
Schemat ideowy pokazany jest na rysunku 1. Układ jest zasilany napięciem 3,3V za pośrednictwem jednego ze złączy komunikacyjnych J9 (SPI), J15 (I²C, UART) lub złącza sygnałów wzorcowych i statusu J16. Pobór prądu generatora razem z modułem GPS waha się w granicach 110mA, bez GPS 60mA. Źródłem sygnału wzorcowego może być jeden z generatorów U2, U6 lub U5 w obudowie DIP8 lub 14. Zworką na 1-2, 3-4 lub 5-6 JP1 wybieramy jeden z generatorów. Zależnie od amplitudy sygnału z generatora jest on formowany w szybkim komparatorze U3A lub bramce U4F. Gdy amplituda sygnału jest mała, używany jest komparator. Potencjometrem P1 ustawiany jest próg przełączania komparatora. Przy dużej, minimum 1,32V, w praktyce 1,65V amplitudzie sygnału z generatora bramka z wejściem Schmitta sprawdzi się w roli układu dopasowującego sygnał z generatora na potrzeby dalszej dystrybucji sygnału. Gdy amplituda sygnału jest niższa niż 1,32V, można spróbować zastąpić U4 wersją bez wejścia Schmitta, a potencjometrem P2 ustawić wstępną polaryzację wejścia bramki. Nie jest to zalecane rozwiązanie, lepiej w tej sytuacji skorzystać z komparatora U3, który niestety jest trzydzieści razy droższy od bramek. Uformowany sygnał wybierany jest na JP1, po czym dzielony przez dwa w U7. Podzielony sygnał dostępny jest na JP1, na którym można wybrać, czy używany będzie sygnał podzielony przez dwa (zwarte 9-10 JP1), czy przed podziałem (zwarte 7-8 JP1).
Drugi komparator zawarty w U3 może być wykorzystany w roli prostego układu formującego sygnał dla licznika częstotliwości. W tym celu jego wejście i wyjście wyprowadzono na J2. Dodatkowo dostępny jest sygnał uformowany w bramce Schmitta U4B.
Bramka U4C steruje bramkami U4D i U4E, których wyjścia wyprowadzono za pośrednictwem rezystorów dopasowujących na złącze BNC J6, a ponadto przez R7 sygnał zegarowy jest wyprowadzony na J5 oraz doprowadzony do mikrokontrolera. W mikrokontrolerze sygnał wzorcowy jest powielany do 80MHz. Mikrokontroler mierzy okres sygnału wzorcowego 1Hz doprowadzonego z na przykład GPS do wyprowadzenia 3 złącza J4. Jeśli wzorcem jest GPS, to mikrokontroler odbiera informację szeregową doprowadzoną do wyprowadzenia 4 J4. Odchyłka generatora TCXO w stosunku do wzorcowego sygnału 1Hz jest wyświetlana na wyświetlaczu OLED. Komunikacja z nim odbywa się za pośrednictwem magistrali I²C, która służy także do obsługi pamięci EEPROM U10. W pamięci przechowywane są między innymi informacje o ustawieniu VCO.
Dzięki temu, po resecie mikrokontrolera generator szybko zsynchronizuje się z GPS, a w przypadku jego braku będzie pracował z ostatnio skorygowaną częstotliwością. Pozwala to synchronizować generator raz na jakiś czas, bo nie zawsze w miejscu, w którym używamy urządzenia, odbiór sygnału GPS jest możliwy. Ze względu na stosunkowo małą liczbę zapisów do pamięci EEPROM, na PCB przewidziano miejsce na pamięć SRAM U11 podtrzymywaną baterią. Ta sama bateria miała służyć do podtrzymania pracy RTC wbudowanego w mikrokontroler oraz jego pamięci BackupDomain, ale zrezygnowano z tej funkcjonalności, ponieważ pierwotnie małą (256 bajtów) EEPROM zastąpiono dużą (64kB), co pozwoliło na zwiększenie liczby zapisów przez zapisywane danych, za każdym razem na innej stronie pamięci, których ma ona 512. Zaletą dużej EEPROM jest także duży, 128-bajtowy bufor zapisu, w stosunku do niewielkiego, ośmiobajtowego w pamięci 256 bajtów. Dzięki temu wszystkie dane do EEPROM zapisywane są na jednej stronie, co zajmuje do 10 ms. W przypadku pamięci 256 bajtów zapisanie 128 bajtów trwałoby do 320ms! Wynika to z tego, że 128 bajtów trzeba byłoby zapisywać 32 razy po 8 bajtów, a każdy zapis trwa do 10ms.
Na chwilę zatrzymam się przy sposobie zapisu pamięci. Dane zapisywane są w dwóch kopiach, każda z sumą kontrolną CRC32. Przy 32-bitowej sumie kontrolnej szanse na niewykrycie błędu są takie, jak siedem razem z rzędu wygrać w lotto. Zapisanie dwóch kopii pozwala, w razie wykrycia błędu na jednej z nich, odtworzyć dane z drugiej. Jeśli to się nie uda, pamięć jest inicjalizowana, co następuje najczęściej wtedy, gdy jest ona użyta po raz pierwszy.
Ze względu na to, że w skrajnym przypadku, dane do pamięci zapisywane są co sześć sekund, gwarantowany milion cykli zapisu mógłby zostać wykorzystany przez ponad dwa miesiące. Doba ma 86400 sekund, zapisując co 6s, w ciągu doby wykonanych byłoby 14400 zapisów, a w miesiąc (30 dni) 432000. Rozkładając równomiernie zapisy po wszystkich 512 sektorach, liczba zapisów zwiększy się 512 razy, co daje około 97 lat. Jak zrealizowano taki zapis? Do zapisanych danych dołączany jest identyfikator zapisu. Jest to 32-bitowa liczba zwiększana o jeden po każdym zapisie. Za każdym razem zapisywana jest kolejna strona pamięci (kolejne 128 bajtów). Początkowo, pierwszy zapis na stronę 0 ma ID równe 0. Drugi zapis na stronę 1 ID 1 i tak aż do strony 511. Kolejny zapis wykonany zostanie na stronie 0 z ID równym 512 i tak dalej. Aby po starcie programu stwierdzić, który zapis jest ostatni, wystarczy odczytać całą pamięć w celu odnalezienia ID o największej wartości.
Wróćmy do opisu generatora. Podobny los jak U11, spotkał pamięć U12 (a lub b) i nie jest ona używana. Diody LED sygnalizują stan urządzenia. U9 pozwala doprowadzić sygnał o czasie 1 sekundy do częstościomierza AVT3275 lub AVT5575.
Sygnał ten może służyć do bramkowania liczników. Stan wyprowadzenia 3 złącza J10 decyduje o tym, czy na wyjściu U9 pojawi się sygnał z TCXO, czy z AVT3275.
Generator VCO jest synchronizowany sygnałem wzorcowym. Pierwsza synchronizacja generatora z GPS może trwać nawet kilkadziesiąt minut. Warunkiem synchronizacji jest obecność sygnału 1pps, a ten pojawia się, gdy moduł GPS odbiera sygnał z 3...4 satelitów. Jeśli moduł nie ma baterii na module, która nie tylko podtrzymuje pracę RTC, ale także przechowuje dodatkowe informacje, do odbioru sygnału wystarczającej jakości może minąć nawet 20 minut. Gdy obecny jest sygnał 1pps, VCO musi się z nim zsynchronizować. Pomiar okresu trwa sekundę, a VCO jest sterowane przez PWM 16-bit. Wydawać się może, że w skrajnym przypadku potrzeba aż 32768 sekund, aby zsynchronizować VCO. Gdy częstotliwości są różne, napięcie na VCO jest zmieniane o 1/65536 w górę lub w dół, a synchronizacja zaczyna się od wartości 0 (1/2Vcc). 32768 sekund to około 9 godzin. Algorytm jest trochę bardziej inteligentny. Gdy odchyłka jest duża, napięcie zmieniane jest w większym stopniu, gdy mała - w mniejszym. Dzięki temu synchronizacja mogłaby trwać kilkanaście minut, ale wyniki kilku pomiarów sygnału 1pps są uśredniane. Wszystkie te czynniki powodują, że za pierwszą synchronizacją trzeba trochę poczekać.
Należy zasygnalizować wpływ napięcia zasilającego na częstotliwość TXVCO. Nie ma problemu, jeśli generator cały czas otrzymuje sygnał 1pps; gdy jednak kalibrowany jest od czasu do czasu, należy pamiętać o wpływie napięcia zasilania na częstotliwość generatora. Nie jest istotna bezwzględna wartość tego napięcia, ważne, aby nie zmieniała się w czasie. Z tego powodu niekorzystne jest zasilanie generatora z tego samego zasilacza, co licznik częstotliwości z wyświetlaczem LED zasilanym z tego samego napięcia.
Program generatora intensywnie wykorzystuje przerwania i DMA. Rzutuje to na stosunkowo duże zużycie pamięci RAM (rysunek 2) spowodowane rezerwacją jej na bufory wyświetlacza, UART, I²C, SPI, ale jednocześnie powoduje, że pętla główna wykonuje się szybko.
W pętli głównej, na PCO, ustawiany jest stan wysoki na czas jej wykonania
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin( TEST_PC0_GPIO_Port, TEST_PC0_Pin, GPIO_PIN_RESET );
HAL_IWDG_Refresh(&hiwdg);
__WFI();
HAL_GPIO_WritePin( TEST_PC0_GPIO_Port, TEST_PC0_Pin, GPIO_PIN_SET );
Na rysunku 3 widać okres powtarzania 1ms (kanał 4 „PC0 Loop” analizatora), o ile nie jest skracany przez przerwanie (podwójne impulsy), natomiast na rysunku 4 pokazany jest czas wykonania pętli głównej.
Uwaga! Fotografie i zrzuty ekranowe o dużej rozdzielczości są dostępne w Elportalu wśród materiałów dodatkowych do tego numeru. Taka ciekawostka: w ciągu 3,65μs AVR taktowany zegarem 20MHz wykona 73 cykle maszynowe, czyli średnio 50 rozkazów. Czasem pętla główna wykonuje się dłużej. Sytuacja taka ma miejsce podczas przygotowania danych dla wyświetlacza OLED, co widać na rysunku 5. Stan linii PCO jest utrzymywany w stanie wysokim przez ponad 2,5ms, po czym następuje transmisja, co obrazują zamiany stanu linii SDA i SCL. W czasie transmisji widać przerwania 1ms, co świadczy o tym, że do transmisji wykorzystano DMA, a nie system przerwań. Bywa, że pętla główna wykonuje się 20μs, na przykład podczas przygotowania danych do wysłania przez UART. W materiałach dodatkowych w Elportalu znajdują się liczne fotografie, zrzuty ekranowe i logi z LA2016 wykonane podczas prac nad urządzeniem.
Montaż i uruchomienie
Układ można zmontować na płytce drukowanej, której projekt pokazany jest na rysunku 6. Układ montujemy standardowo, zaczynając od elementów najmniejszych, a kończąc na największych. Przed montażem należy wybrać typ generatora i zamontować go w miejscu U2, U5 lub U6. W prototypie użyto TG-5006CG-42L ale może to być dowolny VCO 16 lub 32MHz. W przypadku 32MHz zwarte muszą być wyprowadzenia 9-10 JP1, dla 16MHz 7-8. Zależnie, który z generatorów będzie używany, należy założyć zworkę na 1-2, 3-4 lub 5-6 JP1. Kilka miejsc na generatory pozwala łatwo wypróbować różne ich rodzaje. Dlatego w pierwszej kolejności należy ustawić potencjometrem P1 napięcie na komparatorze. Fotografia wstępna pokazuje model. Osoby niedoświadczone powinny poprosić kogoś o pomoc w zaprogramowaniu procesora.
Zmontowany układ należy uruchomić. Potrzebne do tego będą oscyloskop i konwerter USB-UART. Po włączeniu powinien pokazać się ekran powitalny (fotografia 1), po nim kolejny (fotografia 2), a w czasie pracy następny - fotografia 3. Brak takiej treści na ekranie może świadczyć o niepoprawnej pracy generatora.
Aby ustawić próg zadziałania komparatora lub bramki, najlepiej posłużyć się oscyloskopem. Sygnał powinien mieć wypełnienie bliskie 50% - rysunek 7. Do ustawienia progu przełączania można też użyć analizatora logicznego. Praca z nim nie jest wygodna, bo po zarejestrowaniu przebiegu trzeba skorygować ustawienie potencjometru i ponownie zarejestrować przebieg w celu weryfikacji. Czynności należy powtarzać do uzyskania wypełnienia 50%.
Na rysunku 8 pokazano ekran z LA2016. Program wyliczył jakąś niebywałą częstotliwość 138MHz, ale wypełnienie obliczył poprawnie.
Najtańsza wersja SaleAE, zdecydowanie droższa od LA2016, też wystarcza. Ekran pokazano na rysunku 9.
Maksymalna próbkowanie, jakie oferuje ta wersja SaleAE, to 24MHz, jak więc udało się zarejestrować 32MHz? Jest to jak najbardziej możliwe, nawet niektóre oscyloskopy korzystają z takiej możliwości. Warunkiem poprawnej rejestracji jest powtarzalny przebieg niezsynchronizowany z próbkowaniem. Zmierzona częstotliwość będzie podwielokrotnością częstotliwości mierzonego przebiegu i tak jest w tym przypadku, oprogramowanie wyliczyło 8MHz.
Przy braku wspomnianych przyrządów można posłużyć się sondą logiczną AVT3242 (EdW 6/2019) lub AVT5741 (EP 2/2020) i ustawić równe świecenie obu diod. Ostatecznie można skorzystać z miernika uniwersalnego, na którym należy ustawić 1,65V na zakresie DC, nie AC! Mierniki na zakresie AC mierzą do kilkuset Hz, lepszej jakości do kilkudziesięciu kHz, a tu mamy sygnał 32MHz. Pomiar na zakresie DC daje średnią napięcia, która dla przebiegu prostokątnego o wypełnieniu 50% wyniesie połowę napięcia zasilającego. Nie jest to metoda doskonała, ale pozwala stwierdzić, że jakiś przebieg występuje, że nie jest to stały poziom niski (blisko 0V) lub wysoki (blisko 3,3V) i podaje w przybliżeniu jego wypełnienie.
Dalszy opis zamieszczony będzie w następnym numerze EdW.