851 lines
28 KiB
Org Mode
851 lines
28 KiB
Org Mode
#+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:
|
|
|
|
* Introduction
|
|
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.
|
|
|
|
The documentation of the PD200 is accessible [[file:doc/PD200-V7-R1.pdf][here]].
|
|
|
|
#+name: fig:amplifier_PD200
|
|
#+caption: Picture of the PD200 Voltage Amplifier
|
|
#+attr_latex: :width 0.8\linewidth
|
|
[[file:figs/amplifier_PD200.png]]
|
|
|
|
* 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
|
|
#+attr_latex: :width 0.8\linewidth
|
|
[[file:./figs/pd200_expected_small_signal_bandwidth.png]]
|
|
|
|
#+name: fig:pd200_expected_noise
|
|
#+caption: Expected Low frequency noise from 0.03Hz to 20Hz
|
|
#+attr_latex: :width 0.8\linewidth
|
|
[[file:figs/pd200_expected_noise.png]]
|
|
|
|
* Voltage Amplifier Model
|
|
The Amplifier is characterized by its dynamics $G_a(s)$ from voltage inputs $V_{in}$ to voltage output $V_{out}$.
|
|
Ideally, the gain from $V_{in}$ to $V_{out}$ is constant over a wide frequency band with very small phase drop.
|
|
|
|
It is also characterized by its output noise $n$.
|
|
This noise is described by its Power Spectral Density.
|
|
|
|
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.
|
|
|
|
#+begin_src latex :file pd200-model-schematic.pdf
|
|
\begin{tikzpicture}
|
|
\node[block] (G) at (0,0){$G_a(s)$};
|
|
\node[addb, right=0.8 of G] (add){};
|
|
|
|
\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}$};
|
|
\draw[<-] (add.north) -- ++(0, 0.6) node[below right](n){$n$};
|
|
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(G.south west) (n.north-|add.east)}, inner sep=8pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\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
|
|
** Setup
|
|
#+begin_note
|
|
Here are the documentation of the equipment used for this test bench:
|
|
- Voltage Amplifier [[file:doc/PD200-V7-R1.pdf][PD200]]
|
|
- Load Capacitor [[file:doc/0900766b815ea422.pdf][EPCOS 10uF Multilayer Ceramic Capacitor]]
|
|
- Low Noise Voltage Amplifier [[file:doc/egg-5113-preamplifier.pdf][EG&G 5113]]
|
|
- Speedgoat ADC [[file:doc/IO131-OEM-Datasheet.pdf][IO313]]
|
|
#+end_note
|
|
|
|
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.
|
|
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.
|
|
|
|
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.
|
|
|
|
#+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]]
|
|
|
|
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.
|
|
|
|
** 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
|
|
|
|
*** 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
|
|
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]]
|
|
|
|
*** 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.
|
|
|
|
#+begin_note
|
|
Here are the documentation of the equipment used for this test bench:
|
|
- Voltage Amplifier [[file:doc/PD200-V7-R1.pdf][PD200]]
|
|
- Load Capacitor [[file:doc/0900766b815ea422.pdf][EPCOS 10uF Multilayer Ceramic Capacitor]]
|
|
- Speedgoat DAC/ADC [[file:doc/IO131-OEM-Datasheet.pdf][IO313]]
|
|
#+end_note
|
|
|
|
For this measurement, the sampling frequency of the Speedgoat ADC should be as high as possible.
|
|
|
|
#+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]]
|
|
|
|
** 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
|
|
#+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] | - |
|