[READ-ONLY] Mirror of https://github.com/jmrplens/MATLAB_Instruments. Laboratory instruments control with MATLAB
experiment instruments laboratory matlab
0

Configure Feed

Select the types of activity you want to include in your feed.

Upload

Jose M. Requena Plens (Oct 22, 2021, 9:23 PM +0200) 2b9a0f7c 73ea6631

+646
Oscilloscope Rigol MSO1000Z - DS1000Z/MSO-DS1000Z_Programming_Guide.pdf

This is a binary file and will not be displayed.

+119
Oscilloscope Rigol MSO1000Z - DS1000Z/RigolMSO1000Z_ChannelsConfig.m
··· 1 + function RigolMSO1000Z_ChannelsConfig(serialNum,Channels,VScale,VOffset,ProbeRatio,HScale,HOffset) 2 + % Channels settings. Rigol Oscilloscope MSO 1000 Z. 3 + % 4 + % Examples: 5 + % Full config for channels 3 and 4: 6 + % RigolMSO1000Z_ChannelsConfig('DS1ZD181600446',[3,4],[1,0.125],[0,0],[10,1],0.02,0); 7 + % Only vertical settings for channels 1,3,4: 8 + % RigolMSO1000Z_ChannelsConfig('DS1ZD181600446',[1,3,4],[1,0.125,0.5],[0,0,0],[10,1,10]); 9 + % Only horizontal setting: 10 + % RigolMSO1000Z_ChannelsConfig('DS1ZD181600446',1,[],[],[],0.02,0); 11 + % 12 + % Input: 13 + % serialNum: Serial number (char or string), e.g. 'DS1ZD181600446' 14 + % Channels: Channel or channels number to be configured. Array with 15 + % one element for each channel, e.g. [1] or [2,3] or [1,2,3,4]. 16 + % VScale: Vertical scale for each channel. Array with same length 17 + % as ReadChannels. 18 + % VOffset: Vertical offset for each channel. Array with same length 19 + % as ReadChannels. 20 + % ProbeRatio: Probe ratio for each channel. Array with same length 21 + % as ReadChannels. 22 + % HScale: Horizontal scale. Only one element/value. 23 + % HOffset: Horizontal offset. Only one element/value. 24 + % 25 + % Jose Manuel Requena Plens (2021) [joreple@upv.es] 26 + 27 + % Check inputs 28 + arguments 29 + serialNum (1,1) string 30 + Channels (1,:) {mustBeInteger,mustBePositive,mustBeMember(Channels,[1,2,3,4])} 31 + VScale (1,:) = [] 32 + VOffset (1,:) = [] 33 + ProbeRatio (1,:) = [] 34 + HScale {mustBeScalarOrEmpty} = [] 35 + HOffset {mustBeScalarOrEmpty} = [] 36 + end 37 + 38 + %% Load instrument 39 + devlist = visadevlist(); % Get all VISA resources availables 40 + [~,idxdev] = ismember(serialNum,devlist.SerialNumber); % Search the serial number 41 + deviceNr = devlist.ResourceName{idxdev(1)}; % Get resource name 42 + MSO = visadev(deviceNr); % Create VISA Object 43 + 44 + %% Enable channels 45 + % Enable only selected read channels 46 + for c = 1:4 47 + if any(Channels==c) 48 + % Enable 49 + writeline(MSO, sprintf(':CHANnel%d:DISPlay ON',c)) 50 + else 51 + % Disable 52 + writeline(MSO, sprintf(':CHANnel%d:DISPlay OFF',c)) 53 + end 54 + end 55 + 56 + %% Vertical scale 57 + 58 + % Set probe ratio 59 + if ~isempty(ProbeRatio) 60 + for c = 1:length(Channels) 61 + % Set ratio to available nearest value 62 + ratioAvail = [0.01,0.02,0.05,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000]; 63 + [~,idx] = min(abs(ratioAvail-ProbeRatio(c))); 64 + Pratio(c) = ratioAvail(idx); %#ok<*AGROW> 65 + 66 + % Set 67 + writeline(MSO, sprintf(':CHANnel%d:PROBe %f',Channels(c),Pratio(c))) 68 + end 69 + end 70 + 71 + % Vertical scale (amplitude) 72 + for c = 1:length(Channels) 73 + 74 + % Vertical scale 75 + if ~isempty(VScale) 76 + % Set to available nearest value 77 + Pratio = str2double(writeread(MSO, sprintf(':CHANnel%d:PROBe?',Channels(c)))); 78 + if Pratio <= 1 79 + Vavail = repmat([1,2,5],4,1).*[1e-3; 1e-2; 1e-1; 1]; 80 + Vavail = [Vavail(:);10]; 81 + else 82 + Vavail = repmat([1,2,5],4,1).*[1e-2; 1e-1; 1; 1e1]; 83 + Vavail = [Vavail(:);100]; 84 + end 85 + [~,idx] = min(abs(Vavail-VScale(c))); 86 + VSca(c) = Vavail(idx); 87 + 88 + % Set 89 + writeline(MSO, sprintf(':CHANnel%d:SCALe %f',Channels(c),VSca(c))); 90 + end 91 + 92 + % Vertical offset 93 + if ~isempty(VOffset) 94 + writeline(MSO, sprintf(':CHANnel%d:OFFSet %f',Channels(c),VOffset(c))); 95 + end 96 + end 97 + 98 + %% Horizontal scale (time) 99 + 100 + % Horizontal scale 101 + if ~isempty(HScale) 102 + % Set to available nearest value 103 + Tavail = repmat([5,10,20],10,1).*[1e-9;1e-8;1e-7;1e-6;1e-5;1e-4;1e-3;1e-2;1e-1;1]; 104 + Tavail = [Tavail(:);50]; 105 + [~,idx] = min(abs(Tavail-HScale)); 106 + HSca = Tavail(idx); 107 + % Set 108 + writeline(MSO, sprintf(':TIMebase:MAIN:SCALe %f',HSca)); 109 + end 110 + 111 + % Horizontal offset 112 + if ~isempty(HOffset) 113 + % Limits: -Screen/2 to 1s or -Screen/2 to 5000s 114 + if HOffset<(-6*HSca); HOffset = -6*HSca; end 115 + writeline(MSO, sprintf(':TIMebase:MAIN:OFFSet %f',HOffset)); 116 + end 117 + 118 + % Clear VISA Object 119 + clear MSO
+158
Oscilloscope Rigol MSO1000Z - DS1000Z/RigolMSO1000Z_Read.m
··· 1 + function [Data,t,fs] = RigolMSO1000Z_Read(serialNum,Channels,frames) 2 + % Read from Rigol Oscilloscope MSO 1000 Z. 3 + % 4 + % Example: RigolMSO1000Z_Read('DS1ZD181600446',[3,4],2); 5 + % 6 + % Input: 7 + % serialNum: Serial number (char or string), e.g. 'DS1ZD181600446' 8 + % Channels: One-dimension array with channel or channels to read: [1],[2,4],... 9 + % frames: Number of frames to be read from internal memory. 10 + % 11 + % Output 12 + % Data: Array with as many columns as channels received. 13 + % t: Time array (seconds). 14 + % fs: Sample rate (Sa/s or Hz). 15 + % 16 + % Jose Manuel Requena Plens (2021) [joreple@upv.es] 17 + 18 + % Check inputs 19 + arguments 20 + serialNum (1,1) string 21 + Channels (1,:) {mustBeInteger,mustBePositive,mustBeMember(Channels,[1,2,3,4])} 22 + frames {mustBeInteger,mustBeScalarOrEmpty,mustBePositive} = 2 23 + end 24 + 25 + %% Load instrument 26 + devlist = visadevlist(); % Get all VISA resources availables 27 + [~,idxdev] = ismember(serialNum,devlist.SerialNumber); % Search the serial number 28 + deviceNr = devlist.ResourceName{idxdev(1)}; % Get resource name 29 + MSO = visadev(deviceNr); % Create VISA Object 30 + 31 + %% Signal data format 32 + writeline(MSO, ':WAVeform:MODE RAW' ); 33 + writeline(MSO, ':WAVeform:FORMat BYTE') 34 + 35 + % Flush data 36 + flush(MSO); pause(0.1) % Wait 100ms 37 + 38 + %% Read data 39 + 40 + % Data available 41 + % RAW: 250000 (uint8), WORD: 125000 (uint16), ASCII: 15625 (CSV) 42 + frameSize = 250000; 43 + HScale = str2double(writeread(MSO, ':TIMebase:MAIN:SCALe?')); 44 + wavelen = HScale * 12; % Scale*div 45 + sampleRate = str2double(writeread(MSO, ':ACQuire:SRATe?')); 46 + totalSize = wavelen*sampleRate; % Memory Depth = Sample Rate × Waveform Length 47 + totalFrames = min(ceil(totalSize/frameSize),frames); 48 + 49 + % Initialize 50 + cellFrames = cell(1,totalFrames); 51 + RAWData = zeros((frameSize-12)*totalFrames,length(Channels)); 52 + YScale = zeros(1,length(Channels)); 53 + refY = zeros(1,length(Channels)); 54 + oriY = zeros(1,length(Channels)); 55 + exit = false; 56 + 57 + % Read 58 + for c = 1:length(Channels) % Each channel 59 + 60 + % Try attempts 61 + maxatt = 10; 62 + for att = 1:maxatt 63 + try 64 + % Select channel 65 + writeline(MSO, sprintf(':WAVeform:SOURce CHANnel%d',Channels(c)) ); 66 + % Flush data 67 + flush(MSO); pause(0.1) % Wait 100ms 68 + 69 + % Read the waveform data (frames) 70 + frame = 1; 71 + for point = 0:frameSize:totalSize 72 + 73 + % If all the frames have been received, the loop ends 74 + if frame>totalFrames; break; end 75 + 76 + % Initial point for frame N 77 + writeline(MSO, sprintf(':WAVeform:STARt %d',point+13)); 78 + 79 + % Final point for frame N 80 + if (point+frameSize)<=totalSize 81 + writeline(MSO, sprintf(':WAVeform:STOP %d',point+frameSize)) 82 + frameSizeAux = frameSize; 83 + else 84 + % If almost all the memory has been read, the last 85 + % points are received 86 + writeline(MSO, sprintf(':WAVeform:STOP %d',totalSize)) 87 + frameSizeAux = totalSize-point; 88 + addZeros = frameSize-frameSizeAux; 89 + exit = true; 90 + end 91 + 92 + % Receive data 93 + writeline(MSO, ':WAVeform:DATA?'); % Request data 94 + data = read(MSO, frameSizeAux, 'uint8'); % Read data 95 + 96 + % Fill with zeros if the last frame 97 + if exit; data = [data(1:end-1),zeros(1,addZeros+1)]; end 98 + 99 + % Remove Data Header (11) and end newline character (1) and store 100 + cellFrames{frame} = data(12:end-1); % Store frames 101 + 102 + if exit; break; end 103 + frame = frame + 1; 104 + end 105 + 106 + % Store data without Data Header (11) and end newline character (1) 107 + data = [cellFrames{:}]; 108 + RAWData(:,c) = data(:); 109 + 110 + % Flush data and reload channel 111 + flush(MSO); pause(0.1) % Wait 100ms 112 + writeline(MSO, sprintf(':WAVeform:SOURce CHANnel%d',Channels(c)) ); 113 + 114 + % Get Y-axis information 115 + YScale(c) = str2double(writeread(MSO, ':WAVeform:YINCrement?')); 116 + % Reference and origin values to centering data 117 + refY(c) = str2double(writeread(MSO, ':WAVeform:YREFerence?')); 118 + oriY(c) = str2double(writeread(MSO, ':WAVeform:YORigin?')); 119 + 120 + % Reinitialize 121 + exit = false; 122 + cellFrames = cell(1,totalFrames); 123 + 124 + % Exit the attempts loop 125 + break; 126 + 127 + catch 128 + fprintf('Retrying. Attempt %d with channel %d\r\n',att,Channels(c)) 129 + flush(MSO); pause(0.1) % Wait 100ms 130 + clear MSO 131 + MSO = visadev(deviceNr); % Create VISA Object 132 + if att == maxatt 133 + YScale(c) = nan; 134 + refY(c) = nan; 135 + oriY(c) = nan; 136 + fprintf('Empty values with channel %d\r\n',Channels(c)) 137 + break; 138 + end 139 + end 140 + 141 + end 142 + end 143 + 144 + % Flush data 145 + flush(MSO); pause(0.1) % Wait 100ms 146 + 147 + % Samplerate 148 + incX = str2double(writeread(MSO, ':WAVeform:XINCrement?')); % delta T (secs) 149 + fs = str2double(writeread(MSO, ':ACQuire:SRATe?')); % Sa/s 150 + 151 + % Scale data (convert 0-255 values to Measure Units and centering in x-axis) 152 + Data = (RAWData - (refY+oriY) ).*YScale; % Scale and centering 153 + 154 + % Time array (seconds) 155 + t = 0:incX:incX*(size(Data,1)-1); 156 + 157 + % Clear VISA Object 158 + clear MSO
+69
Oscilloscope Rigol MSO1000Z - DS1000Z/RigolMSO1000Z_WaitForTrigger.m
··· 1 + function RigolMSO1000Z_WaitForTrigger(serialNum,TriggerChannel,TriggerLevel) 2 + % Set trigger of Rigol Oscilloscope MSO 1000 Z. 3 + % 4 + % Example: 5 + % RigolMSO1104Z_WaitForTrigger('DS1ZD181600446',3,-0.02); 6 + % 7 + % Input: 8 + % serialNum: Serial number (char or string), e.g. 'DS1ZD181600446' 9 + % TriggerChannel: Channel of trigger source. 10 + % TriggerLevel: Trigger voltage level. 11 + % 12 + % Jose Manuel Requena Plens (2021) [joreple@upv.es] 13 + 14 + % Check inputs 15 + arguments 16 + serialNum (1,1) string 17 + TriggerChannel (1,1) {mustBeInteger,mustBeMember(TriggerChannel,[1,2,3,4])} 18 + TriggerLevel {mustBeScalarOrEmpty,mustBeReal} = -0.02 19 + end 20 + 21 + %% Load instrument 22 + devlist = visadevlist(); % Get all VISA resources availables 23 + [~,idxdev] = ismember(serialNum,devlist.SerialNumber); % Search the serial number 24 + deviceNr = devlist.ResourceName{idxdev(1)}; % Get resource name 25 + MSO = visadev(deviceNr); % Create VISA Object 26 + 27 + % Flush data 28 + flush(MSO); pause(0.1) % Wait 100ms 29 + 30 + %% Acquire settings 31 + writeline(MSO, ':ACQuire:MDEPth AUTO' ); 32 + writeline(MSO, ':WAVeform:MODE RAW' ); 33 + writeline(MSO, ':WAVeform:MODE RAW' ); 34 + 35 + %% Trigger setup 36 + writeline(MSO, ':TRIGger:MODE EDGE' ); 37 + writeline(MSO, ':TRIGger:COUPling DC') 38 + writeline(MSO, ':TRIGger:SWEep SINGle' ); 39 + writeline(MSO, ':TRIGger:HOLDoff 0.0000002'); 40 + writeline(MSO, ':TRIGger:NREJect 1' ); 41 + writeline(MSO, sprintf(':TRIGger:EDGe:SOURce CHANnel%d',TriggerChannel)); 42 + writeline(MSO, ':TRIGger:EDGe:SLOPe POSitive' ); 43 + 44 + % Level 45 + % Limits: (± 5 × VerticalScale from the screen center) - OFFSet 46 + offset = str2double(writeread(MSO, sprintf(':CHANnel%d:OFFSet?',TriggerChannel))); 47 + scale = str2double(writeread(MSO, sprintf(':CHANnel%d:SCALe?',TriggerChannel))); 48 + if TriggerLevel > (5*scale-offset); TriggerLevel = 5*scale-offset; end 49 + if TriggerLevel < (-5*scale-offset); TriggerLevel = -5*scale-offset; end 50 + % Set level 51 + writeline(MSO, sprintf(':TRIGger:EDGe:LEVel %f',TriggerLevel)); 52 + 53 + % Flush data 54 + flush(MSO); pause(0.1) % Wait 100ms 55 + 56 + % Check trigger (if enabled and wait/run, break) 57 + while 1 58 + writeline(MSO, ':SINGle') 59 + % Flush data 60 + flush(MSO); pause(0.2) % Wait 200ms 61 + status = writeread(MSO, ':TRIGger:STATus?' ); 62 + if strcmp(status,'WAIT') || strcmp(status,'RUN') 63 + break; 64 + end 65 + pause(0.5) 66 + end 67 + 68 + % Clear VISA Object 69 + clear MSO
+74
Red Pitaya STEMlab 125-14/RedPitaya_Continuous.m
··· 1 + function RedPitaya_Continuous(IP,port,outCH,type,f,amp) 2 + % RED PITAYA STEMlab 125-14 v1.1 3 + % Comands: https://redpitaya.readthedocs.io/en/latest/appsFeatures/remoteControl/remoteControl.html#list-of-supported-scpi-commands 4 + % Jose Manuel Requena Plens (2021) [joreple@upv.es] 5 + 6 + % Check inputs 7 + arguments 8 + IP (1,1) string 9 + port (1,1) double 10 + outCH (1,1) {mustBeInteger,mustBePositive,mustBeMember(outCH,[1,2])} 11 + type (1,1) string {mustBeMember(type,{'sine','square','triangle','sawu','sawd','pwm'})} 12 + f (1,1) mustBePositive 13 + amp (1,1) {mustBeInRange(amp,-1,1)} 14 + end 15 + 16 + %% CHANNEL 17 + % Output channel 18 + SOURout = ['SOUR',num2str(outCH)]; 19 + OUTPUT = ['OUTPUT',num2str(outCH)]; 20 + 21 + %% SIGNAL 22 + % Type 23 + switch lower(type) 24 + case 'sine' 25 + SIGNAL = 'SINE'; 26 + case 'square' 27 + SIGNAL = 'SQUARE'; 28 + case 'triangle' 29 + SIGNAL = 'TRIANGLE'; 30 + case 'sawu' % sawtooth up 31 + SIGNAL = 'SAWU'; 32 + case 'sawd' % sawtooth down 33 + SIGNAL = 'SAWD'; 34 + case 'pwm' 35 + SIGNAL = 'PWM'; % Duty cycle set with: 'SOURx:DCYC 0.2' 36 + otherwise 37 + error('Type signal error. Available: {sine, square, triangle, sawu, sawd, pwm}.') 38 + end 39 + % Frecuency 40 + FREQUENCY = num2str(f); 41 + % Amplitude (limits -1 to 1 Volt) 42 + if amp > 1; amp = 1; end; if amp < -1; amp = -1; end 43 + AMPLITUDE = num2str(amp); 44 + 45 + 46 + %% CONNECTION 47 + tcpIP = tcpclient(IP, port); % Create connection 48 + configureTerminator(tcpIP,"LF","CR/LF"); % Set terminator for write and read 49 + flush(tcpIP); % Clear write/read buffers 50 + 51 + %% RESET HARDWARE 52 + writeline(tcpIP,'GEN:RST'); % Reset generator order 53 + 54 + %% GENERATE SIGNAL 55 + % Function of output signal order string 'SOURx:FUNC AAAA' 56 + funct_order = [SOURout,':FUNC ',SIGNAL]; 57 + % Frequency of output signal order string 'SOURx:FREQ:FIX xxxx' 58 + f_order = [SOURout,':FREQ:FIX ',FREQUENCY]; 59 + % Amplitude of output signal order string 'SOURx:VOLT x' 60 + a_order = [SOURout,':VOLT ',AMPLITUDE]; 61 + % Offset amplitude 'SOURx:VOLT:OFFS xxx' 62 + a_order_off = [SOURout,':VOLT:OFFS ',num2str(0)]; % To 0 volts 63 + % Channel on order string 'OUTPUTx:STATE ON' 64 + on_order = [OUTPUT,':STATE ON']; 65 + 66 + % Send orders 67 + writeline(tcpIP,funct_order); % Set function of output signal 68 + writeline(tcpIP,f_order); % Set frequency of output signal 69 + writeline(tcpIP,a_order); % Set amplitude of output signal 70 + writeline(tcpIP,a_order_off); % Set offset amplitude of output signal 71 + writeline(tcpIP,on_order); % Power on output channel 72 + 73 + %% Close connection with Red Pitaya 74 + clear('tcpIP')
+96
Red Pitaya STEMlab 125-14/RedPitaya_Pulses.m
··· 1 + function RedPitaya_Pulses(IP,port,outCH,type,f,pulses,amp) 2 + % RED PITAYA STEMlab 125-14 v1.1 3 + % Comands: https://redpitaya.readthedocs.io/en/latest/appsFeatures/remoteControl/remoteControl.html#list-of-supported-scpi-commands 4 + % Jose Manuel Requena Plens (2021) [joreple@upv.es] 5 + 6 + % Check inputs 7 + arguments 8 + IP (1,1) string 9 + port (1,1) double 10 + outCH (1,1) {mustBeInteger,mustBePositive,mustBeMember(outCH,[1,2])} 11 + type (1,1) string {mustBeMember(type,{'sine','square','triangle','sawu','sawd','pwm'})} 12 + f (1,1) mustBePositive 13 + pulses (1,1) {mustBeInteger,mustBePositive} 14 + amp (1,1) {mustBeInRange(amp,-1,1)} 15 + end 16 + 17 + %% CHANNELS 18 + % Output channel 19 + SOURout = ['SOUR',num2str(outCH)]; 20 + OUTPUT = ['OUTPUT',num2str(outCH)]; 21 + 22 + %% SIGNAL 23 + % Type 24 + switch lower(type) 25 + case 'sine' 26 + SIGNAL = 'SINE'; 27 + case 'square' 28 + SIGNAL = 'SQUARE'; 29 + case 'triangle' 30 + SIGNAL = 'TRIANGLE'; 31 + case 'sawu' % sawtooth up 32 + SIGNAL = 'SAWU'; 33 + case 'sawd' % sawtooth down 34 + SIGNAL = 'SAWD'; 35 + case 'pwm' 36 + SIGNAL = 'PWM'; % Duty cycle set with: 'SOURx:DCYC 0.2' 37 + otherwise 38 + error('Type signal error. Available: {sine, square, triangle, sawu, sawd, pwm}.') 39 + end 40 + % Frecuency 41 + FREQUENCY = num2str(f,'%.2f'); 42 + % Amplitude (limits -1 to 1 Volt) 43 + if amp > 1; amp = 1; end; if amp < -1; amp = -1; end 44 + AMPLITUDE = num2str(amp); 45 + % Number of pulses 46 + PULSES = num2str(pulses); 47 + 48 + 49 + %% CONNECTION 50 + tcpIP = tcpclient(IP, port); % Create connection 51 + configureTerminator(tcpIP,"LF","CR/LF"); % Set terminator for write and read 52 + flush(tcpIP); % Clear write/read buffers 53 + 54 + %% RESET HARDWARE 55 + writeline(tcpIP,'GEN:RST'); % Reset generator order 56 + 57 + %% GENERATE SIGNAL 58 + 59 + % Function of output signal order string 'SOURx:FUNC AAAA' 60 + funct_order = [SOURout,':FUNC ',SIGNAL]; 61 + % Frequency of output signal order string 'SOURx:FREQ:FIX xxxx' 62 + f_order = [SOURout,':FREQ:FIX ',FREQUENCY]; 63 + % Amplitude of output signal order string 'SOURx:VOLT x' 64 + a_order = [SOURout,':VOLT ',AMPLITUDE]; 65 + % Offset amplitude 'SOURx:VOLT:OFFS xxx' 66 + a_order_off = [SOURout,':VOLT:OFFS ',num2str(0)]; % To 0 volts 67 + % Phase 'SOURx:PHAS xx' 68 + ph_order = [SOURout,':PHAS ',num2str(0)]; % To 0 69 + % Pulses of signal order string 'SOURx:BURS:NCYC x' 70 + puls_order = [SOURout,':BURS:NCYC ',PULSES]; 71 + % Pulses of signal order string 'SOURx:BURS:STAT BURST' % {'BURST','CONTINOUS'} 72 + pstat_order = [SOURout,':BURS:STAT ','BURST']; 73 + % Channel on order string 'OUTPUTx:STATE ON' 74 + on_order = [OUTPUT,':STATE ON']; 75 + 76 + % Send orders 77 + writeline(tcpIP,funct_order); % Set function of output signal 78 + writeline(tcpIP,f_order); % Set frequency of output signal 79 + writeline(tcpIP,a_order); % Set amplitude of output signal 80 + writeline(tcpIP,a_order_off); % Set offset amplitude of output signal 81 + writeline(tcpIP,ph_order); % Set phase of output signal 82 + writeline(tcpIP,puls_order); % Set pulses of sine wave 83 + writeline(tcpIP,pstat_order); % Set burst mode 84 + writeline(tcpIP,on_order); % Power on output channel 85 + 86 + 87 + %% START MEASURE (generation & acquisition) 88 + writeline(tcpIP,'ACQ:START'); % Acquisition 89 + pause(1); % Wait for load buffer 90 + writeline(tcpIP,'ACQ:TRIG AWG_PE'); 91 + writeline(tcpIP,[SOURout,':TRIG:IMM']); % Set generator trigger to immediately 92 + 93 + %% Close connection with Red Pitaya 94 + clear('tcpIP') 95 + 96 + end
+130
Red Pitaya STEMlab 125-14/RedPitaya_Pulses_SRCandREC.m
··· 1 + function [signal_num,t,Fs] = RedPitaya_Pulses_SRCandREC(IP,port,outCH,inCH,type,f,pulses,amp) 2 + % RED PITAYA STEMlab 125-14 v1.1 3 + % Comands: https://redpitaya.readthedocs.io/en/latest/appsFeatures/remoteControl/remoteControl.html#list-of-supported-scpi-commands 4 + % Jose Manuel Requena Plens (2021) [joreple@upv.es] 5 + 6 + % Check inputs 7 + arguments 8 + IP (1,1) string 9 + port (1,1) double 10 + outCH (1,1) {mustBeInteger,mustBePositive,mustBeMember(outCH,[1,2])} 11 + inCH (1,1) {mustBeInteger,mustBePositive,mustBeMember(inCH,[1,2])} 12 + type (1,1) string {mustBeMember(type,{'sine','square','triangle','sawu','sawd','pwm'})} 13 + f (1,1) mustBePositive 14 + pulses (1,1) {mustBeInteger,mustBePositive} 15 + amp (1,1) {mustBeInRange(amp,-1,1)} 16 + end 17 + 18 + %% CHANNELS 19 + % Output channel 20 + SOURout = ['SOUR',num2str(outCH)]; 21 + OUTPUT = ['OUTPUT',num2str(outCH)]; 22 + % Input channel 23 + SOURin = ['SOUR',num2str(inCH)]; 24 + 25 + %% SIGNAL 26 + % Type 27 + switch lower(type) 28 + case 'sine' 29 + SIGNAL = 'SINE'; 30 + case 'square' 31 + SIGNAL = 'SQUARE'; 32 + case 'triangle' 33 + SIGNAL = 'TRIANGLE'; 34 + case 'sawu' % sawtooth up 35 + SIGNAL = 'SAWU'; 36 + case 'sawd' % sawtooth down 37 + SIGNAL = 'SAWD'; 38 + case 'pwm' 39 + SIGNAL = 'PWM'; % Duty cycle set with: 'SOURx:DCYC 0.2' 40 + otherwise 41 + error('Type signal error. Available: {sine, square, triangle, sawu, sawd, pwm}.') 42 + end 43 + % Frecuency 44 + FREQUENCY = num2str(f,'%.2f'); 45 + % Amplitude (limits -1 to 1 Volt) 46 + if amp > 1; amp = 1; end; if amp < -1; amp = -1; end 47 + AMPLITUDE = num2str(amp); 48 + % Number of pulses 49 + PULSES = num2str(pulses); 50 + 51 + 52 + %% CONNECTION 53 + tcpIP = tcpclient(IP, port); % Create connection 54 + configureTerminator(tcpIP,"LF","CR/LF"); % Set terminator for write and read 55 + flush(tcpIP); % Clear write/read buffers 56 + 57 + %% RESET HARDWARE 58 + writeline(tcpIP,'GEN:RST'); % Reset generator order 59 + writeline(tcpIP,'ACQ:RST'); % Reset acquisition order 60 + 61 + %% GENERATE SIGNAL 62 + 63 + % Function of output signal order string 'SOURx:FUNC AAAA' 64 + funct_order = [SOURout,':FUNC ',SIGNAL]; 65 + % Frequency of output signal order string 'SOURx:FREQ:FIX xxxx' 66 + f_order = [SOURout,':FREQ:FIX ',FREQUENCY]; 67 + % Amplitude of output signal order string 'SOURx:VOLT x' 68 + a_order = [SOURout,':VOLT ',AMPLITUDE]; 69 + % Offset amplitude 'SOURx:VOLT:OFFS xxx' 70 + a_order_off = [SOURout,':VOLT:OFFS ',num2str(0)]; % To 0 volts 71 + % Phase 'SOURx:PHAS xx' 72 + ph_order = [SOURout,':PHAS ',num2str(0)]; % To 0 73 + % Pulses of signal order string 'SOURx:BURS:NCYC x' 74 + puls_order = [SOURout,':BURS:NCYC ',PULSES]; 75 + % Pulses of signal order string 'SOURx:BURS:STAT BURST' % {'BURST','CONTINOUS'} 76 + pstat_order = [SOURout,':BURS:STAT ','BURST']; 77 + % Channel on order string 'OUTPUTx:STATE ON' 78 + on_order = [OUTPUT,':STATE ON']; 79 + 80 + % Send orders 81 + writeline(tcpIP,funct_order); % Set function of output signal 82 + writeline(tcpIP,f_order); % Set frequency of output signal 83 + writeline(tcpIP,a_order); % Set amplitude of output signal 84 + writeline(tcpIP,a_order_off); % Set offset amplitude of output signal 85 + writeline(tcpIP,ph_order); % Set phase of output signal 86 + writeline(tcpIP,puls_order); % Set pulses of sine wave 87 + writeline(tcpIP,pstat_order); % Set burst mode 88 + writeline(tcpIP,on_order); % Power on output channel 89 + 90 + %% ACQUISITION 91 + 92 + writeline(tcpIP,'ACQ:DEC 64'); % Decimation of signal received = 64 -> Fs = 1.953MS/s 93 + writeline(tcpIP,'ACQ:TRIG:LEV 0'); % Trigger level to 0. Trigger by software 94 + writeline(tcpIP,'ACQ:TRIG:DLY 8192'); % Trigger delay to 0. +-8192 is available 95 + writeline(tcpIP,'ACQ:AVG ON'); % Enable averaging 96 + writeline(tcpIP,'ACQ:GET:DATA:UNITS RAW'); % Acquired data units {'RAW','VOLTS'} 97 + writeline(tcpIP,'ACQ:GET:DATA:FORMAT ASCII'); % Acquired data format {'BIN','ASCII'} 98 + 99 + 100 + %% START MEASURE (generation & acquisition) 101 + writeline(tcpIP,'ACQ:START'); % Acquisition 102 + pause(1); % Wait for load buffer 103 + writeline(tcpIP,'ACQ:TRIG AWG_PE'); 104 + writeline(tcpIP,[SOURout,':TRIG:IMM']); % Set generator trigger to immediately 105 + 106 + %% Wait for trigger 107 + while 1 108 + trig_rsp = strtrim(writeread(tcpIP,'ACQ:TRIG:STAT?')); 109 + if trig_rsp == "TD" % Trigger Disabled 110 + break 111 + end 112 + end 113 + 114 + %% READ 115 + writeline(tcpIP,['ACQ:',SOURin,':DATA?']); % Request acquisition data 116 + signal_str = readline(tcpIP); % Read acquisition data 117 + writeline(tcpIP,'ACQ:STOP'); % Stop acquisition 118 + 119 + %% PROCESS DATA 120 + signal_str = erase(signal_str,["{","}"]); % Clean 121 + signal_num = str2double(split(signal_str',',')); % To num 122 + 123 + % Sample rate and time array 124 + Fs = 1.953e6; 125 + t = (0:1:length(signal_num)-1)/Fs; 126 + 127 + %% Close connection with Red Pitaya 128 + clear('tcpIP') 129 + 130 + end