5. Realizacja aplikacja użytkownika

5. Realizacja aplikacja użytkownika

 
Aplikacja użytkownika została wykonana przy użyciu bibliotek WinApi [47] w środowisko programistycznym Code::Blocks 8.02 [48]. Aplikacja od strony użytkownika 48jest widoczna jako zbiór zakładek, w których zostały umieszczone poszczególne funkcjonalności systemu (por. roz. 3.2).
 

5.1. Konfiguracja portów

 
Pierwszą widoczną po uruchomieniu programu zakładką jest zakładka konfiguracji połączenia z płytą UMC. Zakładka prezentowana jest na rysunku 5.1.
 

Rysunek 5.1. Konfiguracja portów
 
Zakładka ta wzorowana jest na popularnym programie do obsługi portów szeregowych "HyperTerminal". W oknie użytkownik ma możliwość otwarcia odpowiedniego portu COM i skonfigurowania go do transmisji ustawiając odpowiedni baudrate, bity stopu, bity danych oraz bity parzystości.

W celu wysłania tekstu należy wpisać go w pole "Transmit" i wcisnąć przycisk "Send". Historia wysyłania pojawia się w oknie poniżej. W celu odbioru danych należy wcisnąć przycisk "Start listening", wówczas odbierane dane pojawiają się w polu "Recive".

Po wciśnięciu "Start listening" użytkownik niemoże przejść do innych zakładek jeżeli nie zakończy nasłuchiwania portu tj. nie wciśnie "Stop listening".
Użytkownik może dodatkowo zmienić tryb wyświetlania odbieranych danych, dzięki zaznaczeniu "Hex" albo "String", wybierając kolejno pomiędzy reprezentacją heksadecymalną, a ASCII.

Zakładka ta spełnia dodatkowo funkcje debugingu dając jednocześnie możliwość ręcznej konfiguracji dowolnych rejestrów układów MAX9452, AD9512 i AD9777 w sposób dowolny.

Po prawidłowym skonfigurowaniu portów i wciśnięciu "Connect" odpytywane są płyty UMC, DAC i DIC w celu ustalenia ich obecności w systemie. Jeżeli płyta DAC lub DIC nie jest widoczna w systemie, to użytkownik jest o tym informowany w polu "Recive", a zakładki spełniające funkcję odpowiedniej płyty stają się niedostępne.

 

5.1.1. Konfiguracja zegarów oraz układów dystrybucji sygnału zegarowego

 
W skład konfiguracji zegarów oraz układów dystrybucji sygnału zegarowego wchodzą dwie zakładki, za których pomocą konfigurowane są układy MAX9452 i AD9512. Zakładki te prezentowane są na rysunkach 5.2 i 5.3.
 
Zakładka MAX9452 ’n CLK1
 

Rysunek 5.2. Konfiguracja układu MAX9452.
 
W widocznych grupach ustawień użytkownik ma możliwość skonfigurowania dwóch zegarów: wewnętrznego "Internal CLK1", oraz opcjonalnego zewnętrznego"Ref. frequency Hz".
Zegar wewnętrzny jest zegarem wychodzącym z układu FPGA do układu MAX9452, a zegar zewnętrzny może zostać podłączony do wejścia CON8 na płycie DAC.
W dalszej pracy został wykorzystany zegar wewnętrzny.

W grupach ustawień "Frequency Outputs" widoczne są bieżące ustawienia częstotliwości zegarów CLK0 oraz CLK1. Zegar CLK0 wchodzi do układu FPGA i może zostać wykorzystany do dowolnych celów. Zegar CLK1 wchodzi do układu AD9512, gdzie może następnie zostać wybrany jako zegar który będzie wprowadzony na układy przetworników.

W grupie ustawień MAX9452 użytkownik konfiguruje wewnętrzne rejestry układu. Ustawienia te zostały opisane bardziej szczegółowo w Dodatku B.

Wysłanie konfiguracji, sprawdzenie stanu zamknięcia pętli PLL i stanów wejść układu odbywa się poprzez wciśniecie przycisku "Apply". Użytkownik jest odpowiednio informowaniu o stanie PLL, jeśli zaświeci się kontrolka "PLL Locked", oraz jeśli wystąpił błąd na wejściach do układu, to zaświeci się kontrolka "Input Error".

Zakładka AD9512 ’n CLK2

 

Rysunek 5.3. Konfiguracja układu AD9512
 
W widocznych grupach ustawień użytkownik ma możliwość skonfigurowania drugiego zegara wewnętrznego (pochodzącego z układu FPGA), który może zostać wybrany jako sygnał transmitowany dalej na układy przetworników.

Kolejnymi ustawieniami są ustawienia układu AD9512, które zostały opisane szerzej w Dodatku C. Głównym zadaniem odpowiedniego skonfigurowania układu AD9512 jest ustawienie częstotliwości dla przetworników C/A (DAC) oraz przetworników A/C (ADC1 oraz ADC2), przez ustawianie odpowiednich dzielników częstotliwości.
Dodatkowo zostały zaimplementowane ustawienia wykorzystujące inne możliwości układu AD9512 jak:

  • wprowadzanie przesunięć w fazie dla sygnałów wyjściowych,
  • wprowadzanie opóźnień dla sygnału wyjściowego, wchodzącego na przetwornik ADC2,
  • dołączanie/odłącznie różnych sekcji, co pozwala na ograniczanie pobieranego prądu,
  • ustawianie napięć/wydajności prądowych wyjść układu AD9512,
  • możliwość wyboru standardu napięć (CMOS, LVDS) sygnałów zegarowych przetworników ADC1 i ADC2.

Funkcje te zostały zaimplementowane dla użytkowników, którzy są zainteresowani wpływem powyżej opisanych parametrów na jakość przetwarzania.
Dla typowego użytkownika interesującą opcją może okazać się odłączanie nie wykorzystywanych sekcji układu AD9512 w celu ograniczania pobieranej mocy.
 

5.2. Konfiguracja i sterowanie przetwornikami C/A

 
Użytkownik konfiguruje i steruje przetwornikami C/A za pośrednictwem zakładki prezentowanej na rysunku 5.4.
 

Rysunek 5.4. Konfiguracja i sterowanie przetwornikami C/A (układem AD9777)
 
W widocznych grupach ustawień użytkownik ma możliwość skonfigurowania układu AD9777 oraz wygenerowania przebiegu sygnału napięciowego, którego podgląd również widoczny jest w oknie. Szerszy opis poszczególnych ustawień został zaprezentowany w dodatku D.

W oknie widoczne są bieżące ustawienia poziomu napięcia na podziałkę oraz odstępu czasu na podziałkę/próbkę, ułatwiające podgląd sygnału oraz analizę zgodności sygnału wytworzonego i mierzonego.
Główną funkcjonalnością zakładki jest wygenerowanie sygnału, które może odbyć się na dwa sposoby:

  • wyrysowanie pożądanego sygnału w oknie podglądu,
  • wgranie sygnału określonego numerycznie z pliku o odpowiednim formacie.

Następnie należy skonfigurować wzmocnienia oraz liczniki adresu i je uruchomić. Dodatkowo została zaimplementowana obsługa innych możliwości układu AD977 takich jak:
  • możliwość wprowadzenia układu w stan niskiego pobierania mocy, poprzez odłączenie wyjść
  • obsługa wewnętrznej pętli PLL,
  • obsługa filtrów; interpolacja, modulacja,
  • możliwość zsynchronizowania wytwarzanych przebiegów.

Funkcje zostały zaimplementowane dla użytkowników obytych z przetwarzaniem
sygnałów. Dla typowego użytkownika interesującą opcją może okazać się wprowadzanie układu AD9777 w stan niskiego pobierania mocy, gdy wytwarzanie sygnałów napięciowych nie leży w jego zainteresowaniu.
 

5.3. Konfiguracja i sterowanie przetwornikami A/C

 

Rysunek 5.5. Konfiguracja i sterowanie przetwornikami A/C (układami LTC2207)
 
Użytkownik konfiguruje i steruje przetwornikami A/C za pośrednictwem zakładki prezentowanej na rysunku 5.4. W widocznych grupach ustawień użytkownik ma możliwość skonfigurowania:

Poszczególnych kanałów (układów LTC2207)

  • włączenie trybu wewnętrznego ditheru,
  • włączenie trybu randomizacji wynikowych próbek,
  • włączenie sprzętowego resetu, który jednocześnie odłącza wejścia układu, co w efekcie ogranicza pobieraną moc,
  • wybranie wewnętrznego wzmocnienia.

Poszczególnych układów wyzwalania
  • określenie warunku (logicznego) uruchomienia akwizycji,
  • określenie wartości napięcia porównywanego z chwilowym wynikiem akwizycji.

Wykonanie akwizycji polega na wybraniu odpowiedniego bufora (programowego) do którego dane zostaną zapisane, następnie skonfigurowaniu lub wyłączeniu układu wyzwalania i ostatecznie na wciśnięciu przycisku "Download". Wyniki akwizycji wyświetlane są w polach podglądu, gdzie sygnał może być wstępnie analizowany dzięki polom pokazującym użytkownikowi wartości napięć na podziałkę i odstępu czasu na podziałkę/próbkę. Wyniki analizy mogą ponadto zostać zapisane do pliku w jednym z 3 formatów:
  • Binarnie : [8bit][8bit]...[8bit][8bit], w konwencji starszy-młodszy bajt,
  • Liczby całkowite ze znakiem : [int], [int], ..., [int]  np. 1255,-253, 2346
  • Liczby zmienno-przecinkowe : [float], [float], ..., [float]  np. 2.00e - 001,-2.54e - 001, 6e - 001

Dodatkowo zaimplementowano:
  • możliwość wykonania pojedynczego pomiaru wciskając przycisk "Check",
  • możliwość skonfigurowania czy podglądany sygnał ma wartość taką jakby rezystancje wejściowe przetworników miały powyżej 1Mfi, co ułatwia późniejsze porównywanie sygnałów z wynikami uzyskanymi oscyloskopami z takimi właśnie wejściami.


5.4. Sterowanie interfejsem GPIB

 
Użytkownik steruje interfejsem GPIB za pośrednictwem zakładki prezentowanej na rysunku 5.6.
 

Rysunek 5.6. Sterowanie interfejsem GPIB
 
W oknie użytkownik wpisuje komendy zaimplementowanego języka skryptowego, którego opis składni znajduje się w Dodatku E. Funkcjonalność języka pozwala użytkownikowi na tworzenie procedur pomiarowych, gdzie dane wysłane z urządzeń pomiarowych mogą być podglądane w polu podglądu lub mogą być zapisywane prosto do pliku. Linie kodu procedury, które są syntaktycznie niepoprawne lub podczas wykonywania wystąpił błąd transmisji, zostaną wskazane użytkownikowi.

Dodatkowo każda uruchomiona procedura może zostać przerwana przez użytkownika wciskając przycisk "Kill". Ponadto zaimplementowano możliwości podglądania zmiennych oraz podglądania wyników (na wykresie), które zostały zapisane do pliku w formacie zmienno-przecinkowym (format zmienno-przecinkowy jest używany przez większość urządzeń pomiarowych obsługiwanych poprzez interfejs GPIB).

W celu podglądania wyników należy otworzyć plik z danymi i tylko z danymi, w  przeciwnym razie podgląd nie będzie dostępny. Następnie użytkownik może określić z jakimi wartościami na podziałkę ma być przedstawiany wykres.

 

5.5. Sterowanie interfejsem I2C

 
Użytkownik steruje interfejsem I2C za pośrednictwem zakładki prezentowanej na rysunku 5.7.
 

Rysunek 5.7. Sterowanie interfejsem I2C
 
W celu sterowania interfejsem użytkownik musi wykonać 3 kroki:
  1. W widocznym oknie użytkownik musi ustawić szybkość transmisji:Normal – 100kb/s, Fast – 400kb/s,High – 3.5Mb/s,
  2. Napisać prosty kod sterujący w interpretowanym języku, którego składnia i przykład prezentowane są poniżej oraz krótko omówione dalej w tekście:
  • [Field1], [Field], ..., [Field];
  • [Field] = {S w||r n} [s hex]||[g]
  • [Field1] = [S w||r s hex] {n}
  • przykad : ”S w 12 s, 3e s, 8d s, S w r 12 s, s g, g n; ”

    Poszczególne pola całej komendy oddzielane są znakiem spacji, a cała komenda zakończona średnikiem generującym sekwencję stopu. Pole pierwsze "Field1" musi zawierać fiagi "S", "w" lub "r", "s" oraz liczbę w postaci heksadecymalnej, a parametrem opcjonalnym jest fiaga "n". Pozostałe pola winny zawierać przynajmniej fiagę "s" wraz liczbą heksadecymalną, albo tylko fiagę "g", reszta fiag jest opcjonalna, przy czym istnieje zasada, że ostatnia fiaga jest fiagą "aktywną".

    Poszczególne fiagi odpowiadają za:
    S – sekwencja startu lub wznowienia startu.
    Jeżeli ta fiaga występuje, to należy określić fiagę "w" lub "r" oraz fiagę "s", a wartość "hex" jest adresem urządzenia docelowego,
    w – określenie kierunku transmisji› zapis,
    r – określenie kierunku transmisji‹ odczyt,
    s – wysłanie bajtu. Jeżeli ta fiaga występuje, to należy również podać wartość "hex", która zostanie wysłana,
    g – odebranie bajtu,
    n – fiaga określa, że nie będzie generowana sekwencja potwierdzenia do urządzenia docelowego, co typowo informuje urządzenie docelowe, że transmisja dobiegła końca.

    3. Nacisnąć przycisk "Send". Jeżeli kod sterujący jest syntaktycznie niepoprawny albo podczas transmisji powstał błąd, to użytkownik jest informowany która linia kodu jest błędna lub nie wykonała się poprawnie.
    Typowym błędem transmisji może być nierozpoznanie adresu przez urządzenie docelowe. Jeżeli użytkownik wydawał komendy odczytu, to wyniki odczytu są wyświetlane w oknie podglądu na bieżąco podczas wykonywania kodu.


Dodatkowo zostały zaimplementowane możliwości zapisu/odczytu kodu sterującego oraz zapisu wyników odczytu do pliku. Funkcjonalności te pozwalają na wgranie kodu sterującego, wygenerowanego przez odpowiednie programy, w przypadku gdy intencją użytkownika jest np. wgranie dużego bloku danych do pamięci fiash oraz pozwalają na przenoszenie wyników pomiarów, które mogą zostać zapisane w formacie ASCII, gdzie kolejne bajty zapisywane są w formie liczb heksadecymalnych oddzielonych znakiem spacji.
 

5.6. Sterowanie interfejsem RS232C

 
Użytkownik steruje interfejsem RS232 za pośrednictwem zakładki prezentowanej na rysunku 5.8.
 

Rysunek 5.8. Sterowanie interfejsem RS232C
 
W widocznym oknie użytkownik konfiguruje moduł UART zaimplementowany w układzie FPGA przez ustawienie odpowiedniego buadrate. Po czymmoże wysłać wpisany tekst w formie znaków ASCII lub w formie liczb heksadecymalnych oddzielonych znakiem spacji. Zaimplementowanie wysyłania danych w formie heksadecymalnej służy do wysyłania plików binarnych.
 
Cheć odbierania (nałsuchiwania portu RS232) jest zaznaczana przez użytkownika poprzez wciśniecie "Listen". Odbieranie danych dzieje się automatycznie i również może być widoczne w formie heksadecymalnej.
 
Dodatkowo zaimplementowano możliwość zapisu kodu odbieranego do pliku, co pozwala na np. przesyłanie niedużych plików graficznych, w przypadku transmisji w formie binarnej (widzianej w oknie podglądu odbieranych danych jako bajty w kodzie heksadecymalnym oddzielone znakiem spacji)