MATLAB: Programowanie multimetru

Dzisiaj dwa słowa na temat programowania aparatury pomiarowej z poziomu MATLABa. Coraz częściej bowiem się zdarza, że posługujemy się złożonymi systemami pomiarowymi, których nie da się sterować ręcznie. Z tego wpisu dowiecie się jak nawiązać połączenie przez port USB z multimetrem i przejąć nad nim kontrolę z poziomu skryptu napisanego w MATLABie. Zapraszam na MATLAB PROGRAMOWANIE MULTIMETRU.

W ostatnim wpisie na temat programowania sprzętu zająłem się kontrolą karty pomiarowej NI z poziomu MATLABa, na przykładzie liczenia szybkiej transformaty Fouriera „w locie”. W bieżącym wpisie pokażę Wam jak nawiązać komunikację z aparaturą kontrolno-pomiarową i zaprogramować multimetr z poziomu MATLABa w celu automatycznego wykonywania pomiarów. Multimetr jest powszechnie stosowanym przyrządem, służącym do wykonywania pomiarów napięcia, prądu, rezystancji i innych wielkości elektrycznych. Za jego pomocą z łatwością wykonuje się pojedyncze pomiary. Ale co gdy trzeba wykonać tysiąc pomiarów w określonych odstępach czasu albo na bieżąco monitorować jakąś wielkość i sprawdzać jej wartość?

MATLAB programowanie multimetru

Do akcji wkracza komputer i MATLAB. Wykorzystując funkcje Instrument Control Toolbox możemy zautomatyzować taki proces i oddać multimetr pod kontrolę MATLABa. Jak to zrobić? Najpierw musimy przygotować środowisko do obsługi multimetru – pisałem o tym w tym wpisie. Jeżeli przyrząd jest widoczny w systemie możemy przejść do jego programowania. Schemat postępowania jest podobny niezależnie od tego czy programujemy multimetr, oscyloskop, generator czy inny przyrząd.

Zadanie jest następujące: zaprogramować multimetr z poziomu MATLABa do automatycznego wykonywania pomiarów, np. napięcia lub oporu elektrycznego. Załóżmy, że chcemy zebrać i zapisać w komputerze N próbek pomiarowych, a następnie tak zebrany sygnał zwizualizować w postaci wykresu. Multimetr jest połączony z komputerem przez USB, a do komunikacji wykorzystuje standard VISA (Virtual Instrument Standard Architecture).

Z komputerem współpracuje multimetr RIGOL
Przygotowanie przestrzeni roboczej

Zobaczmy jak powinien być zbudowany klasyczny program do obsługi przyrządów pomiarowych. Programowanie multimetru zaczynamy od przygotowania przestrzeni roboczej. Ponieważ standardowo umieszczana na początku komenda ‘clear all’ nie usuwa aktywnych połączeń z urządzaniami z poprzednich sesji, dlatego, przed przystąpieniem do programowania należy takie połączenia usunąć jeżeli istnieją.

clear all; close all; clc
 
%% Zamknięcie aktywnych połączeń z urządzeniami z poprzednich sesji
obj = instrfind;
if isempty(obj) == 0
    fclose(obj);
    delete(obj);
    clear obj
end

Kolejnym krokiem jest zebranie informacji o podpiętej do komputera aparaturze kontrolno-pomiarowej. Robi się to za pośrednictwem funkcji instrhwinfo. Funkcja ta zwraca szereg parametrów, między innymi tzw. ObjectConstructorName, którego znajomość jest niezbędna do nawiązania komunikacji z konkretnym urządzeniem.

%% Sprawdzenie czy są dostępne urządzenia i nawiązanie połączenia 
vinfo = instrhwinfo('visa','ni')        % informacja o urządzeniach standardu VISA
DeviceID = vinfo.ObjectConstructorName  % pobieramy identyfikator urządzenia - jest to niezbędne do nawiązania połączenia
strDeviceID = char(DeviceID(1));        % konwersja na char
strDeviceID = [strDeviceID(13:47) '::0::INSTR']    % uzupełnienie o adres "0" wg standardu VISA   

W zmiennej strDeviceID mamy identyfikator (adres) urządzenia, w naszym przypadku multimetru,  składający się z ID producenta, kodu modelu i numeru seryjnego. Dodany fragment  ::0::INSTR, wynika ze specyfikacji standardu VISA i po prostu przyjmujemy, że tak musi być:

strDeviceID = 'USB0::0x1AB1::0x0588::DM3H121700088::0::INSTR'
Nawiązanie połączenia

Jeżeli znamy ID urządzenia możemy nawiązać z nim połączenie. Robi się to poprzez stworzenie obiektu typu instrument, który jest swego rodzaju „bramką” umożliwiającą komunikację z przyrządem. MATLAB rozróżnia tutaj obiekty rodzaju interface i device. Te pierwsze służą do utworzenia kanału komunikacji, z wykorzystaniem standardów: gpib, serial, VISA, itp. Natomiast obiekty instrument rodzaju device, wskazują na konkretny przyrząd, co wymaga zazwyczaj instalacji dodatkowych sterowników. My utworzymy sesję dla obiektu rodzaju interface wykorzystując do tego celu funkcję visa (gdyż taki standard jest zaimplementowany w multimetrze).

obj1 = visa('NI', strDeviceID)    % utworzenie obiektu VISA przypisanego do urządzenia o konkretnym ID
fopen(obj1);                      % nawiązanie połączenia
Multimetr w trybie 'remote' - zdalnym

Od tego momentu możemy rozpocząć rozmowę z przyrządem. Język, którym się posługujemy to SCPI (Standard Commands for Programmable Instruments), który definiuje składnie poleceń do komunikacji z aparaturą kontrolno-pomiarową. Komendy SCPI mają postać tekstową i składają się z jednego lub więcej słów kluczowych oraz parametrów lub wartości liczbowych. Omawianie tego języka daleko wykracza poza ten artykuł, a osoby zainteresowane jego poznaniem odsyłam do źródła. Na szczęście w instrukcji obsługi przyrządów, można znaleźć opis podstawowych komend i parametrów. Tak jest też w przypadku multimetru RIGOL. Trzy poniższe komendy wprowadzają multimetr w tryb pomiaru napięcia stałego, na zakresie 4V i rozdzielczości 3i3/4 cyfry:

%% Konfiguracja multimetru w tryb pomiaru napięcia stałego
fprintf(obj1, 'MEASure:VOLTage:DC 1');      % Zakres pomiarowy: 0 - 400mV, 1 - 4V, 2 - 40V, 3 - 400V, 4 - 1kV
fprintf(obj1, 'RESOlution:VOLTage:DC 0');   % Rozdzielczość: 0 - 3i3/4, 1 - 4i3/4, 2 - 5i3/4,
fprintf(obj1, 'TRIGger:AUTO:INTErval 30');  
Wykonanie pomiarów

Jesteśmy gotowi do wykonania pomiaru napięcia na ustawionym zakresie i w danej rozdzielczości. Można to zrobić na różne sposoby na przykład używając składni SCPI ‘READ?”:

fprintf(obj1, 'READ?');
DCVResult = fscanf(obj1);

Ale w tym przykładzie mamy wykonać N pomiarów bez przerwy, stąd propozycja poniższej struktury. Nie jest ona optymalna, ale jest prosta i obrazuje jak można wykonać akwizycję pomiarów z multimetru:

%% Główna pętla - pomiar
N=100;                   % liczba próbek
t=[]; U = [];           % wektory czasu i napięcia
disp('Trwa pomiar');
 
t1=datetime;
for k=1:N
    
    pause(0.05)
    val= str2num(query(obj1,'MEASure:VOLTage:DC?'));    % odczyt wartości napięcia
    t0 = datetime;              % timestamp
    
    t = [t t0];
    U = [U val];
    plot(U);                    % rysunek
    
end
 
title('Tryb akwizycji danych z multimetru'); ylabel('Napięcie [V]'); xlabel('Próbki [-]'); grid on;
Zakończenie

Poskładanie wszystkich fragmentów w jedną całość, daje w pełni funkcjonalny program do obsługi multimetru. Wymaga on ulepszenia, gdyż nie jest w pełni dopracowany – brakuje między innymi obsługi błędów multimetru oraz bardziej efektywnego wykonywania pomiarów. Specjalnie też pominąłem fragment po głównej pętli, tworzący wektor czasu wyrażony w sekundach na podstawie wektora t0 (datetime). To są zadania dla Was.

Wynik pomiaru napięcia prostokątnego o wartości międzyszczytowej 2V i częstotliwości 0,5Hz jest następujący:

(Visited 65 times, 1 visits today)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *