Update filenames + gitignore

This commit is contained in:
Thomas Dehaeze 2021-05-12 13:32:51 +02:00
parent ad4a6ee31e
commit ed500ed6f5
12 changed files with 957 additions and 602 deletions

7
.gitignore vendored
View File

@ -1,3 +1,10 @@
auto/
*.tex
*.bbl
*.synctex.gz
.auctex-auto/
_minted*
# Windows default autosave extension # Windows default autosave extension
*.asv *.asv
*rtw/ *rtw/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -1,543 +0,0 @@
<?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:17 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Attocube - 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">Attocube - Test Bench</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org91ed2af">1. Estimation of the Spectral Density of the Attocube Noise</a>
<ul>
<li><a href="#org7ed0442">1.1. Long and Slow measurement</a></li>
<li><a href="#org84a3a7f">1.2. Short and Fast measurement</a></li>
<li><a href="#org8263623">1.3. Obtained Amplitude Spectral Density of the measured displacement</a></li>
</ul>
</li>
<li><a href="#orgfbcdb24">2. Effect of the &ldquo;bubble sheet&rdquo; and &ldquo;Aluminium tube&rdquo;</a>
<ul>
<li><a href="#org2c0e0f6">2.1. Aluminium Tube and Bubble Sheet</a></li>
<li><a href="#orgab2ff04">2.2. Only Aluminium Tube</a></li>
<li><a href="#org5e0cbb8">2.3. Nothing</a></li>
<li><a href="#org0161dc2">2.4. Comparison</a></li>
</ul>
</li>
<li><a href="#org45e7337">3. Measurement of the Attocube&rsquo;s non-linearity</a>
<ul>
<li><a href="#orgf2cd3af">3.1. Load Data</a></li>
<li><a href="#org9caccde">3.2. Time Domain Results</a></li>
<li><a href="#orgb15ec0f">3.3. Difference between Encoder and Interferometer as a function of time</a></li>
<li><a href="#orga0c30bc">3.4. Difference between Encoder and Interferometer as a function of position</a></li>
</ul>
</li>
</ul>
</div>
</div>
<p>
In this document, few caracteristics of the Attocube Displacement Measuring Interferometer IDS3010 (<a href="https://www.attocube.com/en/products/laser-displacement-sensor/displacement-measuring-interferometer">link</a>) are studied:
</p>
<ul class="org-ul">
<li>Section <a href="#org45bc653">1</a>: the ASD noise of the measured displacement is estimated</li>
<li>Section <a href="#orgf93a547">2</a>: the effect of two air protections on the stability of the measurement is studied</li>
<li>Section <a href="#org421bcba">3</a>: the cyclic non-linearity of the attocube is estimated using a encoder</li>
</ul>
<div id="outline-container-org91ed2af" class="outline-2">
<h2 id="org91ed2af"><span class="section-number-2">1</span> Estimation of the Spectral Density of the Attocube Noise</h2>
<div class="outline-text-2" id="text-1">
<p>
<a id="org45bc653"></a>
</p>
<div id="orgeea45a0" class="figure">
<p><img src="figs/test-bench-schematic.png" alt="test-bench-schematic.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Test Bench Schematic</p>
</div>
<div id="org1945c4e" class="figure">
<p><img src="figs/IMG-7865.JPG" alt="IMG-7865.JPG" />
</p>
<p><span class="figure-number">Figure 2: </span>Picture of the test bench. The Attocube and mirror are covered by a &ldquo;bubble sheet&rdquo;</p>
</div>
</div>
<div id="outline-container-org7ed0442" class="outline-3">
<h3 id="org7ed0442"><span class="section-number-3">1.1</span> Long and Slow measurement</h3>
<div class="outline-text-3" id="text-1-1">
<p>
The first measurement was made during ~17 hours with a sampling time of \(T_s = 0.1\,s\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'long_test_plastic.mat'</span>, <span class="org-string">'x'</span>, <span class="org-string">'t'</span>)
Ts = 0.1; <span class="org-comment">% [s]</span>
</pre>
</div>
<div id="orgabef257" class="figure">
<p><img src="figs/long_meas_time_domain_full.png" alt="long_meas_time_domain_full.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Long measurement time domain data</p>
</div>
<p>
Let&rsquo;s fit the data with a step response to a first order low pass filter (Figure <a href="#org3effe27">4</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab">f = @(b,x) b(1)<span class="org-type">*</span>(1 <span class="org-type">-</span> exp(<span class="org-type">-</span>x<span class="org-type">/</span>b(2)));
y_cur = x(t <span class="org-type">&lt;</span> 17.5<span class="org-type">*</span>60<span class="org-type">*</span>60);
t_cur = t(t <span class="org-type">&lt;</span> 17.5<span class="org-type">*</span>60<span class="org-type">*</span>60);
nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
B0 = [400e<span class="org-type">-</span>9, 2<span class="org-type">*</span>60<span class="org-type">*</span>60]; <span class="org-comment">% Choose Appropriate Initial Estimates</span>
[B,rnrm] = fminsearch(nrmrsd, B0); <span class="org-comment">% Estimate Parameters &#8216;B&#8217;</span>
</pre>
</div>
<p>
The corresponding time constant is (in [h]):
</p>
<pre class="example">
2.0658
</pre>
<div id="org3effe27" class="figure">
<p><img src="figs/long_meas_time_domain_fit.png" alt="long_meas_time_domain_fit.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Fit of the measurement data with a step response of a first order low pass filter</p>
</div>
<p>
We can see in Figure <a href="#orgabef257">3</a> that there is a transient period where the measured displacement experiences some drifts.
This is probably due to thermal effects.
We only select the data between <code>t1</code> and <code>t2</code>.
The obtained displacement is shown in Figure <a href="#orgdb1e675">5</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">t1 = 10.5; t2 = 17.5; <span class="org-comment">% [h]</span>
x = x(t <span class="org-type">&gt;</span> t1<span class="org-type">*</span>60<span class="org-type">*</span>60 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> t2<span class="org-type">*</span>60<span class="org-type">*</span>60);
x = x <span class="org-type">-</span> mean(x);
t = t(t <span class="org-type">&gt;</span> t1<span class="org-type">*</span>60<span class="org-type">*</span>60 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> t2<span class="org-type">*</span>60<span class="org-type">*</span>60);
t = t <span class="org-type">-</span> t(1);
</pre>
</div>
<div id="orgdb1e675" class="figure">
<p><img src="figs/long_meas_time_domain_zoom.png" alt="long_meas_time_domain_zoom.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Kept data (removed slow drifts during the first hours)</p>
</div>
<p>
The Power Spectral Density of the measured displacement is computed
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hann(ceil(length(x)<span class="org-type">/</span>20));
[p_1, f_1] = pwelch(x, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
As a low pass filter was used in the measurement process, we multiply the PSD by the square of the inverse of the filter&rsquo;s norm.
</p>
<div class="org-src-container">
<pre class="src src-matlab">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>);
p_1 = p_1<span class="org-type">./</span>abs(squeeze(freqresp(G_lpf, f_1, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2;
</pre>
</div>
<p>
Only frequencies below 2Hz are taken into account (high frequency noise will be measured afterwards).
</p>
<div class="org-src-container">
<pre class="src src-matlab">p_1 = p_1(f_1 <span class="org-type">&lt;</span> 2);
f_1 = f_1(f_1 <span class="org-type">&lt;</span> 2);
</pre>
</div>
</div>
</div>
<div id="outline-container-org84a3a7f" class="outline-3">
<h3 id="org84a3a7f"><span class="section-number-3">1.2</span> Short and Fast measurement</h3>
<div class="outline-text-3" id="text-1-2">
<p>
An second measurement is done in order to estimate the high frequency noise of the interferometer.
The measurement is done with a sampling time of \(T_s = 0.1\,ms\) and a duration of ~100s.
</p>
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'short_test_plastic.mat'</span>)
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">x = detrend(x, 0);
</pre>
</div>
<p>
The time domain measurement is shown in Figure <a href="#orgb156e4e">6</a>.
</p>
<div id="orgb156e4e" class="figure">
<p><img src="figs/short_meas_time_domain.png" alt="short_meas_time_domain.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Time domain measurement with the high sampling rate</p>
</div>
<p>
The Power Spectral Density of the measured displacement is computed
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hann(ceil(length(x)<span class="org-type">/</span>20));
[p_2, f_2] = pwelch(x, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-org8263623" class="outline-3">
<h3 id="org8263623"><span class="section-number-3">1.3</span> Obtained Amplitude Spectral Density of the measured displacement</h3>
<div class="outline-text-3" id="text-1-3">
<p>
The computed ASD of the two measurements are combined in Figure <a href="#org72c2457">7</a>.
</p>
<div id="org72c2457" class="figure">
<p><img src="figs/psd_combined.png" alt="psd_combined.png" />
</p>
<p><span class="figure-number">Figure 7: </span>Obtained Amplitude Spectral Density of the measured displacement</p>
</div>
</div>
</div>
</div>
<div id="outline-container-orgfbcdb24" class="outline-2">
<h2 id="orgfbcdb24"><span class="section-number-2">2</span> Effect of the &ldquo;bubble sheet&rdquo; and &ldquo;Aluminium tube&rdquo;</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="orgf93a547"></a>
</p>
<div id="org5a9ad77" class="figure">
<p><img src="figs/IMG-7864.JPG" alt="IMG-7864.JPG" />
</p>
<p><span class="figure-number">Figure 8: </span>Aluminium tube used to protect the beam path from disturbances</p>
</div>
</div>
<div id="outline-container-org2c0e0f6" class="outline-3">
<h3 id="org2c0e0f6"><span class="section-number-3">2.1</span> Aluminium Tube and Bubble Sheet</h3>
<div class="outline-text-3" id="text-2-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'short_test_plastic.mat'</span>);
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">x = detrend(x, 0);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">win = hann(ceil(length(x)<span class="org-type">/</span>10));
[p_1, f_1] = pwelch(x, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgab2ff04" class="outline-3">
<h3 id="orgab2ff04"><span class="section-number-3">2.2</span> Only Aluminium Tube</h3>
<div class="outline-text-3" id="text-2-2">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'short_test_alu_tube.mat'</span>);
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">x = detrend(x, 0);
</pre>
</div>
<p>
The time domain measurement is shown in Figure <a href="#orgb156e4e">6</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hann(ceil(length(x)<span class="org-type">/</span>10));
[p_2, f_2] = pwelch(x, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-org5e0cbb8" class="outline-3">
<h3 id="org5e0cbb8"><span class="section-number-3">2.3</span> Nothing</h3>
<div class="outline-text-3" id="text-2-3">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'short_test_without_material.mat'</span>);
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">x = detrend(x, 0);
</pre>
</div>
<p>
The time domain measurement is shown in Figure <a href="#orgb156e4e">6</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hann(ceil(length(x)<span class="org-type">/</span>10));
[p_3, f_3] = pwelch(x, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-org0161dc2" class="outline-3">
<h3 id="org0161dc2"><span class="section-number-3">2.4</span> Comparison</h3>
<div class="outline-text-3" id="text-2-4">
<div id="orgcaa0ad4" class="figure">
<p><img src="figs/asd_noise_comp_bubble_aluminium.png" alt="asd_noise_comp_bubble_aluminium.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Comparison of the noise ASD with and without bubble sheet</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org45e7337" class="outline-2">
<h2 id="org45e7337"><span class="section-number-2">3</span> Measurement of the Attocube&rsquo;s non-linearity</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="org421bcba"></a>
</p>
<p>
The measurement setup is shown in Figure <a href="#org1b67344">10</a>.
</p>
<div class="note" id="org1f1e587">
<p>
Here are the equipment used in the test bench:
</p>
<ul class="org-ul">
<li>Renishaw Resolution Encoder with 1nm resolution (<a href="doc/L-9517-9448-05-B_Data_sheet_RESOLUTE_BiSS_en.pdf">doc</a>)</li>
<li>Attocube interferometer (<a href="doc/IDS3010.pdf">doc</a>)</li>
<li>Cedrat Amplified Piezoelectric Actuator APA95ML (<a href="doc/APA95ML.pdf">doc</a>)</li>
<li>Voltage Amplifier LA75B (<a href="doc/LA75B.pdf">doc</a>)</li>
<li>Speedgoat IO131 with 16bits ADC and DAC (<a href="doc/IO130 IO131 OEM Datasheet.pdf">doc</a>)</li>
</ul>
</div>
<div id="org1b67344" class="figure">
<p><img src="figs/exp_setup_schematic.png" alt="exp_setup_schematic.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Schematic of the Experiment</p>
</div>
<p>
A DAC and voltage amplified are used to move the mass with the Amplified Piezoelectric Actuator (APA95ML).
The encoder and the attocube are measure ring the same motion.
</p>
<p>
As will be shown shortly, this measurement permitted to measure the period non-linearity of the Attocube.
</p>
</div>
<div id="outline-container-orgf2cd3af" class="outline-3">
<h3 id="orgf2cd3af"><span class="section-number-3">3.1</span> Load Data</h3>
<div class="outline-text-3" id="text-3-1">
<p>
The measurement data are loaded and the offset are removed using the <code>detrend</code> command.
</p>
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'int_enc_comp.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% Sampling Time [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);
</pre>
</div>
</div>
</div>
<div id="outline-container-org9caccde" class="outline-3">
<h3 id="org9caccde"><span class="section-number-3">3.2</span> Time Domain Results</h3>
<div class="outline-text-3" id="text-3-2">
<p>
One period of the displacement of the mass as measured by the encoder and interferometer are shown in Figure <a href="#orgadbe636">11</a>.
It consist of the sinusoidal motion at 0.5Hz with an amplitude of approximately \(70\mu m\).
</p>
<p>
The frequency of the motion is chosen such that no resonance in the system is excited.
This should improve the coherence between the measurements made by the encoder and interferometer.
</p>
<div id="orgadbe636" class="figure">
<p><img src="figs/int_enc_one_cycle.png" alt="int_enc_one_cycle.png" />
</p>
<p><span class="figure-number">Figure 11: </span>One cycle measurement</p>
</div>
<p>
The difference between the two measurements during the same period is shown in Figure <a href="#org448b33f">12</a>.
</p>
<div id="org448b33f" class="figure">
<p><img src="figs/int_enc_one_cycle_error.png" alt="int_enc_one_cycle_error.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Difference between the Encoder and the interferometer during one cycle</p>
</div>
</div>
</div>
<div id="outline-container-orgb15ec0f" class="outline-3">
<h3 id="orgb15ec0f"><span class="section-number-3">3.3</span> Difference between Encoder and Interferometer as a function of time</h3>
<div class="outline-text-3" id="text-3-3">
<p>
The data is filtered using a second order low pass filter with a cut-off frequency \(\omega_0\) as defined below.
</p>
<div class="org-src-container">
<pre class="src src-matlab">w0 = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>5; <span class="org-comment">% [rad/s]</span>
xi = 0.7;
G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> 2<span class="org-type">*</span>xi<span class="org-type">/</span>w0<span class="org-type">*</span>s <span class="org-type">+</span> s<span class="org-type">^</span>2<span class="org-type">/</span>w0<span class="org-type">^</span>2);
</pre>
</div>
<p>
After filtering, the data is &ldquo;re-shaped&rdquo; such that we can superimpose all the measured periods as shown in Figure <a href="#org99397ec">13</a>.
This gives an idea of the measurement error as given by the Attocube during a \(70 \mu m\) motion.
</p>
<div class="org-src-container">
<pre class="src src-matlab">d_err_mean = reshape(lsim(G_lpf, encoder <span class="org-type">-</span> interferometer, t), [2<span class="org-type">/</span>Ts floor(Ts<span class="org-type">/</span>2<span class="org-type">*</span>length(encoder))]);
d_err_mean = d_err_mean <span class="org-type">-</span> mean(d_err_mean);
</pre>
</div>
<div id="org99397ec" class="figure">
<p><img src="figs/int_enc_error_mean_time.png" alt="int_enc_error_mean_time.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Difference between the two measurement in the time domain, averaged for all the cycles</p>
</div>
</div>
</div>
<div id="outline-container-orga0c30bc" class="outline-3">
<h3 id="orga0c30bc"><span class="section-number-3">3.4</span> Difference between Encoder and Interferometer as a function of position</h3>
<div class="outline-text-3" id="text-3-4">
<p>
Figure <a href="#org99397ec">13</a> gives the measurement error as a function of time.
We here wish the compute this measurement error as a function of the position (as measured by the encoer).
</p>
<p>
To do so, all the attocube measurements corresponding to each position measured by the Encoder (resolution of \(1nm\)) are averaged.
Figure <a href="#org0eccff0">14</a> is obtained where we clearly see an error with a period comparable to the motion range and a much smaller period corresponding to the non-linear period errors that we wish the estimate.
</p>
<div class="org-src-container">
<pre class="src src-matlab">[e_sorted, <span class="org-type">~</span>, e_ind] = unique(encoder);
i_mean = zeros(length(e_sorted), 1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(e_sorted)</span>
i_mean(<span class="org-constant">i</span>) = mean(interferometer(e_ind <span class="org-type">==</span> <span class="org-constant">i</span>));
<span class="org-keyword">end</span>
i_mean_error = (i_mean <span class="org-type">-</span> e_sorted);
</pre>
</div>
<div id="org0eccff0" class="figure">
<p><img src="figs/int_enc_error_mean_position.png" alt="int_enc_error_mean_position.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Difference between the two measurement as a function of the measured position by the encoder, averaged for all the cycles</p>
</div>
<p>
The period of the non-linearity seems to be equal to \(765 nm\) which corresponds to half the wavelength of the Laser (\(1.53 \mu m\)).
For the motion range done here, the non-linearity is measured over ~18 periods which permits to do some averaging.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win_length = 1530<span class="org-type">/</span>2; <span class="org-comment">% length of the windows (corresponds to 765 nm)</span>
num_avg = floor(length(e_sorted)<span class="org-type">/</span>win_length); <span class="org-comment">% number of averaging</span>
i_init = ceil((length(e_sorted) <span class="org-type">-</span> win_length<span class="org-type">*</span>num_avg)<span class="org-type">/</span>2); <span class="org-comment">% does not start at the extremity</span>
e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init<span class="org-type">:</span>i_init<span class="org-type">+</span>win_length<span class="org-type">*</span>num_avg<span class="org-type">-</span>1), [win_length num_avg]), 2);
</pre>
</div>
<p>
The obtained periodic non-linearity is shown in Figure <a href="#orge856c17">15</a>.
</p>
<div id="orge856c17" class="figure">
<p><img src="figs/int_non_linearity_period_wavelength.png" alt="int_non_linearity_period_wavelength.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Non-Linearity of the Interferometer over the period of the wavelength</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:17</p>
</div>
</body>
</html>

1
index.html Symbolic link
View File

@ -0,0 +1 @@
test-bench-attocube.html

521
test-bench-attocube.html Normal file
View File

@ -0,0 +1,521 @@
<?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>
<!-- 2021-05-12 mer. 13:32 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Attocube - Test Bench</title>
<meta name="author" content="Dehaeze Thomas" />
<meta name="generator" content="Org Mode" />
<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 = {
svg: {
scale: 1,
fontCache: "global"
},
tex: {
tags: "ams",
multlineWidth: "%MULTLINEWIDTH",
tagSide: "right",
macros: {bm: ["\\boldsymbol{#1}",1],},
tagIndent: ".8em"
}
};
</script>
<script id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.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">Attocube - Test Bench</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgad0ac54">1. Estimation of the Spectral Density of the Attocube Noise</a>
<ul>
<li><a href="#org757fb16">1.1. Long and Slow measurement</a></li>
<li><a href="#orgb6208e7">1.2. Short and Fast measurement</a></li>
<li><a href="#org3bd5ef2">1.3. Obtained Amplitude Spectral Density of the measured displacement</a></li>
</ul>
</li>
<li><a href="#org4a27f63">2. Effect of the &ldquo;bubble sheet&rdquo; and &ldquo;Aluminium tube&rdquo;</a></li>
<li><a href="#org1df7d3a">3. Measurement of the Attocube&rsquo;s non-linearity</a>
<ul>
<li><a href="#orgcff7a2a">3.1. Load Data</a></li>
<li><a href="#orgf79eda1">3.2. Time Domain Results</a></li>
<li><a href="#org46f4beb">3.3. Difference between Encoder and Interferometer as a function of time</a></li>
<li><a href="#org044dbe7">3.4. Difference between Encoder and Interferometer as a function of position</a></li>
</ul>
</li>
</ul>
</div>
</div>
<hr>
<p>This report is also available as a <a href="./test-bench-attocube.pdf">pdf</a>.</p>
<hr>
<p>
In this document, few caracteristics of the Attocube Displacement Measuring Interferometer IDS3010 (<a href="https://www.attocube.com/en/products/laser-displacement-sensor/displacement-measuring-interferometer">link</a>) are studied:
</p>
<ul class="org-ul">
<li>Section <a href="#org8ac57f2">1</a>: the ASD noise of the measured displacement is estimated</li>
<li>Section <a href="#org5a54545">2</a>: the effect of two air protections on the stability of the measurement is studied</li>
<li>Section <a href="#org477e3cc">3</a>: the cyclic non-linearity of the attocube is estimated using a encoder</li>
</ul>
<div id="outline-container-orgad0ac54" class="outline-2">
<h2 id="orgad0ac54"><span class="section-number-2">1</span> Estimation of the Spectral Density of the Attocube Noise</h2>
<div class="outline-text-2" id="text-1">
<p>
<a id="org8ac57f2"></a>
</p>
<div id="org68c205b" class="figure">
<p><img src="figs/test-bench-schematic.png" alt="test-bench-schematic.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Test Bench Schematic</p>
</div>
<div id="org4669be2" class="figure">
<p><img src="figs/IMG-7865.JPG" alt="IMG-7865.JPG" />
</p>
<p><span class="figure-number">Figure 2: </span>Picture of the test bench. The Attocube and mirror are covered by a &ldquo;bubble sheet&rdquo;</p>
</div>
</div>
<div id="outline-container-org757fb16" class="outline-3">
<h3 id="org757fb16"><span class="section-number-3">1.1</span> Long and Slow measurement</h3>
<div class="outline-text-3" id="text-1-1">
<p>
The first measurement was made during ~17 hours with a sampling time of \(T_s = 0.1\,s\).
</p>
<div class="org-src-container">
<pre class="src src-matlab"> load(<span class="org-string">'long_test_plastic.mat'</span>, <span class="org-string">'x'</span>, <span class="org-string">'t'</span>)
Ts = 0.1; <span class="org-comment">% [s]</span>
</pre>
</div>
<div id="orgc4044aa" class="figure">
<p><img src="figs/long_meas_time_domain_full.png" alt="long_meas_time_domain_full.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Long measurement time domain data</p>
</div>
<p>
Let&rsquo;s fit the data with a step response to a first order low pass filter (Figure <a href="#org6d464f2">4</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab"> f = @(b,x) b(1)<span class="org-type">*</span>(1 <span class="org-type">-</span> exp(<span class="org-type">-</span>x<span class="org-type">/</span>b(2)));
y_cur = x(t <span class="org-type">&lt;</span> 17.5<span class="org-type">*</span>60<span class="org-type">*</span>60);
t_cur = t(t <span class="org-type">&lt;</span> 17.5<span class="org-type">*</span>60<span class="org-type">*</span>60);
nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
B0 = [400e<span class="org-type">-</span>9, 2<span class="org-type">*</span>60<span class="org-type">*</span>60]; <span class="org-comment">% Choose Appropriate Initial Estimates</span>
[B,rnrm] = fminsearch(nrmrsd, B0); <span class="org-comment">% Estimate Parameters &#8216;B&#8217;</span>
</pre>
</div>
<p>
The corresponding time constant is (in [h]):
</p>
<pre class="example">
2.0658
</pre>
<div id="org6d464f2" class="figure">
<p><img src="figs/long_meas_time_domain_fit.png" alt="long_meas_time_domain_fit.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Fit of the measurement data with a step response of a first order low pass filter</p>
</div>
<p>
We can see in Figure <a href="#orgc4044aa">3</a> that there is a transient period where the measured displacement experiences some drifts.
This is probably due to thermal effects.
We only select the data between <code>t1</code> and <code>t2</code>.
The obtained displacement is shown in Figure <a href="#org551a453">5</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> t1 = 10.5; t2 = 17.5; <span class="org-comment">% [h]</span>
x = x(t <span class="org-type">&gt;</span> t1<span class="org-type">*</span>60<span class="org-type">*</span>60 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> t2<span class="org-type">*</span>60<span class="org-type">*</span>60);
x = x <span class="org-type">-</span> mean(x);
t = t(t <span class="org-type">&gt;</span> t1<span class="org-type">*</span>60<span class="org-type">*</span>60 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> t2<span class="org-type">*</span>60<span class="org-type">*</span>60);
t = t <span class="org-type">-</span> t(1);
</pre>
</div>
<div id="org551a453" class="figure">
<p><img src="figs/long_meas_time_domain_zoom.png" alt="long_meas_time_domain_zoom.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Kept data (removed slow drifts during the first hours)</p>
</div>
<p>
The Power Spectral Density of the measured displacement is computed
</p>
<div class="org-src-container">
<pre class="src src-matlab"> win = hann(ceil(length(x)<span class="org-type">/</span>20));
[p_1, f_1] = pwelch(x, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
As a low pass filter was used in the measurement process, we multiply the PSD by the square of the inverse of the filter&rsquo;s norm.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> 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>);
p_1 = p_1<span class="org-type">./</span>abs(squeeze(freqresp(G_lpf, f_1, <span class="org-string">'Hz'</span>)))<span class="org-type">.^</span>2;
</pre>
</div>
<p>
Only frequencies below 2Hz are taken into account (high frequency noise will be measured afterwards).
</p>
<div class="org-src-container">
<pre class="src src-matlab"> p_1 = p_1(f_1 <span class="org-type">&lt;</span> 2);
f_1 = f_1(f_1 <span class="org-type">&lt;</span> 2);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb6208e7" class="outline-3">
<h3 id="orgb6208e7"><span class="section-number-3">1.2</span> Short and Fast measurement</h3>
<div class="outline-text-3" id="text-1-2">
<p>
An second measurement is done in order to estimate the high frequency noise of the interferometer.
The measurement is done with a sampling time of \(T_s = 0.1\,ms\) and a duration of ~100s.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> load(<span class="org-string">'short_test_plastic.mat'</span>)
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"> x = detrend(x, 0);
</pre>
</div>
<p>
The time domain measurement is shown in Figure <a href="#orgc1ba734">6</a>.
</p>
<div id="orgc1ba734" class="figure">
<p><img src="figs/short_meas_time_domain.png" alt="short_meas_time_domain.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Time domain measurement with the high sampling rate</p>
</div>
<p>
The Power Spectral Density of the measured displacement is computed
</p>
<div class="org-src-container">
<pre class="src src-matlab"> win = hann(ceil(length(x)<span class="org-type">/</span>20));
[p_2, f_2] = pwelch(x, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-org3bd5ef2" class="outline-3">
<h3 id="org3bd5ef2"><span class="section-number-3">1.3</span> Obtained Amplitude Spectral Density of the measured displacement</h3>
<div class="outline-text-3" id="text-1-3">
<p>
The computed ASD of the two measurements are combined in Figure <a href="#org7f818d7">7</a>.
</p>
<div id="org7f818d7" class="figure">
<p><img src="figs/psd_combined.png" alt="psd_combined.png" />
</p>
<p><span class="figure-number">Figure 7: </span>Obtained Amplitude Spectral Density of the measured displacement</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org4a27f63" class="outline-2">
<h2 id="org4a27f63"><span class="section-number-2">2</span> Effect of the &ldquo;bubble sheet&rdquo; and &ldquo;Aluminium tube&rdquo;</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="org5a54545"></a>
</p>
<div id="org95d7372" class="figure">
<p><img src="figs/IMG-7864.JPG" alt="IMG-7864.JPG" />
</p>
<p><span class="figure-number">Figure 8: </span>Aluminium tube used to protect the beam path from disturbances</p>
</div>
<p>
Measurements corresponding to the used of both the aluminium tube and the &ldquo;bubble sheet &rdquo;are loaded and PSD is computed.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> load(<span class="org-string">'short_test_plastic.mat'</span>);
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% [s]</span>
t_1 = t;
x_1 = detrend(x, 0);
[p_1, f_1] = pwelch(x_1, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
Then, the measurement corresponding to the use of the aluminium tube only are loaded and the PSD is computed.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> load(<span class="org-string">'short_test_alu_tube.mat'</span>);
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% [s]</span>
t_2 = t;
x_2 = detrend(x, 0);
[p_2, f_2] = pwelch(x_2, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
Finally, the measurements when neither using the aluminium tube nor the &ldquo;bubble sheet&rdquo; are used.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> load(<span class="org-string">'short_test_without_material.mat'</span>);
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% [s]</span>
t_3 = t;
x_3 = detrend(x, 0);
[p_3, f_3] = pwelch(x_3, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
The time domain signals are compared in Figure <a href="#org58f5584">9</a> and the power spectral densities are compared in Figure <a href="#orgcc1019d">10</a>.
</p>
<div id="org58f5584" class="figure">
<p><img src="figs/time_domain_comp_bubble_aluminium.png" alt="time_domain_comp_bubble_aluminium.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Time domain signals</p>
</div>
<div id="orgcc1019d" class="figure">
<p><img src="figs/asd_noise_comp_bubble_aluminium.png" alt="asd_noise_comp_bubble_aluminium.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Comparison of the noise ASD with and without bubble sheet</p>
</div>
</div>
</div>
<div id="outline-container-org1df7d3a" class="outline-2">
<h2 id="org1df7d3a"><span class="section-number-2">3</span> Measurement of the Attocube&rsquo;s non-linearity</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="org477e3cc"></a>
</p>
<p>
The measurement setup is shown in Figure <a href="#orgce55d14">11</a>.
</p>
<div class="note" id="org6167c44">
<p>
Here are the equipment used in the test bench:
</p>
<ul class="org-ul">
<li>Renishaw Resolution Encoder with 1nm resolution (<a href="doc/L-9517-9448-05-B_Data_sheet_RESOLUTE_BiSS_en.pdf">doc</a>)</li>
<li>Attocube interferometer (<a href="doc/IDS3010.pdf">doc</a>)</li>
<li>Cedrat Amplified Piezoelectric Actuator APA95ML (<a href="doc/APA95ML.pdf">doc</a>)</li>
<li>Voltage Amplifier LA75B (<a href="doc/LA75B.pdf">doc</a>)</li>
<li>Speedgoat IO131 with 16bits ADC and DAC (<a href="doc/IO130 IO131 OEM Datasheet.pdf">doc</a>)</li>
</ul>
</div>
<div id="orgce55d14" class="figure">
<p><img src="figs/exp_setup_schematic.png" alt="exp_setup_schematic.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Schematic of the Experiment</p>
</div>
<p>
A DAC and voltage amplified are used to move the mass with the Amplified Piezoelectric Actuator (APA95ML).
The encoder and the attocube are measure ring the same motion.
</p>
<p>
As will be shown shortly, this measurement permitted to measure the period non-linearity of the Attocube.
</p>
</div>
<div id="outline-container-orgcff7a2a" class="outline-3">
<h3 id="orgcff7a2a"><span class="section-number-3">3.1</span> Load Data</h3>
<div class="outline-text-3" id="text-3-1">
<p>
The measurement data are loaded and the offset are removed using the <code>detrend</code> command.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> load(<span class="org-string">'int_enc_comp.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% Sampling Time [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"> interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf79eda1" class="outline-3">
<h3 id="orgf79eda1"><span class="section-number-3">3.2</span> Time Domain Results</h3>
<div class="outline-text-3" id="text-3-2">
<p>
One period of the displacement of the mass as measured by the encoder and interferometer are shown in Figure <a href="#org0f63236">12</a>.
It consist of the sinusoidal motion at 0.5Hz with an amplitude of approximately \(70\mu m\).
</p>
<p>
The frequency of the motion is chosen such that no resonance in the system is excited.
This should improve the coherence between the measurements made by the encoder and interferometer.
</p>
<div id="org0f63236" class="figure">
<p><img src="figs/int_enc_one_cycle.png" alt="int_enc_one_cycle.png" />
</p>
<p><span class="figure-number">Figure 12: </span>One cycle measurement</p>
</div>
<p>
The difference between the two measurements during the same period is shown in Figure <a href="#org62cb585">13</a>.
</p>
<div id="org62cb585" class="figure">
<p><img src="figs/int_enc_one_cycle_error.png" alt="int_enc_one_cycle_error.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Difference between the Encoder and the interferometer during one cycle</p>
</div>
</div>
</div>
<div id="outline-container-org46f4beb" class="outline-3">
<h3 id="org46f4beb"><span class="section-number-3">3.3</span> Difference between Encoder and Interferometer as a function of time</h3>
<div class="outline-text-3" id="text-3-3">
<p>
The data is filtered using a second order low pass filter with a cut-off frequency \(\omega_0\) as defined below.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> w0 = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>5; <span class="org-comment">% [rad/s]</span>
xi = 0.7;
G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> 2<span class="org-type">*</span>xi<span class="org-type">/</span>w0<span class="org-type">*</span>s <span class="org-type">+</span> s<span class="org-type">^</span>2<span class="org-type">/</span>w0<span class="org-type">^</span>2);
</pre>
</div>
<p>
After filtering, the data is &ldquo;re-shaped&rdquo; such that we can superimpose all the measured periods as shown in Figure <a href="#org3caa2df">14</a>.
This gives an idea of the measurement error as given by the Attocube during a \(70 \mu m\) motion.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> d_err_mean = reshape(lsim(G_lpf, encoder <span class="org-type">-</span> interferometer, t), [2<span class="org-type">/</span>Ts floor(Ts<span class="org-type">/</span>2<span class="org-type">*</span>length(encoder))]);
d_err_mean = d_err_mean <span class="org-type">-</span> mean(d_err_mean);
</pre>
</div>
<div id="org3caa2df" class="figure">
<p><img src="figs/int_enc_error_mean_time.png" alt="int_enc_error_mean_time.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Difference between the two measurement in the time domain, averaged for all the cycles</p>
</div>
</div>
</div>
<div id="outline-container-org044dbe7" class="outline-3">
<h3 id="org044dbe7"><span class="section-number-3">3.4</span> Difference between Encoder and Interferometer as a function of position</h3>
<div class="outline-text-3" id="text-3-4">
<p>
Figure <a href="#org3caa2df">14</a> gives the measurement error as a function of time.
We here wish the compute this measurement error as a function of the position (as measured by the encoer).
</p>
<p>
To do so, all the attocube measurements corresponding to each position measured by the Encoder (resolution of \(1nm\)) are averaged.
Figure <a href="#org706801f">15</a> is obtained where we clearly see an error with a period comparable to the motion range and a much smaller period corresponding to the non-linear period errors that we wish the estimate.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> [e_sorted, <span class="org-type">~</span>, e_ind] = unique(encoder);
i_mean = zeros(length(e_sorted), 1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(e_sorted)</span>
i_mean(<span class="org-constant">i</span>) = mean(interferometer(e_ind <span class="org-type">==</span> <span class="org-constant">i</span>));
<span class="org-keyword">end</span>
i_mean_error = (i_mean <span class="org-type">-</span> e_sorted);
</pre>
</div>
<div id="org706801f" class="figure">
<p><img src="figs/int_enc_error_mean_position.png" alt="int_enc_error_mean_position.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Difference between the two measurement as a function of the measured position by the encoder, averaged for all the cycles</p>
</div>
<p>
The period of the non-linearity seems to be equal to \(765 nm\) which corresponds to half the wavelength of the Laser (\(1.53 \mu m\)).
For the motion range done here, the non-linearity is measured over ~18 periods which permits to do some averaging.
</p>
<div class="org-src-container">
<pre class="src src-matlab"> win_length = 1530<span class="org-type">/</span>2; <span class="org-comment">% length of the windows (corresponds to 765 nm)</span>
num_avg = floor(length(e_sorted)<span class="org-type">/</span>win_length); <span class="org-comment">% number of averaging</span>
i_init = ceil((length(e_sorted) <span class="org-type">-</span> win_length<span class="org-type">*</span>num_avg)<span class="org-type">/</span>2); <span class="org-comment">% does not start at the extremity</span>
e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init<span class="org-type">:</span>i_init<span class="org-type">+</span>win_length<span class="org-type">*</span>num_avg<span class="org-type">-</span>1), [win_length num_avg]), 2);
</pre>
</div>
<p>
The obtained periodic non-linearity is shown in Figure <a href="#orgfc3683a">16</a>.
</p>
<div id="orgfc3683a" class="figure">
<p><img src="figs/int_non_linearity_period_wavelength.png" alt="int_non_linearity_period_wavelength.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Non-Linearity of the Interferometer over the period of the wavelength</p>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2021-05-12 mer. 13:32</p>
</div>
</body>
</html>

View File

@ -10,6 +10,13 @@
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+BIND: org-latex-image-default-option "scale=1"
#+BIND: org-latex-image-default-width ""
#+LaTeX_CLASS: scrreprt
#+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full]
#+LaTeX_HEADER_EXTRA: \input{preamble.tex}
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org
#+PROPERTY: header-args:matlab+ :exports both #+PROPERTY: header-args:matlab+ :exports both
@ -20,6 +27,12 @@
#+PROPERTY: header-args:matlab+ :output-dir figs #+PROPERTY: header-args:matlab+ :output-dir figs
:END: :END:
#+begin_export html
<hr>
<p>This report is also available as a <a href="./test-bench-attocube.pdf">pdf</a>.</p>
<hr>
#+end_export
* Introduction :ignore: * Introduction :ignore:
In this document, few caracteristics of the Attocube Displacement Measuring Interferometer IDS3010 ([[https://www.attocube.com/en/products/laser-displacement-sensor/displacement-measuring-interferometer][link]]) are studied: In this document, few caracteristics of the Attocube Displacement Measuring Interferometer IDS3010 ([[https://www.attocube.com/en/products/laser-displacement-sensor/displacement-measuring-interferometer][link]]) are studied:
@ -41,6 +54,7 @@ In this document, few caracteristics of the Attocube Displacement Measuring Inte
#+name: fig:test-bench-picture #+name: fig:test-bench-picture
#+caption: Picture of the test bench. The Attocube and mirror are covered by a "bubble sheet" #+caption: Picture of the test bench. The Attocube and mirror are covered by a "bubble sheet"
#+ATTR_ORG: :width 600px #+ATTR_ORG: :width 600px
#+ATTR_LATEX: :width \linewidth
[[file:figs/IMG-7865.JPG]] [[file:figs/IMG-7865.JPG]]
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
@ -240,6 +254,7 @@ The computed ASD of the two measurements are combined in Figure [[fig:psd_combin
#+name: fig:picture-test-bench-aluminium-tube #+name: fig:picture-test-bench-aluminium-tube
#+caption: Aluminium tube used to protect the beam path from disturbances #+caption: Aluminium tube used to protect the beam path from disturbances
#+ATTR_ORG: :width 600px #+ATTR_ORG: :width 600px
#+ATTR_LATEX: :width \linewidth
[[file:figs/IMG-7864.JPG]] [[file:figs/IMG-7864.JPG]]
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
@ -259,81 +274,74 @@ The computed ASD of the two measurements are combined in Figure [[fig:psd_combin
addpath('./mat/'); addpath('./mat/');
#+end_src #+end_src
** Aluminium Tube and Bubble Sheet ** Aluminium Tube and Bubble Sheet :ignore:
Measurements corresponding to the used of both the aluminium tube and the "bubble sheet "are loaded and PSD is computed.
#+begin_src matlab #+begin_src matlab
load('short_test_plastic.mat'); load('short_test_plastic.mat');
Ts = 1e-4; % [s] Ts = 1e-4; % [s]
t_1 = t;
x_1 = detrend(x, 0);
[p_1, f_1] = pwelch(x_1, win, [], [], 1/Ts);
#+end_src #+end_src
#+begin_src matlab ** Only Aluminium Tube :ignore:
x = detrend(x, 0); Then, the measurement corresponding to the use of the aluminium tube only are loaded and the PSD is computed.
#+end_src
#+begin_src matlab :exports none
figure;
plot(t, 1e9*x)
xlabel('Time [s]'); ylabel('Displacement [nm]');
#+end_src
#+begin_src matlab
win = hann(ceil(length(x)/10));
[p_1, f_1] = pwelch(x, win, [], [], 1/Ts);
#+end_src
** Only Aluminium Tube
#+begin_src matlab #+begin_src matlab
load('short_test_alu_tube.mat'); load('short_test_alu_tube.mat');
Ts = 1e-4; % [s] Ts = 1e-4; % [s]
t_2 = t;
x_2 = detrend(x, 0);
[p_2, f_2] = pwelch(x_2, win, [], [], 1/Ts);
#+end_src #+end_src
#+begin_src matlab ** Nothing :ignore:
x = detrend(x, 0); Finally, the measurements when neither using the aluminium tube nor the "bubble sheet" are used.
#+end_src
The time domain measurement is shown in Figure [[fig:short_meas_time_domain]].
#+begin_src matlab :exports none
figure;
plot(t, 1e9*x)
xlabel('Time [s]'); ylabel('Displacement [nm]');
#+end_src
#+begin_src matlab
win = hann(ceil(length(x)/10));
[p_2, f_2] = pwelch(x, win, [], [], 1/Ts);
#+end_src
** Nothing
#+begin_src matlab #+begin_src matlab
load('short_test_without_material.mat'); load('short_test_without_material.mat');
Ts = 1e-4; % [s] Ts = 1e-4; % [s]
t_3 = t;
x_3 = detrend(x, 0);
[p_3, f_3] = pwelch(x_3, win, [], [], 1/Ts);
#+end_src #+end_src
#+begin_src matlab ** Comparison :ignore:
x = detrend(x, 0); The time domain signals are compared in Figure [[fig:time_domain_comp_bubble_aluminium]] and the power spectral densities are compared in Figure [[fig:asd_noise_comp_bubble_aluminium]].
#+end_src
The time domain measurement is shown in Figure [[fig:short_meas_time_domain]].
#+begin_src matlab :exports none
figure;
plot(t, 1e9*x)
xlabel('Time [s]'); ylabel('Displacement [nm]');
#+end_src
#+begin_src matlab
win = hann(ceil(length(x)/10));
[p_3, f_3] = pwelch(x, win, [], [], 1/Ts);
#+end_src
** Comparison
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
hold on; hold on;
plot(f_1(8:end), sqrt(p_1(8:end)), '-', ... plot(t_3, 1e9*x_3, 'DisplayName', 'Nothing');
'DisplayName', 'Alunimium + Bubble'); plot(t_2, 1e9*x_2, 'DisplayName', 'Alunimium');
plot(t_1, 1e9*x_1, 'DisplayName', 'Alunimium + Bubble');
hold off;
xlabel('Time [s]'); ylabel('Displacement [nm]')
legend('location', 'southeast');
ylim([-20, 20]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/time_domain_comp_bubble_aluminium.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:time_domain_comp_bubble_aluminium
#+caption: Time domain signals
#+RESULTS:
[[file:figs/time_domain_comp_bubble_aluminium.png]]
#+begin_src matlab :exports none
figure;
hold on;
plot(f_3(8:end), sqrt(p_3(8:end)), '-', ...
'DisplayName', 'Nothing');
plot(f_2(8:end), sqrt(p_2(8:end)), '-', ... plot(f_2(8:end), sqrt(p_2(8:end)), '-', ...
'DisplayName', 'Aluminium'); 'DisplayName', 'Aluminium');
plot(f_3(8:end), sqrt(p_3(8:end)), '-', ... plot(f_1(8:end), sqrt(p_1(8:end)), '-', ...
'DisplayName', 'nothing'); 'DisplayName', 'Alunimium + Bubble');
hold off; hold off;
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('ASD [$m/\sqrt{Hz}$]'); xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]'); xlabel('Frequency [Hz]');
@ -355,6 +363,7 @@ The time domain measurement is shown in Figure [[fig:short_meas_time_domain]].
:header-args:matlab+: :tangle matlab/attocube_non_linearity.m :header-args:matlab+: :tangle matlab/attocube_non_linearity.m
:END: :END:
<<sec:attocube_non_linearity>> <<sec:attocube_non_linearity>>
** Introduction :ignore: ** Introduction :ignore:
The measurement setup is shown in Figure [[fig:exp_setup_schematic]]. The measurement setup is shown in Figure [[fig:exp_setup_schematic]].
@ -484,7 +493,7 @@ This gives an idea of the measurement error as given by the Attocube during a $7
#+end_src #+end_src
#+begin_src matlab :tangle no :exports results :results file replace #+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/int_enc_error_mean_time.pdf', 'width', 'wide', 'height', 'normal', 'pdf', false); exportFig('figs/int_enc_error_mean_time.pdf', 'width', 'wide', 'height', 'normal', 'simplify', true);
#+end_src #+end_src
#+name: fig:int_enc_error_mean_time #+name: fig:int_enc_error_mean_time

BIN
test-bench-attocube.pdf Normal file

Binary file not shown.

360
test-bench-attocube.tex Normal file
View File

@ -0,0 +1,360 @@
% Created 2020-12-10 jeu. 18:27
% Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{grffile}
\usepackage{longtable}
\usepackage{wrapfig}
\usepackage{rotating}
\usepackage[normalem]{ulem}
\usepackage{amsmath}
\usepackage{textcomp}
\usepackage{amssymb}
\usepackage{capt-of}
\usepackage{hyperref}
\usepackage[most]{tcolorbox}
\usepackage{bm}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{array}
\usepackage{siunitx}
\input{preamble.tex}
\author{Dehaeze Thomas}
\date{\today}
\title{Attocube - Test Bench}
\hypersetup{
pdfauthor={Dehaeze Thomas},
pdftitle={Attocube - Test Bench},
pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 27.1 (Org mode 9.5)},
pdflang={English}}
\begin{document}
\maketitle
\tableofcontents
In this document, few caracteristics of the Attocube Displacement Measuring Interferometer IDS3010 (\href{https://www.attocube.com/en/products/laser-displacement-sensor/displacement-measuring-interferometer}{link}) are studied:
\begin{itemize}
\item Section \ref{sec:attocube_asd_noise}: the ASD noise of the measured displacement is estimated
\item Section \ref{sec:effect_air_protection}: the effect of two air protections on the stability of the measurement is studied
\item Section \ref{sec:attocube_non_linearity}: the cyclic non-linearity of the attocube is estimated using a encoder
\end{itemize}
\chapter{Estimation of the Spectral Density of the Attocube Noise}
\label{sec:orgdeffe75}
\label{sec:attocube_asd_noise}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/test-bench-schematic.png}
\caption{\label{fig:test-bench-schematic}Test Bench Schematic}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=\linewidth]{figs/IMG-7865.JPG}
\caption{\label{fig:test-bench-picture}Picture of the test bench. The Attocube and mirror are covered by a ``bubble sheet''}
\end{figure}
\section{Long and Slow measurement}
\label{sec:orgee32cb3}
The first measurement was made during \textasciitilde{}17 hours with a sampling time of \(T_s = 0.1\,s\).
\begin{minted}[]{matlab}
load('long_test_plastic.mat', 'x', 't')
Ts = 0.1; % [s]
\end{minted}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/long_meas_time_domain_full.png}
\caption{\label{fig:long_meas_time_domain_full}Long measurement time domain data}
\end{figure}
Let's fit the data with a step response to a first order low pass filter (Figure \ref{fig:long_meas_time_domain_fit}).
\begin{minted}[]{matlab}
f = @(b,x) b(1)*(1 - exp(-x/b(2)));
y_cur = x(t < 17.5*60*60);
t_cur = t(t < 17.5*60*60);
nrmrsd = @(b) norm(y_cur - f(b,t_cur)); % Residual Norm Cost Function
B0 = [400e-9, 2*60*60]; % Choose Appropriate Initial Estimates
[B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters B
\end{minted}
The corresponding time constant is (in [h]):
\begin{verbatim}
2.0658
\end{verbatim}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/long_meas_time_domain_fit.png}
\caption{\label{fig:long_meas_time_domain_fit}Fit of the measurement data with a step response of a first order low pass filter}
\end{figure}
We can see in Figure \ref{fig:long_meas_time_domain_full} that there is a transient period where the measured displacement experiences some drifts.
This is probably due to thermal effects.
We only select the data between \texttt{t1} and \texttt{t2}.
The obtained displacement is shown in Figure \ref{fig:long_meas_time_domain_zoom}.
\begin{minted}[]{matlab}
t1 = 10.5; t2 = 17.5; % [h]
x = x(t > t1*60*60 & t < t2*60*60);
x = x - mean(x);
t = t(t > t1*60*60 & t < t2*60*60);
t = t - t(1);
\end{minted}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/long_meas_time_domain_zoom.png}
\caption{\label{fig:long_meas_time_domain_zoom}Kept data (removed slow drifts during the first hours)}
\end{figure}
The Power Spectral Density of the measured displacement is computed
\begin{minted}[]{matlab}
win = hann(ceil(length(x)/20));
[p_1, f_1] = pwelch(x, win, [], [], 1/Ts);
\end{minted}
As a low pass filter was used in the measurement process, we multiply the PSD by the square of the inverse of the filter's norm.
\begin{minted}[]{matlab}
G_lpf = 1/(1 + s/2/pi);
p_1 = p_1./abs(squeeze(freqresp(G_lpf, f_1, 'Hz'))).^2;
\end{minted}
Only frequencies below 2Hz are taken into account (high frequency noise will be measured afterwards).
\begin{minted}[]{matlab}
p_1 = p_1(f_1 < 2);
f_1 = f_1(f_1 < 2);
\end{minted}
\section{Short and Fast measurement}
\label{sec:org48317cd}
An second measurement is done in order to estimate the high frequency noise of the interferometer.
The measurement is done with a sampling time of \(T_s = 0.1\,ms\) and a duration of \textasciitilde{}100s.
\begin{minted}[]{matlab}
load('short_test_plastic.mat')
Ts = 1e-4; % [s]
\end{minted}
\begin{minted}[]{matlab}
x = detrend(x, 0);
\end{minted}
The time domain measurement is shown in Figure \ref{fig:short_meas_time_domain}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/short_meas_time_domain.png}
\caption{\label{fig:short_meas_time_domain}Time domain measurement with the high sampling rate}
\end{figure}
The Power Spectral Density of the measured displacement is computed
\begin{minted}[]{matlab}
win = hann(ceil(length(x)/20));
[p_2, f_2] = pwelch(x, win, [], [], 1/Ts);
\end{minted}
\section{Obtained Amplitude Spectral Density of the measured displacement}
\label{sec:orgdffca76}
The computed ASD of the two measurements are combined in Figure \ref{fig:psd_combined}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/psd_combined.png}
\caption{\label{fig:psd_combined}Obtained Amplitude Spectral Density of the measured displacement}
\end{figure}
\chapter{Effect of the ``bubble sheet'' and ``Aluminium tube''}
\label{sec:org7c7f561}
\label{sec:effect_air_protection}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=\linewidth]{figs/IMG-7864.JPG}
\caption{\label{fig:picture-test-bench-aluminium-tube}Aluminium tube used to protect the beam path from disturbances}
\end{figure}
Measurements corresponding to the used of both the aluminium tube and the ``bubble sheet ''are loaded and PSD is computed.
\begin{minted}[]{matlab}
load('short_test_plastic.mat');
Ts = 1e-4; % [s]
t_1 = t;
x_1 = detrend(x, 0);
[p_1, f_1] = pwelch(x_1, win, [], [], 1/Ts);
\end{minted}
Then, the measurement corresponding to the use of the aluminium tube only are loaded and the PSD is computed.
\begin{minted}[]{matlab}
load('short_test_alu_tube.mat');
Ts = 1e-4; % [s]
t_2 = t;
x_2 = detrend(x, 0);
[p_2, f_2] = pwelch(x_2, win, [], [], 1/Ts);
\end{minted}
Finally, the measurements when neither using the aluminium tube nor the ``bubble sheet'' are used.
\begin{minted}[]{matlab}
load('short_test_without_material.mat');
Ts = 1e-4; % [s]
t_3 = t;
x_3 = detrend(x, 0);
[p_3, f_3] = pwelch(x_3, win, [], [], 1/Ts);
\end{minted}
The time domain signals are compared in Figure \ref{fig:time_domain_comp_bubble_aluminium} and the power spectral densities are compared in Figure \ref{fig:asd_noise_comp_bubble_aluminium}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/time_domain_comp_bubble_aluminium.png}
\caption{\label{fig:time_domain_comp_bubble_aluminium}Time domain signals}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/asd_noise_comp_bubble_aluminium.png}
\caption{\label{fig:asd_noise_comp_bubble_aluminium}Comparison of the noise ASD with and without bubble sheet}
\end{figure}
\chapter{Measurement of the Attocube's non-linearity}
\label{sec:org3e242a7}
\label{sec:attocube_non_linearity}
The measurement setup is shown in Figure \ref{fig:exp_setup_schematic}.
\begin{note}
Here are the equipment used in the test bench:
\begin{itemize}
\item Renishaw Resolution Encoder with 1nm resolution (\href{doc/L-9517-9448-05-B\_Data\_sheet\_RESOLUTE\_BiSS\_en.pdf}{doc})
\item Attocube interferometer (\href{doc/IDS3010.pdf}{doc})
\item Cedrat Amplified Piezoelectric Actuator APA95ML (\href{doc/APA95ML.pdf}{doc})
\item Voltage Amplifier LA75B (\href{doc/LA75B.pdf}{doc})
\item Speedgoat IO131 with 16bits ADC and DAC (\href{doc/IO130 IO131 OEM Datasheet.pdf}{doc})
\end{itemize}
\end{note}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/exp_setup_schematic.png}
\caption{\label{fig:exp_setup_schematic}Schematic of the Experiment}
\end{figure}
A DAC and voltage amplified are used to move the mass with the Amplified Piezoelectric Actuator (APA95ML).
The encoder and the attocube are measure ring the same motion.
As will be shown shortly, this measurement permitted to measure the period non-linearity of the Attocube.
\section{Load Data}
\label{sec:orga1094f1}
The measurement data are loaded and the offset are removed using the \texttt{detrend} command.
\begin{minted}[]{matlab}
load('int_enc_comp.mat', 'interferometer', 'encoder', 'u', 't');
Ts = 1e-4; % Sampling Time [s]
\end{minted}
\begin{minted}[]{matlab}
interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);
\end{minted}
\section{Time Domain Results}
\label{sec:org8c99670}
One period of the displacement of the mass as measured by the encoder and interferometer are shown in Figure \ref{fig:int_enc_one_cycle}.
It consist of the sinusoidal motion at 0.5Hz with an amplitude of approximately \(70\mu m\).
The frequency of the motion is chosen such that no resonance in the system is excited.
This should improve the coherence between the measurements made by the encoder and interferometer.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/int_enc_one_cycle.png}
\caption{\label{fig:int_enc_one_cycle}One cycle measurement}
\end{figure}
The difference between the two measurements during the same period is shown in Figure \ref{fig:int_enc_one_cycle_error}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/int_enc_one_cycle_error.png}
\caption{\label{fig:int_enc_one_cycle_error}Difference between the Encoder and the interferometer during one cycle}
\end{figure}
\section{Difference between Encoder and Interferometer as a function of time}
\label{sec:org3c86e57}
The data is filtered using a second order low pass filter with a cut-off frequency \(\omega_0\) as defined below.
\begin{minted}[]{matlab}
w0 = 2*pi*5; % [rad/s]
xi = 0.7;
G_lpf = 1/(1 + 2*xi/w0*s + s^2/w0^2);
\end{minted}
After filtering, the data is ``re-shaped'' such that we can superimpose all the measured periods as shown in Figure \ref{fig:int_enc_error_mean_time}.
This gives an idea of the measurement error as given by the Attocube during a \(70 \mu m\) motion.
\begin{minted}[]{matlab}
d_err_mean = reshape(lsim(G_lpf, encoder - interferometer, t), [2/Ts floor(Ts/2*length(encoder))]);
d_err_mean = d_err_mean - mean(d_err_mean);
\end{minted}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/int_enc_error_mean_time.png}
\caption{\label{fig:int_enc_error_mean_time}Difference between the two measurement in the time domain, averaged for all the cycles}
\end{figure}
\section{Difference between Encoder and Interferometer as a function of position}
\label{sec:orgbdfe98f}
Figure \ref{fig:int_enc_error_mean_time} gives the measurement error as a function of time.
We here wish the compute this measurement error as a function of the position (as measured by the encoer).
To do so, all the attocube measurements corresponding to each position measured by the Encoder (resolution of \(1nm\)) are averaged.
Figure \ref{fig:int_enc_error_mean_position} is obtained where we clearly see an error with a period comparable to the motion range and a much smaller period corresponding to the non-linear period errors that we wish the estimate.
\begin{minted}[]{matlab}
[e_sorted, ~, e_ind] = unique(encoder);
i_mean = zeros(length(e_sorted), 1);
for i = 1:length(e_sorted)
i_mean(i) = mean(interferometer(e_ind == i));
end
i_mean_error = (i_mean - e_sorted);
\end{minted}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/int_enc_error_mean_position.png}
\caption{\label{fig:int_enc_error_mean_position}Difference between the two measurement as a function of the measured position by the encoder, averaged for all the cycles}
\end{figure}
The period of the non-linearity seems to be equal to \(765 nm\) which corresponds to half the wavelength of the Laser (\(1.53 \mu m\)).
For the motion range done here, the non-linearity is measured over \textasciitilde{}18 periods which permits to do some averaging.
\begin{minted}[]{matlab}
win_length = 1530/2; % length of the windows (corresponds to 765 nm)
num_avg = floor(length(e_sorted)/win_length); % number of averaging
i_init = ceil((length(e_sorted) - win_length*num_avg)/2); % does not start at the extremity
e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init:i_init+win_length*num_avg-1), [win_length num_avg]), 2);
\end{minted}
The obtained periodic non-linearity is shown in Figure \ref{fig:int_non_linearity_period_wavelength}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/int_non_linearity_period_wavelength.png}
\caption{\label{fig:int_non_linearity_period_wavelength}Non-Linearity of the Interferometer over the period of the wavelength}
\end{figure}
\end{document}