Noise measurement for the DMM noise measurement test project https://xdevs.com/article/dmm_noise/ EEVBlog user rodpp Jun 06, 2019 Data collection using MATLAB (see script below) Agilent 34461A -> ethernet All others -> GPIB Mains voltage 127V/60Hz Meters Keithley 2002 -> bougth second hand, mint condition, last cal 2012, no modifications. Agilent 34461A -> bougth new, last cal 2014, no modifications. HP 3456A -> bought used, last cal 2010, repaired in 2018 (replaced CPU of the digital board and recap). Solartron 7150+ - > bougth used, no cal data, no modifications. -------------- MATLAB SCRIPT -------------- %% Get hardware VISA addr hwinfo = instrhwinfo('visa','ni'); hwinfo.ObjectConstructorName %% Create devices handles device_name{1} = "Keithley 2002"; device_name{2} = "Agilent 34461A"; device_name{3} = "HP 3456A"; device_name{4} = "Solartron 7150+"; %device_name{5} = "Fluke 8842A"; handles{1} = visa('ni', 'GPIB0::1::INSTR'); handles{2} = visa('ni', 'TCPIP0::K-34461A-05668::inst0::INSTR'); handles{3} = visa('ni', 'GPIB0::2::INSTR'); handles{4} = visa('ni', 'GPIB0::4::INSTR'); %handles{5} = visa('ni', 'GPIB0::3::INSTR'); %% Connect to the instruments n_devices = size(handles,2); for i = 1:n_devices fopen(handles{i}); end clear i; %% Configure the instruments % Keithley 2002 fprintf(handles{1},":SYST:AZER:TYPE SYNC"); % Here we enable autozero sync fprintf(handles{1},"init:cont off"); fprintf(handles{1},":abort"); fprintf(handles{1},":SYST:LSYN:STAT ON"); % Here enable line sync fprintf(handles{1},":SENS:FUNC 'VOLT:DC'"); % Measure voltage DCV fprintf(handles{1},":SENS:VOLT:DC:NPLC 10"); % Set NPLC to 10 fprintf(handles{1},":SENS:VOLT:DC:RANGE 2"); % Set range manual to 20V fprintf(handles{1},":SENS:VOLT:DC:DIG 8.5"); % Set resolution to 8.5 digits fprintf(handles{1},":SENS:VOLT:DC:AVER:STAT OFF"); % Filter off fprintf(handles{1},":TRIG:SEQ:SOUR TIM"); % Set trigger source from timer fprintf(handles{1},":TRIG:SEQ:DEL 0"); % Set timer to 1 second fprintf(handles{1},":DISP:ENAB 1"); % Disable front panel fprintf(handles{1},":DISP:WIND:TEXT:DATA ''"); % Store message fprintf(handles{1},":DISP:WIND:TEXT:STAT 1"); % Display stored message fprintf(handles{1},":SYST:TST:TYPE RTCL"); % Set time stamp to real time clock (not relative) fprintf(handles{1},":SENS:TEMP:TRAN INT"); % Select the internal temperature transducer % Agilent 34461A fprintf(handles{2},"*RST"); % Reset fprintf(handles{2},"sens:func 'volt:dc'"); % DC Volts fprintf(handles{2},"volt:null:stat off"); % Null off fprintf(handles{2},"volt:zero:auto on"); % auto zero on fprintf(handles{2},"volt:imp:auto on"); % enable high impendance for 0.1, 1 and 10 vdc fprintf(handles{2},"disp:stat off"); % enables/disables the screen fprintf(handles{2},"trig:sour imm"); % Trigger always present fprintf(handles{2},"trig:del:auto on"); % Automatic delay fprintf(handles{2},"volt:range 1"); % Set range manual to 10V fprintf(handles{2},"volt:nplc 10"); % Set NPLC to 10 fprintf(handles{2},"samp:count 1"); % Number of samples fprintf(handles{2},"trig:count 1"); % HP 3456A fprintf(handles{3},"F1R3Z1FL06STGG10STI"); % F1 -> DCV % R4 -> 10V Range % Z1 -> Autozero on % FL0 -> Filter off % 6STG -> 6 dígitos % 10STI -> NPLC % Solartron 7150+ fprintf(handles{4},"I4M0N1R3T0"); % I4 -> Integration Time 10x400ms % M0 -> VDC % N1 -> Numeric output only % R3 -> 20V range % T0 -> Sample Mode (single-shot) % % Fluke 8842A % fprintf(handles{5},"F1R2S0T1"); % F1 -> VCD % % R3 -> 20V Range % % S0 -> Reading rate slow % % T1 -> Trigger external w/ delay %% Data acquisition n_measurements = 1000; for i=1:n_measurements % TRIGGER % Keithley 2002 fprintf(handles{1},":READ?"); % Read voltage and timestamp % Agilent 34461A fprintf(handles{2},"READ?"); % HP 3456A fprintf(handles{3},"T3"); % Solartron 7150+ fprintf(handles{4},"G"); % % Fluke 8842A % fprintf(handles{5},"?"); % GET DATA % Keithley 2002 result = fscanf(handles{1}); result_splited = split(result,','); voltage(1,i) = str2double(extractBefore(result_splited(1),'NVDC')); timestamp_unformated = result_splited(2); timestamp(1,i) = datetime(timestamp_unformated,'InputFormat','HH:mm:ss.SSS dd-MM-yyyy'); % 34461A voltage(2,i) = str2double(fscanf(handles{2})); %HP 3456A voltage(3,i) = str2double(fscanf(handles{3})); %Solartron voltage(4,i) = str2double(fscanf(handles{4})); % %Fluke 8842A % voltage(5,i) = str2double(fscanf(handles{5})); % Plot Graphics for j=1:n_devices subplot(n_devices,2,2*j-1) plot(timestamp(1,:),voltage(j,:)) ylim([min(min(voltage));max(max(voltage))]) legend(device_name{j}) subplot(n_devices,2,2*j) histogram(voltage(j,:)','Normalization','count','BinMethod','fd'); legend(device_name{j}) end drawnow fprintf("\n--------------------------------\nVoltage measurement %d of %d:\n--------------------------------\n",i,n_measurements); % Statistics for j=1:n_devices mean_value = mean(voltage(j,:)); rms_value = rms(voltage(j,:)); sigma_value = std(voltage(j,:)); fprintf("%s\n\t\tvoltage = %e\n\t\tmean=%e\n\t\trms=%e\n\t\tsigma=%e\n",device_name{j},voltage(j,i),mean_value,rms_value,sigma_value); end end %% Save Data for i=1:n_devices csv_data = [datestr(timestamp) char(ones(1000,1)*';') num2str(voltage(i,:)')]; dlmwrite(sprintf('F:\\%s__%s__%d_samples__rodpp.csv',extractBefore(datestr(timestamp(1)),' '),device_name{i},n_measurements),csv_data,'delimiter',''); end %% Disconnect and clean up % Keithley 2002 fprintf(handles{1},":DISP:WIND:TEXT:STAT 0"); % Remove display message n_devices = size(handles,2); for i = 1:n_devices fclose(handles{i}); delete(handles{i}); end clear i; % Erase variables %clear handles hwinfo n_devices date day hour minute month n_measurements result result_splited second time timestamp1 timestamp2 timestamp_unformated x year pd voltage j mean_value rms_value sigma_value device_name % Erase data %clear voltage timestamp