Laboratorium wirtualne 1/Moduł 3 - ćwiczenie 3

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

wersja beta


LABORATORIUM WIRTUALNE 1

Ćwiczenie 3 - Projekt wirtualnego oscyloskopu w środowisku LabWindows/CVI



Celem ćwiczenia jest stworzenie wirtualnego odwzorowania przyrządu pomiarowego jakim jest oscyloskop. Przyrząd taki swoją funkcjonalnością nie może odbiegać od rozwiązań spotykanych w aparaturze autonomicznej. Co więcej jako realizacja programowa - wirtualny oscyloskop nie może być pozbawiony możliwości rozbudowy posiadanych funkcji czy też adaptacji do indywidualnych potrzeb i wygód użytkownika końcowego. Wszystkie te cechy posiadają aplikacje pełniące funkcje przyrządów pomiarowych zaprogramowanych w środowisku LabWindows/CVI.

Stworzyć nowy projekt i wybrać File -> New -> *.uir.

W oknie edytora płyty czołowej wybrać Create -> Command Button i utworzyć przycisk: Koniec.

Parametry:

Constant Name: KONIEC (DUŻE LITERY !)

Callback Function: Zakoncz

Control Mode: Hot

Label: Koniec

Wybrać z menu Create -> Graph -> Graph i utworzyć wyświetlacz oscyloskopowy.

Parametry:

Constant Name: PRZEBIEGT (DUŻE LITERY !) Callback Function: Control Mode: Indicator Label: Przebieg czasowy

W oknie konfigurującym lewą oś Y (przycisk Left Y-axis) można wyłączyć autoskalowanie. Należy jednak w trakcie dalszego pisania programu ustawić właściwe wartości: minimalną i maksymalną.

Zapisać *.uir (Menu Arrange pozwala na uporządkowanie elementów na płycie czołowej).

Opcjonalnie

Z menu: Code -> Preferences -> Default control events wybrać:

EVENT_COMMIT, EVENT_VAL_CHANGED, EVENT_RIGHT_CLICK. Czynność ta ułatwi obsługę wybranych zdarzeń.

Z menu: Code -> Generate -> wybrać All code... . W wyświetlonym oknie konfiguracyjnym pozycje: Select panels to load and display at startup oraz Panel Variable Name pozostawić z ustawieniami domyślnymi. W polu QuitUserInterface Callbacks wybrać funkcję odpowiedzialną za zakończenie programu. W bieżącym projekcie jest to funkcja: Zakoncz.

Zatwierdzić zmiany i zapisać kod (plik *.c)


Z katalogu \cviXX\instr\ (XX - zastępuje numer wersji środowiska np.: 70 lub 80) skopiować do katalogu zadania pliki: scope.c, scope.h, scope.fp. Jeśli jest ustawiony atrybut Read Only to należy go usunąć. Oryginalny sterownik przesyła bufory z danymi o rozmiarze 100. Celową jest modyfikacja (dotyczy ona funkcji sterownika scope_read_waveform), dzięki której możliwe będzie uzyskanie wektora o rozmiarze 2n - w dalszym ciągu będzie to rozmiar wynoszący 1024 elementy.

Włączyć pliki: *.c, *.uir, *.h oraz scope.fp do projektu. Nazwać i zapisać projekt.


Po dodaniu do projektu pliku scope.fp w menu Instrument pojawi się pozycja Sample Oscilloscope, pod którą znaleźć można 4 funkcje wchodzące w skład sterownika symulującego oscyloskop:

scope_init - inicjuje połączenie z przyrządem. scope_config - konfiguruje nastawy oscyloskopu : numer kanału, wzmocnienie toru Y, podstawę czasu oraz tryb pracy (AC, DC, GND). scope_read_waveform - na podstawie dokonanych w poprzedniej funkcji nastaw z przyrządu wczytany zostaje wektor przebiegu czasowego. scope_close - kończy komunikację z przyrządem.

Funkcję inicjującą najlepiej wywołać w programie jednorazowo w funkcji main a więc na samym początku działania programu:

//Funkcję scope_init dobrze jest wywołać przed funkcją

//DisplayPanel


scope_init (1);

DisplayPanel (panelHandle);

Podobnie funkcję kończącą współpracę z przyrządem najlepiej wywołać w programie jednorazowo w funkcji main tym razem na końcu działania programu:

//Funkcję scope_close wywołać po funkcji //DiscardPanel

DiscardPanel (panelHandle);

scope_close ();

Funkcje scope_config oraz scope_read_waferom będą wywoływane “na żądanie” użytkownika programu.

Dołączyć nagłówek scope.h do pliku źródłowego:

#include ”scope.h”


Zadeklarować w kodzie funkcję, której zadaniem będzie odświeżanie ekranu,

po każdorazowej zmianie nastaw poczynionych przez użytkownika:

void Przerysuj(void);

Delkaracja powinna się znajdować na początku kodu źródłowego.

W pliku źródłowym umieścić definicję funkcji Przerysuj() :

void Przerysuj(void)

{

}

Definicję można umieścić w dowolnym miejscu w kodzie (poza ciałami innych funkcji !). Najlepiej jednak funkcję definicję Przerysuj() umieścić bezposrednio po funkcji main.

W początkowej fazie programu będzie ona wywoływać funkcje symulatora oscyloskopu ze standardowymi parametrami i wyświetlać „odczytany” na ich podstawie przebieg czasowy.

W tym celu należy w funkcji Przerysuj() umieścić wywołania: scope_config, scope_read_waveform, DeleteGraphPlot oraz PlotWaveform.

Z menu Instrument -> Sample Oscillosope wybrać Configure (funkcja Przerysuj()) i z domyślnymi parametrami wstawić do kodu (wewnątrz funkcji Przerysuj())

Ponownie z menu Instrument -> Sample Oscillosope wybrać Read Waveform (funkcja scope_read_waveform).

Zdefiniować:

  • tablicę, w której zwracany będzie wektor przebiegu czasowego (typ zmiennych w tablicy: double, rozmiar tablicy: 1024, nazwa tablicy np.: przebieg);
  • zwracany okres próbkowania (typ zmiennej: double, nazwa np.: tp);
  • zwracaną chwilę początkową przebiegu (typ zmiennej: double, nazwa np.: x0);

Z ww parametrami wstawić funkcję do kodu (wewnątrz funkcji Przerysuj())

Do funkcji Przerysuj() dodać wywołania DeleteGraphPlot oraz PlotWaveform W funkcji main po wywołaniu DisplayPanel (panelHandle); można umieścić Przerysuj();


Po uruchomieniu program będzie wyglądał podobnie jak na ilustracji poniżej.

Sprawdzić typ danych i zakres przyjmowanych wartości dla pierwszego parametru w funkcji scope_config (kursor umieścić na funkcji scope_config, klawiszami Ctrl+P wywołać panel funkcyjny; przejść do zmiennej Channel i klawiszem F1 wywołać okno pomocy, z którego można odczytać typ zmiennej i zakres dozwolonych wartości. Każdy argument funkcji scope_config posiada określony typ i zakres. W związku z tym typ definiowanej dla tego argumentu zmiennej musi być identyczny. Dodatkowo przełącznik znajdujący się na ekranie i przyporządkowany do danego parametru funkcji scope_config musi reprezentować zgodny z tym argumentem typ danych i posiadać dopuszczalny zakres przyjmowanych wartości.

Pierwszy parametr odpowiada za kanał oscyloskopu jest typu int i może mieć wartość 1 lub 2.

Zdefiniować globalnie zmienną typu int o nazwie przykładowo nrKanalu zainicjowaną wartością 1.

int nrKanalu = 1;

W edytorze płyty czołowej wybrać z menu Create -> Ring przełącznik służący zmianie kanału:

Parametry:

Constant Name: WYBORKANAL Callback Function: CzytajKanal Control Mode: Hot


opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu