test-bench-pd200/index.org

851 lines
28 KiB
Org Mode
Raw Normal View History

2020-12-15 23:03:14 +01:00
#+TITLE: Voltage Amplifier PD200 - Test Bench
:DRAWER:
#+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com
#+AUTHOR: Dehaeze Thomas
#+HTML_LINK_HOME: ../index.html
#+HTML_LINK_UP: ../index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+BIND: org-latex-image-default-option "scale=1"
#+BIND: org-latex-image-default-width ""
#+LaTeX_CLASS: scrreprt
#+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full]
#+LaTeX_HEADER_EXTRA: \input{preamble.tex}
#+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org
#+PROPERTY: header-args:matlab+ :exports both
#+PROPERTY: header-args:matlab+ :results none
#+PROPERTY: header-args:matlab+ :eval no-export
#+PROPERTY: header-args:matlab+ :noweb yes
#+PROPERTY: header-args:matlab+ :mkdirp yes
#+PROPERTY: header-args:matlab+ :output-dir figs
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
#+PROPERTY: header-args:latex+ :results file raw replace
#+PROPERTY: header-args:latex+ :buffer no
#+PROPERTY: header-args:latex+ :tangle no
#+PROPERTY: header-args:latex+ :eval no-export
#+PROPERTY: header-args:latex+ :exports results
#+PROPERTY: header-args:latex+ :mkdirp yes
#+PROPERTY: header-args:latex+ :output-dir figs
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
:END:
2021-01-13 12:14:03 +01:00
* Introduction
2020-12-15 23:03:14 +01:00
The goal of this test bench is to characterize the Voltage amplifier [[https://www.piezodrive.com/drivers/pd200-60-watt-voltage-amplifier/][PD200]] from PiezoDrive.
2020-12-16 16:21:54 +01:00
The documentation of the PD200 is accessible [[file:doc/PD200-V7-R1.pdf][here]].
2021-01-04 11:09:04 +01:00
#+name: fig:amplifier_PD200
#+caption: Picture of the PD200 Voltage Amplifier
2021-01-13 12:14:03 +01:00
#+attr_latex: :width 0.8\linewidth
2021-01-04 11:09:04 +01:00
[[file:figs/amplifier_PD200.png]]
2020-12-16 16:21:54 +01:00
* Voltage Amplifier Requirements
#+name: tab:voltage_amplifier_requirements
#+caption: Requirements for the Voltage Amplifier
#+attr_latex: :environment tabularx :width 0.5\linewidth :align lX
#+attr_latex: :center t :booktabs t :float t
| <l> | <c> |
| | *Specification* |
|--------------------------------+--------------------|
| Continuous Current | > 50 [mA] |
| Output Voltage Noise (1-200Hz) | < 2 [mV rms] |
| Voltage Input Range | +/- 10 [V] |
| Voltage Output Range | -20 [V] to 150 [V] |
| Small signal bandwidth (-3dB) | > 5 [kHz] |
* PD200 Expected characteristics
#+name: tab:pd200_characteristics
#+caption: Characteristics of the PD200
#+attr_latex: :environment tabularx :width \linewidth :align lXX
#+attr_latex: :center t :booktabs t :float t
| <l> | <c> | <c> |
| *Characteristics* | *Manual* | *Specification* |
|-------------------------------------+--------------+-----------------|
| Input Voltage Range | +/- 10 [V] | +/- 10 [V] |
| Output Voltage Range | -50/150 [V] | -20/150 [V] |
| Gain | 20 [V/V] | |
| Maximum RMS current | 0.9 [A] | > 50 [mA] |
| Maximum Pulse current | 10 [A] | |
| Slew Rate | 150 [V/us] | |
| Noise (10uF load) | 0.7 [mV RMS] | < 2 [mV rms] |
| Small Signal Bandwidth (10uF load) | 7.4 [kHz] | > 5 [kHz] |
| Large Signal Bandwidth (150V, 10uF) | 300 [Hz] | |
For a load capacitance of $10\,\mu F$, the expected $-3\,dB$ bandwidth is $6.4\,kHz$ (Figure [[fig:pd200_expected_small_signal_bandwidth]]) and the low frequency noise is $650\,\mu V\,\text{rms}$ (Figure [[fig:pd200_expected_noise]]).
#+name: fig:pd200_expected_small_signal_bandwidth
#+caption:Expected small signal bandwidth
2021-01-13 12:14:03 +01:00
#+attr_latex: :width 0.8\linewidth
2020-12-16 16:21:54 +01:00
[[file:./figs/pd200_expected_small_signal_bandwidth.png]]
#+name: fig:pd200_expected_noise
#+caption: Expected Low frequency noise from 0.03Hz to 20Hz
2021-01-13 12:14:03 +01:00
#+attr_latex: :width 0.8\linewidth
2020-12-16 16:21:54 +01:00
[[file:figs/pd200_expected_noise.png]]
2020-12-15 23:03:14 +01:00
* Voltage Amplifier Model
2020-12-16 16:21:54 +01:00
The Amplifier is characterized by its dynamics $G_a(s)$ from voltage inputs $V_{in}$ to voltage output $V_{out}$.
2020-12-15 23:03:14 +01:00
Ideally, the gain from $V_{in}$ to $V_{out}$ is constant over a wide frequency band with very small phase drop.
2020-12-16 16:21:54 +01:00
It is also characterized by its output noise $n$.
2020-12-15 23:03:14 +01:00
This noise is described by its Power Spectral Density.
2021-01-13 12:14:03 +01:00
The objective is therefore to determine the transfer function $G_a(s)$ from the input voltage to the output voltage as well as the Power Spectral Density $S_n(\omega)$ of the amplifier output noise.
As both $G_a$ and $S_n$ depends on the load capacitance, they should be measured when loading the amplifier with a $\SI{10}{\micro\farad}$ capacitor.
2020-12-15 23:03:14 +01:00
#+begin_src latex :file pd200-model-schematic.pdf
\begin{tikzpicture}
2020-12-16 16:21:54 +01:00
\node[block] (G) at (0,0){$G_a(s)$};
\node[addb, right=0.8 of G] (add){};
2020-12-15 23:03:14 +01:00
2020-12-16 16:21:54 +01:00
\draw[<-] (G.west) -- ++(-1.2, 0) node[above right]{$V_{in}$};
\draw[->] (G.east) -- (add.west);
\draw[->] (add.east) -- ++(1.2, 0) node[above left]{$V_{out}$};
2020-12-15 23:03:14 +01:00
\draw[<-] (add.north) -- ++(0, 0.6) node[below right](n){$n$};
\begin{scope}[on background layer]
2020-12-16 16:21:54 +01:00
\node[fit={(G.south west) (n.north-|add.east)}, inner sep=8pt, draw, dashed, fill=black!20!white] (P) {};
2020-12-15 23:03:14 +01:00
\node[below] at (P.north) {PD-200};
\end{scope}
\end{tikzpicture}
#+end_src
#+name: fig:pd200-model-schematic
#+caption: Model of the voltage amplifier
#+RESULTS:
[[file:figs/pd200-model-schematic.png]]
* Noise measurement
2020-12-16 16:21:54 +01:00
** Setup
2020-12-15 23:03:14 +01:00
#+begin_note
Here are the documentation of the equipment used for this test bench:
- Voltage Amplifier [[file:doc/PD200-V7-R1.pdf][PD200]]
2021-01-13 12:14:03 +01:00
- Load Capacitor [[file:doc/0900766b815ea422.pdf][EPCOS 10uF Multilayer Ceramic Capacitor]]
2020-12-15 23:03:14 +01:00
- Low Noise Voltage Amplifier [[file:doc/egg-5113-preamplifier.pdf][EG&G 5113]]
- Speedgoat ADC [[file:doc/IO131-OEM-Datasheet.pdf][IO313]]
#+end_note
2020-12-16 16:21:54 +01:00
The output noise of the voltage amplifier PD200 is foreseen to be around 1mV rms in a bandwidth from DC to 1MHz.
If we suppose a white noise, this correspond to an amplitude spectral density:
\begin{equation}
\phi_{n} \approx \frac{1\,mV}{\sqrt{1\,MHz}} = 1 \frac{\mu V}{\sqrt{Hz}}
\end{equation}
The RMS noise begin very small compare to the ADC resolution, we must amplify the noise before digitizing the signal.
The added noise of the instrumentation amplifier should be much smaller than the noise of the PD200.
2021-01-13 12:14:03 +01:00
We use the amplifier EG&G 5113 that has a noise of $\approx 4 nV/\sqrt{Hz}$ referred to its input which is much smaller than the noise induced by the PD200.
2020-12-16 16:21:54 +01:00
The gain of the low-noise amplifier can be increased until the full range of the ADC is used.
This gain should be around 1000.
2020-12-15 23:03:14 +01:00
#+name: fig:setup-noise-measurement
#+caption: Schematic of the test bench to measure the Power Spectral Density of the Voltage amplifier noise $n$
#+attr_latex: :width \linewidth
[[file:figs/setup-noise-measurement.png]]
2021-01-13 12:14:03 +01:00
A low pass filter at 10kHz can be included in the EG&G amplifier in order to limit aliasing.
An high pass filter at low frequency can be added if there is a problem of large offset.
2020-12-16 16:21:54 +01:00
** Results
2021-01-19 23:13:03 +01:00
*** 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
*** 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:
2021-01-19 23:13:03 +01:00
#+begin_src matlab :exports none
%% Load all the measurements
pd200 = {};
for i = 1:7
pd200(i) = {load(['mat/noise_PD200_' num2str(i) '.mat'], 't', 'Vn', 'notes')};
end
%% Take into account the pre-amplifier gain
for i = 1:7
pd200{i}.Vn = pd200{i}.Vn/pd200{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(pd200{i}.t, 1e3*pd200{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.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:noise_shunt_time_3uF
#+caption: Time domain measurement of the amplifier output noise
#+RESULTS:
[[file:figs/noise_shunt_time_3uF.png]]
Obtained low frequency (0.1Hz - 20Hz) noise is shown in Figure [[fig:low_noise_time_domain_3uF]] which is very similar to the noise shown in the documentation (Figure [[fig:pd200_expected_noise]]).
#+begin_src matlab :exports none
figure;
hold on;
plot(pd200{1}.t, lsim(1/(1 + s/2/pi/20), 1e3*pd200{1}.Vn, pd200{1}.t))
hold off;
xlabel('Time [s]');
ylabel('Voltage [mV]');
xlim([0, 40]); ylim([-3, 3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/low_noise_time_domain_3uF.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:low_noise_time_domain_3uF
#+caption: Low Frequency Noise (0.1Hz - 20Hz)
#+RESULTS:
[[file:figs/low_noise_time_domain_3uF.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 [mV]
for i = 1:7
Vn_rms(i) = 1e6*rms(pd200{i}.Vn);
Vn_pkp(i) = 1e3*(max(pd200{i}.Vn)-min(pd200{i}.Vn));
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 | 524.9 | 4.5 |
| PD200_2 | 807.7 | 6.7 |
| PD200_3 | 630.3 | 5.4 |
| PD200_4 | 619.7 | 5.5 |
| PD200_5 | 630.8 | 5.6 |
| PD200_6 | 517.3 | 4.9 |
| PD200_7 | 393.8 | 3.7 |
#+begin_src matlab :exports none
% Sampling time / frequency
Ts = (pd200{1}.t(end) - pd200{1}.t(1))/(length(pd200{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));
[pxx, f] = pwelch(pd200{1}.Vn, win, [], [], Fs);
pxx = zeros(length(pxx), 7);
for i = 1:7
pxx(:, i) = pwelch(pd200{i}.Vn, win, [], [], Fs);
end
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
for i = 1:7
plot(f, sqrt(pxx(:, i)), 'DisplayName', sprintf('PD200-%i', i));
end
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
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/asd_noise_3uF.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:asd_noise_3uF
#+caption: Amplitude Spectral Density of the measured noise
#+RESULTS:
[[file:figs/asd_noise_3uF.png]]
2020-12-16 16:21:54 +01:00
*** 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
2020-12-15 23:03:14 +01:00
* Transfer Function measurement
2020-12-16 16:21:54 +01:00
** Setup
2020-12-15 23:03:14 +01:00
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.
#+begin_note
Here are the documentation of the equipment used for this test bench:
- Voltage Amplifier [[file:doc/PD200-V7-R1.pdf][PD200]]
2021-01-13 12:14:03 +01:00
- Load Capacitor [[file:doc/0900766b815ea422.pdf][EPCOS 10uF Multilayer Ceramic Capacitor]]
2020-12-15 23:03:14 +01:00
- Speedgoat DAC/ADC [[file:doc/IO131-OEM-Datasheet.pdf][IO313]]
#+end_note
2020-12-16 16:21:54 +01:00
For this measurement, the sampling frequency of the Speedgoat ADC should be as high as possible.
2020-12-15 23:03:14 +01:00
#+name: fig:setup-dynamics-measurement
#+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]]
2020-12-16 16:21:54 +01:00
** 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
2020-12-16 16:21:54 +01:00
** 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
2020-12-16 16:21:54 +01:00
* Conclusion
#+name: tab:table_name
#+caption: Measured characteristics, Manual characterstics and specified ones
#+attr_latex: :environment tabularx :width \linewidth :align lXXX
#+attr_latex: :center t :booktabs t :float t
| <l> | <c> | <c> | <c> |
| *Characteristics* | *Measurement* | *Manual* | *Specification* |
|-------------------------------------+---------------+--------------+-----------------|
| Input Voltage Range | - | +/- 10 [V] | +/- 10 [V] |
| Output Voltage Range | - | -50/150 [V] | -20/150 [V] |
| Gain | | 20 [V/V] | - |
| Maximum RMS current | | 0.9 [A] | > 50 [mA] |
| Maximum Pulse current | | 10 [A] | - |
| Slew Rate | | 150 [V/us] | - |
| Noise (10uF load) | | 0.7 [mV RMS] | < 2 [mV rms] |
| Small Signal Bandwidth (10uF load) | | 7.4 [kHz] | > 5 [kHz] |
| Large Signal Bandwidth (150V, 10uF) | | 300 [Hz] | - |