nass-metrology-test-bench/index.html

3302 lines
129 KiB
HTML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2020-11-12 jeu. 10:15 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Sercalo Test Bench</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
<script>MathJax = {
tex: {
tags: 'ams',
macros: {bm: ["\\boldsymbol{#1}",1],}
}
};
</script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
</head>
<body>
<div id="org-div-home-and-up">
<a accesskey="h" href="../index.html"> UP </a>
|
<a accesskey="H" href="../index.html"> HOME </a>
</div><div id="content">
<h1 class="title">Sercalo Test Bench</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org6685336">1. Introduction</a>
<ul>
<li><a href="#orgf7a6d25">1.1. Block Diagram</a></li>
<li><a href="#org0afcd64">1.2. Sercalo</a></li>
<li><a href="#orge58f92c">1.3. Optical Setup</a></li>
<li><a href="#org297bf36">1.4. Newport</a></li>
<li><a href="#orga516b0d">1.5. 4 quadrant Diode</a></li>
<li><a href="#org6d81a27">1.6. ADC/DAC</a></li>
</ul>
</li>
<li><a href="#orgccbc1b8">2. Identification of the system dynamics</a>
<ul>
<li><a href="#orgf39fcf6">2.1. Calibration of the 4 Quadrant Diode</a>
<ul>
<li><a href="#orgf22d038">2.1.1. Input / Output data</a></li>
<li><a href="#orgafd9f46">2.1.2. Linear Regression to obtain the gain of the 4QD</a></li>
</ul>
</li>
<li><a href="#org61b13aa">2.2. Identification of the Sercalo Impedance, Current Amplifier and Voltage Amplifier dynamics</a>
<ul>
<li><a href="#org7f97d4c">2.2.1. Electrical Schematic</a></li>
<li><a href="#orgce2aeb9">2.2.2. Theoretical Transfer Functions</a></li>
<li><a href="#org044bbb3">2.2.3. Identified Transfer Functions</a></li>
</ul>
</li>
<li><a href="#org0c2dfcd">2.3. Identification of the Sercalo Dynamics</a>
<ul>
<li><a href="#org8edc8d0">2.3.1. Input / Output data</a></li>
<li><a href="#org84c6672">2.3.2. Coherence</a></li>
<li><a href="#org44e4d6a">2.3.3. Estimation of the Frequency Response Function Matrix</a></li>
<li><a href="#orgfde749d">2.3.4. Time Delay</a></li>
<li><a href="#orgaff8e09">2.3.5. Extraction of a transfer function matrix</a></li>
</ul>
</li>
<li><a href="#org8e247fa">2.4. Identification of the Newport Dynamics</a>
<ul>
<li><a href="#org296e4be">2.4.1. Input / Output data</a></li>
<li><a href="#orgff783cf">2.4.2. Coherence</a></li>
<li><a href="#org179d780">2.4.3. Estimation of the Frequency Response Function Matrix</a></li>
<li><a href="#org6ae8b0b">2.4.4. Time Delay</a></li>
<li><a href="#org187f24f">2.4.5. Extraction of a transfer function matrix</a></li>
</ul>
</li>
<li><a href="#orgd7bf1ca">2.5. Full System</a></li>
</ul>
</li>
<li><a href="#orgbb80b69">3. Huddle Test</a>
<ul>
<li><a href="#org1de418a">3.1. Load Data</a></li>
<li><a href="#org68d30b6">3.2. Pre-processing</a></li>
<li><a href="#org711054f">3.3. Filter data with low pass filter</a></li>
<li><a href="#orgc846a79">3.4. Time domain plots</a></li>
<li><a href="#org2b99615">3.5. Power Spectral Density</a></li>
<li><a href="#org9e8db47">3.6. Conclusion</a></li>
</ul>
</li>
<li><a href="#orge97a7db">4. Budget Error</a>
<ul>
<li><a href="#org74c32e0">4.1. Effect of the Sercalo angle error on the measured distance by the Attocube</a></li>
<li><a href="#orge85f791">4.2. Unwanted motion of Sercalo/Newport mirrors perpendicular to its surface</a></li>
<li><a href="#org6279dc8">4.3. Change in refractive index of the air in the beam path</a></li>
<li><a href="#org930942c">4.4. Thermal Expansion of the Metrology Frame</a></li>
<li><a href="#org436bf8a">4.5. Estimation of the Sercalo angle error due to Noise</a>
<ul>
<li><a href="#org6b38ed3">4.5.1. Estimation of sources of noise and disturbances</a>
<ul>
<li><a href="#org38dc27b">4.5.1.1. ADC Quantization Noise</a></li>
<li><a href="#org132b3df">4.5.1.2. DAC Quantization Noise</a></li>
<li><a href="#orgecc05d4">4.5.1.3. Noise of the Newport Mirror angle</a></li>
<li><a href="#org9164fb8">4.5.1.4. Disturbances due the Newport Mirror Rotation</a></li>
</ul>
</li>
<li><a href="#orge353531">4.5.2. Perfect Control</a></li>
<li><a href="#org683bb6d">4.5.3. Error due to DAC noise used for the Sercalo</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org9b16eb7">5. Plant Uncertainty</a>
<ul>
<li><a href="#org1b03f29">5.1. Coprime Factorization</a></li>
</ul>
</li>
<li><a href="#orgf672248">6. Plant Scaling</a>
<ul>
<li><a href="#orgf30c784">6.1. Control Objective</a></li>
<li><a href="#org0643666">6.2. General Configuration</a></li>
</ul>
</li>
<li><a href="#org8c1c256">7. Plant Analysis</a>
<ul>
<li><a href="#org22fd12f">7.1. Load Plant</a></li>
<li><a href="#org4e845b2">7.2. RGA-Number</a></li>
<li><a href="#org68e3150">7.3. Rotation Matrix</a></li>
</ul>
</li>
<li><a href="#org592a7ac">8. Active Damping</a>
<ul>
<li><a href="#orgffec17e">8.1. Load Plant</a></li>
<li><a href="#org98c8742">8.2. Integral Force Feedback</a></li>
<li><a href="#org19d8dcd">8.3. Conclusion</a></li>
</ul>
</li>
<li><a href="#org13fdd19">9. Decentralized Control of the Sercalo</a>
<ul>
<li><a href="#org4d98a7e">9.1. Load Plant</a></li>
<li><a href="#orgf49383b">9.2. Diagonal Controller</a></li>
<li><a href="#orgef810d9">9.3. Save the Controller</a></li>
</ul>
</li>
<li><a href="#org5c5403c">10. Newport Control</a>
<ul>
<li><a href="#org46b843d">10.1. Load Plant</a></li>
<li><a href="#org8c32d5d">10.2. Analysis</a></li>
<li><a href="#org177a219">10.3. Save</a></li>
</ul>
</li>
<li><a href="#orga78b022">11. Measurement of the non-repeatability</a>
<ul>
<li><a href="#org4a711c0">11.1. Data Load and pre-processing</a></li>
<li><a href="#org0a3ebcd">11.2. Some Time domain plots</a></li>
<li><a href="#org7e88b83">11.3. Verify Tracking Angle Error</a></li>
<li><a href="#orgce27425">11.4. Processing</a></li>
<li><a href="#orgd13e2d3">11.5. Analysis of the non-repeatable contributions</a></li>
<li><a href="#orga95fd07">11.6. Results with a low pass filter</a></li>
<li><a href="#orgd8d73bc">11.7. Processing</a></li>
</ul>
</li>
</ul>
</div>
</div>
<hr>
<p>This report is also available as a <a href="./index.pdf">pdf</a>.</p>
<hr>
<div id="outline-container-org6685336" class="outline-2">
<h2 id="org6685336"><span class="section-number-2">1</span> Introduction</h2>
<div class="outline-text-2" id="text-1">
</div>
<div id="outline-container-orgf7a6d25" class="outline-3">
<h3 id="orgf7a6d25"><span class="section-number-3">1.1</span> Block Diagram</h3>
<div class="outline-text-3" id="text-1-1">
<p>
The block diagram of the setup to be controlled is shown in Fig. <a href="#org412c6b4">1</a>.
</p>
<div id="org412c6b4" class="figure">
<p><img src="figs/sercalo_diagram_simplify.png" alt="sercalo_diagram_simplify.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Block Diagram of the Experimental Setup</p>
</div>
<p>
The transfer functions in the system are:
</p>
<ul class="org-ul">
<li><b>Current Amplifier</b>: from the voltage set by the DAC to the current going to the Sercalo&rsquo;s inductors
\[ G_i = \begin{bmatrix} G_{i,h} & 0 \\ 0 & G_{i,v} \end{bmatrix} \text{ in } \left[ \frac{A}{V} \right] \]
\[ \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} = G_i \begin{bmatrix} U_{c,h} \\ U_{c,v} \end{bmatrix} \]</li>
<li><b>Impedance of the Sercalo</b> that converts the current going to the sercalo to the voltage across the sercalo:
\[ Z_c = \begin{bmatrix} Z_{c,h} & 0 \\ 0 & Z_{c,v} \end{bmatrix} \text{ in } \left[ \frac{V}{A} \right] \]
\[ \begin{bmatrix} \tilde{V}_{c,h} \\ \tilde{V}_{c,v} \end{bmatrix} = Z_c \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} \]</li>
<li><b>Voltage Amplifier</b>: from the voltage across the Sercalo inductors to the measured voltage
\[ G_a = \begin{bmatrix} G_{a,h} & 0 \\ 0 & G_{a,v} \end{bmatrix} \text{ in } \left[ \frac{V}{V} \right] \]
\[ \begin{bmatrix} V_{c,h} \\ V_{c,v} \end{bmatrix} = G_a \begin{bmatrix} \tilde{V}_{c,h} \\ \tilde{V}_{c,v} \end{bmatrix} \]</li>
<li><b>Sercalo</b>: Transfer function from the current going through the sercalo inductors to the 4 quadrant measurement
\[ G_c = \begin{bmatrix} G_{\frac{V_{p,h}}{\tilde{U}_{c,h}}} & G_{\frac{V_{p,h}}{\tilde{U}_{c,v}}} \\ G_{\frac{V_{p,v}}{\tilde{U}_{c,h}}} & G_{\frac{V_{p,v}}{\tilde{U}_{c,v}}} \end{bmatrix} \text{ in } \left[ \frac{V}{A} \right] \]
\[ \begin{bmatrix} V_{p,h} \\ V_{p,v} \end{bmatrix} = G_c \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} \]</li>
<li><b>Newport</b> Transfer function from the command signal of the Newport to the 4 quadrant measurement
\[ G_n = \begin{bmatrix} G_{\frac{V_{p,h}}{U_{n,h}}} & G_{\frac{V_{p,h}}{U_{n,v}}} \\ G_{\frac{V_{p,v}}{U_{n,h}}} & G_{\frac{V_{n,v}}{U_{n,v}}} \end{bmatrix} \text{ in } \left[ \frac{V}{V} \right] \]
\[ \begin{bmatrix} V_{p,h} \\ V_{p,v} \end{bmatrix} = G_c \begin{bmatrix} V_{n,h} \\ V_{n,v} \end{bmatrix} \]</li>
<li><b>4 Quadrant Diode</b>: the gain of the 4 quadrant diode in [V/rad] is inverse in order to obtain the physical angle of the beam
\[ G_d = \begin{bmatrix} G_{d,h} & 0 \\ 0 & G_{d,v} \end{bmatrix} \text{ in } \left[\frac{V}{rad}\right] \]</li>
</ul>
<p>
The block diagram with each transfer function is shown in Fig. <a href="#org3c44e8c">2</a>.
</p>
<div id="org3c44e8c" class="figure">
<p><img src="figs/sercalo_diagram.png" alt="sercalo_diagram.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Block Diagram of the Experimental Setup with detailed dynamics</p>
</div>
</div>
</div>
<div id="outline-container-org0afcd64" class="outline-3">
<h3 id="org0afcd64"><span class="section-number-3">1.2</span> Sercalo</h3>
<div class="outline-text-3" id="text-1-2">
<p>
From the Sercalo documentation, we have the parameters shown on table <a href="#org11de045">1</a>.
</p>
<table id="org11de045" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 1:</span> Sercalo Parameters</caption>
<colgroup>
<col class="org-left" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-right">Max. Stroke</th>
<th scope="col" class="org-right">Res. Freq.</th>
<th scope="col" class="org-right">DC Gain</th>
<th scope="col" class="org-right">Gain at res.</th>
<th scope="col" class="org-right">RC Res.</th>
</tr>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-right">[deg]</th>
<th scope="col" class="org-right">[Hz]</th>
<th scope="col" class="org-right">[mA/deg]</th>
<th scope="col" class="org-right">[deg/V]</th>
<th scope="col" class="org-right">[Ohm]</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">AX1 (Horizontal)</td>
<td class="org-right">5</td>
<td class="org-right">411.13</td>
<td class="org-right">28.4</td>
<td class="org-right">382.9</td>
<td class="org-right">9.41</td>
</tr>
<tr>
<td class="org-left">AX2 (Vertical)</td>
<td class="org-right">5</td>
<td class="org-right">252.5</td>
<td class="org-right">35.2</td>
<td class="org-right">350.4</td>
<td class="org-right">&#xa0;</td>
</tr>
</tbody>
</table>
<p>
The Inductance and DC resistance of the two axis of the Sercalo have been measured:
</p>
<ul class="org-ul">
<li>\(L_{c,h} = 0.1\ \text{mH}\)</li>
<li>\(L_{c,v} = 0.1\ \text{mH}\)</li>
<li>\(R_{c,h} = 9.3\ \Omega\)</li>
<li>\(R_{c,v} = 8.3\ \Omega\)</li>
</ul>
<p>
Let&rsquo;s first consider the <b>horizontal direction</b> and we try to model the Sercalo by a spring/mass/damper system (Fig. <a href="#orgaa7ee25">3</a>).
</p>
<div id="orgaa7ee25" class="figure">
<p><img src="figs/mech_sercalo.png" alt="mech_sercalo.png" />
</p>
<p><span class="figure-number">Figure 3: </span>1 degree-of-freedom model of the Sercalo</p>
</div>
<p>
The equation of motion is:
</p>
\begin{align*}
\frac{x}{F} &= \frac{1}{k + c s + m s^2} \\
&= \frac{G_0}{1 + 2 \xi \frac{s}{\omega_0} + \frac{s^2}{\omega_0^2}}
\end{align*}
<p>
with:
</p>
<ul class="org-ul">
<li>\(G_0 = 1/k\) is the gain at DC in rad/N</li>
<li>\(\xi = \frac{c}{2 \sqrt{km}}\) is the damping ratio of the system</li>
<li>\(\omega_0 = \sqrt{\frac{k}{m}}\) is the resonance frequency in rad</li>
</ul>
<p>
The force \(F\) applied to the mass is proportional to the current \(I\) flowing through the voice coils:
\[ \frac{F}{I} = \alpha \]
with \(\alpha\) is in \(N/A\) and is to be determined.
</p>
<p>
The current \(I\) is also proportional to the voltage at the output of the buffer:
</p>
\begin{align*}
\frac{I_c}{U_c} &= \frac{1}{(R + R_c) + L_c s} \\
&\approx 0.02 \left[ \frac{A}{V} \right]
\end{align*}
<p>
Let&rsquo;s try to determine the equivalent mass and spring values.
From table <a href="#org11de045">1</a>, for the horizontal direction:
\[ \left| \frac{x}{I} \right|(0) = \left| \alpha \frac{x}{F} \right|(0) = 28.4\ \frac{mA}{deg} = 1.63\ \frac{A}{rad} \]
</p>
<p>
So:
\[ \alpha \frac{1}{k} = 1.63 \Longleftrightarrow k = \frac{\alpha}{1.63} \left[\frac{N}{rad}\right] \]
</p>
<p>
We also know the resonance frequency:
\[ \omega_0 = 411.1\ \text{Hz} = 2583\ \frac{rad}{s} \]
</p>
<p>
And the gain at resonance:
</p>
\begin{align*}
\left| \frac{x}{U_c} \right|(j\omega_0) &= \left| 0.02 \frac{x}{I_c} \right| (j\omega_0) \\
&= \left| 0.02 \alpha \frac{x}{F} \right| (j\omega_0) \\
&= 0.02 \alpha \frac{1/k}{2\xi} \\
&= 282.9\ \left[\frac{deg}{V}\right] \\
&= 4.938\ \left[\frac{rad}{V}\right]
\end{align*}
<p>
Thus:
</p>
\begin{align*}
& \frac{\alpha}{2 \xi k} = 245 \\
\Leftrightarrow & \frac{1.63}{2 \xi} = 245 \\
\Leftrightarrow & \xi = 0.0033 \\
\Leftrightarrow & \xi = 0.33 \%
\end{align*}
<div class="important" id="orgf2e17c9">
\begin{align*}
G_0 &= \frac{1.63}{\alpha}\ \frac{rad}{N} \\
\xi &= 0.0033 \\
\omega_0 &= 2583\ \frac{rad}{s}
\end{align*}
<p>
and in terms of the physical properties:
</p>
\begin{align*}
k &= \frac{\alpha}{1.63}\ \frac{N}{rad} \\
\xi &= 0.0033 \\
m &= \frac{\alpha}{1.1 \cdot 10^7}\ \frac{kg}{m^2}
\end{align*}
<p>
Thus, we have to determine \(\alpha\).
This can be done experimentally by determining the gain at DC or at resonance of the system.
For that, we need to know the angle of the mirror, thus we need to <b>calibrate</b> the photo-diodes.
This will be done using the Newport.
</p>
</div>
</div>
</div>
<div id="outline-container-orge58f92c" class="outline-3">
<h3 id="orge58f92c"><span class="section-number-3">1.3</span> Optical Setup</h3>
</div>
<div id="outline-container-org297bf36" class="outline-3">
<h3 id="org297bf36"><span class="section-number-3">1.4</span> Newport</h3>
<div class="outline-text-3" id="text-1-4">
<p>
Parameters of the Newport are shown in Fig. <a href="#org238480d">4</a>.
</p>
<p>
It&rsquo;s dynamics for small angle excitation is shown in Fig. <a href="#orgfe305ee">5</a>.
</p>
<p>
And we have:
</p>
\begin{align*}
G_{n, h}(0) &= 2.62 \cdot 10^{-3}\ \frac{rad}{V} \\
G_{n, v}(0) &= 2.62 \cdot 10^{-3}\ \frac{rad}{V}
\end{align*}
<div id="org238480d" class="figure">
<p><img src="figs/newport_doc.png" alt="newport_doc.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Documentation of the Newport</p>
</div>
<div id="orgfe305ee" class="figure">
<p><img src="figs/newport_gain.png" alt="newport_gain.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Transfer function of the Newport</p>
</div>
</div>
</div>
<div id="outline-container-orga516b0d" class="outline-3">
<h3 id="orga516b0d"><span class="section-number-3">1.5</span> 4 quadrant Diode</h3>
<div class="outline-text-3" id="text-1-5">
<p>
The front view of the 4 quadrant photo-diode is shown in Fig. <a href="#orge83884c">6</a>.
</p>
<div id="orge83884c" class="figure">
<p><img src="figs/4qd_naming.png" alt="4qd_naming.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Front view of the 4QD</p>
</div>
<p>
Each of the photo-diode is amplified using a 4-channel amplifier as shown in Fig. <a href="#org7da009c">7</a>.
</p>
<div id="org7da009c" class="figure">
<p><img src="figs/4qd_amplifier.png" alt="4qd_amplifier.png" />
</p>
<p><span class="figure-number">Figure 7: </span>Wiring of the amplifier. The amplifier is located on the bottom right of the board</p>
</div>
</div>
</div>
<div id="outline-container-org6d81a27" class="outline-3">
<h3 id="org6d81a27"><span class="section-number-3">1.6</span> ADC/DAC</h3>
<div class="outline-text-3" id="text-1-6">
<p>
Let&rsquo;s compute the theoretical noise of the ADC/DAC.
</p>
\begin{align*}
\Delta V &= 20 V \\
n &= 16bits \\
q &= \Delta V/2^n = 305 \mu V \\
f_N &= 10kHz \\
\Gamma_n &= \frac{q^2}{12 f_N} = 7.76 \cdot 10^{-13} \frac{V^2}{Hz}
\end{align*}
<p>
with \(\Delta V\) the total range of the ADC, \(n\) its number of bits, \(q\) the quantization, \(f_N\) the sampling frequency and \(\Gamma_n\) its theoretical Power Spectral Density.
</p>
</div>
</div>
</div>
<div id="outline-container-orgccbc1b8" class="outline-2">
<h2 id="orgccbc1b8"><span class="section-number-2">2</span> Identification of the system dynamics</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="org268f1a9"></a>
</p>
<p>
In this section, we seek to identify all the blocks as shown in Fig. <a href="#org412c6b4">1</a>.
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Signal</th>
<th scope="col" class="org-left">Name</th>
<th scope="col" class="org-left">Unit</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Voltage Sent to Sercalo - Horizontal</td>
<td class="org-left"><code>Uch</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Voltage Sent to Sercalo - Vertical</td>
<td class="org-left"><code>Ucv</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Voltage Sent to Newport - Horizontal</td>
<td class="org-left"><code>Unh</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Voltage Sent to Newport - Vertical</td>
<td class="org-left"><code>Unv</code></td>
<td class="org-left">[V]</td>
</tr>
</tbody>
<tbody>
<tr>
<td class="org-left">4Q Photodiode Measurement - Horizontal</td>
<td class="org-left"><code>Vph</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">4Q Photodiode Measurement - Vertical</td>
<td class="org-left"><code>Vpv</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Measured Voltage across the Inductance - Horizontal</td>
<td class="org-left"><code>Vch</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Measured Voltage across the Inductance - Vertical</td>
<td class="org-left"><code>Vcv</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Newport Metrology - Horizontal</td>
<td class="org-left"><code>Vnh</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Newport Metrology - Vertical</td>
<td class="org-left"><code>Vnv</code></td>
<td class="org-left">[V]</td>
</tr>
</tbody>
<tbody>
<tr>
<td class="org-left">Attocube Measurement</td>
<td class="org-left"><code>Va</code></td>
<td class="org-left">[m]</td>
</tr>
</tbody>
</table>
</div>
<div id="outline-container-orgf39fcf6" class="outline-3">
<h3 id="orgf39fcf6"><span class="section-number-3">2.1</span> Calibration of the 4 Quadrant Diode</h3>
<div class="outline-text-3" id="text-2-1">
<p>
Prior to any dynamic identification, we would like to be able to determine the meaning of the 4 quadrant diode measurement.
For instance, instead of obtaining transfer function in [V/V] from the input of the sercalo to the measurement voltage of the 4QD, we would like to obtain the transfer function in [rad/V].
This will give insight to physical interpretation.
</p>
<p>
To calibrate the 4 quadrant photo-diode, we can use the metrology included in the Newport.
We can choose precisely the angle of the Newport mirror and see what is the value measured by the 4 Quadrant Diode.
We then should be able to obtain the &ldquo;gain&rdquo; of the 4QD in [V/rad].
</p>
</div>
<div id="outline-container-orgf22d038" class="outline-4">
<h4 id="orgf22d038"><span class="section-number-4">2.1.1</span> Input / Output data</h4>
<div class="outline-text-4" id="text-2-1-1">
<p>
The identification data is loaded
</p>
<div class="org-src-container">
<pre class="src src-matlab">uh = load(<span class="org-string">'mat/data_cal_pd_h.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>, <span class="org-string">'Vnh'</span>);
uv = load(<span class="org-string">'mat/data_cal_pd_v.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>, <span class="org-string">'Vnv'</span>);
</pre>
</div>
<p>
We remove the first seconds where the Sercalo is turned on.
</p>
<div class="org-src-container">
<pre class="src src-matlab">t0 = 1;
uh.Vph(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.Vpv(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.Vnh(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.t(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.t = uh.t <span class="org-type">-</span> uh.t(1); <span class="org-comment">% We start at t=0</span>
t0 = 1;
uv.Vph(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.Vpv(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.Vnv(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.t(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.t = uv.t <span class="org-type">-</span> uv.t(1); <span class="org-comment">% We start at t=0</span>
</pre>
</div>
<div id="org40e7ce2" class="figure">
<p><img src="figs/calib_4qd_h.png" alt="calib_4qd_h.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Identification signals when exciting the horizontal direction (<a href="./figs/calib_4qd_h.png">png</a>, <a href="./figs/calib_4qd_h.pdf">pdf</a>)</p>
</div>
<div id="org9449d1f" class="figure">
<p><img src="figs/calib_4qd_v.png" alt="calib_4qd_v.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Identification signals when exciting in the vertical direction (<a href="./figs/calib_4qd_v.png">png</a>, <a href="./figs/calib_4qd_v.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgafd9f46" class="outline-4">
<h4 id="orgafd9f46"><span class="section-number-4">2.1.2</span> Linear Regression to obtain the gain of the 4QD</h4>
<div class="outline-text-4" id="text-2-1-2">
<p>
We plot the angle of mirror
</p>
<p>
Gain of the Newport metrology in [rad/V].
</p>
<div class="org-src-container">
<pre class="src src-matlab">gn0 = 2.62e<span class="org-type">-</span>3;
</pre>
</div>
<p>
The angular displacement of the beam is twice the angular displacement of the Newport mirror.
</p>
<p>
We do a linear regression
\[ y = a x + b \]
where:
</p>
<ul class="org-ul">
<li>\(y\) is the measured voltage of the 4QD in [V]</li>
<li>\(x\) is the beam angle (twice the mirror angle) in [rad]</li>
<li>\(a\) is the identified gain of the 4QD in [rad/V]</li>
</ul>
<p>
The linear regression is shown in Fig. <a href="#orgf4e448a">10</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">bh = [ones(size(uh.Vnh)) 2<span class="org-type">*</span>gn0<span class="org-type">*</span>uh.Vnh]<span class="org-type">\</span>uh.Vph;
bv = [ones(size(uv.Vnv)) 2<span class="org-type">*</span>gn0<span class="org-type">*</span>uv.Vnv]<span class="org-type">\</span>uv.Vpv;
</pre>
</div>
<div id="orgf4e448a" class="figure">
<p><img src="figs/4qd_linear_reg.png" alt="4qd_linear_reg.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Linear Regression (<a href="./figs/4qd_linear_reg.png">png</a>, <a href="./figs/4qd_linear_reg.pdf">pdf</a>)</p>
</div>
<p>
Thus, we obtain the &ldquo;gain of the 4 quadrant photo-diode as shown on table <a href="#org9b2b265">2</a>.
</p>
<table id="org9b2b265" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 2:</span> Identified Gain of the 4 quadrant diode</caption>
<colgroup>
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">Horizontal [V/rad]</th>
<th scope="col" class="org-right">Vertical [V/rad]</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">-31.0</td>
<td class="org-right">36.3</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-matlab">Gd = tf([bh(2) 0 ;
0 bv(2)]);
</pre>
</div>
<p>
We obtain:
</p>
\begin{align*}
\frac{V_{qd,h}}{\alpha_{0,h}} &\approx 0.032\ \left[ \frac{rad}{V} \right] \\
&\approx 32.3\ \left[ \frac{\mu rad}{mV} \right]
\end{align*}
\begin{align*}
\frac{V_{qd,v}}{\alpha_{0,v}} &\approx 0.028\ \left[ \frac{rad}{V} \right] \\
&\approx 27.6\ \left[ \frac{\mu rad}{mV} \right]
\end{align*}
</div>
</div>
</div>
<div id="outline-container-org61b13aa" class="outline-3">
<h3 id="org61b13aa"><span class="section-number-3">2.2</span> Identification of the Sercalo Impedance, Current Amplifier and Voltage Amplifier dynamics</h3>
<div class="outline-text-3" id="text-2-2">
<p>
We wish here to determine \(G_i\) and \(G_a\) shown in Fig. <a href="#org412c6b4">1</a>.
</p>
<p>
We ignore the electro-mechanical coupling.
</p>
</div>
<div id="outline-container-org7f97d4c" class="outline-4">
<h4 id="org7f97d4c"><span class="section-number-4">2.2.1</span> Electrical Schematic</h4>
<div class="outline-text-4" id="text-2-2-1">
<p>
The schematic of the electrical circuit used to drive the Sercalo is shown in Fig. <a href="#orgd1cb075">11</a>.
</p>
<div id="orgd1cb075" class="figure">
<p><img src="figs/sercalo_amplifier.png" alt="sercalo_amplifier.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Current Amplifier Schematic</p>
</div>
<p>
The elements are:
</p>
<ul class="org-ul">
<li>\(U_c\): the voltage generated by the DAC</li>
<li>BUF: is a unity-gain open-loop buffer that allows to increase the output current</li>
<li>\(R\): a chosen resistor that will determine the gain of the current amplifier</li>
<li>\(L_c\): inductor present in the Sercalo</li>
<li>\(R_c\): resistance of the inductor</li>
<li>\(\tilde{V}_c\): voltage measured across the Sercalo&rsquo;s inductor</li>
<li>\(V_c\): amplified voltage measured across the Sercalo&rsquo;s inductor</li>
<li>\(I_c\) is the current going through the Sercalo&rsquo;s inductor</li>
</ul>
<p>
The values of the components have been measured for the horizontal and vertical directions:
</p>
<ul class="org-ul">
<li>\(R_h = 41 \Omega\)</li>
<li>\(L_{c,h} = 0.1 mH\)</li>
<li>\(R_{c,h} = 9.3 \Omega\)</li>
<li>\(R_v = 41 \Omega\)</li>
<li>\(L_{c,v} = 0.1 mH\)</li>
<li>\(R_{c,v} = 8.3 \Omega\)</li>
</ul>
<p>
Let&rsquo;s first determine the transfer function from \(U_c\) to \(I_c\).
</p>
<p>
We have that:
\[ U_c = (R + R_c) I_c + L_c s I_c \]
</p>
<p>
Thus:
</p>
\begin{align}
G_i(s) &= \frac{I_c}{U_c} \\
&= \frac{1}{(R + R_c) + L_c s} \\
&= \frac{G_{i,0}}{1 + s/\omega_0}
\end{align}
<p>
with
</p>
<ul class="org-ul">
<li>\(G_{i,0} = \frac{1}{R + R_c}\)</li>
<li>\(\omega_0 = \frac{R + R_c}{L_c}\)</li>
</ul>
<p>
Now, determine the transfer function from \(I_c\) to \(\tilde{V}_c\):
\[ \tilde{V}_C = R_c I_c + L_c s I_c \]
Thus:
</p>
\begin{align}
Z_c(s) &= \frac{\tilde{V}_c}{I_c} \\
&= R_c + L_c s
\end{align}
<p>
Finally, the transfer function of the voltage amplifier \(G_a\) is simply a low pass filter:
</p>
\begin{align}
G_a(s) &= \frac{V_c}{\tilde{V}_c} \\
&= \frac{G_{a,0}}{1 + s/\omega_c}
\end{align}
<p>
with
</p>
<ul class="org-ul">
<li>\(G_{a,0}\) is the gain 1000 (60dB)</li>
<li>\(\omega_c\) is the cut-off frequency of the voltage amplifier set to 1000Hz</li>
</ul>
</div>
</div>
<div id="outline-container-orgce2aeb9" class="outline-4">
<h4 id="orgce2aeb9"><span class="section-number-4">2.2.2</span> Theoretical Transfer Functions</h4>
<div class="outline-text-4" id="text-2-2-2">
<p>
The values of the components in the current amplifier have been measured.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Rh = 41; <span class="org-comment">% [Ohm]</span>
Lch = 0.1e<span class="org-type">-</span>3; <span class="org-comment">% [H]</span>
Rch = 9.3; <span class="org-comment">% [Ohm]</span>
Rv = 41; <span class="org-comment">% [Ohm]</span>
Lcv = 0.1e<span class="org-type">-</span>3; <span class="org-comment">% [H]</span>
Rcv = 8.3; <span class="org-comment">% [Ohm]</span>
</pre>
</div>
\begin{align*}
G_i(s) &= \frac{1}{(R + R_c) + L_c s} \\
Z_c(s) &= R_c + L_c s \\
G_a(s) &= \frac{1000}{1 + s/\omega_c}
\end{align*}
<div class="org-src-container">
<pre class="src src-matlab">Gi = blkdiag(1<span class="org-type">/</span>(Rh <span class="org-type">+</span> Rch <span class="org-type">+</span> Lch <span class="org-type">*</span> s), 1<span class="org-type">/</span>(Rv <span class="org-type">+</span> Rcv <span class="org-type">+</span> Lcv <span class="org-type">*</span> s));
Zc = blkdiag(Rch<span class="org-type">+</span>Lch<span class="org-type">*</span>s, Rcv<span class="org-type">+</span>Lcv<span class="org-type">*</span>s);
Ga = blkdiag(1000<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>1000), 1000<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>1000));
</pre>
</div>
<div id="orga5f8a4b" class="figure">
<p><img src="figs/current_amplifier_tf.png" alt="current_amplifier_tf.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Transfer function for the current amplifier (<a href="./figs/current_amplifier_tf.png">png</a>, <a href="./figs/current_amplifier_tf.pdf">pdf</a>)</p>
</div>
<div class="important" id="org8697a9b">
<p>
Over the frequency band of interest, the current amplifier transfer function \(G_i\) can be considered as constant.
This is the same for the impedance \(Z_c\).
</p>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Gi = tf(blkdiag(1<span class="org-type">/</span>(Rh <span class="org-type">+</span> Rch), 1<span class="org-type">/</span>(Rv <span class="org-type">+</span> Rcv)));
Zc = tf(blkdiag(Rch, Rcv));
</pre>
</div>
</div>
</div>
<div id="outline-container-org044bbb3" class="outline-4">
<h4 id="org044bbb3"><span class="section-number-4">2.2.3</span> Identified Transfer Functions</h4>
<div class="outline-text-4" id="text-2-2-3">
<p>
Noise is generated using the DAC (\([U_{c,h}\ U_{c,v}]\)) and we measure the output of the voltage amplifier \([V_{c,h}, V_{c,v}]\).
From that, we should be able to identify \(G_a Z_c G_i\).
</p>
<p>
The identification data is loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab">uh = load(<span class="org-string">'mat/data_uch.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Uch'</span>, <span class="org-string">'Vch'</span>);
uv = load(<span class="org-string">'mat/data_ucv.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Ucv'</span>, <span class="org-string">'Vcv'</span>);
</pre>
</div>
<p>
We remove the first seconds where the Sercalo is turned on.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(1<span class="org-type">*</span>fs));
[GaZcGi_h, f] = tfestimate(uh.Uch, uh.Vch, win, [], [], fs);
[GaZcGi_v, <span class="org-type">~</span>] = tfestimate(uv.Ucv, uv.Vcv, win, [], [], fs);
</pre>
</div>
<div id="orgec88687" class="figure">
<p><img src="figs/current_amplifier_comp_theory_id.png" alt="current_amplifier_comp_theory_id.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Identified and Theoretical Transfer Function \(G_a G_i\) (<a href="./figs/current_amplifier_comp_theory_id.png">png</a>, <a href="./figs/current_amplifier_comp_theory_id.pdf">pdf</a>)</p>
</div>
<p>
There is a gain mismatch, that is probably due to bad identification of the inductance and resistance measurement of the sercalo inductors.
Thus, we suppose \(G_a\) is perfectly known (the gain and cut-off frequency of the voltage amplifier is very accurate) and that \(G_i\) is also well determined as it mainly depends on the resistor used in the amplifier that is well measured.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gi_resp_h = abs(GaZcGi_h)<span class="org-type">./</span>squeeze(abs(freqresp(Ga(1,1)<span class="org-type">*</span>Zc(1,1), f, <span class="org-string">'Hz'</span>)));
Gi_resp_v = abs(GaZcGi_v)<span class="org-type">./</span>squeeze(abs(freqresp(Ga(2,2)<span class="org-type">*</span>Zc(2,2), f, <span class="org-string">'Hz'</span>)));
Gi = tf(blkdiag(mean(Gi_resp_h(f<span class="org-type">&gt;</span>20 <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>200)), mean(Gi_resp_v(f<span class="org-type">&gt;</span>20 <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>200))));
</pre>
</div>
<div id="org3ef292b" class="figure">
<p><img src="figs/current_amplifier_comp_theory_id_bis.png" alt="current_amplifier_comp_theory_id_bis.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Identified and Theoretical Transfer Function \(G_a G_i\) (<a href="./figs/current_amplifier_comp_theory_id_bis.png">png</a>, <a href="./figs/current_amplifier_comp_theory_id_bis.pdf">pdf</a>)</p>
</div>
<p>
Finally, we have the following transfer functions:
</p>
<pre class="example" id="orgb4f4b81">
ans = filepath;
if ischar(ans), fid = fopen('/tmp/babel-ZKMGJu/matlab-FA7h5L', 'w'); fprintf(fid, '%s\n', ans); fclose(fid);
else, dlmwrite('/tmp/babel-ZKMGJu/matlab-FA7h5L', ans, '\t')
end
'org_babel_eoe'
Gi,Zc,Ga
'org_babel_eoe'
ans = filepath;
if ischar(ans), fid = fopen('/tmp/babel-ZKMGJu/matlab-FA7h5L', 'w'); fprintf(fid, '%s\n', ans); fclose(fid);
else, dlmwrite('/tmp/babel-ZKMGJu/matlab-FA7h5L', ans, '\t')
end
'org_babel_eoe'
ans =
'org_babel_eoe'
Gi,Zc,Ga
Gi =
From input 1 to output...
1: 0.01275
2: 0
From input 2 to output...
1: 0
2: 0.01382
Static gain.
Zc =
From input 1 to output...
1: 9.3
2: 0
From input 2 to output...
1: 0
2: 8.3
Static gain.
Ga =
From input 1 to output...
6.2832e+06
1: ----------
(s+6283)
2: 0
From input 2 to output...
1: 0
6.2832e+06
2: ----------
(s+6283)
Continuous-time zero/pole/gain model.
</pre>
</div>
</div>
</div>
<div id="outline-container-org0c2dfcd" class="outline-3">
<h3 id="org0c2dfcd"><span class="section-number-3">2.3</span> Identification of the Sercalo Dynamics</h3>
<div class="outline-text-3" id="text-2-3">
<p>
We now wish to identify the dynamics of the Sercalo identified by \(G_c\) on the block diagram in Fig. <a href="#org412c6b4">1</a>.
</p>
<p>
To do so, we inject some noise at the input of the current amplifier \([U_{c,h},\ U_{c,v}]\) (one input after the other) and we measure simultaneously the output of the 4QD \([V_{p,h},\ V_{p,v}]\).
</p>
<p>
The transfer function obtained will be \(G_c G_i\), and because we have already identified \(G_i\), we can obtain \(G_c\) by multiplying the obtained transfer function matrix by \({G_i}^{-1}\).
</p>
</div>
<div id="outline-container-org8edc8d0" class="outline-4">
<h4 id="org8edc8d0"><span class="section-number-4">2.3.1</span> Input / Output data</h4>
<div class="outline-text-4" id="text-2-3-1">
<p>
The identification data is loaded
</p>
<div class="org-src-container">
<pre class="src src-matlab">uh = load(<span class="org-string">'mat/data_uch.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Uch'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>);
uv = load(<span class="org-string">'mat/data_ucv.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Ucv'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>);
</pre>
</div>
<p>
We remove the first seconds where the Sercalo is turned on.
</p>
<div class="org-src-container">
<pre class="src src-matlab">t0 = 1;
uh.Uch(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.Vph(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.Vpv(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.t(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.t = uh.t <span class="org-type">-</span> uh.t(1); <span class="org-comment">% We start at t=0</span>
t0 = 1;
uv.Ucv(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.Vph(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.Vpv(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.t(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.t = uv.t <span class="org-type">-</span> uv.t(1); <span class="org-comment">% We start at t=0</span>
</pre>
</div>
<div id="org6550086" class="figure">
<p><img src="figs/identification_uh.png" alt="identification_uh.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Identification signals when exciting the horizontal direction (<a href="./figs/identification_uh.png">png</a>, <a href="./figs/identification_uh.pdf">pdf</a>)</p>
</div>
<div id="org86897a2" class="figure">
<p><img src="figs/identification_uv.png" alt="identification_uv.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Identification signals when exciting in the vertical direction (<a href="./figs/identification_uv.png">png</a>, <a href="./figs/identification_uv.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org84c6672" class="outline-4">
<h4 id="org84c6672"><span class="section-number-4">2.3.2</span> Coherence</h4>
<div class="outline-text-4" id="text-2-3-2">
<p>
The window used for the spectral analysis is an <code>hanning</code> windows with temporal size equal to 1 second.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(1<span class="org-type">*</span>fs));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[coh_Uch_Vph, f] = mscohere(uh.Uch, uh.Vph, win, [], [], fs);
[coh_Uch_Vpv, <span class="org-type">~</span>] = mscohere(uh.Uch, uh.Vpv, win, [], [], fs);
[coh_Ucv_Vph, <span class="org-type">~</span>] = mscohere(uv.Ucv, uv.Vph, win, [], [], fs);
[coh_Ucv_Vpv, <span class="org-type">~</span>] = mscohere(uv.Ucv, uv.Vpv, win, [], [], fs);
</pre>
</div>
<div id="org85647d0" class="figure">
<p><img src="figs/coh_sercalo.png" alt="coh_sercalo.png" />
</p>
<p><span class="figure-number">Figure 17: </span>Coherence (<a href="./figs/coh_sercalo.png">png</a>, <a href="./figs/coh_sercalo.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org44e4d6a" class="outline-4">
<h4 id="org44e4d6a"><span class="section-number-4">2.3.3</span> Estimation of the Frequency Response Function Matrix</h4>
<div class="outline-text-4" id="text-2-3-3">
<p>
We compute an estimate of the transfer functions.
</p>
<div class="org-src-container">
<pre class="src src-matlab">[tf_Uch_Vph, f] = tfestimate(uh.Uch, uh.Vph, win, [], [], fs);
[tf_Uch_Vpv, <span class="org-type">~</span>] = tfestimate(uh.Uch, uh.Vpv, win, [], [], fs);
[tf_Ucv_Vph, <span class="org-type">~</span>] = tfestimate(uv.Ucv, uv.Vph, win, [], [], fs);
[tf_Ucv_Vpv, <span class="org-type">~</span>] = tfestimate(uv.Ucv, uv.Vpv, win, [], [], fs);
</pre>
</div>
<div id="orgc07574f" class="figure">
<p><img src="figs/frf_sercalo_gain.png" alt="frf_sercalo_gain.png" />
</p>
<p><span class="figure-number">Figure 18: </span>Frequency Response Matrix (<a href="./figs/frf_sercalo_gain.png">png</a>, <a href="./figs/frf_sercalo_gain.pdf">pdf</a>)</p>
</div>
<div id="org819f437" class="figure">
<p><img src="figs/frf_sercalo_phase.png" alt="frf_sercalo_phase.png" />
</p>
<p><span class="figure-number">Figure 19: </span>Frequency Response Matrix_Phase (<a href="./figs/frf_sercalo_phase.png">png</a>, <a href="./figs/frf_sercalo_phase.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgfde749d" class="outline-4">
<h4 id="orgfde749d"><span class="section-number-4">2.3.4</span> Time Delay</h4>
<div class="outline-text-4" id="text-2-3-4">
<p>
Now, we would like to remove the time delay included in the FRF prior to the model extraction.
</p>
<p>
Estimation of the time delay:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Ts_delay = Ts; <span class="org-comment">% [s]</span>
G_delay = tf(1, 1, <span class="org-string">'InputDelay'</span>, Ts_delay);
G_delay_resp = squeeze(freqresp(G_delay, f, <span class="org-string">'Hz'</span>));
</pre>
</div>
<p>
We then remove the time delay from the frequency response function.
</p>
<div class="org-src-container">
<pre class="src src-matlab">tf_Uch_Vph = tf_Uch_Vph<span class="org-type">./</span>G_delay_resp;
tf_Uch_Vpv = tf_Uch_Vpv<span class="org-type">./</span>G_delay_resp;
tf_Ucv_Vph = tf_Ucv_Vph<span class="org-type">./</span>G_delay_resp;
tf_Ucv_Vpv = tf_Ucv_Vpv<span class="org-type">./</span>G_delay_resp;
</pre>
</div>
</div>
</div>
<div id="outline-container-orgaff8e09" class="outline-4">
<h4 id="orgaff8e09"><span class="section-number-4">2.3.5</span> Extraction of a transfer function matrix</h4>
<div class="outline-text-4" id="text-2-3-5">
<p>
First we define the initial guess for the resonance frequencies and the weights associated.
</p>
<div class="org-src-container">
<pre class="src src-matlab">freqs_res_uh = [410]; <span class="org-comment">% [Hz]</span>
freqs_res_uv = [250]; <span class="org-comment">% [Hz]</span>
</pre>
</div>
<p>
We then make an initial guess on the complex values of the poles.
</p>
<div class="org-src-container">
<pre class="src src-matlab">xi = 0.001; <span class="org-comment">% Approximate modal damping</span>
poles_uh = [2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uh<span class="org-type">*</span>(xi <span class="org-type">+</span> 1<span class="org-constant">i</span>), 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uh<span class="org-type">*</span>(xi <span class="org-type">-</span> 1<span class="org-constant">i</span>)];
poles_uv = [2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uv<span class="org-type">*</span>(xi <span class="org-type">+</span> 1<span class="org-constant">i</span>), 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uv<span class="org-type">*</span>(xi <span class="org-type">-</span> 1<span class="org-constant">i</span>)];
</pre>
</div>
<p>
We then define the weight that will be used for the fitting.
Basically, we want more weight around the resonance and at low frequency (below the first resonance).
Also, we want more importance where we have a better coherence.
Finally, we ignore data above some frequency.
</p>
<div class="org-src-container">
<pre class="src src-matlab">weight_Uch_Vph = coh_Uch_Vph<span class="org-type">'</span>;
weight_Uch_Vpv = coh_Uch_Vpv<span class="org-type">'</span>;
weight_Ucv_Vph = coh_Ucv_Vph<span class="org-type">'</span>;
weight_Ucv_Vpv = coh_Ucv_Vpv<span class="org-type">'</span>;
alpha = 0.1;
<span class="org-keyword">for</span> <span class="org-variable-name">freq_i</span> = <span class="org-constant">1:length(freqs_res_uh)</span>
weight_Uch_Vph(f<span class="org-type">&gt;</span>(1<span class="org-type">-</span>alpha)<span class="org-type">*</span>freqs_res_uh(freq_i) <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>(1 <span class="org-type">+</span> alpha)<span class="org-type">*</span>freqs_res_uh(freq_i)) = 10;
weight_Uch_Vpv(f<span class="org-type">&gt;</span>(1<span class="org-type">-</span>alpha)<span class="org-type">*</span>freqs_res_uh(freq_i) <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>(1 <span class="org-type">+</span> alpha)<span class="org-type">*</span>freqs_res_uh(freq_i)) = 10;
weight_Ucv_Vph(f<span class="org-type">&gt;</span>(1<span class="org-type">-</span>alpha)<span class="org-type">*</span>freqs_res_uv(freq_i) <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>(1 <span class="org-type">+</span> alpha)<span class="org-type">*</span>freqs_res_uv(freq_i)) = 10;
weight_Ucv_Vpv(f<span class="org-type">&gt;</span>(1<span class="org-type">-</span>alpha)<span class="org-type">*</span>freqs_res_uv(freq_i) <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>(1 <span class="org-type">+</span> alpha)<span class="org-type">*</span>freqs_res_uv(freq_i)) = 10;
<span class="org-keyword">end</span>
weight_Uch_Vph(f<span class="org-type">&gt;</span>1000) = 0;
weight_Uch_Vpv(f<span class="org-type">&gt;</span>1000) = 0;
weight_Ucv_Vph(f<span class="org-type">&gt;</span>1000) = 0;
weight_Ucv_Vpv(f<span class="org-type">&gt;</span>1000) = 0;
</pre>
</div>
<p>
The weights are shown in Fig. <a href="#orgafcc83f">20</a>.
</p>
<div id="orgafcc83f" class="figure">
<p><img src="figs/weights_sercalo.png" alt="weights_sercalo.png" />
</p>
<p><span class="figure-number">Figure 20: </span>Weights amplitude (<a href="./figs/weights_sercalo.png">png</a>, <a href="./figs/weights_sercalo.pdf">pdf</a>)</p>
</div>
<p>
When we set some options for <code>vfit3</code>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">opts = struct();
opts.stable = 1; <span class="org-comment">% Enforce stable poles</span>
opts.asymp = 1; <span class="org-comment">% Force D matrix to be null</span>
opts.relax = 1; <span class="org-comment">% Use vector fitting with relaxed non-triviality constraint</span>
opts.skip_pole = 0; <span class="org-comment">% Do NOT skip pole identification</span>
opts.skip_res = 0; <span class="org-comment">% Do NOT skip identification of residues (C,D,E)</span>
opts.cmplx_ss = 0; <span class="org-comment">% Create real state space model with block diagonal A</span>
opts.spy1 = 0; <span class="org-comment">% No plotting for first stage of vector fitting</span>
opts.spy2 = 0; <span class="org-comment">% Create magnitude plot for fitting of f(s)</span>
</pre>
</div>
<p>
We define the number of iteration.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Niter = 5;
</pre>
</div>
<p>
An we run the <code>vectfit3</code> algorithm.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant">1:Niter</span>
[SER_Uch_Vph, poles, <span class="org-type">~</span>, fit_Uch_Vph] = vectfit3(tf_Uch_Vph<span class="org-type">.'</span>, 1<span class="org-constant">i</span><span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uh, weight_Uch_Vph, opts);
<span class="org-keyword">end</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant">1:Niter</span>
[SER_Uch_Vpv, poles, <span class="org-type">~</span>, fit_Uch_Vpv] = vectfit3(tf_Uch_Vpv<span class="org-type">.'</span>, 1<span class="org-constant">i</span><span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uh, weight_Uch_Vpv, opts);
<span class="org-keyword">end</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant">1:Niter</span>
[SER_Ucv_Vph, poles, <span class="org-type">~</span>, fit_Ucv_Vph] = vectfit3(tf_Ucv_Vph<span class="org-type">.'</span>, 1<span class="org-constant">i</span><span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uv, weight_Ucv_Vph, opts);
<span class="org-keyword">end</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant">1:Niter</span>
[SER_Ucv_Vpv, poles, <span class="org-type">~</span>, fit_Ucv_Vpv] = vectfit3(tf_Ucv_Vpv<span class="org-type">.'</span>, 1<span class="org-constant">i</span><span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uv, weight_Ucv_Vpv, opts);
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org6b5c778" class="figure">
<p><img src="figs/identification_matrix_fit.png" alt="identification_matrix_fit.png" />
</p>
<p><span class="figure-number">Figure 21: </span>Transfer Function Extraction of the FRF matrix (<a href="./figs/identification_matrix_fit.png">png</a>, <a href="./figs/identification_matrix_fit.pdf">pdf</a>)</p>
</div>
<div id="orgb59521a" class="figure">
<p><img src="figs/identification_matrix_fit_phase.png" alt="identification_matrix_fit_phase.png" />
</p>
<p><span class="figure-number">Figure 22: </span>Transfer Function Extraction of the FRF matrix (<a href="./figs/identification_matrix_fit_phase.png">png</a>, <a href="./figs/identification_matrix_fit_phase.pdf">pdf</a>)</p>
</div>
<p>
And finally, we create the identified \(G_c\) matrix by multiplying by \({G_i}^{-1}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">G_Uch_Vph = tf(minreal(ss(full(SER_Uch_Vph.A),SER_Uch_Vph.B,SER_Uch_Vph.C,SER_Uch_Vph.D)));
G_Ucv_Vph = tf(minreal(ss(full(SER_Ucv_Vph.A),SER_Ucv_Vph.B,SER_Ucv_Vph.C,SER_Ucv_Vph.D)));
G_Uch_Vpv = tf(minreal(ss(full(SER_Uch_Vpv.A),SER_Uch_Vpv.B,SER_Uch_Vpv.C,SER_Uch_Vpv.D)));
G_Ucv_Vpv = tf(minreal(ss(full(SER_Ucv_Vpv.A),SER_Ucv_Vpv.B,SER_Ucv_Vpv.C,SER_Ucv_Vpv.D)));
Gc = [G_Uch_Vph, G_Ucv_Vph;
G_Uch_Vpv, G_Ucv_Vpv]<span class="org-type">*</span>inv(Gi);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org8e247fa" class="outline-3">
<h3 id="org8e247fa"><span class="section-number-3">2.4</span> Identification of the Newport Dynamics</h3>
<div class="outline-text-3" id="text-2-4">
<p>
We here identify the transfer function from a reference sent to the Newport \([U_{n,h},\ U_{n,v}]\) to the measurement made by the 4QD \([V_{p,h},\ V_{p,v}]\).
</p>
<p>
To do so, we inject noise to the Newport \([U_{n,h},\ U_{n,v}]\) and we record the 4QD measurement \([V_{p,h},\ V_{p,v}]\).
</p>
</div>
<div id="outline-container-org296e4be" class="outline-4">
<h4 id="org296e4be"><span class="section-number-4">2.4.1</span> Input / Output data</h4>
<div class="outline-text-4" id="text-2-4-1">
<p>
The identification data is loaded
</p>
<div class="org-src-container">
<pre class="src src-matlab">uh = load(<span class="org-string">'mat/data_unh.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Unh'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>);
uv = load(<span class="org-string">'mat/data_unv.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Unv'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>);
</pre>
</div>
<p>
We remove the first seconds where the Sercalo is turned on.
</p>
<div class="org-src-container">
<pre class="src src-matlab">t0 = 3;
uh.Unh(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.Vph(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.Vpv(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.t(uh.t<span class="org-type">&lt;</span>t0) = [];
uh.t = uh.t <span class="org-type">-</span> uh.t(1); <span class="org-comment">% We start at t=0</span>
t0 = 1.5;
uv.Unv(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.Vph(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.Vpv(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.t(uv.t<span class="org-type">&lt;</span>t0) = [];
uv.t = uv.t <span class="org-type">-</span> uv.t(1); <span class="org-comment">% We start at t=0</span>
</pre>
</div>
<div id="orgcc3bb7a" class="figure">
<p><img src="figs/identification_unh.png" alt="identification_unh.png" />
</p>
<p><span class="figure-number">Figure 23: </span>Identification signals when exciting the horizontal direction (<a href="./figs/identification_unh.png">png</a>, <a href="./figs/identification_unh.pdf">pdf</a>)</p>
</div>
<div id="org0f2c6bc" class="figure">
<p><img src="figs/identification_unv.png" alt="identification_unv.png" />
</p>
<p><span class="figure-number">Figure 24: </span>Identification signals when exciting in the vertical direction (<a href="./figs/identification_unv.png">png</a>, <a href="./figs/identification_unv.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgff783cf" class="outline-4">
<h4 id="orgff783cf"><span class="section-number-4">2.4.2</span> Coherence</h4>
<div class="outline-text-4" id="text-2-4-2">
<p>
The window used for the spectral analysis is an <code>hanning</code> windows with temporal size equal to 1 second.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(1<span class="org-type">*</span>fs));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[coh_Unh_Vph, f] = mscohere(uh.Unh, uh.Vph, win, [], [], fs);
[coh_Unh_Vpv, <span class="org-type">~</span>] = mscohere(uh.Unh, uh.Vpv, win, [], [], fs);
[coh_Unv_Vph, <span class="org-type">~</span>] = mscohere(uv.Unv, uv.Vph, win, [], [], fs);
[coh_Unv_Vpv, <span class="org-type">~</span>] = mscohere(uv.Unv, uv.Vpv, win, [], [], fs);
</pre>
</div>
<div id="orgeef25d9" class="figure">
<p><img src="figs/id_newport_coherence.png" alt="id_newport_coherence.png" />
</p>
<p><span class="figure-number">Figure 25: </span>Coherence (<a href="./figs/id_newport_coherence.png">png</a>, <a href="./figs/id_newport_coherence.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org179d780" class="outline-4">
<h4 id="org179d780"><span class="section-number-4">2.4.3</span> Estimation of the Frequency Response Function Matrix</h4>
<div class="outline-text-4" id="text-2-4-3">
<p>
We compute an estimate of the transfer functions.
</p>
<div class="org-src-container">
<pre class="src src-matlab">[tf_Unh_Vph, f] = tfestimate(uh.Unh, uh.Vph, win, [], [], fs);
[tf_Unh_Vpv, <span class="org-type">~</span>] = tfestimate(uh.Unh, uh.Vpv, win, [], [], fs);
[tf_Unv_Vph, <span class="org-type">~</span>] = tfestimate(uv.Unv, uv.Vph, win, [], [], fs);
[tf_Unv_Vpv, <span class="org-type">~</span>] = tfestimate(uv.Unv, uv.Vpv, win, [], [], fs);
</pre>
</div>
<div id="orgfb30e57" class="figure">
<p><img src="figs/frf_newport_gain.png" alt="frf_newport_gain.png" />
</p>
<p><span class="figure-number">Figure 26: </span>Frequency Response Matrix (<a href="./figs/frf_newport_gain.png">png</a>, <a href="./figs/frf_newport_gain.pdf">pdf</a>)</p>
</div>
<div id="org152a76c" class="figure">
<p><img src="figs/frf_newport_phase.png" alt="frf_newport_phase.png" />
</p>
<p><span class="figure-number">Figure 27: </span>Frequency Response Matrix Phase (<a href="./figs/frf_newport_phase.png">png</a>, <a href="./figs/frf_newport_phase.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org6ae8b0b" class="outline-4">
<h4 id="org6ae8b0b"><span class="section-number-4">2.4.4</span> Time Delay</h4>
<div class="outline-text-4" id="text-2-4-4">
<p>
Now, we would like to remove the time delay included in the FRF prior to the model extraction.
</p>
<p>
Estimation of the time delay:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Ts_delay = 0.0005; <span class="org-comment">% [s]</span>
G_delay = tf(1, 1, <span class="org-string">'InputDelay'</span>, Ts_delay);
G_delay_resp = squeeze(freqresp(G_delay, f, <span class="org-string">'Hz'</span>));
</pre>
</div>
<p>
We then remove the time delay from the frequency response function.
</p>
<div id="org06b7f85" class="figure">
<p><img src="figs/time_delay_newport.png" alt="time_delay_newport.png" />
</p>
<p><span class="figure-number">Figure 28: </span>Phase change due to time-delay in the Newport dynamics (<a href="./figs/time_delay_newport.png">png</a>, <a href="./figs/time_delay_newport.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org187f24f" class="outline-4">
<h4 id="org187f24f"><span class="section-number-4">2.4.5</span> Extraction of a transfer function matrix</h4>
<div class="outline-text-4" id="text-2-4-5">
<p>
From Fig. <a href="#orgfb30e57">26</a>, it seems reasonable to model the Newport dynamics as diagonal and constant.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gn = blkdiag(tf(mean(abs(tf_Unh_Vph(f<span class="org-type">&gt;</span>10 <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>100)))), tf(mean(abs(tf_Unv_Vpv(f<span class="org-type">&gt;</span>10 <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>100)))));
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd7bf1ca" class="outline-3">
<h3 id="orgd7bf1ca"><span class="section-number-3">2.5</span> Full System</h3>
<div class="outline-text-3" id="text-2-5">
<p>
We now have identified:
</p>
<ul class="org-ul">
<li>\(G_i\)</li>
<li>\(G_a\)</li>
<li>\(G_c\)</li>
<li>\(G_n\)</li>
<li>\(G_d\)</li>
</ul>
<p>
We name the input and output of each transfer function:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gi.InputName = {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>};
Gi.OutputName = {<span class="org-string">'Ich'</span>, <span class="org-string">'Icv'</span>};
Zc.InputName = {<span class="org-string">'Ich'</span>, <span class="org-string">'Icv'</span>};
Zc.OutputName = {<span class="org-string">'Vtch'</span>, <span class="org-string">'Vtcv'</span>};
Ga.InputName = {<span class="org-string">'Vtch'</span>, <span class="org-string">'Vtcv'</span>};
Ga.OutputName = {<span class="org-string">'Vch'</span>, <span class="org-string">'Vcv'</span>};
Gc.InputName = {<span class="org-string">'Ich'</span>, <span class="org-string">'Icv'</span>};
Gc.OutputName = {<span class="org-string">'Vpch'</span>, <span class="org-string">'Vpcv'</span>};
Gn.InputName = {<span class="org-string">'Unh'</span>, <span class="org-string">'Unv'</span>};
Gn.OutputName = {<span class="org-string">'Vpnh'</span>, <span class="org-string">'Vpnv'</span>};
Gd.InputName = {<span class="org-string">'Rh'</span>, <span class="org-string">'Rv'</span>};
Gd.OutputName = {<span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>};
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Sh = sumblk(<span class="org-string">'Vph = Vpch + Vpnh'</span>);
Sv = sumblk(<span class="org-string">'Vpv = Vpcv + Vpnv'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">inputs = {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>, <span class="org-string">'Unh'</span>, <span class="org-string">'Unv'</span>};
outputs = {<span class="org-string">'Vch'</span>, <span class="org-string">'Vcv'</span>, <span class="org-string">'Ich'</span>, <span class="org-string">'Icv'</span>, <span class="org-string">'Rh'</span>, <span class="org-string">'Rv'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>};
sys = connect(Gi, Zc, Ga, Gc, Gn, inv(Gd), Sh, Sv, inputs, outputs);
</pre>
</div>
<p>
The file <code>mat/plant.mat</code> is accessible <a href="./mat/plant.mat">here</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'mat/plant.mat'</span>, <span class="org-string">'sys'</span>, <span class="org-string">'Gi'</span>, <span class="org-string">'Zc'</span>, <span class="org-string">'Ga'</span>, <span class="org-string">'Gc'</span>, <span class="org-string">'Gn'</span>, <span class="org-string">'Gd'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgbb80b69" class="outline-2">
<h2 id="orgbb80b69"><span class="section-number-2">3</span> Huddle Test</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="org8efa1a5"></a>
</p>
<p>
The goal is to determine the noise of the photodiodes as well as the noise of the Attocube interferometer.
</p>
<p>
Multiple measurements are done with different experimental configuration as follow:
</p>
<table id="org8350fa9" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 3:</span> Experimental Configuration for the various Huddle test</caption>
<colgroup>
<col class="org-right" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">Number</th>
<th scope="col" class="org-left">OL/CL</th>
<th scope="col" class="org-left">Compensation Unit</th>
<th scope="col" class="org-left">Aluminum</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">1</td>
<td class="org-left">Open Loop</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
</tr>
<tr>
<td class="org-right">2</td>
<td class="org-left">Open Loop</td>
<td class="org-left">Compensation Unit</td>
<td class="org-left">&#xa0;</td>
</tr>
<tr>
<td class="org-right">3</td>
<td class="org-left">Closed Loop</td>
<td class="org-left">Compensation Unit</td>
<td class="org-left">&#xa0;</td>
</tr>
<tr>
<td class="org-right">4</td>
<td class="org-left">Open Loop</td>
<td class="org-left">Compensation Unit</td>
<td class="org-left">Aluminum</td>
</tr>
<tr>
<td class="org-right">5</td>
<td class="org-left">Closed Loop</td>
<td class="org-left">Compensation Unit</td>
<td class="org-left">Aluminum</td>
</tr>
</tbody>
</table>
</div>
<div id="outline-container-org1de418a" class="outline-3">
<h3 id="org1de418a"><span class="section-number-3">3.1</span> Load Data</h3>
<div class="outline-text-3" id="text-3-1">
<div class="org-src-container">
<pre class="src src-matlab">ht_1 = load(<span class="org-string">'./mat/data_huddle_test_1.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>, <span class="org-string">'Va'</span>);
ht_2 = load(<span class="org-string">'./mat/data_huddle_test_2.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>, <span class="org-string">'Va'</span>);
ht_3 = load(<span class="org-string">'./mat/data_huddle_test_3.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>, <span class="org-string">'Va'</span>);
ht_4 = load(<span class="org-string">'./mat/data_huddle_test_4.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>, <span class="org-string">'Va'</span>);
<span class="org-comment">% ht_5 = load('./mat/data_huddle_test_5.mat', 't', 'Uch', 'Ucv', 'Vph', 'Vpv', 'Va');</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">fs = 1e4;
</pre>
</div>
</div>
</div>
<div id="outline-container-org68d30b6" class="outline-3">
<h3 id="org68d30b6"><span class="section-number-3">3.2</span> Pre-processing</h3>
<div class="outline-text-3" id="text-3-2">
<div class="org-src-container">
<pre class="src src-matlab">t0 = 1; <span class="org-comment">% [s]</span>
tend = 100; <span class="org-comment">% [s]</span>
ht_s = {ht_1 ht_2 ht_3 ht_4}
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(ht_s)</span>
ht_s{<span class="org-constant">i</span>}.Vph(ht_s{<span class="org-constant">i</span>}.t<span class="org-type">&lt;</span>t0) = [];
ht_s{<span class="org-constant">i</span>}.Vpv(ht_s{<span class="org-constant">i</span>}.t<span class="org-type">&lt;</span>t0) = [];
ht_s{<span class="org-constant">i</span>}.Va(ht_s{<span class="org-constant">i</span>}.t<span class="org-type">&lt;</span>t0) = [];
ht_s{<span class="org-constant">i</span>}.t(ht_s{<span class="org-constant">i</span>}.t<span class="org-type">&lt;</span>t0) = [];
ht_s{<span class="org-constant">i</span>}.t = ht_s{<span class="org-constant">i</span>}.t <span class="org-type">-</span> ht_s{<span class="org-constant">i</span>}.t(1); <span class="org-comment">% We start at t=0</span>
ht_s{<span class="org-constant">i</span>}.Vph(tend<span class="org-type">*</span>fs<span class="org-type">+</span>1<span class="org-type">:</span>end) = [];
ht_s{<span class="org-constant">i</span>}.Vpv(tend<span class="org-type">*</span>fs<span class="org-type">+</span>1<span class="org-type">:</span>end) = [];
ht_s{<span class="org-constant">i</span>}.Va(tend<span class="org-type">*</span>fs<span class="org-type">+</span>1<span class="org-type">:</span>end) = [];
ht_s{<span class="org-constant">i</span>}.t(tend<span class="org-type">*</span>fs<span class="org-type">+</span>1<span class="org-type">:</span>end) = [];
ht_s{<span class="org-constant">i</span>}.Va = ht_s{<span class="org-constant">i</span>}.Va <span class="org-type">-</span> mean(ht_s{<span class="org-constant">i</span>}.Va);
<span class="org-keyword">end</span>
ht_1 = ht_s{1};
ht_2 = ht_s{2};
ht_3 = ht_s{3};
ht_4 = ht_s{4};
</pre>
</div>
</div>
</div>
<div id="outline-container-org711054f" class="outline-3">
<h3 id="org711054f"><span class="section-number-3">3.3</span> Filter data with low pass filter</h3>
<div class="outline-text-3" id="text-3-3">
<p>
We filter the data with a first order low pass filter with a crossover frequency of \(\omega_0\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">w0 = 50; <span class="org-comment">% [Hz]</span>
G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>w0);
ht_1.Vaf = lsim(G_lpf, ht_1.Va, ht_1.t);
ht_2.Vaf = lsim(G_lpf, ht_2.Va, ht_2.t);
ht_3.Vaf = lsim(G_lpf, ht_3.Va, ht_3.t);
ht_4.Vaf = lsim(G_lpf, ht_4.Va, ht_4.t);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc846a79" class="outline-3">
<h3 id="orgc846a79"><span class="section-number-3">3.4</span> Time domain plots</h3>
<div class="outline-text-3" id="text-3-4">
<div id="org79e4081" class="figure">
<p><img src="figs/huddle_test_Va.png" alt="huddle_test_Va.png" />
</p>
<p><span class="figure-number">Figure 29: </span>Measurement of the Attocube during Huddle Test (<a href="./figs/huddle_test_Va.png">png</a>, <a href="./figs/huddle_test_Va.pdf">pdf</a>)</p>
</div>
<div id="org08b9f68" class="figure">
<p><img src="figs/huddle_test_4qd.png" alt="huddle_test_4qd.png" />
</p>
<p><span class="figure-number">Figure 30: </span>Measurement of the 4QD during the Huddle tests (<a href="./figs/huddle_test_4qd.png">png</a>, <a href="./figs/huddle_test_4qd.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org2b99615" class="outline-3">
<h3 id="org2b99615"><span class="section-number-3">3.5</span> Power Spectral Density</h3>
<div class="outline-text-3" id="text-3-5">
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(1<span class="org-type">*</span>fs));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[psd_Va1, f] = pwelch(ht_1.Va, win, [], [], fs);
[psd_Va2, <span class="org-type">~</span>] = pwelch(ht_2.Va, win, [], [], fs);
[psd_Va3, <span class="org-type">~</span>] = pwelch(ht_3.Va, win, [], [], fs);
[psd_Va4, <span class="org-type">~</span>] = pwelch(ht_4.Va, win, [], [], fs);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[psd_Vph1, <span class="org-type">~</span>] = pwelch(ht_1.Vph, win, [], [], fs);
[psd_Vph2, <span class="org-type">~</span>] = pwelch(ht_2.Vph, win, [], [], fs);
[psd_Vph3, <span class="org-type">~</span>] = pwelch(ht_3.Vph, win, [], [], fs);
[psd_Vph4, <span class="org-type">~</span>] = pwelch(ht_4.Vph, win, [], [], fs);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[psd_Vpv1, <span class="org-type">~</span>] = pwelch(ht_1.Vpv, win, [], [], fs);
[psd_Vpv2, <span class="org-type">~</span>] = pwelch(ht_2.Vpv, win, [], [], fs);
[psd_Vpv3, <span class="org-type">~</span>] = pwelch(ht_3.Vpv, win, [], [], fs);
[psd_Vpv4, <span class="org-type">~</span>] = pwelch(ht_4.Vpv, win, [], [], fs);
</pre>
</div>
<div id="org6b11072" class="figure">
<p><img src="figs/huddle_test_psd_va.png" alt="huddle_test_psd_va.png" />
</p>
<p><span class="figure-number">Figure 31: </span>PSD of the Interferometer measurement during Huddle tests (<a href="./figs/huddle_test_psd_va.png">png</a>, <a href="./figs/huddle_test_psd_va.pdf">pdf</a>)</p>
</div>
<div id="orga1f3d44" class="figure">
<p><img src="figs/huddle_test_4qd_psd.png" alt="huddle_test_4qd_psd.png" />
</p>
<p><span class="figure-number">Figure 32: </span>PSD of the 4QD signal during Huddle tests (<a href="./figs/huddle_test_4qd_psd.png">png</a>, <a href="./figs/huddle_test_4qd_psd.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org9e8db47" class="outline-3">
<h3 id="org9e8db47"><span class="section-number-3">3.6</span> Conclusion</h3>
<div class="outline-text-3" id="text-3-6">
<p>
The Attocube&rsquo;s &ldquo;Environmental Compensation Unit&rdquo; does not have a significant effect on the stability of the measurement.
</p>
</div>
</div>
</div>
<div id="outline-container-orge97a7db" class="outline-2">
<h2 id="orge97a7db"><span class="section-number-2">4</span> Budget Error</h2>
<div class="outline-text-2" id="text-4">
<p>
<a id="orgb5c90b6"></a>
</p>
<p>
<b>Goals</b>:
</p>
<ul class="org-ul">
<li>List all sources of error and compute their effects on the Attocube measurement</li>
<li>Think about how to determine the value of the individual sources of error</li>
<li>Sum all the sources of error and determine the limiting ones</li>
</ul>
<p>
<b>Sources of error for the Attocube measurement</b>:
</p>
<ul class="org-ul">
<li>Beam non-perpendicularity to the concave mirror is linked to the non-perfect feedback loop:
<ul class="org-ul">
<li>We have only finite gain / limited bandwidth so the Sercalo mirror angle will not be perfect</li>
<li>The non-perpendicularity is measured by the 4QD and is used as the feedback signal, however this signal is noisy and even with infinite gain, this noise will be transmitted to the angle of the beam</li>
</ul></li>
<li>Sercalo/Newport unwanted translation perpendicular to its surface.
This can be due to:
<ul class="org-ul">
<li>Non idealities in the mechanics of the Sercalo</li>
<li>Temperature variations</li>
<li>The reproducible part of the perpendicular translation with respect to the angle of the Sercalo can be taken into account and subtracted from the Attocube measurement</li>
</ul></li>
<li>Temperature variations of the metrology frame</li>
<li>Change in the refractive air index in the beam path.
This can be due to change of Temperature, Pressure and Humidity of the air in the beam path</li>
</ul>
<p>
<b>Procedure</b>:
</p>
<ul class="org-ul">
<li>in section <a href="#org33cffee">4.1</a>:
We estimate the effect of an angle error of the Sercalo mirror on the Attocube measurement</li>
<li>in section <a href="#orgbb0b926">4.2</a>:
The effect of perpendicular motion of the Newport and Sercalo mirrors on the Attocube measurement is determined.</li>
<li>in section <a href="#org3e3c8ec">4.3</a>:
We estimate the expected change of refractive index of the air in the beam path and the resulting Attocube measurement error</li>
<li>in section <a href="#org1b68001">4.5</a>:
The feedback system using the 4 quadrant diode and the Sercalo is studied.
Sensor noise, actuator noise and their effects on the control error is discussed.</li>
</ul>
</div>
<div id="outline-container-org74c32e0" class="outline-3">
<h3 id="org74c32e0"><span class="section-number-3">4.1</span> Effect of the Sercalo angle error on the measured distance by the Attocube</h3>
<div class="outline-text-3" id="text-4-1">
<p>
<a id="org33cffee"></a>
To simplify, we suppose that the Newport mirror is a flat mirror (instead of a concave one).
</p>
<p>
The geometry of the setup is shown in Fig. <a href="#orgccba638">33</a> where:
</p>
<ul class="org-ul">
<li>\(O\) is the reference surface of the Attocube</li>
<li>\(S\) is the point where the beam first hits the Sercalo mirror</li>
<li>\(X\) is the point where the beam first hits the Newport mirror</li>
<li>\(\delta \theta_c\) is the angle error from its ideal 45 degrees</li>
</ul>
<p>
We define the angle error range \(\delta \theta_c\) where we want to evaluate the distance error \(\delta L\) measured by the Attocube.
</p>
<div class="org-src-container">
<pre class="src src-matlab">thetas_c = logspace(<span class="org-type">-</span>7, <span class="org-type">-</span>4, 100); <span class="org-comment">% [rad]</span>
</pre>
</div>
<p>
The geometrical parameters of the setup are defined below.
</p>
<div class="org-src-container">
<pre class="src src-matlab">H = 0.05; <span class="org-comment">% [m]</span>
L = 0.05; <span class="org-comment">% [m]</span>
</pre>
</div>
<div id="orgccba638" class="figure">
<p><img src="figs/angle_error_schematic_sercalo.png" alt="angle_error_schematic_sercalo.png" />
</p>
<p><span class="figure-number">Figure 33: </span>Schematic of the geometry used to evaluate the effect of \(\delta \theta_c\) on the measured distance \(\delta L\)</p>
</div>
<p>
The nominal points \(O\), \(S\) and \(X\) are defined.
</p>
<div class="org-src-container">
<pre class="src src-matlab">O = [<span class="org-type">-</span>L, 0];
S = [0, 0];
X = [0, H];
</pre>
</div>
<p>
Thus, the initial path length \(L\) is:
</p>
<div class="org-src-container">
<pre class="src src-matlab">path_nominal = norm(S<span class="org-type">-</span>O) <span class="org-type">+</span> norm(X<span class="org-type">-</span>S) <span class="org-type">+</span> norm(S<span class="org-type">-</span>X) <span class="org-type">+</span> norm(O<span class="org-type">-</span>S);
</pre>
</div>
<p>
We now compute the new path length when there is an error angle \(\delta \theta_c\) on the Sercalo mirror angle.
</p>
<div class="org-src-container">
<pre class="src src-matlab">path_length = zeros(size(thetas_c));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(thetas_c)</span>
theta_c = thetas_c(<span class="org-constant">i</span>);
Y = [H<span class="org-type">*</span>tan(2<span class="org-type">*</span>theta_c), H];
M = 2<span class="org-type">*</span>H<span class="org-type">/</span>(tan(<span class="org-constant">pi</span><span class="org-type">/</span>4<span class="org-type">-</span>theta_c)<span class="org-type">+</span>1<span class="org-type">/</span>tan(2<span class="org-type">*</span>theta_c))<span class="org-type">*</span>[1, tan(<span class="org-constant">pi</span><span class="org-type">/</span>4<span class="org-type">-</span>theta_c)];
T = [<span class="org-type">-</span>L, M(2)<span class="org-type">+</span>(L<span class="org-type">+</span>M(1))<span class="org-type">*</span>tan(4<span class="org-type">*</span>theta_c)];
path_length(<span class="org-constant">i</span>) = norm(S<span class="org-type">-</span>O) <span class="org-type">+</span> norm(Y<span class="org-type">-</span>S) <span class="org-type">+</span> norm(M<span class="org-type">-</span>Y) <span class="org-type">+</span> norm(T<span class="org-type">-</span>M);
<span class="org-keyword">end</span>
</pre>
</div>
<p>
We then compute the distance error and we plot it as a function of the Sercalo angle error (Fig. <a href="#org4c9adb6">34</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab">path_error = path_length <span class="org-type">-</span> path_nominal;
</pre>
</div>
<div id="org4c9adb6" class="figure">
<p><img src="figs/effect_sercalo_angle_distance_meas.png" alt="effect_sercalo_angle_distance_meas.png" />
</p>
<p><span class="figure-number">Figure 34: </span>Effect of an angle error of the Sercalo on the distance error measured by the Attocube (<a href="./figs/effect_sercalo_angle_distance_meas.png">png</a>, <a href="./figs/effect_sercalo_angle_distance_meas.pdf">pdf</a>)</p>
</div>
<p>
And we plot the beam path using Matlab for an high angle to verify that the code is working (Fig. <a href="#orgb1ddc75">35</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab">theta = 2<span class="org-type">*</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>360; <span class="org-comment">% [rad]</span>
H = 0.05; <span class="org-comment">% [m]</span>
L = 0.05; <span class="org-comment">% [m]</span>
O = [<span class="org-type">-</span>L, 0];
S = [0, 0];
X = [0, H];
Y = [H<span class="org-type">*</span>tan(2<span class="org-type">*</span>theta), H];
M = 2<span class="org-type">*</span>H<span class="org-type">/</span>(tan(<span class="org-constant">pi</span><span class="org-type">/</span>4<span class="org-type">-</span>theta)<span class="org-type">+</span>1<span class="org-type">/</span>tan(2<span class="org-type">*</span>theta))<span class="org-type">*</span>[1, tan(<span class="org-constant">pi</span><span class="org-type">/</span>4<span class="org-type">-</span>theta)];
T = [<span class="org-type">-</span>L, M(2)<span class="org-type">+</span>(L<span class="org-type">+</span>M(1))<span class="org-type">*</span>tan(4<span class="org-type">*</span>theta)];
</pre>
</div>
<div id="orgb1ddc75" class="figure">
<p><img src="figs/simulation_beam_path_high_angle.png" alt="simulation_beam_path_high_angle.png" />
</p>
<p><span class="figure-number">Figure 35: </span>Simulation of a beam path for high angle error (<a href="./figs/simulation_beam_path_high_angle.png">png</a>, <a href="./figs/simulation_beam_path_high_angle.pdf">pdf</a>)</p>
</div>
<div class="important" id="org4ad36e3">
<p>
Based on Fig. <a href="#org4c9adb6">34</a>, we see that an angle error \(\delta\theta_c\) of the Sercalo mirror induces a distance error \(\delta L\) measured by the Attocube which is dependent of the square of \(\delta \theta_c\):
</p>
\begin{equation}
\delta L = \delta\theta_c^2
\end{equation}
<p>
with:
</p>
<ul class="org-ul">
<li>\(\delta L\) expressed in [m]</li>
<li>\(\delta \theta_c\) in [rad]</li>
</ul>
<p>
Some example are shown in table <a href="#orgf0a29c9">4</a>.
</p>
<p>
The tracking error of the feedback system used to position the Sercalo mirror should thus be limited to few micro-meters.
</p>
</div>
<table id="orgf0a29c9" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 4:</span> Effect of an angle error \(\delta \theta_c\) of the Sercalo&rsquo;s mirror on the measurement error \(\delta L\) by the Attocube</caption>
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Angle Error \(\delta \theta_c\)</th>
<th scope="col" class="org-left">Distance measurement error \(\delta L\)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(1\,\mu\text{rad}\)</td>
<td class="org-left">\(1\, nm\)</td>
</tr>
<tr>
<td class="org-left">\(5\,\mu\text{rad}\)</td>
<td class="org-left">\(25\, nm\)</td>
</tr>
<tr>
<td class="org-left">\(10\,\mu\text{rad}\)</td>
<td class="org-left">\(100\, nm\)</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-orge85f791" class="outline-3">
<h3 id="orge85f791"><span class="section-number-3">4.2</span> Unwanted motion of Sercalo/Newport mirrors perpendicular to its surface</h3>
<div class="outline-text-3" id="text-4-2">
<p>
<a id="orgbb0b926"></a>
</p>
<p>
From Figs <a href="#org116871d">36</a> and <a href="#org8126a5d">37</a>, it is clear that perpendicular motions of the Sercalo mirror and of the Newport mirror have an impact on the measured distance by the Attocube interferometer.
</p>
<p>
More precisely, if the note:
</p>
<ul class="org-ul">
<li>\(\delta d_c\) the perpendicular motion of the Sercalo&rsquo;s mirror</li>
<li>\(\delta d_n\) the perpendicular motion of the Newport&rsquo;s mirror</li>
</ul>
<p>
We have that:
</p>
\begin{align}
\delta L &= 2 \cdot \delta d_c \\
\delta L &= 2 \cdot \delta d_n
\end{align}
<p>
Note here that \(\delta L\) denote the change of beam traveled distance.
The error in measured distance by the Attocube will we \(\delta L/2\).
</p>
<div id="org116871d" class="figure">
<p><img src="figs/sercalo_perpendicular_motion.png" alt="sercalo_perpendicular_motion.png" />
</p>
<p><span class="figure-number">Figure 36: </span>Effect of a Perpendicular motion of the Sercalo Mirror</p>
</div>
<div id="org8126a5d" class="figure">
<p><img src="figs/newport_perpendicular_motion.png" alt="newport_perpendicular_motion.png" />
</p>
<p><span class="figure-number">Figure 37: </span>Effect of a Perpendicular motion of the Newport Mirror</p>
</div>
<div class="important" id="orgac402d2">
<p>
The motion of the both Sercalo&rsquo;s and Newport&rsquo;s mirrors perpendicular to its surface is fully transmitted to the measured distance by the Attocube interferometer.
</p>
<p>
This motion can be measured and the repeatable part can be compensated.
However, the non repeatability of this motion should be less than few nano-meters.
</p>
</div>
</div>
</div>
<div id="outline-container-org6279dc8" class="outline-3">
<h3 id="org6279dc8"><span class="section-number-3">4.3</span> Change in refractive index of the air in the beam path</h3>
<div class="outline-text-3" id="text-4-3">
<p>
<a id="org3e3c8ec"></a>
</p>
<p>
Three physical properties of the air makes change of the Attocube measurement:
</p>
<ul class="org-ul">
<li>Temperature: \(K_T \approx 1 ppmK^{-1}\)</li>
<li>Pressure: \(K_P \approx 0.27 ppm hPa^{-1}\)</li>
<li>Humidity: \(K_{HR} \approx 0.01 ppm \% RH^{-1}\)</li>
</ul>
<p>
These physical properties should change relatively slowly, however, for a beam path of 100mm:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Air property Variations</th>
<th scope="col" class="org-left">Measurement error</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(\Delta T = 1^oC\)</td>
<td class="org-left">100nm</td>
</tr>
<tr>
<td class="org-left">\(\Delta P = 1hPa\)</td>
<td class="org-left">27nm</td>
</tr>
<tr>
<td class="org-left">\(\Delta 10\%RH\)</td>
<td class="org-left">10nm</td>
</tr>
</tbody>
</table>
<p>
An <b>Environmental Compensation Unit</b> is used and can compensate for variations or air properties up to:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Air property Variations</th>
<th scope="col" class="org-left">Measurement error</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(\Delta T = \pm 0.1^oC\)</td>
<td class="org-left">\(\pm 10\,\text{nm}\)</td>
</tr>
<tr>
<td class="org-left">\(\Delta P = \pm 1hPa\)</td>
<td class="org-left">\(\pm 25\,\text{nm}\)</td>
</tr>
<tr>
<td class="org-left">\(\Delta \pm 2\%RH\)</td>
<td class="org-left">\(\pm 2\,\text{nm}\)</td>
</tr>
</tbody>
</table>
<div class="important" id="org0e3c38a">
<p>
The total measurement error induced by air properties variations is then:
</p>
\begin{equation}
\sqrt{20^2 + 50^2 + 4^2} = 54nm
\end{equation}
<p>
The beam path should be protected using aluminum to minimize the change in refractive index of the air in the beam path.
</p>
</div>
</div>
</div>
<div id="outline-container-org930942c" class="outline-3">
<h3 id="org930942c"><span class="section-number-3">4.4</span> Thermal Expansion of the Metrology Frame</h3>
<div class="outline-text-3" id="text-4-4">
<p>
The material used for the metrology frame is Aluminum.
Its linear thermal expansion coefficient is \(\alpha = 23 \cdot 10^{-6} K^{-1}\).
</p>
<p>
The distance between the Attocube head and the Attocube is approximatively equal to 5cm.
\[ \frac{\delta L}{\delta T} \approx 0.05 \cdot 23 \cdot 10^{-6} \approx 1\,\frac{\mu m}{{}^oC} \]
If invar is used (\(\alpha = 1.2 \cdot 10^{-6} \, K^{-1}\)):
\[ \frac{\delta L}{\delta T} \approx 60 \frac{nm}{{}^oC} \]
</p>
<p>
Thus, the temperature of the metrology frame should be kept constant to less than \(0.1\,^oC\).
</p>
</div>
</div>
<div id="outline-container-org436bf8a" class="outline-3">
<h3 id="org436bf8a"><span class="section-number-3">4.5</span> Estimation of the Sercalo angle error due to Noise</h3>
<div class="outline-text-3" id="text-4-5">
<p>
<a id="org1b68001"></a>
</p>
<p>
In this section, we seek to estimate the angle error \(\delta \theta\)
</p>
<p>
Consider the block diagram in Fig. <a href="#org18171a2">38</a> with:
</p>
<ul class="org-ul">
<li>\(G\): represents the transfer function from a voltage applied by the Speedgoat DAC used for the Sercalo to the Beam angle</li>
<li>\(K\): is the control law used</li>
</ul>
<p>
The signals are:
</p>
<ul class="org-ul">
<li>\(\delta \theta\): is the &ldquo;true&rdquo; laser beam angle</li>
<li>\(\delta \theta_m\): is the measured beam angle (\(\delta \theta_m = \delta \theta + n_\theta\))</li>
<li>\(n_\theta\): is the measurement noise of the laser beam angle using the 4 quadrant diode.
It includes:
<ul class="org-ul">
<li>ADC noise</li>
<li>\(1/f\) noise, Shot noise, Ambian noise, Intensity noise&#x2026;</li>
</ul></li>
<li>\(d_u\): is noise at the input of the Sercalo.
It includes:
<ul class="org-ul">
<li>DAC noise of the speadgoat</li>
</ul></li>
<li>\(d\): is disturbance on the angle of the beam.
It includes:
<ul class="org-ul">
<li>Angle variations of the Newport mirror</li>
</ul></li>
</ul>
<div id="org18171a2" class="figure">
<p><img src="figs/feedback_diagram.png" alt="feedback_diagram.png" />
</p>
<p><span class="figure-number">Figure 38: </span>Block Diagram of the Feedback system</p>
</div>
</div>
<div id="outline-container-org6b38ed3" class="outline-4">
<h4 id="org6b38ed3"><span class="section-number-4">4.5.1</span> Estimation of sources of noise and disturbances</h4>
<div class="outline-text-4" id="text-4-5-1">
<p>
Let&rsquo;s estimate the values of \(d_u\), \(d\) and \(n_\theta\).
</p>
</div>
<div id="outline-container-org38dc27b" class="outline-5">
<h5 id="org38dc27b"><span class="section-number-5">4.5.1.1</span> ADC Quantization Noise</h5>
<div class="outline-text-5" id="text-4-5-1-1">
<p>
The ADC quantization noise is:
</p>
\begin{equation}
\Gamma_\text{ADC} = \frac{\left(\frac{\Delta V}{2^n}\right)^2}{12 f_s} \text{ in } \left[ \frac{V^2}{Hz} \right]
\end{equation}
<p>
with:
</p>
<ul class="org-ul">
<li>\(\Delta V\): is the range of the ADC in \([V]\)</li>
<li>\(n\): is the number of ADC&rsquo;s bits</li>
<li>\(f_s\): is the sampling frequency in \([Hz]\)</li>
</ul>
<p>
For the ADC used:
</p>
<ul class="org-ul">
<li>\(\Delta V = 20\, V\)</li>
<li>\(n = 16\)</li>
<li>\(f_s = 10\, kHz\)</li>
</ul>
<div class="important" id="org974301d">
\begin{equation}
\Gamma_\text{ADC}(f) = 7.76 \cdot 10^{-13}\,\left[ \frac{V^2}{Hz} \right]
\end{equation}
</div>
</div>
</div>
<div id="outline-container-org132b3df" class="outline-5">
<h5 id="org132b3df"><span class="section-number-5">4.5.1.2</span> DAC Quantization Noise</h5>
<div class="outline-text-5" id="text-4-5-1-2">
<p>
The DAC quantization noise is:
</p>
\begin{equation}
\Gamma_\text{DAC} = \frac{\left(\frac{\Delta V}{2^n}\right)^2}{12 f_s} \text{ in } \left[ \frac{V^2}{Hz} \right]
\end{equation}
<p>
with:
</p>
<ul class="org-ul">
<li>\(\Delta V\): is the range of the DAC in \([V]\)</li>
<li>\(n\): is the number of DAC&rsquo;s bits</li>
<li>\(f_s\): is the sampling frequency in \([Hz]\)</li>
</ul>
<p>
For the DAC used:
</p>
<ul class="org-ul">
<li>\(\Delta V = 20\, V\)</li>
<li>\(n = 16\)</li>
<li>\(f_s = 10\, kHz\)</li>
</ul>
<div class="important" id="org053027b">
\begin{equation}
\Gamma_\text{DAC}(f) = 7.76 \cdot 10^{-13}\,\left[ \frac{V^2}{Hz} \right]
\end{equation}
</div>
</div>
</div>
<div id="outline-container-orgecc05d4" class="outline-5">
<h5 id="orgecc05d4"><span class="section-number-5">4.5.1.3</span> Noise of the Newport Mirror angle</h5>
<div class="outline-text-5" id="text-4-5-1-3">
<p>
Plus, we estimate the effect of DAC quantization noise on the angle error on the Newport mirror.
</p>
<p>
The gain of the Newport is:
</p>
\begin{align*}
\frac{\theta_n}{V_n} &= \frac{26.2}{10}\ \left[ \frac{mrad}{V} \right] \\
&= 2.62 \cdot 10^{-3}\ \left[ \frac{rad}{V} \right]
\end{align*}
\begin{align*}
\Gamma_{\theta_n}(f) &= \left(\frac{\theta_n}{V_n}\right)^2 \cdot \Gamma_\text{DAC}(f) \\
&= (2.62 \cdot 10^{-3})^2 \cdot 7.76 \cdot 10^{-13} \\
&= 3.96 \cdot 10^{-18}\,\left[ \frac{rad^2}{Hz} \right]
\end{align*}
<p>
If we integrate that to obtain an rms value:
</p>
\begin{align*}
\theta_{n, rms} &= \sqrt{\int_{-f_s/2}^{f_s/2} \Gamma_{\theta_n}(f) df} \\
&= 0.2\, \mu rad
\end{align*}
<p>
Which is much less than the noise equivalent angle specified by Newport: \(3\, \mu rad\,[rms]\).
Thus, quantization error of the DAC is not a problem.
</p>
<p>
We expect the angle noise of the Newport mirror to be around \(3\, \mu rad\,[rms]\) which is \(6\, \mu rad\,[rms]\) for the beam angle.
</p>
<div class="important" id="org18b6877">
<p>
If we suppose a white noise, the power spectral density of the beam angle due to the noise of the Newport mirror corresponds to:
</p>
\begin{align*}
\Gamma_{d} &= \frac{(6 \cdot 10^{-6})^2}{f_s}\ \left[ \frac{rad^2}{Hz} \right] \\
&= 3.6 \cdot 10^{-15}\ \left[ \frac{rad^2}{Hz} \right]
\end{align*}
</div>
</div>
</div>
<div id="outline-container-org9164fb8" class="outline-5">
<h5 id="org9164fb8"><span class="section-number-5">4.5.1.4</span> Disturbances due the Newport Mirror Rotation</h5>
<div class="outline-text-5" id="text-4-5-1-4">
<p>
We will rotate the Newport mirror in order to simulate a displacement of the Sample:
</p>
<ul class="org-ul">
<li>The angle range for the Newport mirror is \(\pm 26.2\ mrad = \pm 1.5^o\)</li>
<li>The radius of the concave mirror is 200 mm</li>
</ul>
<div id="orgfa2834b" class="figure">
<p><img src="figs/newport_angle_concave_mirror.png" alt="newport_angle_concave_mirror.png" />
</p>
<p><span class="figure-number">Figure 39: </span>Rotation of the (concave) Newport mirror</p>
</div>
<p>
If we suppose small angles, the corresponding beam deviation is:
\[ \delta \theta \approx 2*\frac{\alpha R}{H + R} = 1.6 \alpha \]
where \(\alpha\) is the rotation of the Newport mirror.
</p>
</div>
</div>
</div>
<div id="outline-container-orge353531" class="outline-4">
<h4 id="orge353531"><span class="section-number-4">4.5.2</span> Perfect Control</h4>
<div class="outline-text-4" id="text-4-5-2">
<p>
If the feedback is perfect, the Sercalo angle error will be equal to the 4 quadrant diode noise.
Let&rsquo;s estimate the 4QD noise in radians.
</p>
<p>
If we note \(V_1\), \(V_2\), \(V_3\) and \(V_4\) the voltage of each of the quadrant, a measurement error \(\delta V_i\) of one of the quadrant will have an effect \(\delta \theta\) on the measured angle:
\[ \delta\theta = G \frac{\delta V_i}{V_1 + V_2 + V_3 + V_4} \]
with \(G\) is the gain of the 4QD in [rad].
</p>
<p>
We should then have that the voltage of each quadrant is as large as possible.
Suppose here that \(V_i \approx 5V\), \(\delta V_i = 1mV\) and \(G = 0.03\,rad\), we obtain:
\[ \delta \theta = 0.03 \frac{0.001}{20} = 1.5\, \mu\text{rad} \]
This then corresponds to
\[ \delta L = 10^{-6} \cdot \delta \theta = 1.5\,nm \]
</p>
<p>
If we just consider the ADC noise:
</p>
<ul class="org-ul">
<li>the ADC range is \(\pm 10V\) with \(16\text{ bits}\).</li>
<li>thus, the LSB corresponds to:
\[ \frac{20}{2^{16}} \approx 0.000305\,V = 0.305\,mV \]</li>
<li>this corresponds to an error \(\delta L \approx 0.5 nm\)</li>
</ul>
</div>
</div>
<div id="outline-container-org683bb6d" class="outline-4">
<h4 id="org683bb6d"><span class="section-number-4">4.5.3</span> Error due to DAC noise used for the Sercalo</h4>
<div class="outline-text-4" id="text-4-5-3">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'./mat/plant.mat'</span>, <span class="org-string">'Gi'</span>, <span class="org-string">'Gc'</span>, <span class="org-string">'Gd'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">G = inv(Gd)<span class="org-type">*</span>Gc<span class="org-type">*</span>Gi;
</pre>
</div>
<p>
Dynamical estimation:
</p>
<ul class="org-ul">
<li>ASD of DAC noise used for the Sercalo</li>
<li>Multiply by transfer function from Sercalo voltage to angle estimation using the 4QD</li>
</ul>
<div class="org-src-container">
<pre class="src src-matlab">freqs = logspace(1, 3, 1000);
fs = 1e4;
<span class="org-comment">% </span><span class="org-comment"><span class="org-constant">ASD </span></span><span class="org-comment">of the DAC voltage going to the Sercalo in [V/sqrt(Hz)]</span>
asd_uc = (20<span class="org-type">/</span>2<span class="org-type">^</span>16)<span class="org-type">/</span>sqrt(12<span class="org-type">*</span>fs)<span class="org-type">*</span>ones(length(freqs), 1);
<span class="org-comment">% </span><span class="org-comment"><span class="org-constant">ASD </span></span><span class="org-comment">of the measured angle by the QD in [rad/sqrt(Hz)]</span>
asd_theta = asd_uc<span class="org-type">.*</span>abs(squeeze(freqresp(G(1,1), freqs, <span class="org-string">'Hz'</span>)));
<span class="org-type">figure</span>;
loglog(freqs, asd_theta)
</pre>
</div>
<p>
Then the corresponding ASD of the measured displacement by the interferometer is:
</p>
<div class="org-src-container">
<pre class="src src-matlab">asd_L = asd_theta<span class="org-type">*</span>10<span class="org-type">^</span>(<span class="org-type">-</span>6); <span class="org-comment">% [m/sqrt(Hz)]</span>
</pre>
</div>
<p>
And we integrate that to have the RMS value:
</p>
<div class="org-src-container">
<pre class="src src-matlab">cps_L = 1<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">*</span>cumtrapz(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs, (asd_L)<span class="org-type">.^</span>2);
</pre>
</div>
<p>
The RMS value is:
</p>
<div class="org-src-container">
<pre class="src src-matlab">sqrt(cps_L(end))
</pre>
</div>
<pre class="example">
1.647e-11
</pre>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
loglog(freqs, cps_L)
</pre>
</div>
<p>
Let&rsquo;s estimate the beam angle error corresponding to 1 LSB of the sercalo&rsquo;s DAC.
Gain of the Sercalo is approximatively 5 degrees for 10V.
However the beam angle deviation is 4 times the angle deviation of the sercalo mirror, thus:
</p>
<div class="org-src-container">
<pre class="src src-matlab">d_alpha = 4<span class="org-type">*</span>(20<span class="org-type">/</span>2<span class="org-type">^</span>16)<span class="org-type">*</span>(5<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>180)<span class="org-type">/</span>10 <span class="org-comment">% [rad]</span>
</pre>
</div>
<pre class="example">
1.0653e-05
</pre>
<p>
This corresponds to a measurement error of the Attocube equals to (in [m])
</p>
<div class="org-src-container">
<pre class="src src-matlab">1e<span class="org-type">-</span>6<span class="org-type">*</span>d_alpha <span class="org-comment">% [m]</span>
</pre>
</div>
<pre class="example">
1.0653e-11
</pre>
<div class="important" id="org7b27ce1">
<p>
The DAC noise use for the Sercalo does not limit the performance of the system.
</p>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org9b16eb7" class="outline-2">
<h2 id="org9b16eb7"><span class="section-number-2">5</span> Plant Uncertainty</h2>
<div class="outline-text-2" id="text-5">
</div>
<div id="outline-container-org1b03f29" class="outline-3">
<h3 id="org1b03f29"><span class="section-number-3">5.1</span> Coprime Factorization</h3>
<div class="outline-text-3" id="text-5-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/plant.mat'</span>, <span class="org-string">'sys'</span>, <span class="org-string">'Gi'</span>, <span class="org-string">'Zc'</span>, <span class="org-string">'Ga'</span>, <span class="org-string">'Gc'</span>, <span class="org-string">'Gn'</span>, <span class="org-string">'Gd'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[fact, Ml, Nl] = lncf(Gc<span class="org-type">*</span>Gi);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf672248" class="outline-2">
<h2 id="orgf672248"><span class="section-number-2">6</span> Plant Scaling</h2>
<div class="outline-text-2" id="text-6">
<p>
<a id="org20e0b86"></a>
</p>
<p>
The goal is the scale the plant prior to control synthesis.
This will simplify the choice of weighting functions and will yield useful insight on the controllability of the plant.
</p>
<table id="org7c3e719" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 5:</span> Maximum wanted values for various signals</caption>
<colgroup>
<col class="org-left" />
<col class="org-right" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-right">Value</th>
<th scope="col" class="org-left">Unit</th>
<th scope="col" class="org-left">Variable Name</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Expected perturbations</td>
<td class="org-right">1</td>
<td class="org-left">[V]</td>
<td class="org-left">\(U_n\)</td>
</tr>
<tr>
<td class="org-left">Maximum input usage</td>
<td class="org-right">10</td>
<td class="org-left">[V]</td>
<td class="org-left">\(U_c\)</td>
</tr>
<tr>
<td class="org-left">Maximum wanted error</td>
<td class="org-right">10</td>
<td class="org-left">[\(\mu rad\)]</td>
<td class="org-left">\(\theta\)</td>
</tr>
<tr>
<td class="org-left">Measured noise</td>
<td class="org-right">5</td>
<td class="org-left">[\(\mu rad\)]</td>
<td class="org-left">&#xa0;</td>
</tr>
</tbody>
</table>
</div>
<div id="outline-container-orgf30c784" class="outline-3">
<h3 id="orgf30c784"><span class="section-number-3">6.1</span> Control Objective</h3>
<div class="outline-text-3" id="text-6-1">
<p>
The maximum expected stroke is \(y_\text{max} = 3mm \approx 5e^{-2} rad\) at \(1Hz\).
The maximum wanted error is \(e_\text{max} = 10 \mu rad\).
</p>
<p>
Thus, we require the sensitivity function at \(\omega_0 = 1\text{ Hz}\):
</p>
\begin{align*}
|S(j\omega_0)| &< \left| \frac{e_\text{max}}{y_\text{max}} \right| \\
&< 2 \cdot 10^{-4}
\end{align*}
<p>
In terms of loop gain, this is equivalent to:
\[ |L(j\omega_0)| > 5 \cdot 10^{3} \]
</p>
</div>
</div>
<div id="outline-container-org0643666" class="outline-3">
<h3 id="org0643666"><span class="section-number-3">6.2</span> General Configuration</h3>
<div class="outline-text-3" id="text-6-2">
<p>
The plant is put in a general configuration as shown in Fig. <a href="#orgbab73c8">40</a>.
</p>
<div id="orgbab73c8" class="figure">
<p><img src="figs/general_control_names.png" alt="general_control_names.png" />
</p>
<p><span class="figure-number">Figure 40: </span>General Control Configuration</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org8c1c256" class="outline-2">
<h2 id="org8c1c256"><span class="section-number-2">7</span> Plant Analysis</h2>
<div class="outline-text-2" id="text-7">
<p>
<a id="org9ff3880"></a>
</p>
</div>
<div id="outline-container-org22fd12f" class="outline-3">
<h3 id="org22fd12f"><span class="section-number-3">7.1</span> Load Plant</h3>
<div class="outline-text-3" id="text-7-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/plant.mat'</span>, <span class="org-string">'G'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org4e845b2" class="outline-3">
<h3 id="org4e845b2"><span class="section-number-3">7.2</span> RGA-Number</h3>
<div class="outline-text-3" id="text-7-2">
<div class="org-src-container">
<pre class="src src-matlab">freqs = logspace(2, 4, 1000);
G_resp = freqresp(G, freqs, <span class="org-string">'Hz'</span>);
A = zeros(size(G_resp));
RGAnum = zeros(1, length(freqs));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(freqs)</span>
A(<span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span>) = G_resp(<span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span>)<span class="org-type">.*</span>inv(G_resp(<span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span>))<span class="org-type">'</span>;
RGAnum(<span class="org-constant">i</span>) = sum(sum(abs(A(<span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span>)<span class="org-type">-</span>eye(2))));
<span class="org-keyword">end</span>
<span class="org-comment">% </span><span class="org-comment"><span class="org-constant">RGA </span></span><span class="org-comment">= G0.*inv(G0)';</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
plot(freqs, RGAnum);
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'xscale'</span>, <span class="org-string">'log'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">U = zeros(2, 2, length(freqs));
S = zeros(2, 2, length(freqs))
V = zeros(2, 2, length(freqs));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(freqs)</span>
[Ui, Si, Vi] = svd(G_resp(<span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span>));
U(<span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span>) = Ui;
S(<span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span>) = Si;
V(<span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span>) = Vi;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org68e3150" class="outline-3">
<h3 id="org68e3150"><span class="section-number-3">7.3</span> Rotation Matrix</h3>
<div class="outline-text-3" id="text-7-3">
<div class="org-src-container">
<pre class="src src-matlab">G0 = freqresp(G, 0);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org592a7ac" class="outline-2">
<h2 id="org592a7ac"><span class="section-number-2">8</span> Active Damping</h2>
<div class="outline-text-2" id="text-8">
<p>
<a id="orgb6cabf6"></a>
</p>
</div>
<div id="outline-container-orgffec17e" class="outline-3">
<h3 id="orgffec17e"><span class="section-number-3">8.1</span> Load Plant</h3>
<div class="outline-text-3" id="text-8-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/plant.mat'</span>, <span class="org-string">'sys'</span>, <span class="org-string">'Gi'</span>, <span class="org-string">'Zc'</span>, <span class="org-string">'Ga'</span>, <span class="org-string">'Gc'</span>, <span class="org-string">'Gn'</span>, <span class="org-string">'Gd'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org98c8742" class="outline-3">
<h3 id="org98c8742"><span class="section-number-3">8.2</span> Integral Force Feedback</h3>
<div class="outline-text-3" id="text-8-2">
<div class="org-src-container">
<pre class="src src-matlab">bode(sys({<span class="org-string">'Vch'</span>, <span class="org-string">'Vcv'</span>}, {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>}));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Kppf = blkdiag(<span class="org-type">-</span>10000<span class="org-type">/</span>s, tf(0));
Kppf.InputName = {<span class="org-string">'Vch'</span>, <span class="org-string">'Vcv'</span>};
Kppf.OutputName = {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>};
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">inputs = {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>, <span class="org-string">'Unh'</span>, <span class="org-string">'Unv'</span>};
outputs = {<span class="org-string">'Ich'</span>, <span class="org-string">'Icv'</span>, <span class="org-string">'Rh'</span>, <span class="org-string">'Rv'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>};
sys_cl = connect(sys, Kppf, inputs, outputs);
<span class="org-type">figure</span>; bode(sys_cl({<span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>}, {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>}), sys({<span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>}, {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>}))
</pre>
</div>
</div>
</div>
<div id="outline-container-org19d8dcd" class="outline-3">
<h3 id="org19d8dcd"><span class="section-number-3">8.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-8-3">
<p>
Active damping does not seems to be applicable here.
</p>
</div>
</div>
</div>
<div id="outline-container-org13fdd19" class="outline-2">
<h2 id="org13fdd19"><span class="section-number-2">9</span> Decentralized Control of the Sercalo</h2>
<div class="outline-text-2" id="text-9">
<p>
<a id="org837f45c"></a>
</p>
<p>
In this section, we try to implement a simple decentralized controller.
</p>
</div>
<div id="outline-container-org4d98a7e" class="outline-3">
<h3 id="org4d98a7e"><span class="section-number-3">9.1</span> Load Plant</h3>
<div class="outline-text-3" id="text-9-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/plant.mat'</span>, <span class="org-string">'sys'</span>, <span class="org-string">'Gi'</span>, <span class="org-string">'Zc'</span>, <span class="org-string">'Ga'</span>, <span class="org-string">'Gc'</span>, <span class="org-string">'Gn'</span>, <span class="org-string">'Gd'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf49383b" class="outline-3">
<h3 id="orgf49383b"><span class="section-number-3">9.2</span> Diagonal Controller</h3>
<div class="outline-text-3" id="text-9-2">
<p>
Using <code>SISOTOOL</code>, a diagonal controller is designed.
The two SISO loop gains are shown in Fig. <a href="#orgb025829">41</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Kh = <span class="org-type">-</span>0.25598<span class="org-type">*</span>(s<span class="org-type">+</span>112)<span class="org-type">*</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 15.93<span class="org-type">*</span>s <span class="org-type">+</span> 6.686e06)<span class="org-type">/</span>((s<span class="org-type">^</span>2<span class="org-type">*</span>(s<span class="org-type">+</span>352.5)<span class="org-type">*</span>(1<span class="org-type">+</span>s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>2000)));
Kv = 10207<span class="org-type">*</span>(s<span class="org-type">+</span>55.15)<span class="org-type">*</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 17.45<span class="org-type">*</span>s <span class="org-type">+</span> 2.491e06)<span class="org-type">/</span>(s<span class="org-type">^</span>2<span class="org-type">*</span>(s<span class="org-type">+</span>491.2)<span class="org-type">*</span>(s<span class="org-type">+</span>7695));
K = blkdiag(Kh, Kv);
K.InputName = {<span class="org-string">'Rh'</span>, <span class="org-string">'Rv'</span>};
K.OutputName = {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>};
</pre>
</div>
<div id="orgb025829" class="figure">
<p><img src="figs/diag_contr_loop_gain.png" alt="diag_contr_loop_gain.png" />
</p>
<p><span class="figure-number">Figure 41: </span>Loop Gain using the Decentralized Diagonal Controller (<a href="./figs/diag_contr_loop_gain.png">png</a>, <a href="./figs/diag_contr_loop_gain.pdf">pdf</a>)</p>
</div>
<p>
We then close the loop and we look at the transfer function from the Newport rotation signal to the beam angle (Fig. <a href="#orgdf6d320">42</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab">inputs = {<span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>, <span class="org-string">'Unh'</span>, <span class="org-string">'Unv'</span>};
outputs = {<span class="org-string">'Vch'</span>, <span class="org-string">'Vcv'</span>, <span class="org-string">'Ich'</span>, <span class="org-string">'Icv'</span>, <span class="org-string">'Rh'</span>, <span class="org-string">'Rv'</span>, <span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>};
sys_cl = connect(sys, <span class="org-type">-</span>K, inputs, outputs);
</pre>
</div>
<div id="orgdf6d320" class="figure">
<p><img src="figs/diag_contr_effect_newport.png" alt="diag_contr_effect_newport.png" />
</p>
<p><span class="figure-number">Figure 42: </span>Effect of the Newport rotation on the beam position when the loop is closed using the Decentralized Diagonal Controller (<a href="./figs/diag_contr_effect_newport.png">png</a>, <a href="./figs/diag_contr_effect_newport.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgef810d9" class="outline-3">
<h3 id="orgef810d9"><span class="section-number-3">9.3</span> Save the Controller</h3>
<div class="outline-text-3" id="text-9-3">
<div class="org-src-container">
<pre class="src src-matlab">Kd = c2d(K, 1e<span class="org-type">-</span>4, <span class="org-string">'tustin'</span>);
</pre>
</div>
<p>
The diagonal controller is accessible <a href="./mat/K_diag.mat">here</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'mat/K_diag.mat'</span>, <span class="org-string">'K'</span>, <span class="org-string">'Kd'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org5c5403c" class="outline-2">
<h2 id="org5c5403c"><span class="section-number-2">10</span> Newport Control</h2>
<div class="outline-text-2" id="text-10">
<p>
<a id="org1dc04df"></a>
</p>
<p>
In this section, we try to implement a simple decentralized controller for the Newport.
This can be used to align the 4QD:
</p>
<ul class="org-ul">
<li>once there is a signal from the 4QD, the Newport feedback loop is closed</li>
<li>thus, the Newport is positioned such that the beam hits the center of the 4QD</li>
<li>then we can move the 4QD manually in X-Y plane in order to cancel the command signal of the Newport</li>
<li>finally, we are sure to be aligned when the command signal of the Newport is 0</li>
</ul>
</div>
<div id="outline-container-org46b843d" class="outline-3">
<h3 id="org46b843d"><span class="section-number-3">10.1</span> Load Plant</h3>
<div class="outline-text-3" id="text-10-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/plant.mat'</span>, <span class="org-string">'Gn'</span>, <span class="org-string">'Gd'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org8c32d5d" class="outline-3">
<h3 id="org8c32d5d"><span class="section-number-3">10.2</span> Analysis</h3>
<div class="outline-text-3" id="text-10-2">
<p>
The plant is basically a constant until frequencies up to the required bandwidth.
</p>
<p>
We get that constant value.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gn0 = freqresp(inv(Gd)<span class="org-type">*</span>Gn, 0);
</pre>
</div>
<p>
We design two controller containing 2 integrators and one lead near the crossover frequency set to 10Hz.
</p>
<div class="org-src-container">
<pre class="src src-matlab">h = 2;
w0 = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>10;
Knh = 1<span class="org-type">/</span>Gn0(1,1) <span class="org-type">*</span> (w0<span class="org-type">/</span>s)<span class="org-type">^</span>2 <span class="org-type">*</span> (1 <span class="org-type">+</span> s<span class="org-type">/</span>w0<span class="org-type">*</span>h)<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>w0<span class="org-type">/</span>h)<span class="org-type">/</span>h;
Knv = 1<span class="org-type">/</span>Gn0(2,2) <span class="org-type">*</span> (w0<span class="org-type">/</span>s)<span class="org-type">^</span>2 <span class="org-type">*</span> (1 <span class="org-type">+</span> s<span class="org-type">/</span>w0<span class="org-type">*</span>h)<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>w0<span class="org-type">/</span>h)<span class="org-type">/</span>h;
</pre>
</div>
<div id="orgb0c6aa9" class="figure">
<p><img src="figs/loop_gain_newport.png" alt="loop_gain_newport.png" />
</p>
<p><span class="figure-number">Figure 43: </span>Diagonal Loop Gain for the Newport (<a href="./figs/loop_gain_newport.png">png</a>, <a href="./figs/loop_gain_newport.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org177a219" class="outline-3">
<h3 id="org177a219"><span class="section-number-3">10.3</span> Save</h3>
<div class="outline-text-3" id="text-10-3">
<div class="org-src-container">
<pre class="src src-matlab">Kn = blkdiag(Knh, Knv);
Knd = c2d(Kn, 1e<span class="org-type">-</span>4, <span class="org-string">'tustin'</span>);
</pre>
</div>
<p>
The controllers can be downloaded <a href="./mat/K_newport.mat">here</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save(<span class="org-string">'mat/K_newport.mat'</span>, <span class="org-string">'Kn'</span>, <span class="org-string">'Knd'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orga78b022" class="outline-2">
<h2 id="orga78b022"><span class="section-number-2">11</span> Measurement of the non-repeatability</h2>
<div class="outline-text-2" id="text-11">
<p>
<a id="org342448a"></a>
</p>
<p>
The goal here is the measure the non-repeatability of the setup.
</p>
<p>
All sources of error (detailed in the budget error in Section <a href="#orgb5c90b6">4</a>) will contribute to the non-repeatability of the system.
</p>
</div>
<div id="outline-container-org4a711c0" class="outline-3">
<h3 id="org4a711c0"><span class="section-number-3">11.1</span> Data Load and pre-processing</h3>
<div class="outline-text-3" id="text-11-1">
<div class="org-src-container">
<pre class="src src-matlab">uh = load(<span class="org-string">'mat/data_rep_h.mat'</span>, ...
<span class="org-string">'t'</span>, <span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>, ...
<span class="org-string">'Unh'</span>, <span class="org-string">'Unv'</span>, ...
<span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>, ...
<span class="org-string">'Vnh'</span>, <span class="org-string">'Vnv'</span>, ...
<span class="org-string">'Va'</span>);
uv = load(<span class="org-string">'mat/data_rep_v.mat'</span>, ...
<span class="org-string">'t'</span>, <span class="org-string">'Uch'</span>, <span class="org-string">'Ucv'</span>, ...
<span class="org-string">'Unh'</span>, <span class="org-string">'Unv'</span>, ...
<span class="org-string">'Vph'</span>, <span class="org-string">'Vpv'</span>, ...
<span class="org-string">'Vnh'</span>, <span class="org-string">'Vnv'</span>, ...
<span class="org-string">'Va'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Let's start one second after the first command in the system</span>
i0 = find(uh.Unh <span class="org-type">~=</span> 0, 1) <span class="org-type">+</span> fs;
iend = i0<span class="org-type">+</span>fs<span class="org-type">*</span>floor((length(uh.t)<span class="org-type">-</span>i0)<span class="org-type">/</span>fs);
uh.Uch([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.Ucv([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.Unh([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.Unv([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.Vph([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.Vpv([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.Vnh([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.Vnv([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.Va ([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uh.t ([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
<span class="org-comment">% We reset the time t</span>
uh.t = uh.t <span class="org-type">-</span> uh.t(1);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Let's start one second after the first command in the system</span>
i0 = find(uv.Unv <span class="org-type">~=</span> 0, 1) <span class="org-type">+</span> fs;
iend = i0<span class="org-type">+</span>fs<span class="org-type">*</span>floor((length(uv.t)<span class="org-type">-</span>i0)<span class="org-type">/</span>fs);
uv.Uch([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.Ucv([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.Unh([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.Unv([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.Vph([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.Vpv([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.Vnh([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.Vnv([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.Va ([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
uv.t ([1<span class="org-type">:</span>i0<span class="org-type">-</span>1, iend<span class="org-type">:</span>end]) = [];
<span class="org-comment">% We reset the time t</span>
uv.t = uv.t <span class="org-type">-</span> uv.t(1);
</pre>
</div>
</div>
</div>
<div id="outline-container-org0a3ebcd" class="outline-3">
<h3 id="org0a3ebcd"><span class="section-number-3">11.2</span> Some Time domain plots</h3>
<div class="outline-text-3" id="text-11-2">
<div id="org15a722b" class="figure">
<p><img src="figs/repeat_time_signals.png" alt="repeat_time_signals.png" />
</p>
<p><span class="figure-number">Figure 44: </span>Time domain Signals for the repeatability measurement (<a href="./figs/repeat_time_signals.png">png</a>, <a href="./figs/repeat_time_signals.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org7e88b83" class="outline-3">
<h3 id="org7e88b83"><span class="section-number-3">11.3</span> Verify Tracking Angle Error</h3>
<div class="outline-text-3" id="text-11-3">
<p>
Let&rsquo;s verify that the positioning error of the beam is small and what could be the effect on the distance measured by the intereferometer.
</p>
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'./mat/plant.mat'</span>, <span class="org-string">'Gd'</span>);
</pre>
</div>
<div id="org4e91224" class="figure">
<p><img src="figs/repeat_tracking_errors.png" alt="repeat_tracking_errors.png" />
</p>
<p><span class="figure-number">Figure 45: </span>Tracking errors during the repeatability measurement (<a href="./figs/repeat_tracking_errors.png">png</a>, <a href="./figs/repeat_tracking_errors.pdf">pdf</a>)</p>
</div>
<p>
Let&rsquo;s compute the PSD of the error to see the frequency content.
</p>
<div class="org-src-container">
<pre class="src src-matlab">[psd_UhRh, f] = pwelch(uh.Vph<span class="org-type">/</span>freqresp(Gd(1,1), 0), hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
[psd_UhRv, <span class="org-type">~</span>] = pwelch(uh.Vpv<span class="org-type">/</span>freqresp(Gd(2,2), 0), hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
[psd_UvRh, <span class="org-type">~</span>] = pwelch(uv.Vph<span class="org-type">/</span>freqresp(Gd(1,1), 0), hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
[psd_UvRv, <span class="org-type">~</span>] = pwelch(uv.Vpv<span class="org-type">/</span>freqresp(Gd(2,2), 0), hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
</pre>
</div>
<div id="org0a0151a" class="figure">
<p><img src="figs/psd_tracking_error_rad.png" alt="psd_tracking_error_rad.png" />
</p>
<p><span class="figure-number">Figure 46: </span>Power Spectral Density of the tracking errors (<a href="./figs/psd_tracking_error_rad.png">png</a>, <a href="./figs/psd_tracking_error_rad.pdf">pdf</a>)</p>
</div>
<p>
Let&rsquo;s convert that to errors in distance
</p>
<p>
\[ \Delta L = L^\prime - L = \frac{L}{\cos(\alpha)} - L \approx \frac{L \alpha^2}{2} \]
with
</p>
<ul class="org-ul">
<li>\(L\) is the nominal distance traveled by the beam</li>
<li>\(L^\prime\) is the distance traveled by the beam with an angle error</li>
<li>\(\alpha\) is the angle error</li>
</ul>
<div class="org-src-container">
<pre class="src src-matlab">L = 0.1; <span class="org-comment">% [m]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[psd_UhLh, f] = pwelch(0.5<span class="org-type">*</span>L<span class="org-type">*</span>(uh.Vph<span class="org-type">/</span>freqresp(Gd(1,1), 0))<span class="org-type">.^</span>2, hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
[psd_UhLv, <span class="org-type">~</span>] = pwelch(0.5<span class="org-type">*</span>L<span class="org-type">*</span>(uh.Vpv<span class="org-type">/</span>freqresp(Gd(2,2), 0))<span class="org-type">.^</span>2, hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
[psd_UvLh, <span class="org-type">~</span>] = pwelch(0.5<span class="org-type">*</span>L<span class="org-type">*</span>(uv.Vph<span class="org-type">/</span>freqresp(Gd(1,1), 0))<span class="org-type">.^</span>2, hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
[psd_UvLv, <span class="org-type">~</span>] = pwelch(0.5<span class="org-type">*</span>L<span class="org-type">*</span>(uv.Vpv<span class="org-type">/</span>freqresp(Gd(2,2), 0))<span class="org-type">.^</span>2, hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
</pre>
</div>
<p>
Now, compare that with the PSD of the measured distance by the interferometer (Fig. <a href="#org27ac0e0">47</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab">[psd_Lh, f] = pwelch(uh.Va, hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
[psd_Lv, <span class="org-type">~</span>] = pwelch(uv.Va, hanning(ceil(1<span class="org-type">*</span>fs)), [], [], fs);
</pre>
</div>
<div id="org27ac0e0" class="figure">
<p><img src="figs/compare_tracking_error_attocube_meas.png" alt="compare_tracking_error_attocube_meas.png" />
</p>
<p><span class="figure-number">Figure 47: </span>Comparison of the effect of tracking error on the measured distance and the measured distance by the Attocube (<a href="./figs/compare_tracking_error_attocube_meas.png">png</a>, <a href="./figs/compare_tracking_error_attocube_meas.pdf">pdf</a>)</p>
</div>
<div class="important" id="org91096f4">
<p>
The tracking errors are a limiting factor.
</p>
</div>
</div>
</div>
<div id="outline-container-orgce27425" class="outline-3">
<h3 id="orgce27425"><span class="section-number-3">11.4</span> Processing</h3>
<div class="outline-text-3" id="text-11-4">
<p>
First, we get the mean value as measured by the interferometer for each value of the Newport angle.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Vahm = mean(reshape(uh.Va, [fs floor(length(uh.t)<span class="org-type">/</span>fs)]),2);
Unhm = mean(reshape(uh.Unh, [fs floor(length(uh.t)<span class="org-type">/</span>fs)]),2);
Vavm = mean(reshape(uv.Va, [fs floor(length(uv.t)<span class="org-type">/</span>fs)]),2);
Unvm = mean(reshape(uv.Unv, [fs floor(length(uv.t)<span class="org-type">/</span>fs)]),2);
</pre>
</div>
<p>
And we can compute the RMS value of the non-repeatable part:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">Va - Horizontal [nm rms]</th>
<th scope="col" class="org-right">Va - Vertical [nm rms]</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">19.6</td>
<td class="org-right">13.9</td>
</tr>
</tbody>
</table>
<div id="org93011b1" class="figure">
<p><img src="figs/repeat_plot_raw.png" alt="repeat_plot_raw.png" />
</p>
<p><span class="figure-number">Figure 48: </span>Repeatability of the measurement (<a href="./figs/repeat_plot_raw.png">png</a>, <a href="./figs/repeat_plot_raw.pdf">pdf</a>)</p>
</div>
<div id="orgc273977" class="figure">
<p><img src="figs/repeat_plot_subtract_mean.png" alt="repeat_plot_subtract_mean.png" />
</p>
<p><span class="figure-number">Figure 49: </span>Repeatability of the measurement after subtracting the mean value (<a href="./figs/repeat_plot_subtract_mean.png">png</a>, <a href="./figs/repeat_plot_subtract_mean.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgd13e2d3" class="outline-3">
<h3 id="orgd13e2d3"><span class="section-number-3">11.5</span> Analysis of the non-repeatable contributions</h3>
<div class="outline-text-3" id="text-11-5">
<p>
Let&rsquo;s know try to determine where does the non-repeatability comes from.
</p>
<p>
From the 4QD signal, we can compute the angle error of the beam and thus determine the corresponding displacement measured by the attocube.
</p>
<p>
We then take the non-repeatable part of this displacement and we compare that with the total non-repeatability.
</p>
<p>
We also plot the displacement measured during the huddle test.
</p>
<p>
All the signals are shown on Fig. <a href="#orgac2ead8">50</a>.
</p>
<div id="orgac2ead8" class="figure">
<p><img src="figs/non-repeatability-parts.png" alt="non-repeatability-parts.png" />
</p>
<p><span class="figure-number">Figure 50: </span>Non repeatabilities (<a href="./figs/non-repeatability-parts.png">png</a>, <a href="./figs/non-repeatability-parts.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orga95fd07" class="outline-3">
<h3 id="orga95fd07"><span class="section-number-3">11.6</span> Results with a low pass filter</h3>
<div class="outline-text-3" id="text-11-6">
<p>
We filter the data with a first order low pass filter with a crossover frequency of \(\omega_0\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">w0 = 10; <span class="org-comment">% [Hz]</span>
G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>w0);
uh.Vaf = lsim(G_lpf, uh.Va, uh.t);
uv.Vaf = lsim(G_lpf, uv.Va, uv.t);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd8d73bc" class="outline-3">
<h3 id="orgd8d73bc"><span class="section-number-3">11.7</span> Processing</h3>
<div class="outline-text-3" id="text-11-7">
<p>
First, we get the mean value as measured by the interferometer for each value of the Newport angle.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Vahm = mean(reshape(uh.Vaf, [fs floor(length(uh.t)<span class="org-type">/</span>fs)]),2);
Unhm = mean(reshape(uh.Unh, [fs floor(length(uh.t)<span class="org-type">/</span>fs)]),2);
Vavm = mean(reshape(uv.Vaf, [fs floor(length(uv.t)<span class="org-type">/</span>fs)]),2);
Unvm = mean(reshape(uv.Unv, [fs floor(length(uv.t)<span class="org-type">/</span>fs)]),2);
</pre>
</div>
<p>
And we can compute the RMS value of the non-repeatable part:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">Va - Horizontal [nm rms]</th>
<th scope="col" class="org-right">Va - Vertical [nm rms]</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">22.9</td>
<td class="org-right">13.9</td>
</tr>
</tbody>
</table>
<div id="org715a1fb" class="figure">
<p><img src="figs/repeat_plot_lpf.png" alt="repeat_plot_lpf.png" />
</p>
<p><span class="figure-number">Figure 51: </span>Repeatability of the measurement (<a href="./figs/repeat_plot_lpf.png">png</a>, <a href="./figs/repeat_plot_lpf.pdf">pdf</a>)</p>
</div>
<div id="org21035b3" class="figure">
<p><img src="figs/repeat_plot_subtract_mean_lpf.png" alt="repeat_plot_subtract_mean_lpf.png" />
</p>
<p><span class="figure-number">Figure 52: </span>Repeatability of the measurement after subtracting the mean value (<a href="./figs/repeat_plot_subtract_mean_lpf.png">png</a>, <a href="./figs/repeat_plot_subtract_mean_lpf.pdf">pdf</a>)</p>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-11-12 jeu. 10:15</p>
</div>
</body>
</html>