| @@ -1,9 +1,9 @@ | |||||
| addpath('subfiles'); | |||||
| if ~exist('theory_only','var') || theory_only == false | |||||
| if ~exist('functiongenerator','var') | |||||
| functiongenerator = FunctionGenerator('10.0.0.3',1234,10); | |||||
| end | |||||
| if ~exist('functiongenerator','var') | |||||
| functiongenerator = FunctionGenerator('10.0.0.3',1234,10); | |||||
| end | |||||
| if ~exist('oscilloscope','var') | |||||
| oscilloscope = Oscilloscope('10.0.0.2',5025,2); | |||||
| if ~exist('oscilloscope','var') | |||||
| oscilloscope = Oscilloscope('10.0.0.2',5025,2); | |||||
| end | |||||
| end | end | ||||
| @@ -72,15 +72,18 @@ classdef Oscilloscope < Equipment | |||||
| m = str2double(sc.query(['MEAS',num2str(measurement),':RES:ACT?'])); | m = str2double(sc.query(['MEAS',num2str(measurement),':RES:ACT?'])); | ||||
| end | end | ||||
| function setWaveformSettings(sc,window,format) | |||||
| if nargin < 3 | |||||
| format = 'REAL'; | |||||
| if nargin < 2 | |||||
| window = 'DEF'; | |||||
| function setWaveformSettings(sc,window,format,type) | |||||
| if nargin < 4 | |||||
| type = 'HRES'; | |||||
| if nargin < 3 | |||||
| format = 'REAL'; | |||||
| if nargin < 2 | |||||
| window = 'DEF'; | |||||
| end | |||||
| end | end | ||||
| end | end | ||||
| sc.clear; | sc.clear; | ||||
| sc.write('CHAN:TYPE HRES'); | |||||
| sc.write(['CHAN:TYPE ',type]); | |||||
| sc.write(['FORM ',format]); | sc.write(['FORM ',format]); | ||||
| sc.write('FORM:BORD MSBF'); | sc.write('FORM:BORD MSBF'); | ||||
| sc.write(['CHAN:DATA:POIN ',window]); | sc.write(['CHAN:DATA:POIN ',window]); | ||||
| @@ -96,15 +99,18 @@ classdef Oscilloscope < Equipment | |||||
| end | end | ||||
| function data = waveform(sc,channels,window) | |||||
| if nargin < 3 | |||||
| window = 'DEF'; | |||||
| if nargin < 2 | |||||
| channels = 1:sc.nchannels; | |||||
| function data = waveform(sc,channels,window,type) | |||||
| if nargin < 4 | |||||
| type = 'HRES'; | |||||
| if nargin < 3 | |||||
| window = 'DEF'; | |||||
| if nargin < 2 | |||||
| channels = 1:sc.nchannels; | |||||
| end | |||||
| end | end | ||||
| end | end | ||||
| sc.enable_channels; | sc.enable_channels; | ||||
| sc.setWaveformSettings(window); | |||||
| sc.setWaveformSettings(window,'REAL',type); | |||||
| for i = channels | for i = channels | ||||
| curcha = ['ch',num2str(i)]; | curcha = ['ch',num2str(i)]; | ||||
| wave = sc.(curcha).getWaveform; | wave = sc.(curcha).getWaveform; | ||||
| @@ -1,20 +1,88 @@ | |||||
| %% Run the measurements | |||||
| data = transferFunction(oscilloscope,functiongenerator,f_start,f_stop,n_steps,amplitude); | |||||
| %% plot the data | |||||
| %% Plot theory only | |||||
| S = asymptote(S_smaller,S_larger,f,Fc); | S = asymptote(S_smaller,S_larger,f,Fc); | ||||
| P = mod(P,pi); | P = mod(P,pi); | ||||
| figure; | figure; | ||||
| subplot(2,1,1) | |||||
| semilogx(data.frequency,data.magnitude,f,A,f,S) | |||||
| ax1 = subplot(2,1,1); | |||||
| semilogx(f,A,f,S) | |||||
| ylabel('Magnitude [dB]','Fontsize',10); | ylabel('Magnitude [dB]','Fontsize',10); | ||||
| xlabel('Frequency [Hz]','Fontsize',10); | xlabel('Frequency [Hz]','Fontsize',10); | ||||
| legend('Measurement','Theory','Asymptote'); | |||||
| xlim([f_start,f_stop]); | |||||
| legend('Theory','Asymptote'); | |||||
| grid on | grid on | ||||
| title('RC-circuit Bodeplot') | |||||
| subplot(2,1,2); | |||||
| semilogx(data.frequency,data.phase,f,P) | |||||
| title('RC-circuit Bodeplot Theory') | |||||
| ax2 = subplot(2,1,2); | |||||
| semilogx(f,P) | |||||
| ylabel('Phase [rad]','Fontsize',10); | ylabel('Phase [rad]','Fontsize',10); | ||||
| xlabel('Frequency [Hz]','Fontsize',10); | xlabel('Frequency [Hz]','Fontsize',10); | ||||
| legend('Measurement','Theory'); | |||||
| grid on | |||||
| xlim([f_start,f_stop]); | |||||
| legend('Theory'); | |||||
| grid on | |||||
| linkaxes([ax1,ax2],'x') | |||||
| %% Run the measurements | |||||
| if theory_only == false | |||||
| data = transferFunction(oscilloscope,functiongenerator,f_start,f_stop,amplitude,n_steps,n_measurements); | |||||
| %% Process the data | |||||
| A_mean = mean(data.magnitude); | |||||
| P_mean = mean(data.phase); | |||||
| A_std = std(data.magnitude); | |||||
| P_std = std(data.phase); | |||||
| %% plot average measurement, theory and asymptote. | |||||
| figure; | |||||
| ax1 = subplot(2,1,1); | |||||
| semilogx(data.frequency,20*log10(A_mean),f,A,f,S) | |||||
| ylabel('Magnitude [dB]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement','Theory','Asymptote'); | |||||
| grid on | |||||
| title('RC-circuit Bodeplot') | |||||
| ax2 = subplot(2,1,2); | |||||
| semilogx(data.frequency,P_mean,f,P) | |||||
| ylabel('Phase [rad]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement','Theory'); | |||||
| grid on | |||||
| %% plot avearage measurement with standard deviation and theory. | |||||
| figure; | |||||
| ax1 = subplot(2,1,1); | |||||
| ax1.XScale = 'log'; | |||||
| errorbar(data.frequency,20*log10(A_mean),20*log10(A_std)) | |||||
| hold on | |||||
| semilogx(f,A) | |||||
| hold off | |||||
| ylabel('Magnitude [dB]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement','Theory','Asymptote'); | |||||
| grid on | |||||
| title('RC-circuit Bodeplot') | |||||
| ax2 = subplot(2,1,2); | |||||
| ax2.XScale = 'log'; | |||||
| errorbar(data.frequency,P_mean,P_std); | |||||
| hold on | |||||
| semilogx(data.frequency,P_mean,f,P) | |||||
| hold off | |||||
| ylabel('Phase [rad]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement','Theory'); | |||||
| grid on | |||||
| %% plot avearage measurement with standard deviation. | |||||
| figure; | |||||
| ax1 = subplot(2,1,1); | |||||
| ax1.XScale = 'log'; | |||||
| errorbar(data.frequency,20*log10(A_mean),20*log10(A_std)) | |||||
| ylabel('Magnitude [dB]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement'); | |||||
| grid on | |||||
| title('RC-circuit Bodeplot') | |||||
| ax2 = subplot(2,1,2); | |||||
| ax2.XScale = 'log'; | |||||
| errorbar(data.frequency,P_mean,P_std); | |||||
| ylabel('Phase [rad]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement'); | |||||
| grid on | |||||
| end | |||||
| @@ -1,25 +1,85 @@ | |||||
| %% Run the measurements | |||||
| data = transferFunction(oscilloscope,functiongenerator,f_start,f_stop,n_steps,amplitude); | |||||
| %% plot the data | |||||
| %% Plot theory only | |||||
| S = asymptote(S_smaller,S_larger,f,Fc); | S = asymptote(S_smaller,S_larger,f,Fc); | ||||
| P = mod(P,pi); | P = mod(P,pi); | ||||
| figure; | figure; | ||||
| subplot(2,1,1) | |||||
| semilogx(data.frequency,data.magnitude) | |||||
| hold on | |||||
| subplot(2,1,1); | |||||
| semilogx(f,A,f,S) | semilogx(f,A,f,S) | ||||
| hold off | |||||
| ylabel('Magnitude [dB]','Fontsize',10); | ylabel('Magnitude [dB]','Fontsize',10); | ||||
| xlabel('Frequency [Hz]','Fontsize',10); | xlabel('Frequency [Hz]','Fontsize',10); | ||||
| legend('Measurement','Theory','Asymptote'); | |||||
| legend('Theory','Asymptote'); | |||||
| grid on | grid on | ||||
| title('RLC-circuit Bodeplot') | |||||
| title('RLC-circuit Bodeplot Theory') | |||||
| subplot(2,1,2); | subplot(2,1,2); | ||||
| semilogx(data.frequency,data.phase) | |||||
| hold on | |||||
| semilogx(f,P) | semilogx(f,P) | ||||
| hold off | |||||
| ylabel('Phase [rad]','Fontsize',10); | ylabel('Phase [rad]','Fontsize',10); | ||||
| xlabel('Frequency [Hz]','Fontsize',10); | xlabel('Frequency [Hz]','Fontsize',10); | ||||
| legend('Measurement','Theory'); | |||||
| grid on | |||||
| legend('Theory'); | |||||
| grid on | |||||
| %% Run the measurements | |||||
| if theory_only == false | |||||
| data = transferFunction(oscilloscope,functiongenerator,f_start,f_stop,amplitude,n_steps,n_measurements); | |||||
| %% Process the data | |||||
| A_mean = mean(data.magnitude); | |||||
| P_mean = mean(data.phase); | |||||
| A_std = std(data.magnitude); | |||||
| P_std = std(data.phase); | |||||
| %% plot average measurement, theory and asymptote. | |||||
| figure; | |||||
| subplot(2,1,1); | |||||
| semilogx(data.frequency,20*log10(A_mean),f,A,f,S) | |||||
| ylabel('Magnitude [dB]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement','Theory','Asymptote'); | |||||
| grid on | |||||
| title('RLC-circuit Bodeplot') | |||||
| subplot(2,1,2); | |||||
| semilogx(data.frequency,P_mean,f,P) | |||||
| ylabel('Phase [rad]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement','Theory'); | |||||
| grid on | |||||
| %% plot avearage measurement with standard deviation and theory. | |||||
| figure; | |||||
| ax = subplot(2,1,1); | |||||
| ax.XScale = 'log'; | |||||
| errorbar(data.frequency,20*log10(A_mean),20*log10(A_std)) | |||||
| hold on | |||||
| semilogx(f,A) | |||||
| hold off | |||||
| ylabel('Magnitude [dB]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement','Theory','Asymptote'); | |||||
| grid on | |||||
| title('RLC-circuit Bodeplot') | |||||
| ax = subplot(2,1,2); | |||||
| ax.XScale = 'log'; | |||||
| errorbar(data.frequency,P_mean,P_std); | |||||
| hold on | |||||
| semilogx(data.frequency,P_mean,f,P) | |||||
| hold off | |||||
| ylabel('Phase [rad]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement','Theory'); | |||||
| grid on | |||||
| %% plot avearage measurement with standard deviation. | |||||
| figure; | |||||
| ax = subplot(2,1,1); | |||||
| ax.XScale = 'log'; | |||||
| errorbar(data.frequency,20*log10(A_mean),20*log10(A_std)) | |||||
| ylabel('Magnitude [dB]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement'); | |||||
| grid on | |||||
| title('RLC-circuit Bodeplot') | |||||
| ax = subplot(2,1,2); | |||||
| ax.XScale = 'log'; | |||||
| errorbar(data.frequency,P_mean,P_std); | |||||
| ylabel('Phase [rad]','Fontsize',10); | |||||
| xlabel('Frequency [Hz]','Fontsize',10); | |||||
| legend('Average Measurement'); | |||||
| grid on | |||||
| end | |||||
| @@ -8,6 +8,6 @@ n = 2^nextpow2(length); | |||||
| X = fft(wave,n,2)/n; | X = fft(wave,n,2)/n; | ||||
| idx = ceil(frequency*n/Fs); | idx = ceil(frequency*n/Fs); | ||||
| phase = mod(angle(mean(X(2,idx)))-angle(mean(X(1,idx))),pi); | phase = mod(angle(mean(X(2,idx)))-angle(mean(X(1,idx))),pi); | ||||
| magnitude = 20*log10(abs(X(2,idx))/abs(X(1,idx))); | |||||
| magnitude = abs(X(2,idx))/abs(X(1,idx)); | |||||
| end | end | ||||
| @@ -1,4 +1,4 @@ | |||||
| function data = transferFunction(oscilloscope,functiongenerator,f_start,f_stop,n_steps,amplitude) | |||||
| function data = transferFunction(oscilloscope,functiongenerator,f_start,f_stop,amplitude,n_steps,n_measurements) | |||||
| %TRANSFERFUNCTION Summary of this function goes here | %TRANSFERFUNCTION Summary of this function goes here | ||||
| % Detailed explanation goes here | % Detailed explanation goes here | ||||
| @@ -7,14 +7,16 @@ function data = transferFunction(oscilloscope,functiongenerator,f_start,f_stop,n | |||||
| functiongenerator.waveform = 'SINUSOID'; | functiongenerator.waveform = 'SINUSOID'; | ||||
| oscilloscope.enable_channels; | oscilloscope.enable_channels; | ||||
| oscilloscope.trigger.source = 'CH1'; | oscilloscope.trigger.source = 'CH1'; | ||||
| emptydata = zeros(n_steps,1); | |||||
| emptydata = zeros(n_measurements,n_steps); | |||||
| data = struct('magnitude',emptydata,'phase',emptydata,'frequency',f_array); | data = struct('magnitude',emptydata,'phase',emptydata,'frequency',f_array); | ||||
| for i = 1:n_steps | |||||
| fprintf('Measurement %i of %i - Frequency: %.2f Hertz\n',i,n_steps,f_array(i)); | |||||
| functiongenerator.frequency = f_array(i); | |||||
| oscilloscope.auto; | |||||
| wavedata = oscilloscope.waveform(1:2); | |||||
| [data.phase(i),data.magnitude(i)] = phamag(wavedata.ch1,wavedata.ch2,wavedata.length,f_array(i),wavedata.sampletime); | |||||
| for j = 1:n_measurements | |||||
| for i = 1:n_steps | |||||
| % fprintf('Measurement %i of %i - Frequency: %.2f Hertz\n',i,n_steps,f_array(i)); | |||||
| functiongenerator.frequency = f_array(i); | |||||
| oscilloscope.auto; | |||||
| wavedata = oscilloscope.waveform(1:2,'DEF','SAMP'); | |||||
| [data.phase(j,i),data.magnitude(j,i)] = phamag(wavedata.ch1,wavedata.ch2,wavedata.length,f_array(i),wavedata.sampletime); | |||||
| end | |||||
| end | end | ||||
| %bodePlot(data.magnitude,data.phase,data.frequency) | %bodePlot(data.magnitude,data.phase,data.frequency) | ||||
| end | end | ||||