2412 lines
84 KiB
Org Mode
2412 lines
84 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:
|
|
|
|
#+begin_export html
|
|
<hr>
|
|
<p>This report is also available as a <a href="./test-bench-pd200.pdf">pdf</a>.</p>
|
|
<hr>
|
|
#+end_export
|
|
|
|
\clearpage
|
|
|
|
* Introduction :ignore:
|
|
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.
|
|
|
|
This document is organized as follows:
|
|
- Section [[sec:requirements]]: the requirements for the amplifiers and the characteristics of the PD200 amplifiers as advertise in the datasheet are listed.
|
|
- Section [[sec:amplifier_model]]: a very simple amplifier model consisting of a transfer function and a noise source is described.
|
|
- Section [[sec:tf_meas]]: the transfer function from input voltage to output voltage is identified.
|
|
- Section [[sec:noise_meas]]: the power spectral density of the amplifier's noise is measured
|
|
- Section [[sec:comp_pi_cedrat]]: the characteristics of the PD200 amplifier are compared to the E.505 amplifier from PI and to the LA75 from cedrat
|
|
- Section [[sec:conclusion]]: the measured characteristics of the PD200 amplifier are compared with the requirements
|
|
|
|
* Requirements PD200 Expected characteristics
|
|
<<sec:requirements>>
|
|
|
|
A picture of the PD200 amplifier is shown in Figure [[fig:amplifier_PD200]].
|
|
|
|
#+name: fig:amplifier_PD200
|
|
#+caption: Picture of the PD200 Voltage Amplifier
|
|
#+attr_latex: :width 0.7\linewidth
|
|
[[file:figs/amplifier_PD200.png]]
|
|
|
|
The specifications as well as the amplifier characteristics as shown in the datasheet are summarized in Table [[tab:pd200_characteristics]].
|
|
|
|
#+name: tab:pd200_characteristics
|
|
#+caption: Characteristics of the PD200 compared with the specifications
|
|
#+attr_latex: :environment tabularx :width 0.7\linewidth :align lcc
|
|
#+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] | |
|
|
|
|
The most important characteristics are the large (small signal) bandwidth > 5 [kHz] and the small noise (< 2 [mV RMS]).
|
|
|
|
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]]).
|
|
|
|
These two characteristics are respectively measured in Section [[sec:tf_meas]] and Section [[sec:noise_meas]].
|
|
|
|
#+name: fig:pd200_expected_small_signal_bandwidth
|
|
#+caption:Expected small signal bandwidth
|
|
#+attr_latex: :width 0.7\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.7\linewidth
|
|
[[file:figs/pd200_expected_noise.png]]
|
|
|
|
* Voltage Amplifier Model
|
|
<<sec:amplifier_model>>
|
|
|
|
The Amplifier is characterized by its dynamics $G_p(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 *input* noise $n$.
|
|
|
|
The objective is therefore to determine the transfer function $G_p(s)$ from the input voltage to the output voltage as well as the Power Spectral Density $S_n(\omega)$ of the amplifier input noise.
|
|
|
|
As $G_p$ depends on the load capacitance, it should be measured when loading the amplifier with a $10\,\mu F$ capacitor.
|
|
|
|
#+begin_src latex :file pd200-model-schematic.pdf
|
|
\begin{tikzpicture}
|
|
\node[addb] (add) at (0,0) {};
|
|
\node[block, right=0.8 of add] (G) {$G_p(s)$};
|
|
|
|
\draw[<-] (add.west) -- ++(-1.2, 0) node[above right]{$V_{in}$};
|
|
\draw[->] (add.east) -- (G.west);
|
|
\draw[<-] (add.north) -- ++(0, 0.6) node[below right](n){$n$};
|
|
\draw[->] (G.east) -- ++(1.2, 0) node[above left]{$V_{out}$};
|
|
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(G.south-|add.west) (n.north-|G.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]]
|
|
|
|
|
|
The input noise of the amplifier $n$ can be further modeled by shaping a white noise with unitary PSD $\tilde{n}$ with a transfer function $G_n(s)$ as shown in Figure [[fig:setup-dynamics-measurement]].
|
|
|
|
The Amplitude Spectral Density $\Gamma_n$ is then:
|
|
\begin{equation}
|
|
\Gamma_n(\omega) = |G_n(j\omega)| \Gamma_{\tilde{n}}(\omega)
|
|
\end{equation}
|
|
with $\Gamma_{\tilde{n}}(\omega) = 1$.
|
|
|
|
|
|
#+begin_src latex :file pd200-model-schematic-normalized.pdf
|
|
\begin{tikzpicture}
|
|
\node[addb] (add) at (0,0) {};
|
|
\node[block, above=0.5 of add] (Gn) {$G_n(s)$};
|
|
\node[block, right=0.8 of add] (G) {$G_p(s)$};
|
|
|
|
\draw[<-] (add.west) -- ++(-1.2, 0) node[above right]{$V_{in}$};
|
|
\draw[->] (add.east) -- (G.west);
|
|
\draw[->] (Gn.south) -- (add.north) node[above right]{$n$};
|
|
\draw[<-] (Gn.north) -- ++(0, 0.6) node[below right](n){$\tilde{n}$};
|
|
\draw[->] (G.east) -- ++(1.2, 0) node[above left]{$V_{out}$};
|
|
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(G.south east) (n.north-|Gn.west)}, 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-normalized
|
|
#+caption: Model of the voltage amplifier with normalized noise input
|
|
#+RESULTS:
|
|
[[file:figs/pd200-model-schematic-normalized.png]]
|
|
|
|
* Transfer Function measurement
|
|
<<sec:tf_meas>>
|
|
|
|
** Introduction :ignore:
|
|
|
|
In this section, the transfer function of the PD200 amplifier is measured:
|
|
- Section [[sec:tf_meas_setup]]: the measurement setup is described
|
|
- Section [[sec:tf_meas_w_max]]: the maximum sinusoidal excitation frequency is estimated in order to not overload the amplifier
|
|
- Section [[sec:meas_small_signal_bandwidth]]: the small signal bandwidth measurement results are shown
|
|
- Section [[sec:model_small_signal_bandwidth]]: a model of the small signal dynamics of the amplifier is obtained
|
|
- Section [[sec:bandwidth_amplitude]]: the amplifier's transfer function is estimated for several input amplitudes
|
|
|
|
** Setup
|
|
<<sec:tf_meas_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/KEM_F3040_C4G_AXIAL-1104248.pdf][Film Capacitors 600V 10uF 5%]]
|
|
- DAC/ADC: [[file:doc/IO131-OEM-Datasheet.pdf][IO313 Speedgoat Interface]]
|
|
#+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]]
|
|
|
|
** 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
|
|
|
|
** Maximum Frequency/Voltage to not overload the amplifier
|
|
<<sec:tf_meas_w_max>>
|
|
|
|
Then the maximum output current of the amplifier is reached, the amplifier automatically shuts down itself.
|
|
We should then make sure that the output current does not reach this maximum specified current.
|
|
|
|
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 amplitude and the output voltage amplitude for sinusoidal waves of frequency $\omega$:
|
|
\[ V_{out} = \frac{1}{C\omega} I_{out} \]
|
|
|
|
Moreover, 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 at which the output current reaches its maximum value is:
|
|
\begin{equation}
|
|
\boxed{\omega_{\text{max}} = \frac{1}{20 C V_{in}} I_{out,\text{max}}}
|
|
\end{equation}
|
|
with:
|
|
- $\omega_{\text{max}}$ the maximum input sinusoidal frequency in Radians per seconds
|
|
- $C$ the load capacitance in Farads
|
|
- $V_{in}$ the input voltage sinusoidal amplitude in Volts
|
|
- $I_{out,\text{max}}$ the specified maximum output current in Amperes
|
|
|
|
$\omega_{\text{max}}/2\pi$ as a function of $V_{in}$ is shown in Figure [[fig:max_frequency_voltage]].
|
|
|
|
#+begin_src matlab :exports none
|
|
Iout_max = 0.57; % Maximum output current [A]
|
|
C = 2.7e-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
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/max_frequency_voltage.pdf', 'width', 'wide', 'height', 'normal');
|
|
#+end_src
|
|
|
|
#+name: fig:max_frequency_voltage
|
|
#+caption: Maximum frequency as a function of the excitation voltage amplitude
|
|
#+RESULTS:
|
|
[[file:figs/max_frequency_voltage.png]]
|
|
|
|
When doing sweep sine excitation, we make sure not to reach this maximum excitation frequency.
|
|
|
|
** Small Signal Bandwidth
|
|
<<sec:meas_small_signal_bandwidth>>
|
|
|
|
Here the small signal dynamics of all the 7 PD200 amplifiers are identified.
|
|
|
|
A (logarithmic) sweep sine excitation voltage is generated by the Speedgoat DAC with an amplitude of 0.1V and a frequency going from 1Hz up to 5kHz.
|
|
|
|
The output voltage of the PD200 amplifier is measured thanks to the monitor voltage of the PD200 amplifier.
|
|
The input voltage of the PD200 amplifier (the generated voltage by the DAC) is measured with another ADC of the Speedgoat.
|
|
This way, the time delay related to the ADC will not be apparent in the results.
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Load all the measurements
|
|
pd200 = {};
|
|
for i = 1:7
|
|
pd200(i) = {load(['tf_pd200_' num2str(i) '_10uF_small_signal.mat'], 't', 'Vin', 'Vout', 'notes')};
|
|
end
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Compute sampling Frequency
|
|
Ts = (pd200{1}.t(end) - pd200{1}.t(1))/(length(pd200{1}.t)-1);
|
|
Fs = 1/Ts;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Compute all the transfer functions
|
|
win = hanning(ceil(0.5*Fs)); % Hannning Windows
|
|
|
|
for i = 1:length(pd200)
|
|
[tf_est, f] = tfestimate(pd200{i}.Vin, 20*pd200{i}.Vout, win, [], [], 1/Ts);
|
|
pd200{i}.tf = tf_est;
|
|
pd200{i}.f = f;
|
|
end
|
|
#+end_src
|
|
|
|
The obtained transfer functions from $V_{in}$ to $V_{out}$ are shown in Figure [[fig:pd200_small_signal_tf]].
|
|
#+begin_src matlab :exports none
|
|
figure;
|
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
|
|
|
ax1 = nexttile;
|
|
hold on;
|
|
for i = 1:length(pd200)
|
|
plot(pd200{i}.f, abs(pd200{i}.tf))
|
|
end
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]);
|
|
hold off;
|
|
ylim([10, 30]);
|
|
|
|
ax2 = nexttile;
|
|
hold on;
|
|
for i = 1:length(pd200)
|
|
plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf), 'DisplayName', sprintf('PD200 %i', i))
|
|
end
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
|
hold off;
|
|
yticks(-360:2:360);
|
|
ylim([-12, 2]);
|
|
legend('location', 'southwest');
|
|
|
|
linkaxes([ax1,ax2],'x');
|
|
xlim([1, 5e3]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/pd200_small_signal_tf.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:pd200_small_signal_tf
|
|
#+caption: Identified dynamics from input voltage to output voltage
|
|
#+RESULTS:
|
|
[[file:figs/pd200_small_signal_tf.png]]
|
|
|
|
We can see the very well matching between all the 7 amplifiers.
|
|
The amplitude is constant over a wide frequency band and the phase drop is limited to less than 1 degree up to 500Hz.
|
|
|
|
** Model of the amplifier small signal dynamics
|
|
<<sec:model_small_signal_bandwidth>>
|
|
|
|
The identified dynamics in Figure [[fig:pd200_small_signal_tf]] can very well be modeled this dynamics with a first order low pass filter (even a constant could work fine).
|
|
|
|
Below is the defined transfer function $G_p(s)$.
|
|
#+begin_src matlab
|
|
Gp = 20/(1 + s/2/pi/25e3);
|
|
#+end_src
|
|
|
|
Comparison of the model with the identified dynamics is shown in Figure [[fig:pd200_small_signal_tf_model]].
|
|
#+begin_src matlab :exports none
|
|
colors = get(gca,'colororder');
|
|
|
|
figure;
|
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
|
|
|
ax1 = nexttile;
|
|
hold on;
|
|
for i = 1:length(pd200)
|
|
plot(pd200{i}.f, abs(pd200{i}.tf), 'color', [colors(1, :), 0.5])
|
|
end
|
|
set(gca,'ColorOrderIndex',2)
|
|
plot(pd200{1}.f, abs(squeeze(freqresp(Gp, pd200{1}.f, 'Hz'))), '--')
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]);
|
|
hold off;
|
|
ylim([1e0, 1e2]);
|
|
|
|
ax2 = nexttile;
|
|
hold on;
|
|
plot(pd200{1}.f, 180/pi*angle(pd200{1}.tf), 'color', [colors(1, :), 0.5], ...
|
|
'DisplayName', 'Exp. data')
|
|
for i = 2:length(pd200)
|
|
plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf), 'color', [colors(1, :), 0.5], ...
|
|
'HandleVisibility', 'off')
|
|
end
|
|
set(gca,'ColorOrderIndex',2)
|
|
plot(pd200{1}.f, 180/pi*angle(squeeze(freqresp(Gp, pd200{1}.f, 'Hz'))), '--', ...
|
|
'DisplayName', '$|G_p|$')
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
|
yticks(-360:2:360);
|
|
ylim([-12, 2]);
|
|
legend('location', 'southwest');
|
|
|
|
linkaxes([ax1,ax2],'x');
|
|
xlim([5, 5e3]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/pd200_small_signal_tf_model.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:pd200_small_signal_tf_model
|
|
#+caption:Bode plot of $G_d(s)$ as well as the identified transfer functions of all 7 amplifiers
|
|
#+RESULTS:
|
|
[[file:figs/pd200_small_signal_tf_model.png]]
|
|
|
|
#+begin_src matlab :tangle no :exports none
|
|
save('matlab/mat/pd200_model.mat', 'Gp');
|
|
#+end_src
|
|
|
|
And finally this model is saved.
|
|
#+begin_src matlab :eval no
|
|
save('mat/pd200_model.mat', 'Gp');
|
|
#+end_src
|
|
|
|
** Large Signal Bandwidth
|
|
<<sec:bandwidth_amplitude>>
|
|
|
|
The PD200 amplifiers will most likely not be used for large signals, but it is still nice to see how the amplifier dynamics is changing with the input voltage amplitude.
|
|
|
|
Several identifications using sweep sin were performed with input voltage amplitude ranging from 0.1V to 4V.
|
|
The maximum excitation frequency for each amplitude was limited from the estimation in Section [[sec:tf_meas_w_max]].
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Load all the measurements
|
|
Vin_ampl = {'0_1', '0_5', '1', '2', '4'};
|
|
|
|
pd200 = {};
|
|
for i = 1:length(Vin_ampl)
|
|
pd200(i) = {load(['tf_pd200_1_10uF_' Vin_ampl{i} 'V.mat'], 't', 'Vin', 'Vout', 'notes')};
|
|
end
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Compute the maximum excitation frequency
|
|
Iout_max = 0.57; % Maximum output current [A]
|
|
C = 10e-6; % Load Capacitance [F]
|
|
|
|
V_in = [0.1, 0.5, 1, 2, 4];
|
|
f_max = 0.8*Iout_max./(20*C*V_in/sqrt(2))/2/pi;
|
|
for i = 1:length(Vin_ampl)
|
|
pd200{i}.notes.pd200.f_max = f_max(i);
|
|
pd200{i}.notes.pd200.Vin = V_in(i);
|
|
end
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Compute sampling Frequency
|
|
Ts = (pd200{1}.t(end) - pd200{1}.t(1))/(length(pd200{1}.t)-1);
|
|
Fs = 1/Ts;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Compute all the transfer functions
|
|
win = hanning(ceil(0.5*Fs)); % Hannning Windows
|
|
|
|
for i = 1:length(pd200)
|
|
[tf_est, f] = tfestimate(pd200{i}.Vin, 20*pd200{i}.Vout, win, [], [], 1/Ts);
|
|
pd200{i}.tf = tf_est(f < 0.99*pd200{i}.notes.pd200.f_max);
|
|
pd200{i}.f = f(f < 0.99*pd200{i}.notes.pd200.f_max);
|
|
end
|
|
#+end_src
|
|
|
|
The obtained transfer functions for the different excitation amplitudes are shown in Figure [[fig:pd200_large_signal_tf]].
|
|
It is shown that the input voltage amplitude does not affect that much the amplifier dynamics.
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Plot the identified transfer functions
|
|
figure;
|
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
|
|
|
ax1 = nexttile;
|
|
hold on;
|
|
for i = 1:length(pd200)
|
|
plot(pd200{i}.f, abs(pd200{i}.tf))
|
|
end
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]);
|
|
hold off;
|
|
ylim([1e0, 1e2]);
|
|
|
|
ax2 = nexttile;
|
|
hold on;
|
|
for i = 1:length(pd200)
|
|
plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf), 'DisplayName', sprintf('$V_{in} = %.1f [V]$', pd200{i}.notes.pd200.Vin))
|
|
end
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
|
legend('location', 'southwest');
|
|
hold off;
|
|
yticks(-360:2:360);
|
|
ylim([-12, 2]);
|
|
|
|
linkaxes([ax1,ax2],'x');
|
|
xlim([5, 5e3]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/pd200_large_signal_tf.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:pd200_large_signal_tf
|
|
#+caption: Amplifier dynamics for several input voltage amplitudes
|
|
#+RESULTS:
|
|
[[file:figs/pd200_large_signal_tf.png]]
|
|
|
|
* Noise measurement
|
|
<<sec:noise_meas>>
|
|
|
|
** Introduction :ignore:
|
|
|
|
In this part, the goal is to measure the noise of the PD200 voltage amplifier.
|
|
This noise can be separated into an input voltage noise and an input current noise.
|
|
However, the input voltage noise has much larger effects than the input current noise and we will only try to measure the input voltage noise.
|
|
|
|
|
|
In section [[sec:noise_setup]], the measurement setup is described and a model (block diagram) of the setup is given in section [[sec:noise_model]].
|
|
|
|
Then, the noise contribution of each element is measured:
|
|
- Section [[sec:noise_quantization]]: the quantization noise of the ADC is estimated
|
|
- Sections [[sec:noise_egg]] and [[sec:noise_femto]]: the noise of the low-noise amplifiers are estimated
|
|
- Sections [[sec:low_freq_noise_pd200]] and [[sec:high_freq_noise_pd200]]:: the input voltage noise of the PD200 amplifier is estimated
|
|
- Section [[sec:noise_dac]]: the output noise of the DAC is measured
|
|
- Section [[sec:noise_full_measurement]]: the noise of the full measurement chain (DAC to PD200 to pre-amplifier to ADC) is measured and it is found that the DAC is the main source of noise
|
|
- Section [[sec:noise_ssi2v]]: the noise of an 20bits DAC is measured
|
|
- Section [[sec:noise_full_measurement_ssi2v]]: it is shown if using the 20bits DAC could lower the overall noise of the setup
|
|
|
|
Finally in section [[sec:pd200_noise_model]], a model of the PD200 amplifier's noise is developed.
|
|
|
|
#+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/KEM_F3040_C4G_AXIAL-1104248.pdf][Film Capacitors 600V 10uF 5%]]
|
|
- Low Noise Voltage Amplifiers [[file:doc/egg-5113-preamplifier.pdf][EG&G 5113]] and [[file:doc/de-dlpva-100-b.pdf][Femto DLPVA]]
|
|
- ADC: [[file:doc/IO131-OEM-Datasheet.pdf][IO313 Speedgoat card]]
|
|
- 16bits DAC: [[file:doc/IO131-OEM-Datasheet.pdf][IO313 Speedgoat card]]
|
|
- 20bits DAC: [[file:doc/SSI2V_Datasheet.pdf][SSI2V]]
|
|
#+end_note
|
|
|
|
** 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
|
|
|
|
** Measurement Setup
|
|
<<sec:noise_setup>>
|
|
|
|
As the output noise of the PD200 voltage amplifier is foreseen to be around 1mV rms in a bandwidth from DC to 1MHz, it is not possible to directly measure it with an ADC.
|
|
We need to amplify the noise before digitizing the signal.
|
|
To do so, we need to use a low noise voltage amplifier with a noise density much smaller than the measured noise of the PD200 amplifier.
|
|
|
|
Let's first estimate the noise density of the PD200 amplifier.
|
|
If we suppose a white noise, this correspond to an amplitude spectral density:
|
|
\begin{equation}
|
|
\Gamma_{n}(\omega) \approx \frac{1\,mV}{\sqrt{1\,MHz}} = 1 \frac{\mu V}{\sqrt{Hz}}
|
|
\end{equation}
|
|
|
|
The input noise of the instrumentation amplifier should be then much smaller than the output noise of the PD200.
|
|
We will use either the amplifier EG&G 5113 that has a noise of $\approx 4 nV/\sqrt{Hz}$ referred to its input or the Femto DLPVA amplifier with an input noise of $\approx 3nV/\sqrt{Hz}$.
|
|
|
|
The gain of the low-noise amplifier is then increased until the full range of the ADC is used.
|
|
This gain should be around 1000 (60dB).
|
|
|
|
A representation of the measurement bench is shown in Figure [[fig:setup-noise-measurement]].
|
|
|
|
Note that it is quite important to load the amplifier with the "Load Box" including a $10\,\mu F$ capacitor as the (high frequency) noise of the amplifier depends on the actual load being used.
|
|
|
|
#+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]]
|
|
|
|
** Model of the setup
|
|
<<sec:noise_model>>
|
|
|
|
As shown in Figure [[fig:noise_meas_procedure]], there are 4 elements involved in the measurement:
|
|
- a Digital to Analog Convert (DAC)
|
|
- the Voltage amplifier to be measured with a gain of 20 (PD200)
|
|
- a low noise voltage amplifier with a variable gain and integrated low pass filters and high pass filters
|
|
- an Analog to Digital Converter (ADC)
|
|
|
|
Each of these equipment has some noise:
|
|
- $q_{da}$: quantization noise of the DAC
|
|
- $n_{da}$: output noise of the DAC
|
|
- $n_p$: input noise of the PD200 (what we wish to characterize)
|
|
- $n_a$: input noise of the pre-amplifier
|
|
- $q_{ad}$: quantization noise of the ADC
|
|
|
|
#+begin_src latex :file noise_meas_procedure.pdf
|
|
\begin{tikzpicture}
|
|
% DAC
|
|
\node[DAC] (DAC) at (0,0) {DAC};
|
|
\node[addb, right=0.4 of DAC] (addqda){};
|
|
\node[addb, right=0.4 of addqda] (addnda){};
|
|
|
|
% PD200
|
|
\node[addb, right=1.2 of addnda] (addnp){};
|
|
\node[block, right=0.4 of addnp] (Gp){$G_p(s)$};
|
|
|
|
% Pre Amp
|
|
\node[addb, right=1.2 of Gp] (addna){};
|
|
\node[block, right=0.4 of addna] (Ga) {$G_a(s)$};
|
|
|
|
% ADC
|
|
\node[addb, right=1.2 of Ga] (addqad){};
|
|
\node[ADC, right=0.4 of addqad] (ADC) {ADC};
|
|
|
|
% \draw[->] (const.east) -- node[sloped]{$/$} (DAC.west);
|
|
\draw[<-] (DAC.west) -- node[sloped]{$/$} ++(-1.0, 0);
|
|
\draw[->] (DAC.east) -- (addqda.west);
|
|
\draw[->] (addqda.east) -- (addnda.west);
|
|
\draw[->] (addnda.east) -- (addnp.west);
|
|
\draw[->] (addnp.east) -- (Gp.west);
|
|
\draw[->] (Gp.east) -- (addna.west);
|
|
\draw[->] (addna.east) -- (Ga.west);
|
|
\draw[->] (Ga.east) -- (addqad.west);
|
|
\draw[->] (addqad.east) -- (ADC.west);
|
|
\draw[->] (ADC.east) -- node[sloped]{$/$} ++(1.0, 0) node[above left]{$n$};
|
|
|
|
\draw[<-] (addnda.north) -- ++(0, 0.6) node[below right](nda){$n_{da}$};
|
|
\draw[<-] (addqda.north) -- ++(0, 0.6) node[below right](qda){$q_{da}$};
|
|
|
|
\draw[<-] (addnp.north) -- ++(0, 0.6) node[below right](np){$n_{p}$};
|
|
\draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$};
|
|
|
|
\draw[<-] (addqad.north) -- ++(0, 0.6) node[below right](qad){$q_{ad}$};
|
|
|
|
\coordinate[] (top) at (nda.north);
|
|
\coordinate[] (bot) at (Ga.south);
|
|
|
|
% DAC
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(DAC.west|-bot) (addnda.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {DAC};
|
|
\end{scope}
|
|
|
|
% PD200
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addnp.west|-bot) (Gp.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {PD200};
|
|
\end{scope}
|
|
|
|
% 5113
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {Pre Amp};
|
|
\end{scope}
|
|
|
|
% ADC
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {ADC};
|
|
\end{scope}
|
|
\end{tikzpicture}
|
|
#+end_src
|
|
|
|
#+name: fig:noise_meas_procedure
|
|
#+caption: Sources of noise in the experimental setup
|
|
#+RESULTS:
|
|
[[file:figs/noise_meas_procedure.png]]
|
|
|
|
In the next sections, we wish to measure all these sources of noise and make sure that we can effectively characterize the noise $n_p$ of the PD200 amplifier.
|
|
|
|
** Quantization Noise of the ADC
|
|
<<sec:noise_quantization>>
|
|
|
|
The quantization noise is something that can be predicted from the sampling frequency and the quantization of the ADC.
|
|
Indeed, the Amplitude Spectral Density of the quantization noise of an ADC/DAC is equal to:
|
|
\begin{equation}
|
|
\Gamma_q(\omega) = \frac{q}{\sqrt{12 f_s}}
|
|
\end{equation}
|
|
with:
|
|
- $q = \frac{\Delta V}{2^n}$ the quantization in [V], which is the corresponding value in [V] of the least significant bit
|
|
- $\Delta V$ is the full range of the ADC in [V]
|
|
- $n$ is the number of bits
|
|
- $f_s$ is the sample frequency in [Hz]
|
|
|
|
Let's estimate that with the ADC used for the measurements:
|
|
#+begin_src matlab
|
|
%% ADC Quantization noise
|
|
adc = struct();
|
|
adc.Delta_V = 20; % [V]
|
|
adc.n = 16; % number of bits
|
|
adc.Fs = 20e3; % [Hz]
|
|
adc.Gamma_q = adc.Delta_V/2^adc.n/sqrt(12*adc.Fs); % [V/sqrt(Hz)]
|
|
#+end_src
|
|
|
|
The obtained Amplitude Spectral Density is src_matlab[:exports results :results value replace]{adc.Gamma_q} {{{results(=6.2294e-07=)}}} $V/\sqrt{Hz}$.
|
|
|
|
** EG&G - Amplifier noise measurement
|
|
<<sec:noise_egg>>
|
|
|
|
We now wish to measure the noise of the pre-amplifier.
|
|
To do so, the input of the pre-amplifier is shunted with a 50Ohms resistor such that the pre-amplifier input voltage is just its input noise.
|
|
Then, the gain of the amplifier is increased until the measured signal on the ADC is much larger than the quantization noise.
|
|
|
|
The Amplitude Spectral Density $\Gamma_n(\omega)$ of the measured signal $n$ is computed.
|
|
Finally, the Amplitude Spectral Density of $n_a$ can be computed taking into account the gain of the pre-amplifier:
|
|
\begin{equation}
|
|
\Gamma_{n_a}(\omega) \approx \frac{\Gamma_n(\omega)}{|G_a(\omega)|}
|
|
\end{equation}
|
|
|
|
#+begin_src latex :file noise_measure_setup_preamp.pdf
|
|
\begin{tikzpicture}
|
|
\node[block={0.6cm}{0.6cm}] (const) {$0$};
|
|
% Pre Amp
|
|
\node[addb, right=0.6 of const] (addna) {};
|
|
\node[block, right=0.4 of addna] (Ga) {$G_a(s)$};
|
|
|
|
% ADC
|
|
\node[addb, right=1.2 of Ga] (addqad){};
|
|
\node[ADC, right=0.4 of addqad] (ADC) {ADC};
|
|
|
|
\draw[->] (const.east) -- (addna.west);
|
|
\draw[->] (addna.east) -- (Ga.west);
|
|
\draw[->] (Ga.east) -- (addqad.west);
|
|
\draw[->] (addqad.east) -- (ADC.west);
|
|
\draw[->] (ADC.east) -- node[sloped]{$/$} ++(1.0, 0) node[above left]{$n$};
|
|
|
|
\draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$};
|
|
\draw[<-] (addqad.north) -- ++(0, 0.6) node[below right](qad){$q_{ad}$};
|
|
|
|
\coordinate[] (top) at (na.north);
|
|
\coordinate[] (bot) at (Ga.south);
|
|
|
|
% 5113
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {Pre Amp};
|
|
\end{scope}
|
|
|
|
% ADC
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {ADC};
|
|
\end{scope}
|
|
\end{tikzpicture}
|
|
#+end_src
|
|
|
|
#+name: fig:noise_measure_setup_preamp
|
|
#+caption: Sources of noise in the experimental setup
|
|
#+RESULTS:
|
|
[[file:figs/noise_measure_setup_preamp.png]]
|
|
|
|
#+begin_src matlab :exports none
|
|
%% EG&G Input Voltage Noise
|
|
egg = load('mat/noise_preamp_5113.mat', 't', 'Vn', 'notes'); % Load Data
|
|
#+end_src
|
|
|
|
The gain of the low noise amplifier is set to src_matlab[:exports results :results value replace]{ans = egg.notes.pre_amp.gain} {{{results(=50000=)}}} for the measurement.
|
|
|
|
#+begin_src matlab :exports none
|
|
% Compute the equivalent voltage at the input of the amplifier
|
|
egg.Vn = egg.Vn/egg.notes.pre_amp.gain;
|
|
egg.Vn = egg.Vn - mean(egg.Vn);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Sampling time / frequency
|
|
Ts = (egg.t(end) - egg.t(1))/(length(egg.t) - 1);
|
|
Fs = 1/Ts;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Hanning window
|
|
win = hanning(ceil(0.5/Ts));
|
|
|
|
% Power Spectral Density
|
|
[pxx, f] = pwelch(egg.Vn, win, [], [], Fs);
|
|
|
|
% Save the results inside the struct
|
|
egg.pxx = pxx;
|
|
egg.f = f;
|
|
#+end_src
|
|
|
|
The obtained Amplitude Spectral Density of the Low Noise Voltage Amplifier is shown in Figure [[fig:asd_egg]].
|
|
The obtained noise amplitude is very closed to the one specified in the documentation of $4nV/\sqrt{Hz}$ at 1kHZ.
|
|
|
|
It is also verified that the quantization noise of the ADC is much smaller and what we are measuring is indeed the noise of the pre-amplifier.
|
|
|
|
#+begin_src matlab :exports none
|
|
figure;
|
|
hold on;
|
|
plot(egg.f, sqrt(egg.pxx), 'DisplayName', '$\Gamma_{n_a}$');
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./egg.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'northeast');
|
|
xlim([1, Fs/2]); ylim([1e-11, 1e-7]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/asd_egg.pdf', 'width', 'wide', 'height', 'normal');
|
|
#+end_src
|
|
|
|
#+name: fig:asd_egg
|
|
#+caption: Obtained Amplitude Spectral Density of the EG&G Low Noise Voltage Amplifier
|
|
#+RESULTS:
|
|
[[file:figs/asd_egg.png]]
|
|
|
|
** Femto - Amplifier noise measurement
|
|
<<sec:noise_femto>>
|
|
|
|
Similarly to Section [[sec:noise_egg]], the noise of the Femto amplifier is identified.
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Femto Input Voltage Noise
|
|
femto = load('mat/noise_femto.mat', 't', 'Vout', 'notes'); % Load Data
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Compute the equivalent voltage at the input of the amplifier
|
|
femto.Vout = femto.Vout/femto.notes.pre_amp.gain;
|
|
femto.Vout = femto.Vout - mean(femto.Vout);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Sampling time / frequency
|
|
Ts = (femto.t(end) - femto.t(1))/(length(femto.t) - 1);
|
|
Fs = 1/Ts;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Hanning window
|
|
win = hanning(ceil(0.5/Ts));
|
|
|
|
% Power Spectral Density
|
|
[pxx, f] = pwelch(femto.Vout, win, [], [], Fs);
|
|
|
|
% Save the results inside the struct
|
|
femto.pxx = pxx;
|
|
femto.f = f;
|
|
#+end_src
|
|
|
|
The obtained Amplitude spectral density is shown in Figure [[fig:asd_femto]].
|
|
|
|
#+begin_src matlab :exports none
|
|
figure;
|
|
hold on;
|
|
plot(femto.f, sqrt(femto.pxx), 'DisplayName', '$\Gamma_{n_a}$');
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./femto.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'northeast');
|
|
xlim([1, Fs/2]); ylim([1e-11, 1e-7]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/asd_femto.pdf', 'width', 'wide', 'height', 'normal');
|
|
#+end_src
|
|
|
|
#+name: fig:asd_femto
|
|
#+caption: Obtained Amplitude Spectral Density of the Femto Low Noise Voltage Amplifier
|
|
#+RESULTS:
|
|
[[file:figs/asd_femto.png]]
|
|
|
|
** PD200 - Low frequency noise measurement
|
|
<<sec:low_freq_noise_pd200>>
|
|
|
|
The measurement setup is shown in Figure [[fig:noise_measure_setup_pd200]].
|
|
The input of the PD200 amplifier is shunted with a 50 Ohm resistor such that there in no voltage input expected the PD200 input voltage noise.
|
|
The gain of the pre-amplifier is increased in order to measure a signal much larger than the quantization noise of the ADC.
|
|
|
|
#+begin_src latex :file noise_measure_setup_pd200.pdf
|
|
\begin{tikzpicture}
|
|
\node[block={0.6cm}{0.6cm}] (const) {$0$};
|
|
|
|
% PD200
|
|
\node[addb, right=0.6 of const] (addnp){};
|
|
\node[block, right=0.4 of addnp] (Gp){$G_p(s)$};
|
|
|
|
% Pre Amp
|
|
\node[addb, right=1.2 of Gp] (addna) {};
|
|
\node[block, right=0.4 of addna] (Ga) {$G_a(s)$};
|
|
|
|
% ADC
|
|
\node[addb, right=1.2 of Ga] (addqad){};
|
|
\node[ADC, right=0.4 of addqad] (ADC) {ADC};
|
|
|
|
\draw[->] (const.east) -- (addnp.west);
|
|
\draw[->] (addnp.east) -- (Gp.west);
|
|
\draw[->] (Gp.east) -- (addna.west);
|
|
\draw[->] (addna.east) -- (Ga.west);
|
|
\draw[->] (Ga.east) -- (addqad.west);
|
|
\draw[->] (addqad.east) -- (ADC.west);
|
|
\draw[->] (ADC.east) -- node[sloped]{$/$} ++(1.0, 0) node[above left]{$n$};
|
|
|
|
\draw[<-] (addnp.north) -- ++(0, 0.6) node[below right](np){$n_{p}$};
|
|
\draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$};
|
|
\draw[<-] (addqad.north) -- ++(0, 0.6) node[below right](qad){$q_{ad}$};
|
|
|
|
\coordinate[] (top) at (na.north);
|
|
\coordinate[] (bot) at (Ga.south);
|
|
|
|
% PD200
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addnp.west|-bot) (Gp.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {PD200};
|
|
\end{scope}
|
|
|
|
% 5113
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {Pre Amp};
|
|
\end{scope}
|
|
|
|
% ADC
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {ADC};
|
|
\end{scope}
|
|
\end{tikzpicture}
|
|
#+end_src
|
|
|
|
#+name: fig:noise_measure_setup_pd200
|
|
#+caption: Sources of noise in the experimental setup
|
|
#+RESULTS:
|
|
[[file:figs/noise_measure_setup_pd200.png]]
|
|
|
|
#+begin_src matlab :exports none
|
|
%% PD200 Input Voltage Noise
|
|
% 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 and PD200 Gain
|
|
for i = 1:7
|
|
pd200w{i}.Vn = pd200w{i}.Vn/pd200w{i}.notes.pre_amp.gain/20;
|
|
end
|
|
#+end_src
|
|
|
|
The measured low frequency (<20Hz) *output* noise of one of the PD200 amplifiers is shown in Figure [[fig:pd200_noise_time_lpf]].
|
|
It is very similar to the one specified in the datasheet in Figure [[fig:pd200_expected_noise]].
|
|
|
|
#+begin_src matlab :exports none
|
|
% Compute the low frequency noise
|
|
G_lpf = 1/(1 + s/2/pi/20);
|
|
t_max = 40;
|
|
|
|
figure;
|
|
hold on;
|
|
plot(pd200w{1}.t(1:t_max/Ts), 20*lsim(G_lpf, 1e3*pd200w{1}.Vn(1:t_max/Ts), pd200w{1}.t(1:t_max/Ts)))
|
|
hold off;
|
|
xlabel('Time [s]');
|
|
ylabel('Voltage [mV]');
|
|
ylim([-3, 3]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/pd200_noise_time_lpf.pdf', 'width', 'wide', 'height', 'normal');
|
|
#+end_src
|
|
|
|
#+name: fig:pd200_noise_time_lpf
|
|
#+caption: Measured low frequency noise of the PD200 from 0.01Hz to 20Hz
|
|
#+RESULTS:
|
|
[[file:figs/pd200_noise_time_lpf.png]]
|
|
|
|
The obtained RMS and peak to peak values of the measured *output* noise are shown in Table [[tab:rms_pkp_noise]] and found to be very similar to the specified ones.
|
|
#+begin_src matlab :exports none
|
|
% Compute the RMS and Peak to Peak noise for the low frequency 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(20*pd200w{i}.Vn);
|
|
Vn_lpf = 20*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 [$10\,\mu F$]', 'PD200 1', 'PD200 2', 'PD200 3', 'PD200 4', 'PD200 5', 'PD200 6', 'PD200 7'}, {'*RMS [$\mu V$]*', '*Peak to Peak [$mV$]*'}, ' %.1f ');
|
|
#+end_src
|
|
|
|
#+name: tab:rms_pkp_noise
|
|
#+caption: RMS and Peak to Peak measured low frequency output noise (0.01Hz to 20Hz)
|
|
#+attr_latex: :environment tabularx :width 0.5\linewidth :align lcc
|
|
#+attr_latex: :center t :booktabs t :float t
|
|
#+RESULTS:
|
|
| | *RMS [$\mu V$]* | *Peak to Peak [$mV$]* |
|
|
|-----------------------------+-----------------+-----------------------|
|
|
| Specification [$10\,\mu F$] | 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 |
|
|
|
|
** PD200 - High frequency noise measurement
|
|
<<sec:high_freq_noise_pd200>>
|
|
|
|
The measurement setup is the same as in Figure [[fig:noise_measure_setup_pd200]].
|
|
|
|
The Amplitude Spectral Density $\Gamma_n(\omega)$ of the measured signal by the ADC is computed.
|
|
The Amplitude Spectral Density of the input voltage noise of the PD200 amplifier $n_p$ is then computed taking into account the gain of the pre-amplifier and the gain of the PD200 amplifier:
|
|
\begin{equation}
|
|
\Gamma_{n_p}(\omega) = \frac{\Gamma_n(\omega)}{|G_p(j\omega) G_a(j\omega)|}
|
|
\end{equation}
|
|
|
|
And we verify that we are indeed measuring the noise of the PD200 and not the noise of the pre-amplifier by checking that:
|
|
\begin{equation}
|
|
\Gamma_{n_p}(\omega) |G_p(j\omega)| \ll \Gamma_{n_a}
|
|
\end{equation}
|
|
|
|
#+begin_src matlab :exports none
|
|
%% PD200 Input Voltage Noise
|
|
% Load all the measurements
|
|
pd200 = {};
|
|
for i = 1:7
|
|
pd200(i) = {load(['mat/noise_PD200_' num2str(i) '_10uF.mat'], 't', 'Vout', 'notes')};
|
|
end
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Take into account the pre-amplifier gain and PD200 Gain
|
|
for i = 1:7
|
|
pd200{i}.Vout = pd200{i}.Vout/pd200{i}.notes.pre_amp.gain/20;
|
|
end
|
|
#+end_src
|
|
|
|
#+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
|
|
|
|
#+begin_src matlab :exports none
|
|
% Compute the PSD of the measured noise
|
|
win = hanning(ceil(2/Ts));
|
|
|
|
for i = 1:7
|
|
[pxx, f] = pwelch(pd200{i}.Vout, win, [], [], Fs);
|
|
pd200{i}.f = f;
|
|
pd200{i}.pxx = pxx;
|
|
end
|
|
#+end_src
|
|
|
|
The Amplitude Spectral Density of the measured *input* noise is computed and shown in Figure [[fig:asd_noise_pd200_10uF]].
|
|
|
|
It is verified that the contribution of the PD200 noise is much larger than the contribution of the pre-amplifier noise of the quantization noise.
|
|
#+begin_src matlab :exports none
|
|
colors = get(gca,'colororder');
|
|
|
|
figure;
|
|
hold on;
|
|
plot(femto.f, sqrt(femto.pxx)/20, 'DisplayName', '$\Gamma_{n_a}/|G_p|$');
|
|
plot(pd200{1}.f, sqrt(pd200{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$');
|
|
for i = 2:7
|
|
plot(pd200{i}.f, sqrt(pd200{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off');
|
|
end
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./pd200{1}.notes.pre_amp.gain/20, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_p G_a|$');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'southeast');
|
|
xlim([1, Fs/2]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/asd_noise_pd200_10uF.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:asd_noise_pd200_10uF
|
|
#+caption: Amplitude Spectral Density of the measured input voltage noise of the PD200 amplifiers
|
|
#+RESULTS:
|
|
[[file:figs/asd_noise_pd200_10uF.png]]
|
|
|
|
#+begin_note
|
|
The Amplitude Spectral Density of the input noise of the PD200 amplifiers present sharp peaks.
|
|
It is not clear yet what causes such peaks and if these peaks have high influence on the total RMS noise of the amplifiers.
|
|
#+end_note
|
|
|
|
** 16bits DAC noise measurement
|
|
<<sec:noise_dac>>
|
|
|
|
In order not to have any quantization noise and only measure the output voltage noise of the DAC, we "ask" the DAC to output a zero voltage.
|
|
|
|
The measurement setup is schematically represented in Figure [[fig:noise_measure_setup_dac]].
|
|
The gain of the pre-amplifier is adjusted such that the measured amplified noise is much larger than the quantization noise of the ADC.
|
|
|
|
The Amplitude Spectral Density $\Gamma_n(\omega)$ of the measured signal is computed.
|
|
The Amplitude Spectral Density of the DAC output voltage noise $n_{da}$ can be computed taking into account the gain of the pre-amplifier:
|
|
\begin{equation}
|
|
\Gamma_{n_{da}}(\omega) = \frac{\Gamma_m(\omega)}{|G_a(\omega)|}
|
|
\end{equation}
|
|
|
|
And it is verified that the Amplitude Spectral Density of $n_{da}$ is much larger than the one of $n_a$:
|
|
\begin{equation}
|
|
\Gamma_{n_{da}} \gg \Gamma_{n_a}
|
|
\end{equation}
|
|
|
|
#+begin_src latex :file noise_measure_setup_dac.pdf
|
|
\begin{tikzpicture}
|
|
\node[block={0.6cm}{0.6cm}] (const) {$0$};
|
|
|
|
% DAC
|
|
\node[DAC, right=0.6 of const] (DAC) {DAC};
|
|
\node[addb, right=0.4 of DAC] (addnda){};
|
|
|
|
% Pre Amp
|
|
\node[addb, right=1.2 of addnda] (addna) {};
|
|
\node[block, right=0.4 of addna] (Ga) {$G_a(s)$};
|
|
|
|
% ADC
|
|
\node[addb, right=1.2 of Ga] (addqad){};
|
|
\node[ADC, right=0.4 of addqad] (ADC) {ADC};
|
|
|
|
\draw[->] (const.east) -- node[sloped]{$/$} (DAC.west);
|
|
\draw[->] (DAC.east) -- (addnda.west);
|
|
\draw[->] (addnda.east) -- (addna.west);
|
|
\draw[->] (addna.east) -- (Ga.west);
|
|
\draw[->] (Ga.east) -- (addqad.west);
|
|
\draw[->] (addqad.east) -- (ADC.west);
|
|
\draw[->] (ADC.east) -- node[sloped]{$/$} ++(1.0, 0);
|
|
|
|
\draw[<-] (addnda.north) -- ++(0, 0.6) node[below right](nda){$n_{da}$};
|
|
\draw[<-] (addna.north) -- ++(0, 0.6) node[below right](na){$n_{a}$};
|
|
\draw[<-] (addqad.north) -- ++(0, 0.6) node[below right](qad){$q_{ad}$};
|
|
|
|
\coordinate[] (top) at (na.north);
|
|
\coordinate[] (bot) at (Ga.south);
|
|
|
|
% DAC
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(DAC.west|-bot) (addnda.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {DAC};
|
|
\end{scope}
|
|
|
|
% 5113
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addna.west|-bot) (Ga.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {Pre Amp};
|
|
\end{scope}
|
|
|
|
% ADC
|
|
\begin{scope}[on background layer]
|
|
\node[fit={(addqad.west|-bot) (ADC.east|-top)}, inner sep=10pt, draw, dashed, fill=black!20!white] (P) {};
|
|
\node[above] at (P.north) {ADC};
|
|
\end{scope}
|
|
\end{tikzpicture}
|
|
#+end_src
|
|
|
|
#+name: fig:noise_measure_setup_dac
|
|
#+caption: Sources of noise in the experimental setup
|
|
#+RESULTS:
|
|
[[file:figs/noise_measure_setup_dac.png]]
|
|
|
|
#+begin_src matlab :exports none
|
|
%% DAC Output Voltage Noise
|
|
dac = load('mat/noise_preamp_5113_dac.mat', 't', 'Vn', 'notes');
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Take input acount the gain of the pre-amplifier
|
|
dac.Vn = dac.Vn/dac.notes.pre_amp.gain;
|
|
dac.Vn = dac.Vn - mean(dac.Vn);
|
|
#+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
|
|
|
|
#+begin_src matlab :exports none
|
|
% Compute the PSD of the measured noise
|
|
win = hanning(ceil(0.5/Ts));
|
|
|
|
[pxx, f] = pwelch(dac.Vn, win, [], [], Fs);
|
|
dac.pxx = pxx;
|
|
dac.f = f;
|
|
#+end_src
|
|
|
|
The obtained Amplitude Spectral Density of the DAC's output voltage is shown in Figure [[fig:asd_noise_dac]].
|
|
|
|
#+begin_src matlab :exports none
|
|
colors = get(gca,'colororder');
|
|
|
|
figure;
|
|
hold on;
|
|
plot(egg.f, sqrt(egg.pxx), 'DisplayName', '$\Gamma_{n_a}$');
|
|
set(gca,'ColorOrderIndex',3)
|
|
plot(dac.f, sqrt(dac.pxx), 'DisplayName', '$\Gamma_{n_{da}}$');
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./dac.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'southeast');
|
|
xlim([1, Fs/2]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/asd_noise_dac.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:asd_noise_dac
|
|
#+caption: Amplitude Spectral Density of the measured output voltage noise of the 16bits DAC
|
|
#+RESULTS:
|
|
[[file:figs/asd_noise_dac.png]]
|
|
|
|
** Noise of the full setup with 16bits DAC
|
|
<<sec:noise_full_measurement>>
|
|
|
|
Let's now measure the noise of the full setup in Figure [[fig:noise_meas_procedure_bis]] and analyze the results.
|
|
|
|
#+name: fig:noise_meas_procedure_bis
|
|
#+caption: Sources of noise in the experimental setup
|
|
#+RESULTS:
|
|
[[file:figs/noise_meas_procedure.png]]
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Full measurement chain from DAC to ADC
|
|
pd200dac = {};
|
|
for i = 1:7
|
|
pd200dac(i) = {load(['mat/noise_PD200_' num2str(i) '_10uF_DAC.mat'], 't', 'Vout', 'notes')};
|
|
end
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Take into account the pre-amplifier gain
|
|
for i = 1:7
|
|
pd200dac{i}.Vout = pd200dac{i}.Vout/pd200dac{i}.notes.pre_amp.gain/20;
|
|
pd200dac{i}.Vout = pd200dac{i}.Vout - mean(pd200dac{i}.Vout);
|
|
end
|
|
#+end_src
|
|
|
|
#+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 Amplitude Spectral Density of the measured noise is computed and the shown in Figure [[fig:asd_noise_tot]].
|
|
|
|
We can very well see that to total measured noise is the sum of the DAC noise and the PD200 noise.
|
|
#+begin_src matlab :exports none
|
|
% Compute the PSD of the measured noise
|
|
win = hanning(ceil(2/Ts));
|
|
|
|
for i = 1:7
|
|
[pxx, f] = pwelch(pd200dac{i}.Vout, win, [], [], Fs);
|
|
pd200dac{i}.f = f;
|
|
pd200dac{i}.pxx = pxx;
|
|
end
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
colors = get(gca,'colororder');
|
|
|
|
figure;
|
|
hold on;
|
|
plot(egg.f, sqrt(egg.pxx)/20, 'DisplayName', '$\Gamma_{n_a}$');
|
|
plot(pd200{1}.f, sqrt(pd200{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}/|G_p|$');
|
|
for i = 2:7
|
|
plot(pd200{i}.f, sqrt(pd200{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off');
|
|
end
|
|
set(gca,'ColorOrderIndex',3)
|
|
plot(dac.f, sqrt(dac.pxx), 'DisplayName', '$|G_p| \cdot \Gamma_{n_{da}}$');
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./dac.notes.pre_amp.gain/20, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_p G_a|$');
|
|
plot(pd200dac{1}.f, sqrt(pd200dac{1}.pxx), 'color', [colors(4, :), 0.5], 'DisplayName', '$\Gamma_{tot}$');
|
|
for i = 2:7
|
|
plot(pd200dac{i}.f, sqrt(pd200dac{i}.pxx), 'color', [colors(4, :), 0.5], 'HandleVisibility', 'off');
|
|
end
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'southeast');
|
|
xlim([1, Fs/2]); ylim([1e-11, 1e-4]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/asd_noise_tot.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:asd_noise_tot
|
|
#+caption: Amplitude Spectral Density of the measured noise and of the individual sources of noise
|
|
#+RESULTS:
|
|
[[file:figs/asd_noise_tot.png]]
|
|
|
|
#+begin_important
|
|
The input noise of the PD200 amplifier is limited by the output voltage noise of the DAC.
|
|
Having a DAC with lower output voltage noise could lower the overall noise of the setup.
|
|
SSI2V 20bits DACs are used in the next section to verify that.
|
|
#+end_important
|
|
|
|
** 20bits DAC noise measurement
|
|
<<sec:noise_ssi2v>>
|
|
|
|
Let's now measure the output voltage noise of another DAC called the "SSI2V" ([[file:doc/\[SSI2V\]Datasheet.pdf][doc]]).
|
|
It is a 20bits DAC with an output voltage range of +/-10.48 V and a very low output voltage noise.
|
|
|
|
The measurement setup is the same as the one in Figure [[fig:noise_measure_setup_dac]].
|
|
|
|
#+begin_src matlab :exports none
|
|
%% SSI2V Output Voltage Noise
|
|
ssi2v = load('mat/noise_preamp_5113_SSI2V.mat', 't', 'Vn', 'notes');
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Take into account the pre-amplifier gain
|
|
ssi2v.Vn = ssi2v.Vn/ssi2v.notes.pre_amp.gain;
|
|
ssi2v.Vn = ssi2v.Vn - mean(ssi2v.Vn);
|
|
#+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
|
|
|
|
#+begin_src matlab :exports none
|
|
% Compute the Power Spectral Density of the measured noise
|
|
win = hanning(ceil(0.5/Ts));
|
|
|
|
[pxx, f] = pwelch(ssi2v.Vn, win, [], [], Fs);
|
|
ssi2v.pxx = pxx;
|
|
ssi2v.f = f;
|
|
#+end_src
|
|
|
|
The obtained Amplitude Spectral Density of the output voltage noise of the SSI2V DAC is shown in Figure [[fig:asd_ssi2v_noise]] and compared with the output voltage noise of the 16bits DAC.
|
|
It is shown to be much smaller (~1 order of magnitude).
|
|
|
|
#+begin_src matlab :exports none
|
|
colors = get(gca,'colororder');
|
|
|
|
figure;
|
|
hold on;
|
|
plot(egg.f, sqrt(egg.pxx), 'DisplayName', '$\Gamma_{n_a}$');
|
|
set(gca,'ColorOrderIndex',3)
|
|
plot(dac.f, sqrt(dac.pxx), 'DisplayName', '$\Gamma_{n_{da}}$');
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./ssi2v.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$');
|
|
set(gca,'ColorOrderIndex',5)
|
|
plot(ssi2v.f, sqrt(ssi2v.pxx), 'DisplayName', '$\Gamma_{n_{SSI2V}}$');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'southeast');
|
|
xlim([1, Fs/2]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/asd_ssi2v_noise.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:asd_ssi2v_noise
|
|
#+caption: Amplitude Spectral Density of the SSI2V DAC's noise
|
|
#+RESULTS:
|
|
[[file:figs/asd_ssi2v_noise.png]]
|
|
|
|
#+begin_important
|
|
Using the SSI2V as the DAC with the PD200 should give much better noise output than using the 16bits DAC.
|
|
The limiting factor should then be the noise of the PD200 itself.
|
|
#+end_important
|
|
|
|
** TODO Noise of the full setup with 20bits DAC
|
|
<<sec:noise_full_measurement_ssi2v>>
|
|
|
|
** PD200 Amplifier noise model
|
|
<<sec:pd200_noise_model>>
|
|
|
|
Let's design a transfer function $G_n(s)$ whose norm represent the Amplitude Spectral Density of the input voltage noise of the PD200 amplifier as shown in Figure [[fig:pd200-model-schematic-normalized-bis]].
|
|
|
|
#+name: fig:pd200-model-schematic-normalized-bis
|
|
#+caption: Model of the voltage amplifier with normalized noise input
|
|
[[file:figs/pd200-model-schematic-normalized.png]]
|
|
|
|
|
|
A simple transfer function that allows to obtain a good fit is defined below.
|
|
#+begin_src matlab
|
|
%% Model of the PD200 Input Voltage Noise
|
|
Gn = 1e-5 * ((1 + s/2/pi/20)/(1 + s/2/pi/2))^2 /(1 + s/2/pi/5e3);
|
|
#+end_src
|
|
|
|
The comparison between the measured ASD of the modeled ASD is done in Figure [[fig:pd200_asd_noise_model]].
|
|
#+begin_src matlab :exports none
|
|
% Plot the ASD of both the measured noise and the modelled one
|
|
freqs = logspace(-1, 4, 1000);
|
|
|
|
figure;
|
|
hold on;
|
|
plot(pd200{1}.f, sqrt(pd200{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$');
|
|
for i = 2:7
|
|
plot(pd200{i}.f, sqrt(pd200{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off');
|
|
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 [$m/\sqrt{Hz}$]');
|
|
xlim([1, Fs/2]);
|
|
ylim([1e-8, 1e-4]);
|
|
legend('location', 'northeast');
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/pd200_asd_noise_model.pdf', 'width', 'wide', 'height', 'normal');
|
|
#+end_src
|
|
|
|
#+name: fig:pd200_asd_noise_model
|
|
#+caption: ASD of the measured input voltage noise and modeled noise using $G_n(s)$
|
|
#+RESULTS:
|
|
[[file:figs/pd200_asd_noise_model.png]]
|
|
|
|
Let's now compute the Cumulative Amplitude Spectrum corresponding to the measurement and the model and compare them.
|
|
|
|
The integration from low to high frequency and from high to low frequency are both shown in Figure [[fig:pd200_cas_noise_model]].
|
|
|
|
The fit between the model and the measurements is rather good considering the complex shape of the measured ASD and the simple model used.
|
|
#+begin_src matlab :exports none
|
|
% Compute the cumulative power spectrum from high to low and low to high frequencies
|
|
for i = 1:7
|
|
pd200{i}.CPS_f = flip(-cumtrapz(flip(pd200{i}.f), flip(pd200{i}.pxx)));
|
|
pd200{i}.CPS = cumtrapz(pd200{i}.f, pd200{i}.pxx);
|
|
end
|
|
|
|
CPS_Gn_f = flip(-cumtrapz(flip(freqs), flip(abs(squeeze(freqresp(Gn, freqs, 'Hz'))).^2)));
|
|
CPS_Gn = cumtrapz(freqs, abs(squeeze(freqresp(Gn, freqs, 'Hz'))).^2);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
figure;
|
|
hold on;
|
|
plot(pd200{1}.f, sqrt(pd200{1}.CPS), 'color', [colors(1, :), 0.5], 'DisplayName', '$CAS$');
|
|
for i = 2:7
|
|
plot(pd200{i}.f, sqrt(pd200{i}.CPS), 'color', [colors(1, :), 0.5], 'HandleVisibility', 'off');
|
|
end
|
|
for i = 1:7
|
|
plot(pd200{i}.f, sqrt(pd200{i}.CPS_f), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off');
|
|
end
|
|
|
|
set(gca,'ColorOrderIndex',1)
|
|
plot(freqs, sqrt(CPS_Gn), '--', 'DisplayName', 'model');
|
|
set(gca,'ColorOrderIndex',2)
|
|
plot(freqs, sqrt(CPS_Gn_f), '--', 'HandleVisibility', 'off');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('CAS [V rms]');
|
|
xlim([1, Fs/2]);
|
|
ylim([1e-6, 1e-4]);
|
|
legend('location', 'northeast');
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/pd200_cas_noise_model.pdf', 'width', 'wide', 'height', 'normal');
|
|
#+end_src
|
|
|
|
#+name: fig:pd200_cas_noise_model
|
|
#+caption: Cumulative Amplitude Spectrum of the measured input voltage noise and modeled noise using $G_n(s)$
|
|
#+RESULTS:
|
|
[[file:figs/pd200_cas_noise_model.png]]
|
|
|
|
The obtained RMS noise of the model is src_matlab[:exports results :results value replace]{ans = 1e6*20*sqrt(CPS_Gn(end))} {{{results(=286.74=)}}} uV RMS which is not that far from the specifications.
|
|
|
|
#+begin_src matlab :tangle no :exports none
|
|
save('matlab/mat/pd200_model.mat', 'Gn', '-append');
|
|
#+end_src
|
|
|
|
Finally the model of the amplifier noise is saved.
|
|
#+begin_src matlab :eval no
|
|
save('mat/pd200_model.mat', 'Gn', '-append');
|
|
#+end_src
|
|
|
|
** Tests :noexport:
|
|
*** 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
|
|
|
|
*** DONE Pre-Amp Noise
|
|
CLOSED: [2021-01-22 ven. 22:51]
|
|
#+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
|
|
|
|
*** DONE DAC (16bits) Noise
|
|
CLOSED: [2021-01-22 ven. 23:13]
|
|
#+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
|
|
|
|
#+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
|
|
|
|
*** DONE Noise when shunting the input (50 Ohms) - After Warmup
|
|
CLOSED: [2021-01-22 ven. 23:09]
|
|
|
|
#+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_warmup]].
|
|
|
|
#+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
|
|
|
|
#+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]]
|
|
|
|
*** DONE Noise with DAC at the input of the PD200
|
|
CLOSED: [2021-01-22 ven. 23:39]
|
|
#+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
|
|
|
|
#+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_dac]].
|
|
#+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
|
|
|
|
*** With 10uF load and Femto pre-amplifier :noexport:
|
|
|
|
#+begin_src matlab :exports none
|
|
% Load Data
|
|
preamp = load('mat/noise_femto.mat', 't', 'Vout', 'notes');
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Compute the equivalent voltage at the input of the amplifier
|
|
preamp.Vout = preamp.Vout/preamp.notes.pre_amp.gain/20;
|
|
preamp.Vout = preamp.Vout - mean(preamp.Vout);
|
|
#+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
|
|
% Hanning window
|
|
win = hanning(ceil(0.5/Ts));
|
|
|
|
% Power Spectral Density
|
|
[pxx, f] = pwelch(preamp.Vout, win, [], [], Fs);
|
|
|
|
% Save the results inside the struct
|
|
preamp.pxx = pxx;
|
|
preamp.f = f;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
figure;
|
|
hold on;
|
|
plot(preamp.f, sqrt(preamp.pxx), 'DisplayName', '$\Gamma_{n_a}$');
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./preamp.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'northeast');
|
|
xlim([1, Fs/2]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Load all the measurements
|
|
pd200b = {};
|
|
for i = 1:7
|
|
pd200b(i) = {load(['mat/noise_PD200_' num2str(i) '_10uF.mat'], 't', 'Vout', 'notes')};
|
|
end
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Take into account the pre-amplifier gain
|
|
for i = 1:7
|
|
pd200b{i}.Vout = pd200b{i}.Vout/pd200b{i}.notes.pre_amp.gain/20;
|
|
end
|
|
#+end_src
|
|
|
|
The measured low frequency noise $n_p$ of one of the amplifiers is shown in Figure [[fig:pd200_noise_time_lpf]].
|
|
It is very similar to the one specified in the datasheet in Figure [[fig:pd200_expected_noise]].
|
|
#+begin_src matlab :exports none
|
|
% Compute the low frequency noise
|
|
G_lpf = 1/(1 + s/2/pi/20);
|
|
t_max = 40;
|
|
|
|
figure;
|
|
hold on;
|
|
plot(pd200b{1}.t(1:t_max/Ts), 20*lsim(G_lpf, 1e3*pd200b{1}.Vout(1:t_max/Ts), pd200b{1}.t(1:t_max/Ts)))
|
|
hold off;
|
|
xlabel('Time [s]');
|
|
ylabel('Voltage [mV]');
|
|
ylim([-3, 3]);
|
|
#+end_src
|
|
|
|
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 for the low frequency noise
|
|
Vn_rms = zeros(6,1); % RMS value [uV rms]
|
|
Vn_pkp = zeros(6,1); % Peak to Peak Value in 20Hz bandwidth [mV]
|
|
for i = 1:7
|
|
Vn_rms(i) = 1e6*rms(pd200b{i}.Vout);
|
|
Vn_lpf = lsim(1/(1 + s/2/pi/20), pd200b{i}.Vout, pd200b{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 low frequency noise (0.01Hz to 20Hz)
|
|
#+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 | 281.9 | 1.6 |
|
|
| PD200_2 | 665.6 | 2.0 |
|
|
| PD200_3 | 314.8 | 2.1 |
|
|
| PD200_4 | 360.1 | 2.2 |
|
|
| PD200_5 | 563.2 | 1.7 |
|
|
| PD200_6 | 323.3 | 2.0 |
|
|
| PD200_7 | 212.5 | 1.1 |
|
|
|
|
#+begin_src matlab :exports none
|
|
% Sampling time / frequency
|
|
Ts = (pd200b{1}.t(end) - pd200b{1}.t(1))/(length(pd200b{1}.t) - 1);
|
|
Fs = 1/Ts;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
win = hanning(ceil(0.5/Ts));
|
|
|
|
for i = 1:7
|
|
[pxx, f] = pwelch(pd200b{i}.Vout, win, [], [], Fs);
|
|
pd200b{i}.f = f;
|
|
pd200b{i}.pxx = pxx;
|
|
end
|
|
#+end_src
|
|
|
|
The Amplitude Spectral Density of the measured noise is now computed and shown in Figure [[fig:asd_noise_3uF_warmup]].
|
|
#+begin_src matlab :exports none
|
|
colors = get(gca,'colororder');
|
|
|
|
figure;
|
|
hold on;
|
|
plot(preamp.f, sqrt(preamp.pxx), 'DisplayName', '$\Gamma_{n_a}$');
|
|
plot(pd200b{1}.f, sqrt(pd200b{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$');
|
|
for i = 2:7
|
|
plot(pd200b{i}.f, sqrt(pd200b{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off');
|
|
end
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./pd200b{1}.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'southeast');
|
|
xlim([1, Fs/2]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/asd_noise_10uF.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:asd_noise_10uF
|
|
#+caption: Amplitude Spectral Density of the measured noise
|
|
#+RESULTS:
|
|
[[file:figs/asd_noise_10uF.png]]
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Load all the measurements
|
|
pd200t = {};
|
|
for i = 1:7
|
|
pd200t(i) = {load(['mat/noise_PD200_' num2str(i) '_10uF_DAC.mat'], 't', 'Vout', 'notes')};
|
|
end
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Take into account the pre-amplifier gain
|
|
for i = 1:7
|
|
pd200t{i}.Vout = pd200t{i}.Vout/pd200t{i}.notes.pre_amp.gain/20;
|
|
end
|
|
#+end_src
|
|
|
|
The measured low frequency noise $n_p$ of one of the amplifiers is shown in Figure [[fig:pd200_noise_time_lpf]].
|
|
It is very similar to the one specified in the datasheet in Figure [[fig:pd200_expected_noise]].
|
|
#+begin_src matlab :exports none
|
|
% Compute the low frequency noise
|
|
G_lpf = 1/(1 + s/2/pi/20);
|
|
t_max = 40;
|
|
|
|
figure;
|
|
hold on;
|
|
plot(pd200t{1}.t(1:t_max/Ts), lsim(G_lpf, 1e3*pd200t{1}.Vout(1:t_max/Ts), pd200t{1}.t(1:t_max/Ts)))
|
|
hold off;
|
|
xlabel('Time [s]');
|
|
ylabel('Voltage [mV]');
|
|
ylim([-3, 3]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Sampling time / frequency
|
|
Ts = (pd200t{1}.t(end) - pd200t{1}.t(1))/(length(pd200t{1}.t) - 1);
|
|
Fs = 1/Ts;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
win = hanning(ceil(0.5/Ts));
|
|
|
|
for i = 1:7
|
|
[pxx, f] = pwelch(pd200t{i}.Vout, win, [], [], Fs);
|
|
pd200t{i}.f = f;
|
|
pd200t{i}.pxx = pxx;
|
|
end
|
|
#+end_src
|
|
|
|
The Amplitude Spectral Density of the measured noise is now computed and shown in Figure [[fig:asd_noise_3uF_warmup]].
|
|
#+begin_src matlab :exports none
|
|
colors = get(gca,'colororder');
|
|
|
|
figure;
|
|
hold on;
|
|
plot(preamp.f, sqrt(preamp.pxx), 'DisplayName', '$\Gamma_{n_a}$');
|
|
plot(pd200b{1}.f, sqrt(pd200b{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$');
|
|
for i = 2:7
|
|
plot(pd200b{i}.f, sqrt(pd200b{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off');
|
|
end
|
|
set(gca,'ColorOrderIndex',3)
|
|
plot(dac.f, 20*sqrt(dac.pxx), 'DisplayName', '$|G_p| \cdot \Gamma_{n_{da}}$');
|
|
plot(pd200t{1}.f, sqrt(pd200t{1}.pxx), 'color', [colors(4, :), 0.5], 'DisplayName', '$\Gamma_{tot}$');
|
|
for i = 2:7
|
|
plot(pd200t{i}.f, sqrt(pd200t{i}.pxx), 'color', [colors(4, :), 0.5], 'HandleVisibility', 'off');
|
|
end
|
|
plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./pd200t{1}.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'southeast');
|
|
xlim([1, Fs/2]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :tangle no :exports results :results file replace
|
|
exportFig('figs/asd_noise_10uF.pdf', 'width', 'wide', 'height', 'tall');
|
|
#+end_src
|
|
|
|
#+name: fig:asd_noise_10uF
|
|
#+caption: Amplitude Spectral Density of the measured noise
|
|
#+RESULTS:
|
|
[[file:figs/asd_noise_10uF.png]]
|
|
|
|
* Comparison to other commercial amplifiers
|
|
<<sec:comp_pi_cedrat>>
|
|
** Introduction
|
|
In this section, three similar voltage amplifiers are compared:
|
|
- the [[file:doc/PD200-V7-R1.pdf][PD200]] from PiezoDrive
|
|
- the [[file:doc/LA75B.pdf][LA75B]] from CedratTechnologies
|
|
- the [[file:doc/E-505-Datasheet.pdf][E-505.00]] from PI
|
|
|
|
These are compared in term of dynamic from input voltage to output voltage for a load of $10\,\mu F$ in Section [[sec:tf_comp]] and then in term of input voltage noise in Section [[sec:noise_comp]].
|
|
|
|
The characteristics that I could find for the three amplifiers are summarized in Table [[tab:amplifiers_characteristics]].
|
|
|
|
#+name: tab:amplifiers_characteristics
|
|
#+caption: Characteristics of the three tested voltage amplifiers
|
|
#+attr_latex: :environment tabularx :width 0.9\linewidth :align lccc
|
|
#+attr_latex: :center t :booktabs t :float t
|
|
| <l> | <c> | <c> | <c> |
|
|
| *Characteristics* | *PD200* | *LA75B* | *E-505* |
|
|
|------------------------+------------------+---------------------+--------------|
|
|
| Gain | 20 [V/V] | 20 [V/V] | 10 [V/V] |
|
|
| Maximum RMS current | 0.9 [A] | 0.4 [A] | |
|
|
| Maximum Pulse current | 10 [A] | 1 [A] | 2 [A] |
|
|
| Slew Rate | 150 [V/us] | | |
|
|
| Noise (10uF load) | 0.7 [mV RMS] | 3.4 [mV RMS] | 0.6 [mV RMS] |
|
|
| Small Signal Bandwidth | 7.4 [kHz] (10uF) | 30 [kHz] (unloaded) | |
|
|
|
|
#+begin_note
|
|
The documentation for the three amplifiers can be found here: [[file:doc/PD200-V7-R1.pdf][PD200]], [[file:doc/LA75B.pdf][LA75B]], [[file:doc/E-505-Datasheet.pdf][E-505.00]].
|
|
#+end_note
|
|
|
|
** 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
|
|
|
|
** Transfer functions
|
|
<<sec:tf_comp>>
|
|
|
|
#+begin_src matlab
|
|
la75 = load('tf_la75_10uF_small_signal.mat', 't', 'Vin', 'Vout');
|
|
pd200 = load('tf_pd200_1_10uF_small_signal.mat', 't', 'Vin', 'Vout', 'notes');
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Compute sampling Frequency
|
|
Ts = (pd200.t(end) - pd200.t(1))/(length(pd200.t)-1);
|
|
Fs = 1/Ts;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
%% Compute all the transfer functions
|
|
win = hanning(ceil(0.5*Fs)); % Hannning Windows
|
|
|
|
[tf_pd200, f] = tfestimate(pd200.Vin, 20*pd200.Vout, win, [], [], 1/Ts);
|
|
[tf_la75, ~] = tfestimate(la75.Vin, la75.Vout, win, [], [], 1/Ts);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
figure;
|
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
|
|
|
ax1 = nexttile;
|
|
hold on;
|
|
plot(f, abs(tf_pd200))
|
|
plot(f(f<900), abs(tf_la75(f<900)))
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]);
|
|
hold off;
|
|
ylim([10, 30]);
|
|
|
|
ax2 = nexttile;
|
|
hold on;
|
|
plot(f, 180/pi*angle(tf_pd200), 'DisplayName', 'PD200')
|
|
plot(f(f<900), 180/pi*angle(tf_la75(f<900)), 'DisplayName', 'LA75')
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
|
hold off;
|
|
yticks(-360:2:360);
|
|
ylim([-12, 2]);
|
|
legend('location', 'southwest');
|
|
|
|
linkaxes([ax1,ax2],'x');
|
|
xlim([1, 5e3]);
|
|
#+end_src
|
|
|
|
** Noise Characteristics
|
|
<<sec:noise_comp>>
|
|
|
|
#+begin_src matlab :exports none
|
|
pd200 = load('mat/noise_PD200_1_10uF.mat', 't', 'Vout', 'notes');
|
|
la75 = load('mat/noise_la75_10uF.mat', 't', 'Vout', 'notes');
|
|
#+end_src
|
|
|
|
#+begin_src matlab
|
|
pd200.Vout = pd200.Vout/pd200.notes.pre_amp.gain;
|
|
la75.Vout = la75.Vout/la75.notes.pre_amp.gain;
|
|
#+end_src
|
|
|
|
#+begin_src matlab
|
|
figure;
|
|
hold on;
|
|
plot(pd200.t, 1e3*pd200.Vout)
|
|
plot(la75.t, 1e3*la75.Vout)
|
|
hold off;
|
|
xlabel('Time [s]');
|
|
ylabel('Voltage [mV]');
|
|
% ylim([-3, 3]);
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
% Sampling time / frequency
|
|
Ts = (pd200.t(end) - pd200.t(1))/(length(pd200.t) - 1);
|
|
Fs = 1/Ts;
|
|
|
|
% Hanning window
|
|
win = hanning(ceil(0.5/Ts));
|
|
|
|
[pxx, f] = pwelch(pd200.Vout, win, [], [], Fs);
|
|
pd200.pxx = pxx;
|
|
pd200.f = f;
|
|
|
|
[pxx, f] = pwelch(la75.Vout, win, [], [], Fs);
|
|
la75.pxx = pxx;
|
|
la75.f = f;
|
|
#+end_src
|
|
|
|
#+begin_src matlab :exports none
|
|
colors = get(gca,'colororder');
|
|
|
|
figure;
|
|
hold on;
|
|
plot(pd200.f, sqrt(pd200.pxx), 'DisplayName', 'PD200');
|
|
plot(la75.f, sqrt(la75.pxx), 'DisplayName', 'LA75');
|
|
hold off;
|
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('ASD [$V/\sqrt{Hz}$]');
|
|
legend('location', 'southeast');
|
|
xlim([1, Fs/2]);
|
|
#+end_src
|
|
|
|
* Conclusion
|
|
<<sec: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] | - |
|