Laboratorium wirtualne 1/Moduł 3 - ćwiczenie 3: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
m Zastępowanie tekstu – „\</math>” na „\ </math>” |
||
(Nie pokazano 6 wersji utworzonych przez 2 użytkowników) | |||
Linia 47: | Linia 47: | ||
Constant Name: PRZEBIEGT (DUŻE LITERY !) | Constant Name: PRZEBIEGT (DUŻE LITERY !) | ||
Callback Function: | Callback Function: | ||
Control Mode: Indicator | Control Mode: Indicator | ||
Label: Przebieg czasowy | Label: Przebieg czasowy | ||
Linia 77: | Linia 80: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="500px"|[[Grafika:LW1_M3_Slajd04.png]] | |valign="top" width="500px"|[[Grafika:LW1_M3_Slajd04.png]] | ||
|valign="top"|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 <math>2^n\ | |valign="top"|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 <math>2^n\ </math>, - 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. | Włączyć pliki: '''*.c, *.uir, *.h''' oraz '''scope.fp''' do projektu. Nazwać i zapisać projekt. | ||
Linia 205: | Linia 208: | ||
Etykieta: '''Kanał 1''' '''Kanał 2''' | Etykieta: '''Kanał 1''' '''Kanał 2''' | ||
Wartość: | Wartość: <math>\begin{matrix}\,\,\,\,\,\,\,\,\,\ 1 & \,\,\,\,\,\,\,\,\,\,2 \end{matrix}\ </math>, | ||
Wartości te są zgodne z podanymi w pomocy do funkcji '''scope_config'''. | Wartości te są zgodne z podanymi w pomocy do funkcji '''scope_config'''. | ||
Linia 231: | Linia 234: | ||
|} | |} | ||
<hr width="100%"> | |||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
Linia 246: | Linia 251: | ||
y - parametr wyjściowy zawierający część urojoną widma Fouriera. | y - parametr wyjściowy zawierający część urojoną widma Fouriera. | ||
n - liczba elementów, która musi spełniać zależność <math>2^n\ | n - liczba elementów, która musi spełniać zależność <math>2^n\ </math>,. | ||
Linia 258: | Linia 263: | ||
|valign="top" width="500px"|[[Grafika:LW1_M3_Slajd14.png]] | |valign="top" width="500px"|[[Grafika:LW1_M3_Slajd14.png]] | ||
|valign="top"|Wartości widma zwracane są we współrzędnych kartezjańskich, a pożądaną postacią są współrzędne biegunowe, gdyż poszukiwana jest bezpośrednia postać widma amplitudowego. | |valign="top"|Wartości widma zwracane są we współrzędnych kartezjańskich, a pożądaną postacią są współrzędne biegunowe, gdyż poszukiwana jest bezpośrednia postać widma amplitudowego. | ||
Symbole na slajdzie: <math>A\ | Symbole na slajdzie: <math>A\ </math>, - wektor widma amplitudowego, <math>\Phi\ </math>, - wektor widma fazowego. | ||
|} | |} | ||
Linia 294: | Linia 299: | ||
|valign="top"|Operację przeskalowania opisuje równanie przedstawione na slajdzie gdzie: | |valign="top"|Operację przeskalowania opisuje równanie przedstawione na slajdzie gdzie: | ||
:<math>widmo_{log}\ | :<math>widmo_{log}\ </math>, - wynikowe widmo w skali logarytmicznej; | ||
:<math>widmo_{lin}\ | :<math>widmo_{lin}\ </math>, - widmo w skali liniowej (wektor '''mag'''); | ||
:<math>maksimum(widmo_{lin})\ | :<math>maksimum(widmo_{lin})\ </math>, - wartość maksymalna widma liniowego. | ||
:<math>log_{10})\ | :<math>log_{10})\ </math>, - w programie należy wykorzystać funkcję '''log10'''. | ||
UWAGA!! Aby uniknąć błędów pojawiających się przy próbie wyznaczania logarytmu dla argumentów: 0 oraz n/0 można dokonać sztucznego „zaszumienia” sygnału wejściowego w dziedzinie czasu. Poziom szumów niech wynosi do 1% amplitudy tego sygnału. | UWAGA!! Aby uniknąć błędów pojawiających się przy próbie wyznaczania logarytmu dla argumentów: 0 oraz n/0 można dokonać sztucznego „zaszumienia” sygnału wejściowego w dziedzinie czasu. Poziom szumów niech wynosi do 1% amplitudy tego sygnału. | ||
Linia 307: | Linia 312: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="500px"|[[Grafika:LW1_M3_Slajd18.png]] | |valign="top" width="500px"|[[Grafika:LW1_M3_Slajd18.png]] | ||
|valign="top"|Do wyświetlenia widma warto użyć funkcji '''PlotWaveform'''. W funkcji tej w pozycji '''Initial X''' należy wstawić wartość 0 (składowa stała). W pozycji '''X Increment''', korzystając ze znajomości okresu próbkowania | |valign="top"|Do wyświetlenia widma warto użyć funkcji '''PlotWaveform'''. W funkcji tej w pozycji '''Initial X''' należy wstawić wartość 0 (składowa stała). W pozycji '''X Increment''', korzystając ze znajomości okresu próbkowania <math>t_{pr}\ </math>, należy wyznaczyć i umieścić wartość rozdzielczości widmowej: <math>r = f_{pr}/N</math>; (<math>f_{pr}\ </math>, -częstotliwość próbkowania, <math>N\ </math>, - liczba próbek w widmie). Argument '''Plot Style''' należy ustawić na '''vertical bar'''. | ||
UWAGA!! Ponieważ dla sygnałów rzeczywistych widmo jest symetryczne należy wyświetlać jedynie jego połowę | UWAGA!! Ponieważ dla sygnałów rzeczywistych widmo jest symetryczne należy wyświetlać jedynie jego połowę | ||
Linia 358: | Linia 363: | ||
|valign="top"|Dysponując odczytem pozycji 2 kursorów na ekranie z przebiegiem czasowym można uzyskać powiększenie wybranego fragmentu. Fragment ten określony jest przez odpowiednie współrzędne kursorów. | |valign="top"|Dysponując odczytem pozycji 2 kursorów na ekranie z przebiegiem czasowym można uzyskać powiększenie wybranego fragmentu. Fragment ten określony jest przez odpowiednie współrzędne kursorów. | ||
Na rysunku przedstawiono przykładową sytuację. Obszarem zainteresowania (przeznaczonym do powiększenia) jest czerwony prostokąt, ograniczony kursorami (niebieskim i zielonym). Prostokąt ten można opisać dwiema parami współrzędnych: <math>(X_{min}, Y_{min})\ | Na rysunku przedstawiono przykładową sytuację. Obszarem zainteresowania (przeznaczonym do powiększenia) jest czerwony prostokąt, ograniczony kursorami (niebieskim i zielonym). Prostokąt ten można opisać dwiema parami współrzędnych: <math>(X_{min}, Y_{min})\ </math>, oraz <math>(X_{min}, Y_{min})\ </math>, oznaczonych odpowiednio zielonymi kółkami. Dysponując współrzędnymi kursorów: pierwszego <math>(X_1,Y_1)\ </math>, oraz drugiego <math>(X_2,Y_2)\ </math>, należy wyznaczyć: <math>X_{min}\ </math>, , <math>X_{max}\ </math>, , <math>Y_{min}\ </math>, oraz <math>Y_{max}\ </math>, . Będą one potrzebne do przeskalowania osi <math>X\ </math>, oraz <math>Y\ </math>, ekranu z przebiegiem czasowym. Włączaniem i wyłączaniem powiększenia niech steruje przełącznik typu '''Binary Switch'''. Jeżeli <math>X_1=X_2</math> lub <math>Y_1=Y_2</math> wtedy należy dezaktywować przełącznik powiększenia. W funkcji CALLBACK tego przełącznika trzeba obsłużyć dwa przypadki: włączenie i wyłączenie powiększenia. W obu należy wykorzystać funkcję: | ||
'''int status = SetAxisScalingMode (int panelHandle, int controlID, int axis, int axisScaling, double min, double max);''' | |||
Pełny opis funkcji '''SetAxisScalingMode''' dostępny jest poprzez pomoc środowiska LabWindows/CVI. W tym celu należy wybrać menu '''Help -> Contents''' i po otworzeniu okna pomocy ze '''''Spisu treści''''' wybrać '''Library Reference -> User Interface Library -> Functions -> Alphabetical List of Functions -> SetAxisScalingMode.''' | |||
Funkcję tę należy wykonać osobno dla osi X i Y. Parametr '''axis''' dla osi X ustawić należy na '''bottom X axis''' dla osi Y musi to być '''left Y axis'''. Argument '''axisScaling''' należy ustawić następująco: dla włączenia powiększenia - '''manual;''' dla wyłączenia - '''auto'''. Działanie tego parametru wygląda następująco: '''manual''' - odczytuje współrzędne graniczne z pozycji '''Min''' oraz '''Max;''' tryb '''auto''' natomiast powoduje, że wyświetlany jest cały bufor danych taki jaki wyświetlony został funkcją '''PlotWaveform'''. Wartości '''Min''' oraz '''Max''' są ignorowane tym nie mniej nie wolno ich w funkcji opuścić. | |||
|} | |} | ||
Linia 366: | Linia 379: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="500px"|[[Grafika:LW1_M3_Slajd25.png]] | |valign="top" width="500px"|[[Grafika:LW1_M3_Slajd25.png]] | ||
|valign="top"|''opis | |valign="top"|Włączanie i wyłączanie przyrządu można zrealizować poprzez przełącznik dwupozycyjny typu '''Binary Switch'''. Wszystkie elementy panelu przyrządu, które użytkownik może nastawiać, przełączać, wybierać lub naciskać należy wcześniej zmodyfikować (nie dotyczy to włącznika). W oknach właściwości należy kolejno uaktywniać opcję '''Initially Dimmed'''. Spowoduje to, iż po uruchomieniu aplikacji wszystkie elementy z zaznaczonym wyżej parametrem nie będą aktywne (slajd 25 po lewej stronie). Aktywacji tych elementów można dokonać w ramach funkcji '''Callback''' przyporządkowanej do przełącznika dwupozycyjnego. | ||
Operacji tej można dokonać przy użyciu funkcji '''SetCtrlAttribute''', która służy do ustawiania właściwości elementów pulpitu użytkownika. Drugi jej argument powinien zawierać identyfikator elementu podlegającego zmianie. W trzecim właściwość, która ma być zmieniona. W czwartym zaś wartość tej właściwości. Zatem po rozwinięciu drzewa własności w polu trzeciego parametru w gałęzi '''Control Settings...''' odnaleźć i wybrać należy pozycję '''Dimmed'''. Korzystając z okna podpowiedzi dla parametru czwartego ustawić wartość aktywującą przycisk. (Należy pamiętać o wstawieniu funkcji do kodu) | |||
Pełny opis funkcji '''SetCtrlAttribute''' dostępny jest poprzez pomoc środowiska LabWindows/CVI. W tym celu należy wybrać menu '''Help -> Contents''' i po otworzeniu okna pomocy ze '''''Spisu treści''''' wybrać '''Library Reference -> User Interface Library -> Functions -> Alphabetical List of Functions -> SetCtrlAttribute.''' | |||
Wywołanie funkcji musi zostać powtórzone dla każdego składnika ekranu przyrządu, który miał ustawiony atrybut '''Initially Dimmed'''. | |||
Wartość początkową przełącznika powinno być 0 (Off). Po włączeniu (wartość 1) należy wywoływać dla każdego żądanego elementu funkcję '''SetCtrlAttribute'''. Funkcja '''Callback''' przyporządkowana dla „włącznika zasilania” może mieć postać instrukcji waunkowej '''if .... else '''. Schematyczny zapis tej instrukcji znajduje się poniżej: | |||
'''if( stanPrzełącznika == 1)''' | |||
'''{''' | |||
:'''SetCtrlAttribute''' | |||
:'''................''' | |||
'''}''' | |||
'''else''' | |||
'''{''' | |||
:'''QuitUserInterface(0);''' | |||
:'''//koniec programu (w tym przypadku zbędny jest przycisk''' | |||
:'''//KONIEC i przyporządkowana mu funkcja CALLBACK''' | |||
'''}''' | |||
|} | |} | ||
Linia 372: | Linia 412: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="500px"|[[Grafika:LW1_M3_Slajd26.png]] | |valign="top" width="500px"|[[Grafika:LW1_M3_Slajd26.png]][[Grafika:LW1_M3_Slajd27.png]] | ||
|valign="top"|''opis | |valign="top"|Identycznie do sposobu utworzenia przycisku '''Koniec''' utworzyć kolejny przycisk '''Zapis''', którego naciśnięcie spowoduje zapis danych (wektora z wygenerowanymi próbkami przebiegu) do pliku. Pomocna będzie funkcja '''ArrayToFile''' (w menu Library: Formatting and I/O Library -> File I/O). Pełny opis funkcji '''SetCtrlAttribute''' dostępny jest poprzez pomoc środowiska LabWindows/CVI. W tym celu należy wybrać menu '''Help -> Contents''' i po otworzeniu okna pomocy ze '''''Spisu treści''''' wybrać '''Library Reference -> Formatting and I/O -> Alphabetical List of Functions -> ArrayToFile.''' | ||
Dla sprawdzenia poprawności zapisu można utworzyć jeszcze jeden przycisk, tym razem o nazwie '''Odczyt''' (ustawienia takie jak dla przycisku '''Zapis''') uaktywniany dopiero po zapisie danych. W funkcji callback stowarzyszonej z tym przyciskiem należy odczytać dane z pliku korzystając z '''FileToArray''' (w menu Library: Formatting and I/O Library -> File I/O). Wyświetlenie danych na ekranie odbywa się w omówiony już sposób. Rozważyć warto stworzenie nowego programu czytającego zapisane do pliku sygnały. | |||
Pełny opis funkcji '''SetCtrlAttribute''' dostępny jest poprzez pomoc środowiska LabWindows/CVI. W tym celu należy wybrać menu '''Help -> Contents''' i po otworzeniu okna pomocy ze '''''Spisu treści''''' wybrać '''Library Reference -> Formatting and I/O -> Alphabetical List of Functions -> FileToArray.''' Po odczytaniu danych z pliku należy je wyświetlić w dodatkowym ekranie oscyloskopowym. | |||
|} | |} | ||
Linia 386: | Linia 425: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="500px"|[[Grafika:LW1_M3_Slajd28.png]] | |valign="top" width="500px"|[[Grafika:LW1_M3_Slajd28.png]] | ||
|valign="top"| | |valign="top"|Środowisko LabWidows/CVI pozwala w bardzo szerokim zakresie rozbudować funkcjonalność przedstawionego przyrządu wirtualnego. Istnieje możliwość generacji złożonych sygnałów odkształconych a także sygnałów definiowanych przez użytkownika. Oprócz podstawowej analizy czasowej i częstotliwościowej istnieje możliwość cyfrowego przetwarzania sygnałów w oparciu o analizę czasowo-częstotliwościową np.: STFT czy analizę falkową. Dysponując odpowiednim sprzętem (karta DAQ lub interfejs GPIB) można dokonać akwizycji sygnałów rzeczywistych. | ||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> |
Aktualna wersja na dzień 12:03, 5 wrz 2023
wersja beta
LABORATORIUM WIRTUALNE 1
Ćwiczenie 3 - Projekt wirtualnego oscyloskopu w środowisku LabWindows/CVI
![]() |
|
![]() |
Stworzyć nowy projekt i wybrać File -> New -> *.uir. |
![]() |
Po uruchomieniu program będzie wyglądał podobnie jak na ilustracji poniżej. |