diff --git a/doc/E-505-Datasheet.pdf b/doc/E-505-Datasheet.pdf new file mode 100644 index 0000000..84f7aa1 Binary files /dev/null and b/doc/E-505-Datasheet.pdf differ diff --git a/doc/LA75B.pdf b/doc/LA75B.pdf new file mode 100644 index 0000000..0055f41 Binary files /dev/null and b/doc/LA75B.pdf differ diff --git a/doc/[SSI2V]Datasheet.pdf b/doc/SSI2V_Datasheet.pdf similarity index 100% rename from doc/[SSI2V]Datasheet.pdf rename to doc/SSI2V_Datasheet.pdf diff --git a/figs/asd_noise_pd200_10uF.pdf b/figs/asd_noise_pd200_10uF.pdf new file mode 100644 index 0000000..529d134 Binary files /dev/null and b/figs/asd_noise_pd200_10uF.pdf differ diff --git a/figs/asd_noise_pd200_10uF.png b/figs/asd_noise_pd200_10uF.png new file mode 100644 index 0000000..59073ce Binary files /dev/null and b/figs/asd_noise_pd200_10uF.png differ diff --git a/figs/asd_noise_tot.pdf b/figs/asd_noise_tot.pdf index f78894a..5b91b5f 100644 Binary files a/figs/asd_noise_tot.pdf and b/figs/asd_noise_tot.pdf differ diff --git a/figs/asd_noise_tot.png b/figs/asd_noise_tot.png index 91a1a77..40aabfa 100644 Binary files a/figs/asd_noise_tot.png and b/figs/asd_noise_tot.png differ diff --git a/figs/pd200_asd_noise_model.pdf b/figs/pd200_asd_noise_model.pdf index 1961414..f558fc9 100644 Binary files a/figs/pd200_asd_noise_model.pdf and b/figs/pd200_asd_noise_model.pdf differ diff --git a/figs/pd200_asd_noise_model.png b/figs/pd200_asd_noise_model.png index 40d6abc..6351999 100644 Binary files a/figs/pd200_asd_noise_model.png and b/figs/pd200_asd_noise_model.png differ diff --git a/figs/pd200_cas_noise_model.pdf b/figs/pd200_cas_noise_model.pdf index 31add26..54509c7 100644 Binary files a/figs/pd200_cas_noise_model.pdf and b/figs/pd200_cas_noise_model.pdf differ diff --git a/figs/pd200_cas_noise_model.png b/figs/pd200_cas_noise_model.png index c66ae2d..b5656a7 100644 Binary files a/figs/pd200_cas_noise_model.png and b/figs/pd200_cas_noise_model.png differ diff --git a/figs/pd200_large_signal_tf.pdf b/figs/pd200_large_signal_tf.pdf new file mode 100644 index 0000000..86a3239 Binary files /dev/null and b/figs/pd200_large_signal_tf.pdf differ diff --git a/figs/pd200_large_signal_tf.png b/figs/pd200_large_signal_tf.png new file mode 100644 index 0000000..b261ec9 Binary files /dev/null and b/figs/pd200_large_signal_tf.png differ diff --git a/figs/pd200_noise_time_lpf.pdf b/figs/pd200_noise_time_lpf.pdf index fd90285..901a799 100644 Binary files a/figs/pd200_noise_time_lpf.pdf and b/figs/pd200_noise_time_lpf.pdf differ diff --git a/figs/pd200_small_signal_tf.pdf b/figs/pd200_small_signal_tf.pdf new file mode 100644 index 0000000..395a4e0 Binary files /dev/null and b/figs/pd200_small_signal_tf.pdf differ diff --git a/figs/pd200_small_signal_tf.png b/figs/pd200_small_signal_tf.png new file mode 100644 index 0000000..6358399 Binary files /dev/null and b/figs/pd200_small_signal_tf.png differ diff --git a/figs/pd200_small_signal_tf_model.pdf b/figs/pd200_small_signal_tf_model.pdf new file mode 100644 index 0000000..001c6ea Binary files /dev/null and b/figs/pd200_small_signal_tf_model.pdf differ diff --git a/figs/pd200_small_signal_tf_model.png b/figs/pd200_small_signal_tf_model.png new file mode 100644 index 0000000..ec432ba Binary files /dev/null and b/figs/pd200_small_signal_tf_model.png differ diff --git a/figs/setup-dynamics-measurement.pdf b/figs/setup-dynamics-measurement.pdf index a613412..2329b50 100644 Binary files a/figs/setup-dynamics-measurement.pdf and b/figs/setup-dynamics-measurement.pdf differ diff --git a/figs/setup-dynamics-measurement.png b/figs/setup-dynamics-measurement.png index ce2d04e..713c578 100644 Binary files a/figs/setup-dynamics-measurement.png and b/figs/setup-dynamics-measurement.png differ diff --git a/figs/setup-dynamics-measurement.svg b/figs/setup-dynamics-measurement.svg index ac4d2db..21e4c93 100644 --- a/figs/setup-dynamics-measurement.svg +++ b/figs/setup-dynamics-measurement.svg @@ -9,14 +9,43 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="107.05267mm" - height="22.557003mm" - viewBox="0 0 107.05267 22.557003" + height="26.790337mm" + viewBox="0 0 107.05266 26.790336" version="1.1" id="svg16293" sodipodi:docname="setup-dynamics-measurement.svg" - inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07, custom)"> + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + + + + + + + inkscape:isstock="true" + inkscape:collect="always"> @@ -213,15 +243,15 @@ overflow="visible" id="symbol1317"> @@ -229,16 +259,16 @@ overflow="visible" id="symbol564"> @@ -248,7 +278,7 @@ overflow="visible" id="symbol7787"> @@ -256,15 +286,15 @@ overflow="visible" id="symbol6786"> @@ -272,24 +302,24 @@ overflow="visible" id="symbol9694"> @@ -299,7 +329,7 @@ overflow="visible" id="symbol1078"> @@ -307,15 +337,15 @@ overflow="visible" id="symbol4771"> @@ -323,47 +353,47 @@ overflow="visible" id="symbol4118"> @@ -371,27 +401,41 @@ overflow="visible" id="symbol7165"> + + + Input - + style="fill:#a7a7a7;fill-opacity:0.36;fill-rule:evenodd;stroke:#262604;stroke-width:0.264583;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers fill stroke;stop-color:#000000" + d="M -4.3046069,23.192768 H 26.031212 V 46.908157 H -4.3046069 Z" + sodipodi:nodetypes="ccccc" /> Monitor1/20 + transform="matrix(3.7795276,0,0,3.7795276,-574.70368,-225.38707)"> @@ -562,7 +604,7 @@ sodipodi:nodetypes="cc" /> 20 Load Box + transform="translate(-24.376893,73.976684)"> TSP + transform="translate(-2.8878782,154.6281)"> + transform="translate(-2.8878782,154.6281)"> + transform="translate(-2.8878782,154.6281)"> + + + + + + + ADC + + + + + + + + + Save diff --git a/index.org b/index.org deleted file mode 100644 index 348019f..0000000 --- a/index.org +++ /dev/null @@ -1,1608 +0,0 @@ -#+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: -#+HTML_HEAD: - -#+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 -
-

This report is also available as a pdf.

-
-#+end_export - -* 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 -| | | -| | *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 -| | | | -| *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_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 output noise $n$. -This noise is described by its Power Spectral Density. - -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 output noise. - -As both $G_p$ and $S_n$ depends on the load capacitance, they should be measured when loading the amplifier with a $10\,\mu F$ capacitor. - -#+begin_src latex :file pd200-model-schematic.pdf - \begin{tikzpicture} - \node[block] (G) at (0,0){$G_p(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 -** Introduction :ignore: - -- Section [[sec:noise_setup]] -- Section [[sec:noise_model]] -- Section [[sec:noise_quantization]] -- Section [[sec:noise_preamp]] -- Section [[sec:noise_pd200]] -- Section [[sec:noise_dac]] -- Section [[sec:noise_full_measurement]] -- Section [[sec:noise_ssi2v]] - -** Matlab Init :noexport:ignore: -#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) -<> -#+end_src - -#+begin_src matlab :exports none :results silent :noweb yes -<> -#+end_src - -#+begin_src matlab :tangle no -addpath('./matlab/mat/'); -addpath('./matlab/'); -#+end_src - -#+begin_src matlab :eval no -addpath('./mat/'); -#+end_src - -** 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. - -** Model of the setup -<> - -As shown in Figure [[fig:noise_meas_procedure]], there are 4 equipment 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$: output 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[block, right=1.2 of addnda] (Gp){$G_p(s)$}; - \node[addb, right=0.4 of Gp] (addnp){}; - - % Pre Amp - \node[addb, right=1.2 of addnp] (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) -- (Gp.west); - \draw[->] (Gp.east) -- (addnp.west); - \draw[->] (addnp.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={(Gp.west|-bot) (addnp.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]] - -** Quantization Noise -<> - -The quantization noise is something that can be predicted. -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] - -#+begin_src matlab -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}$. - -** Pre Amplifier noise measurement -<> - -First, we wish to measure the noise of the pre-amplifier. -To do so, the input of the pre-amplifier is shunted such that there is 0V at its inputs. -Then, the gain of the amplifier is increase 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} - -This is true if the quantization noise $\Gamma_{q_{ad}}$ is negligible. - -#+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 -% Load Data -preamp = load('mat/noise_preamp_5113.mat', 't', 'Vn', 'notes'); -#+end_src - -The gain of the low noise amplifier is set to src_matlab[:exports results :results value replace]{ans = preamp.notes.pre_amp.gain} {{{results(=50000=)}}}. - -#+begin_src matlab :exports none -% Compute the equivalent voltage at the input of the amplifier -preamp.Vn = preamp.Vn/preamp.notes.pre_amp.gain; -preamp.Vn = preamp.Vn - mean(preamp.Vn); -#+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.Vn, win, [], [], Fs); - -% Save the results inside the struct -preamp.pxx = pxx; -preamp.f = f; -#+end_src - -The obtained Amplitude Spectral Density of the Low Noise Voltage Amplifier is shown in Figure [[fig:asd_preamp]]. -The obtained noise amplitude is very closed to the one specified in the documentation of $4nV/\sqrt{Hz}$ at 1kHZ. - -#+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 :tangle no :exports results :results file replace -exportFig('figs/asd_preamp.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:asd_preamp -#+caption: Obtained Amplitude Spectral Density of the Low Noise Voltage Amplifier -#+RESULTS: -[[file:figs/asd_preamp.png]] - -** PD200 noise measurement -<> - -The input of the PD200 amplifier is shunted such that there is 0V between its inputs. -Then the gain of the pre-amplifier is increased in order to measure a signal much larger than the quantization noise of the ADC. -We compute the Amplitude Spectral Density of the measured signal $\Gamma_n(\omega)$. -The Amplitude Spectral Density of $n_p$ can be computed taking into account the gain of the pre-amplifier: -\begin{equation} -\Gamma_{n_p}(\omega) = \frac{\Gamma_n(\omega)}{|G_a(\omega)|} -\end{equation} - -And we verify that this is indeed the noise of the PD200 and not the noise of the pre-amplifier by checking that: -\begin{equation} -\Gamma_{n_p} \ll \Gamma_{n_a} -\end{equation} - -#+begin_src latex :file noise_measure_setup_pd200.pdf -\begin{tikzpicture} - \node[block={0.6cm}{0.6cm}] (const) {$0$}; - - % PD200 - \node[block, right=0.6 of const] (Gp){$G_p(s)$}; - \node[addb, right=0.4 of Gp] (addnp){}; - - % Pre Amp - \node[addb, right=1.2 of addnp] (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) -- (Gp.west); - \draw[->] (Gp.east) -- (addnp.west); - \draw[->] (addnp.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={(Gp.west|-bot) (addnp.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 -%% 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 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(pd200w{1}.t(1:t_max/Ts), 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 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(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 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 | 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 :exports none -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 - -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(pd200w{1}.f, sqrt(pd200w{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$'); -for i = 2:7 - plot(pd200w{i}.f, sqrt(pd200w{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); -end -plot([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./pd200w{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_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]] - -** DAC noise measurement -<> - -In order not to have any quantization noise, we impose the DAC to output a zero voltage. -The gain of the low noise amplifier is adjusted to - -The Amplitude Spectral Density $\Gamma_n(\omega)$ of the measured signal is computed. -The Amplitude Spectral Density of $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 verify 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 = load('mat/noise_preamp_5113_dac.mat', 't', 'Vn', 'notes'); -#+end_src - -#+begin_src matlab :exports none -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 -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 -colors = get(gca,'colororder'); - -figure; -hold on; -plot(preamp.f, sqrt(preamp.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: -#+RESULTS: -[[file:figs/asd_noise_dac.png]] - -** Total noise measurement -<> - -Let's now analyze the measurement of the setup in Figure [[fig:noise_meas_procedure]]. - -#+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 -% 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_tot]]. -#+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 -colors = get(gca,'colororder'); - -figure; -hold on; -plot(preamp.f, sqrt(preamp.pxx), 'DisplayName', '$\Gamma_{n_a}$'); -plot(pd200w{2}.f, sqrt(pd200w{2}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$'); -for i = 2:7 - plot(pd200w{i}.f, sqrt(pd200w{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([1 Fs/2], [adc.Gamma_q, adc.Gamma_q]./dac.notes.pre_amp.gain, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_a|$'); -plot(pd200dac{2}.f, sqrt(pd200dac{2}.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]); -#+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 output noise of the PD200 amplifier is limited by the noise of the DAC. -Having a DAC with lower noise could lower the output noise of the PD200. -SSI2V DACs will be used to verify that. -#+end_important - -** 20bits DAC noise measurement -<> -Let's now measure the noise of another DAC called the "SSI2V" ([[file:doc/\[SSI2V\]Datasheet.pdf][doc]]). -It is a 20bits DAC with an output of +/-10.48 V and a very low noise. - -The measurement setup is the same as the one in Figure [[fig:noise_measure_setup_dac]]. - -#+begin_src matlab :exports none -ssi2v = load('mat/noise_preamp_5113_SSI2V.mat', 't', 'Vn', 'notes'); -#+end_src - -#+begin_src matlab :exports none -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 -win = hanning(ceil(0.5/Ts)); - -[pxx, f] = pwelch(ssi2v.Vn, win, [], [], Fs); -ssi2v.pxx = pxx; -ssi2v.f = f; -#+end_src - -The obtained noise of the SSI2V DAC is shown in Figure [[fig:asd_ssi2v_noise]] and compared with the 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(preamp.f, sqrt(preamp.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 - -** 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) -<> -#+end_src - -#+begin_src matlab :exports none :results silent :noweb yes -<> -#+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 - -* 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]] - -** Matlab Init :noexport:ignore: -#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) -<> -#+end_src - -#+begin_src matlab :exports none :results silent :noweb yes -<> -#+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 - -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: -\[ \omega_{\text{max}} = \frac{1}{20 C V_{in}} I_{out,\text{max}} \] - -$\omega_max$ 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]] - -** Obtained Transfer Functions -Several identifications using sweep sin were performed with input voltage amplitude ranging from 0.1V to 4V. - -#+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_7_' Vin_ampl{i} 'V.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 -% Hannning Windows -win = hanning(ceil(0.5*Fs)); - -% Compute all the transfer functions -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 frequency response functions are shown in Figure [[fig:pd200_tf_voltage]]. -As the input voltage increases, the voltage drop is increasing. - -#+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), 'DisplayName', sprintf('$V_{in} = %.1f [V]$', pd200{i}.notes.pd200.Vin)) -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([19, 21]); -legend('location', 'northeast'); - -ax2 = nexttile; -hold on; -for i = 1:length(pd200) - plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf)) -end -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -yticks(-360:5:360); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -ylim([-15, 5]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 5e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/pd200_tf_voltage.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:pd200_tf_voltage -#+caption: Transfer function for the PD200 amplitude between $V_{in}$ and $V_{out}$ for multiple voltage amplitudes -#+RESULTS: -[[file:figs/pd200_tf_voltage.png]] - -The small signal transfer function of the amplifier can be approximated by a first order low pass filter. - -#+begin_src matlab -Gp = 19.95/(1 + s/2/pi/35e3); -#+end_src - -The comparison from the model and measurements are shown in Figure [[fig:tf_pd200_model]]. - -#+begin_src matlab :exports none -freqs = logspace(1, 4, 1000); -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 -plot(freqs, abs(squeeze(freqresp(Gp, freqs, 'Hz'))), 'k--'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([19, 21]); - -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 -plot(freqs, 180/pi*angle(squeeze(freqresp(Gp, freqs, 'Hz'))), 'k--', 'DisplayName', '$G_p(j\omega)$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -yticks(-5:1:5); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -ylim([-3, 1]); -legend('location', 'southwest'); - -linkaxes([ax1,ax2],'x'); -xlim([10, 1e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/tf_pd200_model.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:tf_pd200_model -#+caption: Comparison of the model transfer function and the measured frequency response function -#+RESULTS: -[[file:figs/tf_pd200_model.png]] - -* 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 -| | | | | -| *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] | - | diff --git a/matlab/mat/pd200_model.mat b/matlab/mat/pd200_model.mat new file mode 100644 index 0000000..85d2c7d Binary files /dev/null and b/matlab/mat/pd200_model.mat differ diff --git a/test-bench-pd200.html b/test-bench-pd200.html index e525031..bb2314b 100644 --- a/test-bench-pd200.html +++ b/test-bench-pd200.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Voltage Amplifier PD200 - Test Bench @@ -39,37 +39,41 @@

Table of Contents

@@ -77,52 +81,49 @@

This report is also available as a pdf.


+

+\clearpage +

+

The goal of this test bench is to characterize the Voltage amplifier PD200 from PiezoDrive.

-
-

-The documentation of the PD200 is accessible here. -

- -
-

This document is organized as follows:

    -
  • Section 1: the requirements for the amplifiers and the characteristics of the PD200 amplifiers as advertise in the datasheet are listed.
  • -
  • Section 2: a very simple amplifier model consisting of a transfer function and a noise source is described.
  • -
  • Section 3: the transfer function from input voltage to output voltage is identified.
  • -
  • Section 4: the power spectral density of the amplifier’s noise is measured
  • -
  • Section 5: the characteristics of the PD200 amplifier are compared to the E.505 amplifier from PI and to the LA75 from cedrat
  • -
  • Section 6: the measured characteristics of the PD200 amplifier are compared with the requirements
  • +
  • Section 1: the requirements for the amplifiers and the characteristics of the PD200 amplifiers as advertise in the datasheet are listed.
  • +
  • Section 2: a very simple amplifier model consisting of a transfer function and a noise source is described.
  • +
  • Section 3: the transfer function from input voltage to output voltage is identified.
  • +
  • Section 4: the power spectral density of the amplifier’s noise is measured
  • +
  • Section 5: the characteristics of the PD200 amplifier are compared to the E.505 amplifier from PI and to the LA75 from cedrat
  • +
  • Section 6: the measured characteristics of the PD200 amplifier are compared with the requirements
-
-

1 Requirements PD200 Expected characteristics

+
+

1 Requirements PD200 Expected characteristics

- +

-A picture of the PD200 amplifier is shown in Figure 1. +A picture of the PD200 amplifier is shown in Figure 1.

-
+

amplifier_PD200.png

Figure 1: Picture of the PD200 Voltage Amplifier

-The specifications as well as the amplifier characteristics as shown in the datasheet are summarized in Table 1. +The specifications as well as the amplifier characteristics as shown in the datasheet are summarized in Table 1.

- +
@@ -201,22 +202,22 @@ The most important characteristics are the large (small signal) bandwidth > 5

-For a load capacitance of \(10\,\mu F\), the expected \(-3\,dB\) bandwidth is \(6.4\,kHz\) (Figure 2) and the low frequency noise is \(650\,\mu V\,\text{rms}\) (Figure 3). +For a load capacitance of \(10\,\mu F\), the expected \(-3\,dB\) bandwidth is \(6.4\,kHz\) (Figure 2) and the low frequency noise is \(650\,\mu V\,\text{rms}\) (Figure 3).

-These two characteristics are respectively measured in Section 3 and Section 4. +These two characteristics are respectively measured in Section 3 and Section 4.

-
+

pd200_expected_small_signal_bandwidth.png

Figure 2: Expected small signal bandwidth

-
+

pd200_expected_noise.png

Figure 3: Expected Low frequency noise from 0.03Hz to 20Hz

@@ -224,11 +225,11 @@ These two characteristics are respectively measured in Section -

2 Voltage Amplifier Model

+
+

2 Voltage Amplifier Model

- +

@@ -249,7 +250,7 @@ As \(G_p\) depends on the load capacitance, it should be measured when loading t

-
+

pd200-model-schematic.png

Figure 4: Model of the voltage amplifier

@@ -257,7 +258,7 @@ As \(G_p\) depends on the load capacitance, it should be measured when loading t

-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 6. +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 6.

@@ -272,42 +273,44 @@ with \(\Gamma_{\tilde{n}}(\omega) = 1\). -

+

pd200-model-schematic-normalized.png

+

Figure 5: Model of the voltage amplifier with normalized noise input

-
-

3 Transfer Function measurement

+
+

3 Transfer Function measurement

- +

In this section, the transfer function of the PD200 amplifier is measured:

    -
  • Section 3.1: the measurement setup is described
  • -
  • Section 3.2: the maximum sinusoidal excitation frequency is estimated in order to not overload the amplifier
  • -
  • Section 3.3: the small signal bandwidth measurement results are shown
  • -
  • Section 3.4: the amplifier’s transfer function is estimated for several input amplitudes
  • +
  • Section 3.1: the measurement setup is described
  • +
  • Section 3.2: the maximum sinusoidal excitation frequency is estimated in order to not overload the amplifier
  • +
  • Section 3.3: the small signal bandwidth measurement results are shown
  • +
  • Section 3.4: a model of the small signal dynamics of the amplifier is obtained
  • +
  • Section 3.5: the amplifier’s transfer function is estimated for several input amplitudes
-
-

3.1 Setup

+
+

3.1 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 6 is used. +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 6 is used.

-
+

Here are the documentation of the equipment used for this test bench:

@@ -324,7 +327,7 @@ For this measurement, the sampling frequency of the Speedgoat ADC should be as h

-
+

setup-dynamics-measurement.png

Figure 6: Schematic of the test bench to estimate the dynamics from voltage input \(V_{in}\) to voltage output \(V_{out}\)

@@ -332,11 +335,11 @@ For this measurement, the sampling frequency of the Speedgoat ADC should be as h
-
-

3.2 Maximum Frequency/Voltage to not overload the amplifier

+
+

3.2 Maximum Frequency/Voltage to not overload the amplifier

- +

@@ -380,11 +383,11 @@ with:

-\(\omega_{\text{max}}/2\pi\) as a function of \(V_{in}\) is shown in Figure 7. +\(\omega_{\text{max}}/2\pi\) as a function of \(V_{in}\) is shown in Figure 7.

-
+

max_frequency_voltage.png

Figure 7: Maximum frequency as a function of the excitation voltage amplitude

@@ -396,94 +399,149 @@ When doing sweep sine excitation, we make sure not to reach this maximum excitat
-
-

3.3 Small Signal Bandwidth

+
+

3.3 Small Signal Bandwidth

- -Load Data +

-Compute Transfer Functions +Here the small signal dynamics of all the 7 PD200 amplifiers are identified.

-Compare +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.

-Model +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.

-Save Model +The obtained transfer functions from \(V_{in}\) to \(V_{out}\) are shown in Figure 8. +

+ +
+

pd200_small_signal_tf.png +

+

Figure 8: Identified dynamics from input voltage to output voltage

+
+ +

+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.

-
-

3.4 Bandwidth for multiple excitation signals

+
+

3.4 Model of the amplifier small signal dynamics

- +

-Several identifications using sweep sin were performed with input voltage amplitude ranging from 0.1V to 4V. +The identified dynamics in Figure 8 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)\). +

-
Iout_max = 0.57; % Maximum output current [A]
-C = 10e-6; % Load Capacitance [F]
+
Gp = 20/(1 + s/2/pi/25e3);
+
+
-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 +

+Comparison of the model with the identified dynamics is shown in Figure 9. +

+ +
+

pd200_small_signal_tf_model.png +

+

Figure 9: Bode plot of \(G_d(s)\) as well as the identified transfer functions of all 7 amplifiers

+
+ +

+And finally this model is saved. +

+
+
save('mat/pd200_model.mat', 'Gp');
 
+ +
+

3.5 Large Signal Bandwidth

+
+

+ +

+ +

+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 3.2. +

+ +

+The obtained transfer functions for the different excitation amplitudes are shown in Figure 10. +It is shown that the input voltage amplitude does not affect that much the amplifier dynamics. +

+ + +
+

pd200_large_signal_tf.png +

+

Figure 10: Amplifier dynamics for several input voltage amplitudes

+
+
+
-
-

4 Noise measurement

+
+

4 Noise measurement

- +

-In section 4.1, the measurement setup is described and a model (block diagram) of the setup is given in section 4.2. +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 4.1, the measurement setup is described and a model (block diagram) of the setup is given in section 4.2.

Then, the noise contribution of each element is measured:

    -
  • Section 4.3: the quantization noise of the ADC is estimated
  • -
  • Sections 4.4 and 4.5: the noise of the low-noise amplifiers are estimated
  • -
  • Section 4.6: the input voltage noise of the PD200 amplifier is estimated
  • -
  • Section 4.7: the output noise of the DAC is measured
  • -
  • Section 4.8: 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 4.9: the noise of an 20bits DAC is measured and it is shown if it could lowering the overall noise of the setup
  • +
  • Section 4.3: the quantization noise of the ADC is estimated
  • +
  • Sections 4.4 and 4.5: the noise of the low-noise amplifiers are estimated
  • +
  • Sections 4.6 and 4.7:: the input voltage noise of the PD200 amplifier is estimated
  • +
  • Section 4.8: the output noise of the DAC is measured
  • +
  • Section 4.9: 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 4.10: the noise of an 20bits DAC is measured
  • +
  • Section 4.11: it is shown if using the 20bits DAC could lower the overall noise of the setup

-Finally in section 4.10, a model of the PD200 amplifier’s noise is developed. -

-
- -
-

4.1 Measurement Setup

-
-

- +Finally in section 4.12, a model of the PD200 amplifier’s noise is developed.

-
+

Here are the documentation of the equipment used for this test bench:

@@ -492,12 +550,28 @@ Here are the documentation of the equipment used for this test bench:
  • Load Capacitor: Film Capacitors 600V 10uF 5%
  • Low Noise Voltage Amplifiers EG&G 5113 and Femto DLPVA
  • ADC: IO313 Speedgoat card
  • +
  • 16bits DAC: IO313 Speedgoat card
  • +
  • 20bits DAC: SSI2V
  • +
    + +
    +

    4.1 Measurement Setup

    +
    +

    + +

    -The output noise of the voltage amplifier PD200 is foreseen to be around 1mV rms in a bandwidth from DC to 1MHz. +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} @@ -505,42 +579,41 @@ If we suppose a white noise, this correspond to an amplitude spectral density: \end{equation}

    -The RMS noise being very small compare to the ADC resolution, we must amplify this noise before digitizing the signal. +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 added noise of the instrumentation amplifier should be much smaller than the noise of the PD200. -We use either 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. +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 11. +

    -
    +

    +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. +

    + + +

    setup-noise-measurement.png

    -

    Figure 8: Schematic of the test bench to measure the Power Spectral Density of the Voltage amplifier noise \(n\)

    +

    Figure 11: Schematic of the test bench to measure the Power Spectral Density of the Voltage amplifier noise \(n\)

    - -

    -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. -

    -
    -

    4.2 Model of the setup

    +
    +

    4.2 Model of the setup

    - +

    -As shown in Figure 9, there are 4 equipment involved in the measurement: +As shown in Figure 12, there are 4 elements involved in the measurement:

    • a Digital to Analog Convert (DAC)
    • @@ -556,29 +629,33 @@ 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
    • +
    • \(n_a\): input noise of the pre-amplifier
    • \(q_{ad}\): quantization noise of the ADC
    -
    +

    noise_meas_procedure.png

    -

    Figure 9: Sources of noise in the experimental setup

    +

    Figure 12: Sources of noise in the experimental setup

    + +

    +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. +

    -
    -

    4.3 Quantization Noise

    +
    +

    4.3 Quantization Noise of the ADC

    - +

    -The quantization noise is something that can be predicted. -The Amplitude Spectral Density of the quantization noise of an ADC/DAC is equal to: +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}} @@ -593,8 +670,12 @@ with:
  • \(f_s\) is the sample frequency in [Hz]
  • +

    +Let’s estimate that with the ADC used for the measurements: +

    -
    adc = struct();
    +
    %% ADC Quantization noise
    +adc = struct();
     adc.Delta_V = 20; % [V]
     adc.n = 16; % number of bits
     adc.Fs = 20e3; % [Hz]
    @@ -608,17 +689,17 @@ The obtained Amplitude Spectral Density is 6.2294e-07 \(V/\sqrt{Hz}
     
    -
    -

    4.4 EG&G - Amplifier noise measurement

    +
    +

    4.4 EG&G - Amplifier noise measurement

    - +

    -First, we wish to measure the noise of the pre-amplifier. -To do so, the input of the pre-amplifier is shunted such that there is 0V at its inputs. -Then, the gain of the amplifier is increase until the measured signal on the ADC is much larger than the quantization noise. +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.

    @@ -629,117 +710,95 @@ Finally, the Amplitude Spectral Density of \(n_a\) can be computed taking into a \Gamma_{n_a}(\omega) \approx \frac{\Gamma_n(\omega)}{|G_a(\omega)|} \end{equation} -

    -This is true if the quantization noise \(\Gamma_{q_{ad}}\) is negligible. -

    - -
    +

    noise_measure_setup_preamp.png

    -

    Figure 10: Sources of noise in the experimental setup

    -
    - -

    -The gain of the low noise amplifier is set to 50000. -

    - -

    -The obtained Amplitude Spectral Density of the Low Noise Voltage Amplifier is shown in Figure 11. -The obtained noise amplitude is very closed to the one specified in the documentation of \(4nV/\sqrt{Hz}\) at 1kHZ. -

    - - -
    -

    asd_egg.png -

    -

    Figure 11: Obtained Amplitude Spectral Density of the EG&G Low Noise Voltage Amplifier

    -
    -
    -
    - -
    -

    4.5 Femto - Amplifier noise measurement

    -
    -

    - -

    - -

    -Similarly to Section 4.4, the noise of the Femto amplifier is identified. -

    - -
    -
    % 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;
    -
    -
    - - -
    -

    asd_femto.png -

    -

    Figure 12: Obtained Amplitude Spectral Density of the Femto Low Noise Voltage Amplifier

    -
    -
    -
    - -
    -

    4.6 PD200 noise measurement

    -
    -

    - -

    - -

    -The input of the PD200 amplifier is shunted with a 50 Ohm resistor. -The gain of the pre-amplifier is increased in order to measure a signal much larger than the quantization noise of the ADC. -

    - -

    -The Amplitude Spectral Density of the measured signal \(\Gamma_n(\omega)\) is computed. -The Amplitude Spectral Density of \(n_p\) is then computed taking into account the gain of the pre-amplifier and the can 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 this is indeed 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} - - -
    -

    noise_measure_setup_pd200.png -

    Figure 13: Sources of noise in the experimental setup

    -The measured low frequency output noise of one of the PD200 amplifiers is shown in Figure 14. -It is very similar to the one specified in the datasheet in Figure 3. +The gain of the low noise amplifier is set to 50000 for the measurement.

    -
    -

    pd200_noise_time_lpf.png +

    +The obtained Amplitude Spectral Density of the Low Noise Voltage Amplifier is shown in Figure 14. +The obtained noise amplitude is very closed to the one specified in the documentation of \(4nV/\sqrt{Hz}\) at 1kHZ.

    -

    Figure 14: Measured low frequency noise of the PD200 from 0.01Hz to 20Hz

    + +

    +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. +

    + + +
    +

    asd_egg.png +

    +

    Figure 14: Obtained Amplitude Spectral Density of the EG&G Low Noise Voltage Amplifier

    +
    +
    +
    + +
    +

    4.5 Femto - Amplifier noise measurement

    +
    +

    + +

    + +

    +Similarly to Section 4.4, the noise of the Femto amplifier is identified. +

    + +

    +The obtained Amplitude spectral density is shown in Figure 15. +

    + + +
    +

    asd_femto.png +

    +

    Figure 15: Obtained Amplitude Spectral Density of the Femto Low Noise Voltage Amplifier

    +
    +
    +
    + +
    +

    4.6 PD200 - Low frequency noise measurement

    +
    +

    + +

    + +

    +The measurement setup is shown in Figure 16. +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. +

    + + +
    +

    noise_measure_setup_pd200.png +

    +

    Figure 16: Sources of noise in the experimental setup

    -The obtained RMS and peak to peak values of the measured output noise are shown in Table 2. +The measured low frequency (<20Hz) output noise of one of the PD200 amplifiers is shown in Figure 17. +It is very similar to the one specified in the datasheet in Figure 3.

    -
    Table 1: Characteristics of the PD200 compared with the specifications
    + + +
    +

    pd200_noise_time_lpf.png +

    +

    Figure 17: Measured low frequency noise of the PD200 from 0.01Hz to 20Hz

    +
    + +

    +The obtained RMS and peak to peak values of the measured output noise are shown in Table 2 and found to be very similar to the specified ones. +

    +
    @@ -752,207 +811,236 @@ The obtained RMS and peak to peak values of the measured output noise are - - + + - + - + - + - + - + - + - + - +
    Table 2: RMS and Peak to Peak measured low frequency output noise (0.01Hz to 20Hz)
     RMS [uV]Peak to Peak [mV]RMS [\(\mu V\)]Peak to Peak [\(mV\)]
    Specification [10uF]Specification [\(10\,\mu F\)] 714.0 4.3
    PD200_1PD200 1 565.1 3.7
    PD200_2PD200 2 767.6 3.5
    PD200_3PD200 3 479.9 3.0
    PD200_4PD200 4 615.7 3.5
    PD200_5PD200 5 651.0 2.4
    PD200_6PD200 6 473.2 2.7
    PD200_7PD200 7 423.1 2.3
    - -

    -The Amplitude Spectral Density of the measured input noise is computed and shown in Figure 15. -

    - -

    -The contribution of the PD200 noise is much larger than the contribution of the pre-amplifier noise of the quantization noise. -

    - -
    -

    asd_noise_3uF_warmup.png -

    -

    Figure 15: Amplitude Spectral Density of the measured noise

    -
    -
    -

    4.7 DAC noise measurement

    +
    +

    4.7 PD200 - High frequency noise measurement

    - +

    -In order not to have any quantization noise, we impose the DAC to output a zero voltage. -The gain of the low noise amplifier is adjusted in order to have sufficient voltage going to the ADC. +The measurement setup is the same as in Figure 16. +

    + +

    +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} + +

    +The Amplitude Spectral Density of the measured input noise is computed and shown in Figure 18. +

    + +

    +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. +

    + +
    +

    asd_noise_pd200_10uF.png +

    +

    Figure 18: Amplitude Spectral Density of the measured input voltage noise of the PD200 amplifiers

    +
    + +
    +

    +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. +

    + +
    +
    +
    + +
    +

    4.8 16bits DAC noise measurement

    +
    +

    + +

    + +

    +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 19. +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 \(n_{da}\) can be computed taking into account the gain of the pre-amplifier: +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 verify that the Amplitude Spectral Density of \(n_{da}\) is much larger than the one of \(n_a\): +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} -
    +

    noise_measure_setup_dac.png

    -

    Figure 16: Sources of noise in the experimental setup

    +

    Figure 19: Sources of noise in the experimental setup

    +

    +The obtained Amplitude Spectral Density of the DAC’s output voltage is shown in Figure 20. +

    -
    + +

    asd_noise_dac.png

    +

    Figure 20: Amplitude Spectral Density of the measured output voltage noise of the 16bits DAC

    -
    -

    4.8 Total noise measurement

    -
    -

    - -

    - -

    -Let’s now analyze the measurement of the setup in Figure 18. -

    - - -
    -

    noise_meas_procedure.png -

    -

    Figure 18: Sources of noise in the experimental setup

    -
    - -

    -The PSD of the measured noise is computed and the ASD is shown in Figure 19. -

    -
    -
    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
    -
    -
    - - -
    -

    asd_noise_tot.png -

    -

    Figure 19: Amplitude Spectral Density of the measured noise and of the individual sources of noise

    -
    - -
    -

    -The output noise of the PD200 amplifier is limited by the noise of the DAC. -Having a DAC with lower noise could lower the output noise of the PD200. -SSI2V DACs will be used to verify that. -

    - -
    -
    -
    - -
    -

    4.9 20bits DAC noise measurement

    +
    +

    4.9 Noise of the full setup with 16bits DAC

    - +

    -Let’s now measure the noise of another DAC called the “SSI2V” (doc). -It is a 20bits DAC with an output of +/-10.48 V and a very low output noise. +Let’s now measure the noise of the full setup in Figure 21 and analyze the results.

    -

    -The measurement setup is the same as the one in Figure 16. + +

    +

    noise_meas_procedure.png

    - -
    -
    win = hanning(ceil(0.5/Ts));
    -
    -[pxx, f] = pwelch(ssi2v.Vn, win, [], [], Fs);
    -ssi2v.pxx = pxx;
    -ssi2v.f = f;
    -
    +

    Figure 21: Sources of noise in the experimental setup

    -The obtained noise of the SSI2V DAC is shown in Figure 20 and compared with the noise of the 16bits DAC. +The Amplitude Spectral Density of the measured noise is computed and the shown in Figure 22. +

    + +

    +We can very well see that to total measured noise is the sum of the DAC noise and the PD200 noise. +

    + +
    +

    asd_noise_tot.png +

    +

    Figure 22: Amplitude Spectral Density of the measured noise and of the individual sources of noise

    +
    + +
    +

    +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. +

    + +
    +
    +
    + +
    +

    4.10 20bits DAC noise measurement

    +
    +

    + +

    + +

    +Let’s now measure the output voltage noise of another DAC called the “SSI2V” (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 19. +

    + +

    +The obtained Amplitude Spectral Density of the output voltage noise of the SSI2V DAC is shown in Figure 23 and compared with the output voltage noise of the 16bits DAC. It is shown to be much smaller (~1 order of magnitude).

    -
    +

    asd_ssi2v_noise.png

    -

    Figure 20: Amplitude Spectral Density of the SSI2V DAC’s noise

    +

    Figure 23: Amplitude Spectral Density of the SSI2V DAC’s noise

    -
    +

    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. @@ -962,29 +1050,51 @@ The limiting factor should then be the noise of the PD200 itself.

    -
    -

    4.10 PD200 Amplifier noise model

    -
    +
    +

    4.11 Noise of the full setup with 20bits DAC

    +

    - + +

    +
    +
    + +
    +

    4.12 PD200 Amplifier noise model

    +
    +

    +

    -Let’s design a transfer function whose norm represent the Amplitude Spectral Density of the input voltage noise of the PD200 amplifier. +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 24. +

    + + +
    +

    pd200-model-schematic-normalized.png +

    +

    Figure 24: Model of the voltage amplifier with normalized noise input

    +
    + + +

    +A simple transfer function that allows to obtain a good fit is defined below.

    -
    Gn = 2.5e-5 * ((1 + s/2/pi/30)/(1 + s/2/pi/2))^2 /(1 + s/2/pi/5e3);
    +
    %% 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);
     

    -The comparison between the measured ASD of the modeled ASD is done in Figure +The comparison between the measured ASD of the modeled ASD is done in Figure 25.

    -
    +

    pd200_asd_noise_model.png

    -

    Figure 21: ASD of the measured input voltage noise and modeled noise using \(G_n(s)\)

    +

    Figure 25: ASD of the measured input voltage noise and modeled noise using \(G_n(s)\)

    @@ -992,35 +1102,157 @@ Let’s now compute the Cumulative Amplitude Spectrum corresponding to the m

    -The integration from low to high frequency and from high to low frequency are both shown in Figure +The integration from low to high frequency and from high to low frequency are both shown in Figure 26.

    -
    +

    +The fit between the model and the measurements is rather good considering the complex shape of the measured ASD and the simple model used. +

    + +

    pd200_cas_noise_model.png

    -

    Figure 22: Cumulative Amplitude Spectrum of the measured input voltage noise and modeled noise using \(G_n(s)\)

    +

    Figure 26: Cumulative Amplitude Spectrum of the measured input voltage noise and modeled noise using \(G_n(s)\)

    -The obtained RMS noise of the model is 650.77 uV RMS which is the same as advertise. +The obtained RMS noise of the model is 286.74 uV RMS which is not that far from the specifications.

    + +

    +Finally the model of the amplifier noise is saved. +

    +
    +
    save('mat/pd200_model.mat', 'Gn', '-append');
    +
    +
    -
    -

    5 Comparison to other commercial amplifiers

    +
    +

    5 Comparison to other commercial amplifiers

    - +

    -
    -

    5.1 Transfer functions

    +
    +

    5.1 Introduction

    +
    +

    +In this section, three similar voltage amplifiers are compared: +

    + + +

    +These are compared in term of dynamic from input voltage to output voltage for a load of \(10\,\mu F\) in Section 5.2 and then in term of input voltage noise in Section 5.3. +

    + +

    +The characteristics that I could find for the three amplifiers are summarized in Table 3. +

    + + + + +++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 3: Characteristics of the three tested voltage amplifiers
    CharacteristicsPD200LA75BE-505
    Gain20 [V/V]20 [V/V]10 [V/V]
    Maximum RMS current0.9 [A]0.4 [A] 
    Maximum Pulse current10 [A]1 [A]2 [A]
    Slew Rate150 [V/us]  
    Noise (10uF load)0.7 [mV RMS]3.4 [mV RMS]0.6 [mV RMS]
    Small Signal Bandwidth7.4 [kHz] (10uF)30 [kHz] (unloaded) 
    + +
    +

    +The documentation for the three amplifiers can be found here: PD200, LA75B, E-505.00. +

    +
    -
    -

    5.2 Noise Characteristics

    +
    +
    + +
    +

    5.2 Transfer functions

    +

    + +

    + +
    +
    la75 = load('tf_la75_10uF_small_signal.mat', 't', 'Vin', 'Vout');
    +pd200 = load('tf_pd200_1_10uF_small_signal.mat', 't', 'Vin', 'Vout', 'notes');
    +
    +
    +
    +
    + +
    +

    5.3 Noise Characteristics

    +
    +

    + +

    +
    pd200.Vout = pd200.Vout/pd200.notes.pre_amp.gain;
     la75.Vout  = la75.Vout/la75.notes.pre_amp.gain;
    @@ -1042,15 +1274,15 @@ ylabel('Voltage [mV]');
     
    -
    -

    6 Conclusion

    +
    +

    6 Conclusion

    - +

    - - +
    Table 3: Measured characteristics, Manual characterstics and specified ones
    +@@ -1139,7 +1371,7 @@ ylabel('Voltage [mV]');

    Author: Dehaeze Thomas

    -

    Created: 2021-02-10 mer. 16:16

    +

    Created: 2021-02-12 ven. 14:59

    diff --git a/test-bench-pd200.org b/test-bench-pd200.org index 4bfcfc6..23f54ea 100644 --- a/test-bench-pd200.org +++ b/test-bench-pd200.org @@ -46,13 +46,11 @@
    #+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. -#+begin_note -The documentation of the PD200 is accessible [[file:doc/PD200-V7-R1.pdf][here]]. -#+end_note - 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. @@ -68,14 +66,14 @@ 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.8\linewidth +#+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 \linewidth :align lXX +#+attr_latex: :environment tabularx :width 0.7\linewidth :align lcc #+attr_latex: :center t :booktabs t :float t | | | | | *Characteristics* | *Manual* | *Specification* | @@ -98,12 +96,12 @@ These two characteristics are respectively measured in Section [[sec:tf_meas]] a #+name: fig:pd200_expected_small_signal_bandwidth #+caption:Expected small signal bandwidth -#+attr_latex: :width 0.8\linewidth +#+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.8\linewidth +#+attr_latex: :width 0.7\linewidth [[file:figs/pd200_expected_noise.png]] * Voltage Amplifier Model @@ -169,6 +167,8 @@ with $\Gamma_{\tilde{n}}(\omega) = 1$. \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]] @@ -181,6 +181,7 @@ 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 @@ -274,147 +275,163 @@ exportFig('figs/max_frequency_voltage.pdf', 'width', 'wide', 'height', 'normal') When doing sweep sine excitation, we make sure not to reach this maximum excitation frequency. -** Obtained Transfer Functions :noexport: -Several identifications using sweep sin were performed with input voltage amplitude ranging from 0.1V to 4V. +** 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 -Vin_ampl = {'0_1', '0_5', '1', '2', '4'}; - pd200 = {}; -for i = 1:length(Vin_ampl) - pd200(i) = {load(['tf_pd200_7_' Vin_ampl{i} 'V.mat'], 't', 'Vin', 'Vout', 'notes')}; +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 +%% 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 -% Hannning Windows -win = hanning(ceil(0.5*Fs)); +%% Compute all the transfer functions +win = hanning(ceil(0.5*Fs)); % Hannning Windows -% Compute all the transfer functions 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); + pd200{i}.tf = tf_est; + pd200{i}.f = f; end #+end_src -The obtained frequency response functions are shown in Figure [[fig:pd200_tf_voltage]]. -As the input voltage increases, the voltage drop is increasing. - +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), 'DisplayName', sprintf('$V_{in} = %.1f [V]$', pd200{i}.notes.pd200.Vin)) -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([19, 21]); -legend('location', 'northeast'); - -ax2 = nexttile; -hold on; -for i = 1:length(pd200) - plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf)) -end -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -yticks(-360:5:360); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -ylim([-15, 5]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 5e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/pd200_tf_voltage.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:pd200_tf_voltage -#+caption: Transfer function for the PD200 amplitude between $V_{in}$ and $V_{out}$ for multiple voltage amplitudes -#+RESULTS: -[[file:figs/pd200_tf_voltage.png]] - -The small signal transfer function of the amplifier can be approximated by a first order low pass filter. - -#+begin_src matlab -Gp = 19.95/(1 + s/2/pi/35e3); -#+end_src - -The comparison from the model and measurements are shown in Figure [[fig:tf_pd200_model]]. - -#+begin_src matlab :exports none -freqs = logspace(1, 4, 1000); -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 -plot(freqs, abs(squeeze(freqresp(Gp, freqs, 'Hz'))), 'k--'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $V_{out}/V_{in}$ [V/V]'); set(gca, 'XTickLabel',[]); hold off; -ylim([19, 21]); +ylim([10, 30]); 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)) + plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf), 'DisplayName', sprintf('PD200 %i', i)) end -plot(freqs, 180/pi*angle(squeeze(freqresp(Gp, freqs, 'Hz'))), 'k--', 'DisplayName', '$G_p(j\omega)$'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -yticks(-5:1:5); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); hold off; -ylim([-3, 1]); +yticks(-360:2:360); +ylim([-12, 2]); legend('location', 'southwest'); linkaxes([ax1,ax2],'x'); -xlim([10, 1e3]); +xlim([1, 5e3]); #+end_src #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/tf_pd200_model.pdf', 'width', 'wide', 'height', 'tall'); +exportFig('figs/pd200_small_signal_tf.pdf', 'width', 'wide', 'height', 'tall'); #+end_src -#+name: fig:tf_pd200_model -#+caption: Comparison of the model transfer function and the measured frequency response function +#+name: fig:pd200_small_signal_tf +#+caption: Identified dynamics from input voltage to output voltage #+RESULTS: -[[file:figs/tf_pd200_model.png]] +[[file:figs/pd200_small_signal_tf.png]] -** TODO Small Signal Bandwidth -<> -Load Data +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. -Compute Transfer Functions +** Model of the amplifier small signal dynamics +<> -Compare +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). -Model +Below is the defined transfer function $G_p(s)$. +#+begin_src matlab +Gp = 20/(1 + s/2/pi/25e3); +#+end_src -Save Model +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'); -** TODO Bandwidth for multiple excitation signals +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 <> +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 @@ -426,7 +443,8 @@ for i = 1:length(Vin_ampl) end #+end_src -#+begin_src matlab +#+begin_src matlab :exports none +%% Compute the maximum excitation frequency Iout_max = 0.57; % Maximum output current [A] C = 10e-6; % Load Capacitance [F] @@ -439,16 +457,15 @@ end #+end_src #+begin_src matlab :exports none -% Compute sampling Frequency +%% 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 -% Hannning Windows -win = hanning(ceil(0.5*Fs)); +%% Compute all the transfer functions +win = hanning(ceil(0.5*Fs)); % Hannning Windows -% Compute all the transfer functions 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); @@ -456,54 +473,83 @@ for i = 1:length(pd200) 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), 'DisplayName', sprintf('$V_{in} = %.1f [V]$', pd200{i}.notes.pd200.Vin)) + 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([19, 21]); -legend('location', 'northeast'); +ylim([1e0, 1e2]); ax2 = nexttile; hold on; for i = 1:length(pd200) - plot(pd200{i}.f, 180/pi*angle(pd200{i}.tf)) + 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'); -yticks(-360:5:360); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +legend('location', 'southwest'); hold off; -ylim([-15, 5]); +yticks(-360:2:360); +ylim([-12, 2]); linkaxes([ax1,ax2],'x'); -xlim([10, 5e3]); +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 <> ** 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 -- Section [[sec:noise_pd200]]: the input voltage noise of the PD200 amplifier is 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 and it is shown if it could lowering the overall noise of the setup +- 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) <> @@ -525,40 +571,35 @@ addpath('./mat/'); ** 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/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]] -#+end_note +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. -The output noise of the voltage amplifier PD200 is foreseen to be around 1mV rms in a bandwidth from DC to 1MHz. +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 RMS noise being very small compare to the ADC resolution, we must amplify this noise before digitizing the signal. +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 added noise of the instrumentation amplifier should be much smaller than the noise of the PD200. -We use either 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. +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]] -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. - ** Model of the setup <> -As shown in Figure [[fig:noise_meas_procedure]], there are 4 equipment involved in the measurement: +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 @@ -568,7 +609,7 @@ 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 +- $n_a$: input noise of the pre-amplifier - $q_{ad}$: quantization noise of the ADC #+begin_src latex :file noise_meas_procedure.pdf @@ -644,11 +685,13 @@ Each of these equipment has some noise: #+RESULTS: [[file:figs/noise_meas_procedure.png]] -** Quantization Noise +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 <> -The quantization noise is something that can be predicted. -The Amplitude Spectral Density of the quantization noise of an ADC/DAC is equal to: +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} @@ -658,7 +701,9 @@ with: - $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 @@ -671,9 +716,9 @@ The obtained Amplitude Spectral Density is src_matlab[:exports results :results ** EG&G - Amplifier noise measurement <> -First, we wish to measure the noise of the pre-amplifier. -To do so, the input of the pre-amplifier is shunted such that there is 0V at its inputs. -Then, the gain of the amplifier is increase until the measured signal on the ADC is much larger than the quantization noise. +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: @@ -681,8 +726,6 @@ Finally, the Amplitude Spectral Density of $n_a$ can be computed taking into acc \Gamma_{n_a}(\omega) \approx \frac{\Gamma_n(\omega)}{|G_a(\omega)|} \end{equation} -This is true if the quantization noise $\Gamma_{q_{ad}}$ is negligible. - #+begin_src latex :file noise_measure_setup_preamp.pdf \begin{tikzpicture} \node[block={0.6cm}{0.6cm}] (const) {$0$}; @@ -726,11 +769,11 @@ This is true if the quantization noise $\Gamma_{q_{ad}}$ is negligible. [[file:figs/noise_measure_setup_preamp.png]] #+begin_src matlab :exports none -% Load Data -egg = load('mat/noise_preamp_5113.mat', 't', 'Vn', 'notes'); +%% 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=)}}}. +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 @@ -759,6 +802,8 @@ egg.f = f; 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; @@ -786,8 +831,8 @@ exportFig('figs/asd_egg.pdf', 'width', 'wide', 'height', 'normal'); Similarly to Section [[sec:noise_egg]], the noise of the Femto amplifier is identified. #+begin_src matlab :exports none -% Load Data -femto = load('mat/noise_femto.mat', 't', 'Vout', 'notes'); +%% Femto Input Voltage Noise +femto = load('mat/noise_femto.mat', 't', 'Vout', 'notes'); % Load Data #+end_src #+begin_src matlab :exports none @@ -802,7 +847,7 @@ Ts = (femto.t(end) - femto.t(1))/(length(femto.t) - 1); Fs = 1/Ts; #+end_src -#+begin_src matlab +#+begin_src matlab :exports none % Hanning window win = hanning(ceil(0.5/Ts)); @@ -814,6 +859,8 @@ 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; @@ -835,23 +882,13 @@ exportFig('figs/asd_femto.pdf', 'width', 'wide', 'height', 'normal'); #+RESULTS: [[file:figs/asd_femto.png]] -** PD200 noise measurement -<> +** PD200 - Low frequency noise measurement +<> -The input of the PD200 amplifier is shunted with a 50 Ohm resistor. +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. -The Amplitude Spectral Density of the measured signal $\Gamma_n(\omega)$ is computed. -The Amplitude Spectral Density of $n_p$ is then computed taking into account the gain of the pre-amplifier and the can 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 this is indeed 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 latex :file noise_measure_setup_pd200.pdf \begin{tikzpicture} \node[block={0.6cm}{0.6cm}] (const) {$0$}; @@ -909,7 +946,8 @@ And we verify that this is indeed the noise of the PD200 and not the noise of th [[file:figs/noise_measure_setup_pd200.png]] #+begin_src matlab :exports none -%% Load all the measurements +%% 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')}; @@ -917,14 +955,15 @@ end #+end_src #+begin_src matlab :exports none -%% Take into account the pre-amplifier gain and PD200 Gain +% 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 *output* noise of one of the PD200 amplifiers is shown in Figure [[fig:pd200_noise_time_lpf]]. +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); @@ -948,9 +987,9 @@ exportFig('figs/pd200_noise_time_lpf.pdf', 'width', 'wide', 'height', 'normal'); #+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]]. +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 +% 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 @@ -961,55 +1000,88 @@ 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 '); +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 \linewidth :align lXX +#+attr_latex: :environment tabularx :width 0.5\linewidth :align lcc #+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 | +| | *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 +<> + +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 = (pd200w{1}.t(end) - pd200w{1}.t(1))/(length(pd200w{1}.t) - 1); +Ts = (pd200{1}.t(end) - pd200{1}.t(1))/(length(pd200{1}.t) - 1); Fs = 1/Ts; #+end_src #+begin_src matlab :exports none -win = hanning(ceil(10/Ts)); +% Compute the PSD of the measured noise +win = hanning(ceil(2/Ts)); for i = 1:7 - [pxx, f] = pwelch(pd200w{i}.Vn, win, [], [], Fs); - pd200w{i}.f = f; - pd200w{i}.pxx = pxx; + [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_3uF_warmup]]. +The Amplitude Spectral Density of the measured *input* noise is computed and shown in Figure [[fig:asd_noise_pd200_10uF]]. -The contribution of the PD200 noise is much larger than the contribution of the pre-amplifier noise of the quantization noise. +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(egg.f, sqrt(egg.pxx)/20, 'DisplayName', '$\Gamma_{n_a}/|G_p|$'); -plot(pd200w{1}.f, sqrt(pd200w{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$'); +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(pd200w{i}.f, sqrt(pd200w{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); + 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]./pd200w{1}.notes.pre_amp.gain/20, 'k--', 'DisplayName', '$\Gamma_{q_{ad}}/|G_p G_a|$'); +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}$]'); @@ -1018,27 +1090,34 @@ xlim([1, Fs/2]); #+end_src #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/asd_noise_3uF_warmup.pdf', 'width', 'wide', 'height', 'tall'); +exportFig('figs/asd_noise_pd200_10uF.pdf', 'width', 'wide', 'height', 'tall'); #+end_src -#+name: fig:asd_noise_3uF_warmup -#+caption: Amplitude Spectral Density of the measured noise +#+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_3uF_warmup.png]] +[[file:figs/asd_noise_pd200_10uF.png]] -** DAC noise measurement +#+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 <> -In order not to have any quantization noise, we impose the DAC to output a zero voltage. -The gain of the low noise amplifier is adjusted in order to have sufficient voltage going to the ADC. +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 $n_{da}$ can be computed taking into account the gain of the pre-amplifier: +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 verify that the Amplitude Spectral Density of $n_{da}$ is much larger than the one of $n_a$: +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} @@ -1100,10 +1179,12 @@ And it is verify that the Amplitude Spectral Density of $n_{da}$ is much larger [[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 @@ -1115,6 +1196,7 @@ 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); @@ -1122,6 +1204,8 @@ 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'); @@ -1143,14 +1227,14 @@ exportFig('figs/asd_noise_dac.pdf', 'width', 'wide', 'height', 'tall'); #+end_src #+name: fig:asd_noise_dac -#+caption: +#+caption: Amplitude Spectral Density of the measured output voltage noise of the 16bits DAC #+RESULTS: [[file:figs/asd_noise_dac.png]] -** Total noise measurement +** Noise of the full setup with 16bits DAC <> -Let's now analyze the measurement of the setup in Figure [[fig:noise_meas_procedure_bis]]. +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 @@ -1158,18 +1242,18 @@ Let's now analyze the measurement of the setup in Figure [[fig:noise_meas_proced [[file:figs/noise_meas_procedure.png]] #+begin_src matlab :exports none -%% Load all the measurements +%% Full measurement chain from DAC to ADC pd200dac = {}; for i = 1:7 - pd200dac(i) = {load(['mat/noise_PD200_' num2str(i) '_3uF_DAC.mat'], 't', 'Vn', 'notes')}; + 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 +% Take into account the pre-amplifier gain for i = 1:7 - pd200dac{i}.Vn = pd200dac{i}.Vn/pd200dac{i}.notes.pre_amp.gain/20; - pd200dac{i}.Vn = pd200dac{i}.Vn - mean(pd200dac{i}.Vn); + 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 @@ -1179,12 +1263,15 @@ 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_tot]]. -#+begin_src matlab -win = hanning(ceil(0.5/Ts)); +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}.Vn, win, [], [], Fs); + [pxx, f] = pwelch(pd200dac{i}.Vout, win, [], [], Fs); pd200dac{i}.f = f; pd200dac{i}.pxx = pxx; end @@ -1196,9 +1283,9 @@ colors = get(gca,'colororder'); figure; hold on; plot(egg.f, sqrt(egg.pxx)/20, 'DisplayName', '$\Gamma_{n_a}$'); -plot(pd200w{1}.f, sqrt(pd200w{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}/|G_p|$'); +plot(pd200{1}.f, sqrt(pd200{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}/|G_p|$'); for i = 2:7 - plot(pd200w{i}.f, sqrt(pd200w{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); + 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}}$'); @@ -1224,24 +1311,26 @@ exportFig('figs/asd_noise_tot.pdf', 'width', 'wide', 'height', 'tall'); [[file:figs/asd_noise_tot.png]] #+begin_important -The output noise of the PD200 amplifier is limited by the noise of the DAC. -Having a DAC with lower noise could lower the output noise of the PD200. -SSI2V DACs will be used to verify that. +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 -** TODO 20bits DAC noise measurement +** 20bits DAC noise measurement <> -Let's now measure the noise of another DAC called the "SSI2V" ([[file:doc/\[SSI2V\]Datasheet.pdf][doc]]). -It is a 20bits DAC with an output of +/-10.48 V and a very low output noise. +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 @@ -1252,7 +1341,8 @@ Ts = (ssi2v.t(end) - ssi2v.t(1))/(length(ssi2v.t) - 1); Fs = 1/Ts; #+end_src -#+begin_src matlab +#+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); @@ -1260,7 +1350,7 @@ ssi2v.pxx = pxx; ssi2v.f = f; #+end_src -The obtained noise of the SSI2V DAC is shown in Figure [[fig:asd_ssi2v_noise]] and compared with the noise of the 16bits DAC. +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 @@ -1295,27 +1385,41 @@ Using the SSI2V as the DAC with the PD200 should give much better noise output t The limiting factor should then be the noise of the PD200 itself. #+end_important -** TODO PD200 Amplifier noise model +** TODO Noise of the full setup with 20bits DAC +<> + +** PD200 Amplifier noise model <> -Let's design a transfer function whose norm represent the Amplitude Spectral Density of the input voltage noise of the PD200 amplifier. +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 -Gn = 2.5e-5 * ((1 + s/2/pi/30)/(1 + s/2/pi/2))^2 /(1 + s/2/pi/5e3); +%% 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 +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(pd200w{1}.f, sqrt(pd200w{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$'); +plot(pd200{1}.f, sqrt(pd200{1}.pxx), 'color', [colors(2, :), 0.5], 'DisplayName', '$\Gamma_{n_p}$'); for i = 2:7 - plot(pd200w{i}.f, sqrt(pd200w{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); + plot(pd200{i}.f, sqrt(pd200{i}.pxx), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); end -plot(f, abs(squeeze(freqresp(Gn, f, 'Hz'))), 'k-', 'DisplayName', '$|G_n(j\omega)|$'); +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([0.1, Fs/2]); +xlim([1, Fs/2]); ylim([1e-8, 1e-4]); legend('location', 'northeast'); #+end_src @@ -1331,36 +1435,39 @@ exportFig('figs/pd200_asd_noise_model.pdf', 'width', 'wide', 'height', 'normal') 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 +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 - pd200w{i}.CPS_f = flip(-cumtrapz(flip(f), flip(pd200w{i}.pxx))); - pd200w{i}.CPS = cumtrapz(f, pd200w{i}.pxx); + 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(f), flip(abs(squeeze(freqresp(Gn, f, 'Hz'))).^2))); -CPS_Gn = cumtrapz(f, abs(squeeze(freqresp(Gn, f, 'Hz'))).^2); +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(pd200w{1}.f, sqrt(pd200w{1}.CPS), 'color', [colors(1, :), 0.5], 'DisplayName', '$CAS$'); +plot(pd200{1}.f, sqrt(pd200{1}.CPS), 'color', [colors(1, :), 0.5], 'DisplayName', '$CAS$'); for i = 2:7 - plot(pd200w{i}.f, sqrt(pd200w{i}.CPS), 'color', [colors(1, :), 0.5], 'HandleVisibility', 'off'); + plot(pd200{i}.f, sqrt(pd200{i}.CPS), 'color', [colors(1, :), 0.5], 'HandleVisibility', 'off'); end for i = 1:7 - plot(pd200w{i}.f, sqrt(pd200w{i}.CPS_f), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); + plot(pd200{i}.f, sqrt(pd200{i}.CPS_f), 'color', [colors(2, :), 0.5], 'HandleVisibility', 'off'); end set(gca,'ColorOrderIndex',1) -plot(f, sqrt(CPS_Gn), '--', 'DisplayName', 'model'); +plot(freqs, sqrt(CPS_Gn), '--', 'DisplayName', 'model'); set(gca,'ColorOrderIndex',2) -plot(f, sqrt(CPS_Gn_f), '--', 'HandleVisibility', 'off'); +plot(freqs, sqrt(CPS_Gn_f), '--', 'HandleVisibility', 'off'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('CPS [V rms]'); -xlim([0.1, Fs/2]); +xlabel('Frequency [Hz]'); ylabel('CAS [V rms]'); +xlim([1, Fs/2]); ylim([1e-6, 1e-4]); legend('location', 'northeast'); #+end_src @@ -1374,239 +1481,17 @@ exportFig('figs/pd200_cas_noise_model.pdf', 'width', 'wide', 'height', 'normal') #+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(1))} {{{results(=650.77=)}}} uV RMS which is the same as advertise. +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. -** TODO With 10uF load and Femto pre-amplifier :noexport: - -#+begin_src matlab :exports none -% Load Data -preamp = load('mat/noise_femto.mat', 't', 'Vout', 'notes'); +#+begin_src matlab :tangle no :exports none +save('matlab/mat/pd200_model.mat', 'Gn', '-append'); #+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; -preamp.Vout = preamp.Vout - mean(preamp.Vout); +Finally the model of the amplifier noise is saved. +#+begin_src matlab :eval no +save('mat/pd200_model.mat', 'Gn', '-append'); #+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; -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), 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; -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]] - ** 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) @@ -2120,10 +2005,339 @@ xlim([1, Fs/2]); The output noise of the PD200 amplifier is limited by the noise of the DAC. #+end_important -* TODO Comparison to other commercial amplifiers +*** 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 <> +** 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 +| | | | | +| *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) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+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 +<> + +#+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 +<> + #+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'); diff --git a/test-bench-pd200.pdf b/test-bench-pd200.pdf index ad64fa1..813fd94 100644 Binary files a/test-bench-pd200.pdf and b/test-bench-pd200.pdf differ
    Table 4: Measured characteristics, Manual characterstics and specified ones