Analyze: dac noise, pre-amp noise, amp bandwidth
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								figs/asd_noise_3uF_warmup.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								figs/asd_noise_3uF_warmup.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								figs/asd_noise_3uF_warmup.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								figs/asd_noise_3uF_warmup.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 161 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								figs/noise_shunt_time_3uF_warmup.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								figs/noise_shunt_time_3uF_warmup.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								figs/noise_shunt_time_3uF_warmup.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								figs/noise_shunt_time_3uF_warmup.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 78 KiB  | 
							
								
								
									
										504
									
								
								index.org
									
									
									
									
									
								
							
							
						
						
									
										504
									
								
								index.org
									
									
									
									
									
								
							@@ -179,7 +179,313 @@ addpath('./matlab/');
 | 
			
		||||
addpath('./mat/');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
*** Noise when shunting the input (50 Ohms)
 | 
			
		||||
*** Pre-Amp Noise
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
preamp = load('mat/noise_preamp_5113.mat', 't', 'Vn', 'notes');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
preamp.Vn = preamp.Vn/preamp.notes.pre_amp.gain;
 | 
			
		||||
preamp.Vn = preamp.Vn - mean(preamp.Vn);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
figure;
 | 
			
		||||
plot(preamp.t, preamp.Vn);
 | 
			
		||||
xlabel('Time [s]');
 | 
			
		||||
ylabel('Voltage [V]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
% Sampling time / frequency
 | 
			
		||||
Ts = (preamp.t(end) - preamp.t(1))/(length(preamp.t) - 1);
 | 
			
		||||
Fs = 1/Ts;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
win = hanning(ceil(0.5/Ts));
 | 
			
		||||
 | 
			
		||||
[pxx, f] = pwelch(preamp.Vn, win, [], [], Fs);
 | 
			
		||||
 | 
			
		||||
preamp.pxx = pxx;
 | 
			
		||||
preamp.f = f;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(preamp.f, sqrt(preamp.pxx));
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
xlim([1, Fs/2]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
*** DAC (16bits) Noise
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
dac = load('mat/noise_preamp_5113_dac.mat', 't', 'Vn', 'notes');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
dac.Vn = dac.Vn/dac.notes.pre_amp.gain;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
dac.Vn = dac.Vn - mean(dac.Vn);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
figure;
 | 
			
		||||
plot(dac.t, 1e6*dac.Vn);
 | 
			
		||||
xlabel('Time [s]');
 | 
			
		||||
ylabel('Voltage [$\mu V$]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
% Sampling time / frequency
 | 
			
		||||
Ts = (dac.t(end) - dac.t(1))/(length(dac.t) - 1);
 | 
			
		||||
Fs = 1/Ts;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The PSD of the measured noise is computed and the ASD is shown in Figure [[fig:asd_noise_3uF]].
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
win = hanning(ceil(0.5/Ts));
 | 
			
		||||
 | 
			
		||||
[pxx, f] = pwelch(dac.Vn, win, [], [], Fs);
 | 
			
		||||
dac.pxx = pxx;
 | 
			
		||||
dac.f = f;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(dac.f, sqrt(dac.pxx), 'DisplayName', 'DAC');
 | 
			
		||||
plot(dac.f, ones(size(dac.f))*(10/2^16)/sqrt(12*Fs)/dac.notes.pre_amp.gain, 'k--', 'DisplayName', 'ADC quant.');
 | 
			
		||||
plot(preamp.f, sqrt(preamp.pxx), 'DisplayName', 'Pre Amp');
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
xlim([1, Fs/2]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
*** SSI2V DAC (20bits) Noise
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
ssi2v = load('mat/noise_preamp_5113_SSI2V.mat', 't', 'Vn', 'notes');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
ssi2v.Vn = ssi2v.Vn/ssi2v.notes.pre_amp.gain;
 | 
			
		||||
ssi2v.Vn = ssi2v.Vn - mean(ssi2v.Vn);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
figure;
 | 
			
		||||
plot(ssi2v.t, 1e6*ssi2v.Vn);
 | 
			
		||||
xlabel('Time [s]');
 | 
			
		||||
ylabel('Voltage [$\mu V$]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
% Sampling time / frequency
 | 
			
		||||
Ts = (ssi2v.t(end) - ssi2v.t(1))/(length(ssi2v.t) - 1);
 | 
			
		||||
Fs = 1/Ts;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The PSD of the measured noise is computed and the ASD is shown in Figure [[fig:asd_noise_3uF]].
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
win = hanning(ceil(0.5/Ts));
 | 
			
		||||
 | 
			
		||||
[pxx, f] = pwelch(ssi2v.Vn, win, [], [], Fs);
 | 
			
		||||
ssi2v.pxx = pxx;
 | 
			
		||||
ssi2v.f = f;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(dac.f, sqrt(dac.pxx), 'DisplayName', 'DAC');
 | 
			
		||||
plot(ssi2v.f, sqrt(ssi2v.pxx), 'DisplayName', 'SSI2V');
 | 
			
		||||
plot(ssi2v.f, ones(size(ssi2v.f))*(10/2^16)/sqrt(12*Fs)/ssi2v.notes.pre_amp.gain, 'k--', 'DisplayName', 'ADC quant.');
 | 
			
		||||
plot(preamp.f, sqrt(preamp.pxx), 'DisplayName', 'Pre Amp');
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
xlim([1, Fs/2]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
*** Noise when shunting the input (50 Ohms) - After Warmup
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
%% Load all the measurements
 | 
			
		||||
pd200w = {};
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    pd200w(i) = {load(['mat/noise_PD200_' num2str(i) '_3uF_warmup.mat'], 't', 'Vn', 'notes')};
 | 
			
		||||
end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
%% Take into account the pre-amplifier gain
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    pd200w{i}.Vn = pd200w{i}.Vn/pd200w{i}.notes.pre_amp.gain;
 | 
			
		||||
end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The time domain measurements of the amplifier noise are shown in Figure [[fig:noise_shunt_time_3uF]].
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    plot(pd200w{i}.t, 1e3*pd200w{i}.Vn)
 | 
			
		||||
end
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Time [s]');
 | 
			
		||||
ylabel('Voltage [mV]');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
exportFig('figs/noise_shunt_time_3uF_warmup.pdf', 'width', 'wide', 'height', 'normal');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:noise_shunt_time_3uF_warmup
 | 
			
		||||
#+caption: Time domain measurement of the amplifier output noise
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/noise_shunt_time_3uF_warmup.png]]
 | 
			
		||||
 | 
			
		||||
The obtained RMS and peak to peak values of the measured noises are shown in Table [[tab:rms_pkp_noise]].
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
%% Compute the RMS and Peak to Peak noise
 | 
			
		||||
Vn_rms = zeros(7,1); % RMS value [uV rms]
 | 
			
		||||
Vn_pkp = zeros(7,1); % Peak to Peak Value in 20Hz bandwidth [mV]
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    Vn_rms(i) = 1e6*rms(pd200w{i}.Vn);
 | 
			
		||||
    Vn_lpf = lsim(1/(1 + s/2/pi/20), pd200w{i}.Vn, pd200w{i}.t);
 | 
			
		||||
    Vn_pkp(i) = 1e3*(max(Vn_lpf)-min(Vn_lpf));
 | 
			
		||||
end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
 | 
			
		||||
data2orgtable([[714; Vn_rms], [4.3; Vn_pkp]], {'Specification [10uF]', 'PD200_1', 'PD200_2', 'PD200_3', 'PD200_4', 'PD200_5', 'PD200_6', 'PD200_7'}, {'*RMS [uV]*', '*Peak to Peak [mV]*'}, ' %.1f ');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: tab:rms_pkp_noise
 | 
			
		||||
#+caption: RMS and Peak to Peak measured noise
 | 
			
		||||
#+attr_latex: :environment tabularx :width \linewidth :align lXX
 | 
			
		||||
#+attr_latex: :center t :booktabs t :float t
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
|                      | *RMS [uV]* | *Peak to Peak [mV]* |
 | 
			
		||||
|----------------------+------------+---------------------|
 | 
			
		||||
| Specification [10uF] |      714.0 |                 4.3 |
 | 
			
		||||
| PD200_1              |      565.1 |                 3.7 |
 | 
			
		||||
| PD200_2              |      767.6 |                 3.5 |
 | 
			
		||||
| PD200_3              |      479.9 |                 3.0 |
 | 
			
		||||
| PD200_4              |      615.7 |                 3.5 |
 | 
			
		||||
| PD200_5              |      651.0 |                 2.4 |
 | 
			
		||||
| PD200_6              |      473.2 |                 2.7 |
 | 
			
		||||
| PD200_7              |      423.1 |                 2.3 |
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
% Sampling time / frequency
 | 
			
		||||
Ts = (pd200w{1}.t(end) - pd200w{1}.t(1))/(length(pd200w{1}.t) - 1);
 | 
			
		||||
Fs = 1/Ts;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The PSD of the measured noise is computed and the ASD is shown in Figure [[fig:asd_noise_3uF]].
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
win = hanning(ceil(0.5/Ts));
 | 
			
		||||
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    [pxx, f] = pwelch(pd200w{i}.Vn, win, [], [], Fs);
 | 
			
		||||
    pd200w{i}.f = f;
 | 
			
		||||
    pd200w{i}.pxx = pxx;
 | 
			
		||||
end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    plot(pd200w{i}.f, sqrt(pd200w{i}.pxx), 'DisplayName', sprintf('PD200W-%i', i));
 | 
			
		||||
end
 | 
			
		||||
plot(preamp.f, sqrt(preamp.pxx), 'k-', 'DisplayName', 'Pre Amp');
 | 
			
		||||
plot(dac.f, ones(size(dac.f))*(10/2^16)/sqrt(12*Fs)/pd200w{1}.notes.pre_amp.gain, 'k--', 'DisplayName', 'ADC quant.');
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
xlim([1, Fs/2]);
 | 
			
		||||
% ylim([5e-7, 1e-3]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
exportFig('figs/asd_noise_3uF_warmup.pdf', 'width', 'wide', 'height', 'tall');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:asd_noise_3uF_warmup
 | 
			
		||||
#+caption: Amplitude Spectral Density of the measured noise
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/asd_noise_3uF_warmup.png]]
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
Gn = 1e-6*(s + 2*pi*40)^2/(s + 2*pi)^2;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
freqs = logspace(0, 4, 1000);
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    plot(pd200w{i}.f, sqrt(pd200w{i}.pxx), 'DisplayName', sprintf('PD200W-%i', i));
 | 
			
		||||
end
 | 
			
		||||
plot(freqs, abs(squeeze(freqresp(Gn, freqs, 'Hz'))), 'k--', 'DisplayName', '$|G_n(j\omega)|$');
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
xlim([1, Fs/2]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
*** Load / No Load                                                :noexport:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
pd200_load = load('noise_PD200_7_3uF_warmup.mat');
 | 
			
		||||
pd200_no_load = load('noise_PD200_7_no_load.mat');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
pd200_load.Vn = pd200_load.Vn/pd200_load.notes.pre_amp.gain;
 | 
			
		||||
pd200_no_load.Vn = pd200_no_load.Vn/pd200_no_load.notes.pre_amp.gain;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
% Sampling time / frequency
 | 
			
		||||
Ts = (pd200_load.t(end) - pd200_load.t(1))/(length(pd200_load.t) - 1);
 | 
			
		||||
Fs = 1/Ts;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The PSD of the measured noise is computed and the ASD is shown in Figure [[fig:asd_noise_3uF]].
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
win = hanning(ceil(0.5/Ts));
 | 
			
		||||
 | 
			
		||||
[pxx_load, f] = pwelch(pd200_load.Vn, win, [], [], Fs);
 | 
			
		||||
[pxx_no_load, ~] = pwelch(pd200_no_load.Vn, win, [], [], Fs);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(f, sqrt(pxx_load), 'DisplayName', 'Load');
 | 
			
		||||
plot(f, sqrt(pxx_no_load), 'DisplayName', 'No Load');
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
xlim([1, Fs/2]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
*** Noise when shunting the input (50 Ohms)                       :noexport:
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
%% Load all the measurements
 | 
			
		||||
@@ -310,6 +616,111 @@ exportFig('figs/asd_noise_3uF.pdf', 'width', 'wide', 'height', 'tall');
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/asd_noise_3uF.png]]
 | 
			
		||||
 | 
			
		||||
*** Noise with DAC at the input of the PD200
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
%% Load all the measurements
 | 
			
		||||
pd200dac = {};
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    pd200dac(i) = {load(['mat/noise_PD200_' num2str(i) '_3uF_DAC.mat'], 't', 'Vn', 'notes')};
 | 
			
		||||
end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
%% Take into account the pre-amplifier gain
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    pd200dac{i}.Vn = pd200dac{i}.Vn/pd200dac{i}.notes.pre_amp.gain;
 | 
			
		||||
    pd200dac{i}.Vn = pd200dac{i}.Vn - mean(pd200dac{i}.Vn);
 | 
			
		||||
end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The time domain measurements of the amplifier noise are shown in Figure [[fig:noise_shunt_time_3uF]].
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    plot(pd200dac{i}.t, 1e3*pd200dac{i}.Vn)
 | 
			
		||||
end
 | 
			
		||||
hold off;
 | 
			
		||||
xlabel('Time [s]');
 | 
			
		||||
ylabel('Voltage [mV]');
 | 
			
		||||
xlim([0, 0.1]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
exportFig('figs/noise_shunt_time_3uF_dac.pdf', 'width', 'wide', 'height', 'normal');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:noise_shunt_time_3uF_dac
 | 
			
		||||
#+caption: Time domain measurement of the amplifier output noise
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/noise_shunt_time_3uF_dac.png]]
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
% Sampling time / frequency
 | 
			
		||||
Ts = (pd200dac{1}.t(end) - pd200dac{1}.t(1))/(length(pd200dac{1}.t) - 1);
 | 
			
		||||
Fs = 1/Ts;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The PSD of the measured noise is computed and the ASD is shown in Figure [[fig:asd_noise_3uF]].
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
win = hanning(ceil(0.5/Ts));
 | 
			
		||||
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    [pxx, f] = pwelch(pd200dac{i}.Vn, win, [], [], Fs);
 | 
			
		||||
    pd200dac{i}.f = f;
 | 
			
		||||
    pd200dac{i}.pxx = pxx;
 | 
			
		||||
end
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
for i = 1:7
 | 
			
		||||
    plot(pd200dac{i}.f, sqrt(pd200dac{i}.pxx), 'DisplayName', sprintf('PD200DAC-%i', i));
 | 
			
		||||
end
 | 
			
		||||
plot(preamp.f, sqrt(preamp.pxx), 'k-', 'DisplayName', 'Pre Amp');
 | 
			
		||||
plot(dac.f, 20*sqrt(dac.pxx), 'k-', 'DisplayName', 'ADC noise');
 | 
			
		||||
plot(dac.f, ones(size(dac.f))*(10/2^16)/sqrt(12*Fs)/pd200dac{1}.notes.pre_amp.gain, 'k--', 'DisplayName', 'ADC quant.');
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
xlim([1, Fs/2]);
 | 
			
		||||
% ylim([5e-7, 1e-3]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no :exports results :results file replace
 | 
			
		||||
exportFig('figs/asd_noise_3uF_dac.pdf', 'width', 'wide', 'height', 'tall');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+name: fig:asd_noise_3uF_dac
 | 
			
		||||
#+caption: Amplitude Spectral Density of the measured noise
 | 
			
		||||
#+RESULTS:
 | 
			
		||||
[[file:figs/asd_noise_3uF_dac.png]]
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(pd200dac{1}.f, sqrt(pd200dac{1}.pxx), 'DisplayName', 'PD200 + DAC');
 | 
			
		||||
plot(pd200w{1}.f, sqrt(pd200w{1}.pxx), 'DisplayName', 'PD200');
 | 
			
		||||
plot(dac.f, 20*sqrt(dac.pxx), 'k-', 'DisplayName', 'DAC');
 | 
			
		||||
plot(preamp.f, sqrt(preamp.pxx), 'k-', 'DisplayName', 'Pre Amp');
 | 
			
		||||
plot(dac.f, ones(size(dac.f))*(10/2^16)/sqrt(12*Fs)/pd200dac{1}.notes.pre_amp.gain, 'k--', 'DisplayName', 'ADC quant.');
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
 | 
			
		||||
legend('location', 'southwest');
 | 
			
		||||
xlim([1, Fs/2]);
 | 
			
		||||
% ylim([5e-7, 1e-3]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_important
 | 
			
		||||
The output noise of the PD200 amplifier is limited by the noise of the DAC.
 | 
			
		||||
#+end_important
 | 
			
		||||
 | 
			
		||||
*** TODO Noise with SSI2V at the input of the PD200
 | 
			
		||||
 | 
			
		||||
* Transfer Function measurement
 | 
			
		||||
** Setup
 | 
			
		||||
In order to measure the transfer function from the input voltage $V_{in}$ to the output voltage $V_{out}$, the test bench shown in Figure [[fig:setup-dynamics-measurement]] is used.
 | 
			
		||||
@@ -327,7 +738,98 @@ For this measurement, the sampling frequency of the Speedgoat ADC should be as h
 | 
			
		||||
#+caption: Schematic of the test bench to estimate the dynamics from voltage input $V_{in}$ to voltage output $V_{out}$
 | 
			
		||||
[[file:figs/setup-dynamics-measurement.png]]
 | 
			
		||||
 | 
			
		||||
** Maximum Frequency/Voltage to not overload the amplifier
 | 
			
		||||
 | 
			
		||||
The maximum current is 1A [rms] which corresponds to 0.7A in amplitude of the sin wave.
 | 
			
		||||
 | 
			
		||||
The impedance of the capacitance is:
 | 
			
		||||
\[ Z_C(\omega) = \frac{1}{jC\omega} \]
 | 
			
		||||
 | 
			
		||||
Therefore the relation between the output current and the output voltage is (in amplitude):
 | 
			
		||||
\[ V_{out} = \frac{1}{C\omega} I_{out} \]
 | 
			
		||||
 | 
			
		||||
There is a gain of 20 between the input voltage and the output voltage:
 | 
			
		||||
\[ 20 V_{in} = \frac{1}{C\omega} I_{out} \]
 | 
			
		||||
 | 
			
		||||
For a specified voltage input amplitude $V_{in}$, the maximum frequency is then:
 | 
			
		||||
\[ \omega_{\text{max}} = \frac{1}{20 C V_{in}} I_{out,\text{max}} \]
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
Iout_max = 0.7; % Maximum output current [A]
 | 
			
		||||
C = 3e-6; % Load Capacitance [F]
 | 
			
		||||
 | 
			
		||||
V_in = linspace(0, 5, 100); % Input Voltage [V]
 | 
			
		||||
 | 
			
		||||
w_max = 1./(20*C*V_in) * Iout_max; % [rad/s]
 | 
			
		||||
 | 
			
		||||
figure;
 | 
			
		||||
plot(V_in, w_max/2/pi);
 | 
			
		||||
xlabel('Input Voltage Amplitude [V]');
 | 
			
		||||
ylabel('Maximum Frequency [Hz]');
 | 
			
		||||
set(gca, 'yscale', 'log');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
** Results
 | 
			
		||||
*** Matlab Init                                            :noexport:ignore:
 | 
			
		||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
 | 
			
		||||
<<matlab-dir>>
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none :results silent :noweb yes
 | 
			
		||||
<<matlab-init>>
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :tangle no
 | 
			
		||||
addpath('./matlab/mat/');
 | 
			
		||||
addpath('./matlab/');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :eval no
 | 
			
		||||
addpath('./mat/');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
*** First test
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
pd200_1V_1 = load('mat/tf_pd200_7_1V.mat', 't', 'Vin', 'Vout', 'Iout');
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
Ts = (pd200_1V_1.t(end) - pd200_1V_1.t(1))/(length(pd200_1V_1.t)-1);
 | 
			
		||||
Fs = 1/Ts;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
win = hanning(ceil(1*Fs));
 | 
			
		||||
 | 
			
		||||
[tf_1, f] = tfestimate(pd200_1V_1.Vin, pd200_1V_1.Vout, win, [], [], 1/Ts);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab :exports none
 | 
			
		||||
figure;
 | 
			
		||||
tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None');
 | 
			
		||||
 | 
			
		||||
ax1 = nexttile([2,1]);
 | 
			
		||||
hold on;
 | 
			
		||||
plot(f, abs(tf_1));
 | 
			
		||||
hold off;
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
 | 
			
		||||
ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]);
 | 
			
		||||
hold off;
 | 
			
		||||
ylim([1e-1, 1e1]);
 | 
			
		||||
 | 
			
		||||
ax2 = nexttile;
 | 
			
		||||
hold on;
 | 
			
		||||
plot(f, 180/pi*angle(tf_1));
 | 
			
		||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
 | 
			
		||||
yticks(-360:15:360);
 | 
			
		||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
 | 
			
		||||
hold off;
 | 
			
		||||
ylim([-45, 15]);
 | 
			
		||||
 | 
			
		||||
linkaxes([ax1,ax2],'x');
 | 
			
		||||
xlim([1, 2e3]);
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
* Conclusion
 | 
			
		||||
 | 
			
		||||
#+name: tab:table_name
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user