Serwisy partnerskie:
Close icon
Serwisy partnerskie

Moduł precyzyjnego generatora TCXO i synchronizacji z GPS, część 2

Article Image
Elmax
W EdW 9/2020 pojawił się artykuł opisujący licznik częstotliwości i czasu AVT3275. Czymże on byłby, gdyby nie miał precyzyjnego generatora? Byłby miernikiem z dużą liczbą cyfr, z których połowa nie miałaby żadnego znaczenia! Pierwsza część artykułu zakończyła się opisem wstępnego uruchomienia. Oto dalsze wskazówki.

W następnej kolejności trzeba przyłączyć konwerter USB-UART do J17. W programie terminalu należy ustawić wymagany port COM z parametrami 921600 8N1. Na ekranie powinniśmy zobaczyć obraz jak na rysunku 10.

Rysunek 10.

Prawe okno terminalu przedstawia informacje wysyłane przez AVT3275 na J7, gdy jest on połączony z generatorem przez J11. O sposobie podłączenia częstościomierza można przeczytać w dalszej części artykułu. Jeśli generator będzie synchronizowany sygnałem z GPS, należy go przyłączyć do J4. Do wyprowadzenia 4 przyłączamy linię TX modułu GPS, która jest linią RX UART w mikrokontrolerze. RX GPS można podłączyć do wyprowadzenia 1, ale na razie nie jest ona używana. Do wyprowadzenia 3 doprowadzamy sygnał 1pps. Fotografia 4 pokazuje miejsce, w którym ten sygnał jest dostępny dla modułu GY-GPS6MV2.

Fotografia 4.

Dla modułu FGPMMOSL3C będzie to wyprowadzenie 9 i tego właśnie modułu użyto w prototypie. Na wyprowadzeniu 5 J4 dostępny jest sygnał reset. Gdy komunikacja z modułem przebiega poprawnie, w terminalu zobaczymy ekran podobny do tego z rysunku 11, gdy GPS nie odbiera sygnału z satelitów.

Rysunek 11.

W chwili odebrania sygnału z satelitów wygląd ekranu zmieni się na podobny do rysunku 12, gdzie widać odbiór z siedmiu satelitów. Jeśli moduł GPS nie dostarcza sygnału wzorcowego 1pps, ekran będzie wyglądał podobnie jak na rysunku 13. Informacje te są także wyświetlane na wyświetlaczu OLED - fotografia 5. W górnym wierszu wyświetlany jest czas UTC, następnie w nawiasie liczba satelitów, po niej czas ostatniej synchronizacji. W dolnym wierszu odchyłka TCXO od sygnału 1pps z GPS.

Rysunek 12.
Rysunek 13.
Fotografia 5.

Gdy moduł jest uruchomiony, można podłączyć go do częstościomierza. W przypadku AVT3275 należy wylutować kwarc i do wejścia X1 przylutować przewód lub goldpin (fotografia 6) oraz doprowadzić sygnał 8 MHz, który jest dostępny na wyprowadzeniu 4 złącza J16.

Fotografia 6.

Połączenie to powinno być wykonane kablem ekranowanym. W prototypie połączenie nieekranowanym przewodem długości 15 centymetrów powodowało zakłócenia obrazu pobliskiego telewizora. Moduł można zasilić z płytki AVT3275, łącząc wyprowadzenie 1 J11 częstościomierza z 1 J16 (+3,3V) generatora i 2 J11 z 2 J16 (GND). Dodatkowo wyprowadzenie 3 J11 warto połączyć z linią TX UART dostępną na wyprowadzeniu 4 J15 generatora. Dzięki temu na ekranie 10 częstościomierza będzie można odczytać informacje o aktualnej dokładności generatora, bieżącym czasie UTC, liczbie satelitów, z których GPS odbiera sygnał oraz czasie ostatniej synchronizacji TCXO z GPS - fotografia 7.

Fotografia 7.

Aby ta funkcjonalność działała, należy uaktualnić program w AVT3275 do wersji 1.2 lub nowszej. Program dostępny jest na Elportalu. Połączony zestaw AVT3275 z AVT3276 można zobaczyć na fotografii 8.

Fotografia 8.

Nie opisuję sposobu podłączenia generatora do AVT5575, bo używanie go z tym częstościomierzem nie ma sensu.

Generator co sekundę wysyła informacje o parametrach pracy. Aby wykorzystać te informacje, trzeba znać format ramki wysyłanej przez UART. Dane są wysyłane z prędkością 9600 w formacie 8N1 w postaci ramki składającej się z nagłówka i chunków:

struct{
   header_t header;
   chunk_nr nr;
   chunk_1pps pps1;
   chunk_delta delta;
   chunk_gps gps;
   chunk_end end;
}ramka_t;

nagłówek:

typedef struct{
   uint32_t crc;
   uint16_t len;
   uint32_t id;
   uint16_t ver;
}header_t;

zawiera sumę kontrolną CRC obejmującą całą strukturę „ramka_t” bez CRC. Następna jest długość ramki równa wszystkim danym, łącznie z CRC, po tym jest ID programu o wartości 0x636e7953, następnie wersja programu. Wszystkie chunki mają taką samą budowę, na którą składa się:

ID     UINT8	unikalny identyfikator
LEN    UINT16	długość chunka w bajtach
DATA   UINT8*	dane o długości LED. Gdy LEN=0 danych nie ma

Pierwszy chunk:

typedef struct{
   uint8_t id; 
   uint8_t len;
   uint32_t cnt;
}chunk_nr;

o id=1, len=4 zawiera tylko pole „cnt”, w którym jest zawarty numer kolejny transmisji. Następny chunk:

typedef struct{
   uint8_t id;
   uint8_t len;
   uint32_t okres_u32;
   double okres_d;
   float okres_f;
}chunk_1pps;

id=2, len=16, „okres_u32” zawiera liczbę zliczonych impulsów zegarowych (80MHz) w czasie jednosekundowego pomiaru okresu sygnału wzorcowego. Przy idealnej synchronizacji będzie to 80e6. Zmienna „okres_d” zawiera zmierzony okres sygnału przedstawiony w postaci liczby zmiennoprzecinkowej double, „okres_f” to samo w formacie float. Kolejny chunk:

typedef struct{
   uint8_t id;
   uint8_t len;
   double delta_d;
   float delta_f;
}chunk_delta;

id=3, len=12, „delta_d” to odchyłka od okresu jednej sekundy typ double, „delta_f” to samo typ float. Po nim chunk:

typedef struct{
   uint8_t id;
   uint8_t len;
   char utc[6];
   char lastUTC[6];
   uint8_t satelit;
}chunk_gps;

id=4, len=13, „utc” zawiera w formie tekstu godzinę w formacie ggmmss, „lastUTC” - czas ostatniej synchronizacji z GPS. Ostatni chunk:

typedef struct{
   uint8_t id;
   uint8_t len;
}chunk_end;

nie zawiera danych, id=0, len=0.

Trzeba mieć świadomość, że w kolejnych wersjach oprogramowania, rozmiar chunków może się zmienić (dojdą nowe informacje), tak samo ich kolejność nie jest gwarantowana poza chunkami „header” i „end”. Całości dopełnia definicja identyfikatorów chunków

enum{ CHUNK_END, CHUNK_NR_TRANSMISJI, CHUNK_1PPS, CHUNK_DELTA, CHUNK_GPS };

oraz funkcja obliczająca CRC i sposób jej użycia:

uint32_t Crc( u8 *p, u16 len ){
   return CalculateCrc32( p, len, len );
}

p = (uint8_t*)&ramka;                        // Wskaźnik na strukturę
p += sizeof(ramka.header.crc);               // Zwiększamy o rozmiar CRC
uint16_t len = ramka.header.len;
uint32_t crc = Crc( p, len );

W przypadku wykorzystania generatora z innymi urządzeniami do komunikacji można też wykorzystać interfejs I²C. Aby działał poprawnie, należy założyć zworkę na J9. Interfejs ten jest dostępny także na AVT3275, ale na razie I²C w generatorze może pracować z maksymalnym taktowaniem 100kHz. W częstościomierzu do magistrali I²C przyłączony jest wyświetlacz OLED, który korzysta z trybu FAST (400kHz). Zmniejszenie szybkości komunikacji z wyświetlaczem powodowało widoczne odświeżanie zawartości ekranu, dlatego zrezygnowano z komunikacji z generatorem przez I²C. Taka komunikacja będzie możliwa dla rozbudowanej wersji częstościomierza, który będzie miał kilka interfejsów I²C ale niewykluczone, że prędkość komunikacji w generatorze zwiększy się i możliwa będzie bezpośrednia współpraca częstościomierza z generatorem przez I²C. Opcjonalnym rozwiązaniem będzie płytka obwodów wejściowych, na której znajdować się będzie multiplekser I²C PCA9544. Rozdzielał on będzie interfejs I²C na cztery magistrale. Każda z nich może pracować z inną prędkością. Do jednej z nich można będzie podłączyć płytkę generatora. Komunikacja z generatorem przez I²C polega na zaadresowaniu rejestru oraz jego odczycie. Adres I²C generatora: 0x38 (0x70). Zawartość poszczególnych rejestrów prezentuje tabela 1.

Tabela 1.

Prosty program dla Arduino dostępny na Elportalu pokazuje sposób komunikacji, a na rysunku 14 widać efekt jego pracy. Jeśli master I²C obsługuje tryb multimaster, to kilka urządzeń może komunikować się z generatorem. 

Rysunek 14.

Gdy urządzenie, które korzysta z generatora, nie ma interfejsu I²C lub UART, przydatne mogą być sygnały SYNC, NOSYNC i 1PPM, dostępne na J16. Sygnał 1PPM jest aktywny, gdy na wejściu 3 J4 dostępny jest sygnał wzorcowy, NOSYNC sygnalizuje obecność sygnału o dokładności powyżej 1ppm, SYNC 1ppm lub mniej (tabela 2). 

Tabela 2.

Zmiany w programie częstościomierza AVT3275. Zmiany dotyczą wyświetlania informacji na ekranie numer 10. Aktualnie wyświetlane są według fotografii 9. 

Fotografia 9.
  • Delta - Odchyłka TCXO od wzorca 1Hz w ppm.
  • CNT - Liczba impulsów zliczona przez licznik taktowany 80MHz mierzący okres sygnału 1Hz.
  • UTC - Aktualny czas z GPS.
  • Last - Czas ostatniej synchronizacji.

Rodzaj informacji wyświetlanej na LED wybiera się, naciskając przycisk enkodera.

Słowo końcowe. Obwód z U3B może posłużyć do prób i pomiaru różnych przebiegów. Korzystając z drugiego komparatora (złącze J2), przeprowadzono próby pomiaru częstotliwości generatora 40MHz I533-2P3-40.0000M. Po ustawieniu potencjometrem P2 wypełnienia blisko 50%, sygnał wyglądał jak na rysunku 15.

Rysunek 15.

Kanał 1 (lazurowy) pokazuje wyście komparatora, kanał 2 (żółty) wyjście bramki Schmitta U4B. Jak widać, daleko im do „książkowego” prostokąta. Przyłączenie przewodu łączącego komparator z częstościomierzem AVT3275 silnie tłumi sygnał (rysunek 16), natomiast gdy przewód przyłączony jest wyjścia U4B, oscylogram wygląda jak na rysunku 17.

Rysunek 16.
Rysunek 17.

Kolejne próby polegały na zmierzeniu częstotliwości generatora przez częstościomierz. W pierwszej kolejności AVT3275 podłączony był do wyjścia komparatora. Po próbach ustawienia potencjometru P2 udało się przy sygnale jak na oscylogramie z rysunku 18 uzyskać poprawny wynik na wyświetlaczu LED i w oknie terminalu - rysunek 19.

Rysunek 18.
Rysunek 19.

Warto zauważyć, że poprawny pomiar był możliwy przy takim ustawieniu, przy którym na wyjściu bramki Schmitta nie było sygnału! Niewielka zmiana ustawienia potencjometru powodowała niestabilne odczyty: rysunek 20 oraz rysunek 21.

Rysunek 20.
Rysunek 21.

Próby pomiary sygnału z wyjścia bramki U4B skończyły się niepowodzeniem: rysunki 22 i 23.

Rysunek 22.
Rysunek 23.

Próby takie uświadamiają, że budowa stopnia wejściowego łatwa nie będzie, a wydaje się, że to tylko kilka układów scalonych. Ułatwieniem będzie to, że połączenia pomiędzy układami będą krótkie, więc cechować je będzie mała pojemność.

Tam, gdzie sygnał będzie przesyłany na większe odległości, zastosowane będą „dziwne” rozwiązania, jak pokazuje rysunek 24.

Rysunek 24.

Dlaczego do AVT3276 wybrano STM32F401? 

Pierwotnie miał to być STM32F411RE pracujący z zegarem 100MHz. Po zastanowieniu wybrano taki sam mikrokontroler jak w licznikach AVT3275 i AVT5575, pracujący z częstotliwością 80MHz. Dzięki temu duża część kodu mogła zostać przeniesiona z liczników częstotliwości, co znacznie skróciło czas poświęcony na napisanie programu. Co prawda timer mierzący wzorzec liczy „tylko” 80 milionów impulsów w ciągu sekundy (AVR liczyłby dziesięć razy mniej, dokładnie 8 milionów impulsów, chyba że wersja mikrokontrolera w małej obudowie, wtedy osiem razy mniej dokładnie, 10e6 impulsów).

Firma:
Tematyka materiału: AVT3276, generator TCXO, GPS
AUTOR
Źródło
Elektronika dla Wszystkich kwiecień 2021
Udostępnij
Zobacz wszystkie quizy
Quiz weekendowy
Edukacja
1/10 Jak działa rezystor LDR?
UK Logo
Elektronika dla Wszystkich
Zapisując się na nasz newsletter możesz otrzymać GRATIS
najnowsze e-wydanie magazynu "Elektronika dla Wszystkich"