%% awg70k matlab ict send waveform 2 %{ send a large waveform within a modest buffer %} %% sample waveform freq_a = 200e3; freq_b = 0.4e3; sampling_rate = 10e6; duration = freq_b^-1 / 2; % seconds, half a cycle of freq_b % adjust duration and sampling_rate to minimize rounding error samples = round(duration * sampling_rate); t = linspace(0, duration - sampling_rate^-1, samples); w1 = freq_a*2*pi; w2 = freq_b*2*pi; y = sin(w2*t).*sin(w1*t); %plot(t,y); %% remote variables visa_vendor = 'ni'; visa_address = 'TCPIP::134.62.36.164::INSTR'; buffer = 20 * 2^10; % 20 KiB linefeed = 10; %% connect to instrument if exist('awg', 'var') fclose(awg); delete(awg); clear awg; end awg = visa(visa_vendor, visa_address, 'OutputBuffer', buffer); fopen(awg); %% basic io r = query(awg, '*idn?'); fprintf(1, '%s', r); fwrite(awg, '*cls'); fprintf(1, 'event status register cleared\n'); %fwrite(awg, '*rst') %% status check r = query(awg, '*esr?', '%s', '%d'); fprintf(1, 'event status register: %d\n', r); % read all messages until No error fprintf(1, 'messages:\n'); while 1 r = query(awg, 'syst:err?'); fprintf(1, '* %s', r); if strcmp(r, ['0,"No error"' linefeed]) break end end %% awg70k requires single precision vectors waveform_data = single(y); waveform_name = 'test'; waveform_samples = length(waveform_data); waveform_bytes = waveform_samples * 4; %% command formatting delete_waveform = sprintf('wlist:waveform:delete "%s"', waveform_name); header = sprintf('#%d%d',length(num2str(waveform_bytes)), waveform_bytes); create_waveform = sprintf('wlist:waveform:new "%s", %d', waveform_name, ... length(waveform_data)); write_waveform_binblock = sprintf('wlist:waveform:data "%s", %s', ... waveform_name, header); assign_waveform_ch1 = sprintf('source1:waveform "%s"', waveform_name); %% send commands to instrument % delete_waveform is only necessary if waveform exists % the error generated by delete_waveform can be ignored fwrite(awg, delete_waveform); fwrite(awg, create_waveform); awg.EOIMode = 'off'; fwrite(awg, write_waveform_binblock); if buffer >= waveform_bytes fwrite(awg, waveform_data, 'single'); else sample_buffer = floor(buffer / 4); for a = 1:sample_buffer:waveform_samples-sample_buffer fwrite(awg, waveform_data(a:a+sample_buffer-1), 'single'); end a = a + sample_buffer; fwrite(awg, waveform_data(a:end), 'single'); end awg.EOIMode = 'on'; fwrite(awg, linefeed); fwrite(awg, assign_waveform_ch1); %% status check after transfer r = query(awg, '*esr?', '%s', '%d'); fprintf(1, 'event status register: %d\n', r); % read all messages until No error fprintf(1, 'messages:\n'); while 1 r = query(awg, 'syst:err?'); fprintf(1, '* %s', r); if strcmp(r, ['0,"No error"' linefeed]) break end end %% gracefully disconnect %fclose(awg); %delete(awg); %clear awg;