This commit is contained in:
Thomas Dehaeze 2021-02-11 10:17:38 +01:00
commit 15d8508bf0
12 changed files with 330 additions and 234 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View File

@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2021-02-03 mer. 11:20 --> <!-- 2021-02-10 mer. 15:14 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Encoder Renishaw Vionic - Test Bench</title> <title>Encoder Renishaw Vionic - Test Bench</title>
<meta name="generator" content="Org mode" /> <meta name="generator" content="Org mode" />
@ -39,23 +39,22 @@
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
<li><a href="#org691fd8d">1. Encoder Model</a></li> <li><a href="#orgee60877">1. Expected Performances</a></li>
<li><a href="#org6d49234">2. Noise Measurement</a> <li><a href="#org78808d1">2. Encoder Model</a></li>
<li><a href="#org07e5c0c">3. Noise Measurement</a>
<ul> <ul>
<li><a href="#orga5ff56c">2.1. Test Bench</a></li> <li><a href="#org1171cfb">3.1. Test Bench</a></li>
<li><a href="#org14877fe">2.2. Results</a></li> <li><a href="#org2d3c7ed">3.2. Thermal drifts</a></li>
<li><a href="#org12c8422">3.3. Time Domain signals</a></li>
<li><a href="#orgcfb7422">3.4. Noise Spectral Density</a></li>
<li><a href="#orgf450d0e">3.5. Noise Model</a></li>
<li><a href="#org5d6e2aa">3.6. Validity of the noise model</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org2b0bcde">3. Linearity Measurement</a> <li><a href="#orgbcdb22e">4. Linearity Measurement</a>
<ul> <ul>
<li><a href="#org175ba6f">3.1. Test Bench</a></li> <li><a href="#org0508ec2">4.1. Test Bench</a></li>
<li><a href="#org69056ec">3.2. Results</a></li> <li><a href="#org4e41106">4.2. Results</a></li>
</ul>
</li>
<li><a href="#org5ca0c03">4. Dynamical Measurement</a>
<ul>
<li><a href="#orgde9a37d">4.1. Test Bench</a></li>
<li><a href="#org8bc51db">4.2. Results</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -65,9 +64,9 @@
<p>This report is also available as a <a href="./test-bench-vionic.pdf">pdf</a>.</p> <p>This report is also available as a <a href="./test-bench-vionic.pdf">pdf</a>.</p>
<hr> <hr>
<div class="note" id="org978e8ad"> <div class="note" id="orgf0dfbf1">
<p> <p>
You can find below the document of: You can find below the documentation of:
</p> </p>
<ul class="org-ul"> <ul class="org-ul">
<li><a href="doc/L-9517-9678-05-A_Data_sheet_VIONiC_series_en.pdf">Vionic Encoder</a></li> <li><a href="doc/L-9517-9678-05-A_Data_sheet_VIONiC_series_en.pdf">Vionic Encoder</a></li>
@ -77,70 +76,81 @@ You can find below the document of:
</div> </div>
<p> <p>
We would like to characterize the encoder measurement system. In this document, we wish to characterize the performances of the encoder measurement system.
</p>
<p>
In particular, we would like to measure: In particular, we would like to measure:
</p> </p>
<ul class="org-ul"> <ul class="org-ul">
<li>Power Spectral Density of the measurement noise</li> <li>the measurement noise</li>
<li>Bandwidth of the sensor</li> <li>the linearity of the sensor</li>
<li>Linearity of the sensor</li> <li>the bandwidth of the sensor</li>
</ul> </ul>
<p>
This document is structured as follow:
</p>
<ul class="org-ul">
<li>Section <a href="#org5825e63">1</a>: the expected performance of the Vionic encoder system are described</li>
<li>Section <a href="#org886dc10">2</a>: a simple model of the encoder is developed</li>
<li>Section <a href="#orgce8febf">3</a>: the noise of the encoder is measured and a model of the noise is identified</li>
<li>Section <a href="#org0a6ada3">4</a>: the linearity of the sensor is estimated</li>
</ul>
<div id="orgf372152" class="figure"> <div id="outline-container-orgee60877" class="outline-2">
<h2 id="orgee60877"><span class="section-number-2">1</span> Expected Performances</h2>
<div class="outline-text-2" id="text-1">
<p>
<a id="org5825e63"></a>
</p>
<p>
The Vionic encoder is shown in Figure <a href="#org8649a60">1</a>.
</p>
<div id="org8649a60" class="figure">
<p><img src="figs/encoder_vionic.png" alt="encoder_vionic.png" /> <p><img src="figs/encoder_vionic.png" alt="encoder_vionic.png" />
</p> </p>
<p><span class="figure-number">Figure 1: </span>Picture of the Vionic Encoder</p> <p><span class="figure-number">Figure 1: </span>Picture of the Vionic Encoder</p>
</div> </div>
<ul class="org-ul">
<li>1: 2YA275</li>
<li>2: 2YA274</li>
<li>3: 2YA273</li>
<li>4: 2YA270</li>
<li>5: 2YA272</li>
<li>6: 2YA271</li>
<li>7: 2YJ313</li>
</ul>
<div id="outline-container-org691fd8d" class="outline-2">
<h2 id="org691fd8d"><span class="section-number-2">1</span> Encoder Model</h2>
<div class="outline-text-2" id="text-1">
<p> <p>
The Encoder is characterized by its dynamics \(G_m(s)\) from the &ldquo;true&rdquo; displacement \(y\) to measured displacement \(y_m\). From the Renishaw <a href="https://www.renishaw.com/en/how-optical-encoders-work--36979">website</a>:
Ideally, this dynamics is constant over a wide frequency band with very small phase drop. </p>
<blockquote>
<p>
The VIONiC encoder features the third generation of Renishaw&rsquo;s unique filtering optics that average the contributions from many scale periods and effectively filter out non-periodic features such as dirt.
The nominally square-wave scale pattern is also filtered to leave a pure sinusoidal fringe field at the detector.
Here, a multiple finger structure is employed, fine enough to produce photocurrents in the form of four symmetrically phased signals.
These are combined to remove DC components and produce sine and cosine signal outputs with high spectral purity and low offset while maintaining <b>bandwidth to beyond 500 kHz</b>.
</p> </p>
<p> <p>
It is also characterized by its measurement noise \(n\) that can be described by its Power Spectral Density (PSD). Fully integrated advanced dynamic signal conditioning, Auto Gain , Auto Balance and Auto Offset Controls combine to ensure <b>ultra-low Sub-Divisional Error (SDE) of typically</b> \(<\pm 15\, nm\).
</p> </p>
<p> <p>
The model of the encoder is shown in Figure <a href="#orgb6cf5b4">2</a>. This evolution of filtering optics, combined with carefully-selected electronics, provide incremental signals with wide bandwidth achieving a maximum speed of 12 m/s with the lowest positional jitter (noise) of any encoder in its class.
Interpolation is within the readhead, with fine resolution versions being further augmented by additional noise-reducing electronics to achieve <b>jitter of just 1.6 nm RMS</b>.
</p>
</blockquote>
<p>
The expected interpolation errors (non-linearity) is shown in Figure <a href="#org35c5a3c">2</a>.
</p> </p>
<div id="orgb6cf5b4" class="figure"> <div id="org35c5a3c" class="figure">
<p><img src="figs/encoder-model-schematic.png" alt="encoder-model-schematic.png" /> <p><img src="./figs/vionic_expected_noise.png" alt="vionic_expected_noise.png" />
</p> </p>
<p><span class="figure-number">Figure 2: </span>Model of the Encoder</p> <p><span class="figure-number">Figure 2: </span>Expected interpolation errors for the Vionic Encoder</p>
</div> </div>
<p> <p>
We can also use a transfer function \(G_n(s)\) to shape a noise \(\tilde{n}\) with unity ASD as shown in Figure <a href="#orgd00343b">4</a>. The characteristics as advertise in the manual as well as our specifications are shown in Table <a href="#org025a9b8">1</a>.
</p> </p>
<table id="org025a9b8" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<div id="org2725c4b" class="figure"> <caption class="t-above"><span class="table-number">Table 1:</span> Characteristics of the Vionic compared with the specifications</caption>
<p><img src="figs/encoder-model-schematic-with-asd.png" alt="encoder-model-schematic-with-asd.png" />
</p>
</div>
<table id="org20632fc" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 1:</span> Characteristics of the Vionic Encoder</caption>
<colgroup> <colgroup>
<col class="org-left" /> <col class="org-left" />
@ -153,56 +163,93 @@ We can also use a transfer function \(G_n(s)\) to shape a noise \(\tilde{n}\) wi
<tr> <tr>
<th scope="col" class="org-left"><b>Characteristics</b></th> <th scope="col" class="org-left"><b>Characteristics</b></th>
<th scope="col" class="org-center"><b>Manual</b></th> <th scope="col" class="org-center"><b>Manual</b></th>
<th scope="col" class="org-center"><b>Specifications</b></th> <th scope="col" class="org-center"><b>Specification</b></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td class="org-left">Range</td> <td class="org-left">Time Delay</td>
<td class="org-center">Ruler length</td>
<td class="org-center">&gt; 200 [um]</td>
</tr>
<tr>
<td class="org-left">Resolution</td>
<td class="org-center">2.5 [nm]</td>
<td class="org-center">&lt; 50 [nm rms]</td>
</tr>
<tr>
<td class="org-left">Sub-Divisional Error</td>
<td class="org-center">\(< \pm 15\,nm\)</td>
<td class="org-center">&#xa0;</td> <td class="org-center">&#xa0;</td>
<td class="org-center">&lt; 0.5 ms</td>
</tr> </tr>
<tr> <tr>
<td class="org-left">Bandwidth</td> <td class="org-left">Bandwidth</td>
<td class="org-center">To be checked</td> <td class="org-center">&gt; 500 kHz</td>
<td class="org-center">&gt; 5 [kHz]</td> <td class="org-center">&gt; 5 kHz</td>
</tr>
<tr>
<td class="org-left">Noise</td>
<td class="org-center">&lt; 1.6 nm rms</td>
<td class="org-center">&lt; 50 nm rms</td>
</tr>
<tr>
<td class="org-left">Linearity</td>
<td class="org-center">&lt; +/- 15 nm</td>
<td class="org-center">&#xa0;</td>
</tr>
<tr>
<td class="org-left">Range</td>
<td class="org-center">Ruler length</td>
<td class="org-center">&gt; 200 um</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div id="orgd00343b" class="figure">
<p><img src="./figs/vionic_expected_noise.png" alt="vionic_expected_noise.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Expected interpolation errors for the Vionic Encoder</p>
</div>
</div> </div>
</div> </div>
<div id="outline-container-org78808d1" class="outline-2">
<div id="outline-container-org6d49234" class="outline-2"> <h2 id="org78808d1"><span class="section-number-2">2</span> Encoder Model</h2>
<h2 id="org6d49234"><span class="section-number-2">2</span> Noise Measurement</h2>
<div class="outline-text-2" id="text-2"> <div class="outline-text-2" id="text-2">
<p> <p>
<a id="org4cb96c9"></a> <a id="org886dc10"></a>
</p>
<p>
The Encoder is characterized by its dynamics \(G_m(s)\) from the &ldquo;true&rdquo; displacement \(y\) to measured displacement \(y_m\).
Ideally, this dynamics is constant over a wide frequency band with very small phase drop.
</p>
<p>
It is also characterized by its measurement noise \(n\) that can be described by its Power Spectral Density (PSD) \(\Gamma_n(\omega)\).
</p>
<p>
The model of the encoder is shown in Figure <a href="#orgd01aa78">3</a>.
</p>
<div id="orgd01aa78" class="figure">
<p><img src="figs/encoder-model-schematic.png" alt="encoder-model-schematic.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Model of the Encoder</p>
</div>
<p>
We can also use a transfer function \(G_n(s)\) to shape a noise \(\tilde{n}\) with unity ASD as shown in Figure <a href="#org35c5a3c">2</a>.
</p>
<div id="org0de813a" class="figure">
<p><img src="figs/encoder-model-schematic-with-asd.png" alt="encoder-model-schematic-with-asd.png" />
</p> </p>
</div> </div>
<div id="outline-container-orga5ff56c" class="outline-3"> </div>
<h3 id="orga5ff56c"><span class="section-number-3">2.1</span> Test Bench</h3> </div>
<div class="outline-text-3" id="text-2-1">
<div id="outline-container-org07e5c0c" class="outline-2">
<h2 id="org07e5c0c"><span class="section-number-2">3</span> Noise Measurement</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="orgce8febf"></a>
</p>
</div>
<div id="outline-container-org1171cfb" class="outline-3">
<h3 id="org1171cfb"><span class="section-number-3">3.1</span> Test Bench</h3>
<div class="outline-text-3" id="text-3-1">
<p> <p>
To measure the noise \(n\) of the encoder, one can rigidly fix the head and the ruler together such that no motion should be measured. To measure the noise \(n\) of the encoder, one can rigidly fix the head and the ruler together such that no motion should be measured.
Then, the measured signal \(y_m\) corresponds to the noise \(n\). Then, the measured signal \(y_m\) corresponds to the noise \(n\).
@ -210,53 +257,62 @@ Then, the measured signal \(y_m\) corresponds to the noise \(n\).
</div> </div>
</div> </div>
<div id="outline-container-org14877fe" class="outline-3"> <div id="outline-container-org2d3c7ed" class="outline-3">
<h3 id="org14877fe"><span class="section-number-3">2.2</span> Results</h3> <h3 id="org2d3c7ed"><span class="section-number-3">3.2</span> Thermal drifts</h3>
<div class="outline-text-3" id="text-2-2"> <div class="outline-text-3" id="text-3-2">
<p> <ul class="org-ul">
First we load the data. <li class="off"><code>[&#xa0;]</code> picture of the setup</li>
</p> <li class="off"><code>[&#xa0;]</code> long thermal drifts</li>
<div class="org-src-container"> <li class="off"><code>[&#xa0;]</code> once stabilize, look at the noise</li>
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span> <li class="off"><code>[&#xa0;]</code> compute low frequency ASD (may still be thermal drifts of the mechanics and not noise)</li>
enc1 = load(<span class="org-string">'noise_meas_100s_20kHz_1.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'x'</span>); </ul>
enc2 = load(<span class="org-string">'noise_meas_100s_20kHz_2.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'x'</span>); </div>
enc3 = load(<span class="org-string">'noise_meas_100s_20kHz_3.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'x'</span>);
enc4 = load(<span class="org-string">'noise_meas_100s_20kHz_4.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'x'</span>);
enc6 = load(<span class="org-string">'noise_meas_100s_20kHz_6.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'x'</span>);
enc7 = load(<span class="org-string">'noise_meas_100s_20kHz_7.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'x'</span>);
</pre>
</div> </div>
<div id="outline-container-org12c8422" class="outline-3">
<h3 id="org12c8422"><span class="section-number-3">3.3</span> Time Domain signals</h3>
<div class="outline-text-3" id="text-3-3">
<p> <p>
The raw measured data as well as the low pass filtered data (using a first order low pass filter with a cut-off at 10Hz) are shown in Figure <a href="#org72fd239">5</a>. First we load the data.
The raw measured data as well as the low pass filtered data (using a first order low pass filter with a cut-off at 10Hz) are shown in Figure <a href="#org0525912">5</a>.
</p> </p>
<div id="org72fd239" class="figure"> <div id="org0525912" class="figure">
<p><img src="figs/vionic_noise_raw_lpf.png" alt="vionic_noise_raw_lpf.png" /> <p><img src="figs/vionic_noise_raw_lpf.png" alt="vionic_noise_raw_lpf.png" />
</p> </p>
<p><span class="figure-number">Figure 5: </span>Time domain measurement (raw data and low pass filtered data with first order 10Hz LPF)</p> <p><span class="figure-number">Figure 5: </span>Time domain measurement (raw data and low pass filtered data with first order 10Hz LPF)</p>
</div> </div>
<p> <p>
The time domain data for all the encoders are compared in Figure <a href="#orgf7f2fda">6</a>. The time domain data for all the encoders are compared in Figure <a href="#org5c2c4fa">6</a>.
</p> </p>
<div id="orgf7f2fda" class="figure"> <div id="org5c2c4fa" class="figure">
<p><img src="figs/vionic_noise_time.png" alt="vionic_noise_time.png" /> <p><img src="figs/vionic_noise_time.png" alt="vionic_noise_time.png" />
</p> </p>
<p><span class="figure-number">Figure 6: </span>Comparison of the time domain measurement</p> <p><span class="figure-number">Figure 6: </span>Comparison of the time domain measurement</p>
</div> </div>
</div>
</div>
<div id="outline-container-orgcfb7422" class="outline-3">
<h3 id="orgcfb7422"><span class="section-number-3">3.4</span> Noise Spectral Density</h3>
<div class="outline-text-3" id="text-3-4">
<p> <p>
The amplitude spectral density is computed and shown in Figure <a href="#orgf3c083c">7</a>. The amplitude spectral density is computed and shown in Figure <a href="#orged52478">7</a>.
</p> </p>
<div id="orgf3c083c" class="figure"> <div id="orged52478" class="figure">
<p><img src="figs/vionic_noise_asd.png" alt="vionic_noise_asd.png" /> <p><img src="figs/vionic_noise_asd.png" alt="vionic_noise_asd.png" />
</p> </p>
<p><span class="figure-number">Figure 7: </span>Amplitude Spectral Density of the measured signal</p> <p><span class="figure-number">Figure 7: </span>Amplitude Spectral Density of the measured signal</p>
</div> </div>
</div>
</div>
<div id="outline-container-orgf450d0e" class="outline-3">
<h3 id="orgf450d0e"><span class="section-number-3">3.5</span> Noise Model</h3>
<div class="outline-text-3" id="text-3-5">
<p> <p>
Let&rsquo;s create a transfer function that approximate the measured noise of the encoder. Let&rsquo;s create a transfer function that approximate the measured noise of the encoder.
</p> </p>
@ -266,29 +322,49 @@ Let&rsquo;s create a transfer function that approximate the measured noise of th
</div> </div>
<p> <p>
The amplitude of the transfer function and the measured ASD are shown in Figure <a href="#org8714af7">8</a>. The amplitude of the transfer function and the measured ASD are shown in Figure <a href="#orgd40fb21">8</a>.
</p> </p>
<div id="org8714af7" class="figure"> <div id="orgd40fb21" class="figure">
<p><img src="figs/vionic_noise_asd_model.png" alt="vionic_noise_asd_model.png" /> <p><img src="figs/vionic_noise_asd_model.png" alt="vionic_noise_asd_model.png" />
</p> </p>
<p><span class="figure-number">Figure 8: </span>Measured ASD of the noise and modelled one</p> <p><span class="figure-number">Figure 8: </span>Measured ASD of the noise and modeled one</p>
</div>
</div>
</div>
<div id="outline-container-org5d6e2aa" class="outline-3">
<h3 id="org5d6e2aa"><span class="section-number-3">3.6</span> Validity of the noise model</h3>
<div class="outline-text-3" id="text-3-6">
<p>
The cumulative amplitude spectrum is now computed and shown in Figure <a href="#orgf87a6b7">9</a>.
</p>
<p>
We can see that the Root Mean Square value of the measurement noise is \(\approx 1.6 \, nm\) as advertise in the datasheet.
</p>
<div id="orgf87a6b7" class="figure">
<p><img src="figs/vionic_noise_cas_model.png" alt="vionic_noise_cas_model.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Meassured CAS of the noise and modeled one</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org2b0bcde" class="outline-2"> <div id="outline-container-orgbcdb22e" class="outline-2">
<h2 id="org2b0bcde"><span class="section-number-2">3</span> Linearity Measurement</h2> <h2 id="orgbcdb22e"><span class="section-number-2">4</span> Linearity Measurement</h2>
<div class="outline-text-2" id="text-3"> <div class="outline-text-2" id="text-4">
<p> <p>
<a id="orgc339bfd"></a> <a id="org0a6ada3"></a>
</p> </p>
</div> </div>
<div id="outline-container-org175ba6f" class="outline-3"> <div id="outline-container-org0508ec2" class="outline-3">
<h3 id="org175ba6f"><span class="section-number-3">3.1</span> Test Bench</h3> <h3 id="org0508ec2"><span class="section-number-3">4.1</span> Test Bench</h3>
<div class="outline-text-3" id="text-3-1"> <div class="outline-text-3" id="text-4-1">
<p> <p>
In order to measure the linearity, we have to compare the measured displacement with a reference sensor with a known linearity. In order to measure the linearity, we have to compare the measured displacement with a reference sensor with a known linearity.
An interferometer or capacitive sensor should work fine. An interferometer or capacitive sensor should work fine.
@ -296,7 +372,7 @@ An actuator should also be there so impose a displacement.
</p> </p>
<p> <p>
One idea is to use the test-bench shown in Figure <a href="#org30ec1c0">9</a>. One idea is to use the test-bench shown in Figure <a href="#orge0a809b">10</a>.
</p> </p>
<p> <p>
@ -309,38 +385,22 @@ As the interferometer has a very large bandwidth, we should be able to estimate
</p> </p>
<div id="org30ec1c0" class="figure"> <div id="orge0a809b" class="figure">
<p><img src="figs/test_bench_encoder_calibration.png" alt="test_bench_encoder_calibration.png" /> <p><img src="figs/test_bench_encoder_calibration.png" alt="test_bench_encoder_calibration.png" />
</p> </p>
<p><span class="figure-number">Figure 9: </span>Schematic of the test bench</p> <p><span class="figure-number">Figure 10: </span>Schematic of the test bench</p>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org69056ec" class="outline-3"> <div id="outline-container-org4e41106" class="outline-3">
<h3 id="org69056ec"><span class="section-number-3">3.2</span> Results</h3> <h3 id="org4e41106"><span class="section-number-3">4.2</span> Results</h3>
</div>
</div>
<div id="outline-container-org5ca0c03" class="outline-2">
<h2 id="org5ca0c03"><span class="section-number-2">4</span> Dynamical Measurement</h2>
<div class="outline-text-2" id="text-4">
<p>
<a id="org71dc40b"></a>
</p>
</div>
<div id="outline-container-orgde9a37d" class="outline-3">
<h3 id="orgde9a37d"><span class="section-number-3">4.1</span> Test Bench</h3>
</div>
<div id="outline-container-org8bc51db" class="outline-3">
<h3 id="org8bc51db"><span class="section-number-3">4.2</span> Results</h3>
</div> </div>
</div> </div>
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2021-02-03 mer. 11:20</p> <p class="date">Created: 2021-02-10 mer. 15:14</p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -49,36 +49,75 @@
* Introduction :ignore: * Introduction :ignore:
#+begin_note #+begin_note
You can find below the document of: You can find below the documentation of:
- [[file:doc/L-9517-9678-05-A_Data_sheet_VIONiC_series_en.pdf][Vionic Encoder]] - [[file:doc/L-9517-9678-05-A_Data_sheet_VIONiC_series_en.pdf][Vionic Encoder]]
- [[file:doc/L-9517-9862-01-C_Data_sheet_RKLC_EN.pdf][Linear Scale]] - [[file:doc/L-9517-9862-01-C_Data_sheet_RKLC_EN.pdf][Linear Scale]]
#+end_note #+end_note
We would like to characterize the encoder measurement system. In this document, we wish to characterize the performances of the encoder measurement system.
In particular, we would like to measure: In particular, we would like to measure:
- Power Spectral Density of the measurement noise - the measurement noise
- Bandwidth of the sensor - the linearity of the sensor
- Linearity of the sensor - the bandwidth of the sensor
This document is structured as follow:
- Section [[sec:vionic_expected_performances]]: the expected performance of the Vionic encoder system are described
- Section [[sec:encoder_model]]: a simple model of the encoder is developed
- Section [[sec:noise_measurement]]: the noise of the encoder is measured and a model of the noise is identified
- Section [[sec:linearity_measurement]]: the linearity of the sensor is estimated
* Expected Performances
<<sec:vionic_expected_performances>>
The Vionic encoder is shown in Figure [[fig:encoder_vionic]].
#+name: fig:encoder_vionic #+name: fig:encoder_vionic
#+caption: Picture of the Vionic Encoder #+caption: Picture of the Vionic Encoder
#+attr_latex: :width 0.6\linewidth #+attr_latex: :width 0.6\linewidth
[[file:figs/encoder_vionic.png]] [[file:figs/encoder_vionic.png]]
- 1: 2YA275 From the Renishaw [[https://www.renishaw.com/en/how-optical-encoders-work--36979][website]]:
- 2: 2YA274 #+begin_quote
- 3: 2YA273 The VIONiC encoder features the third generation of Renishaw's unique filtering optics that average the contributions from many scale periods and effectively filter out non-periodic features such as dirt.
- 4: 2YA270 The nominally square-wave scale pattern is also filtered to leave a pure sinusoidal fringe field at the detector.
- 5: 2YA272 Here, a multiple finger structure is employed, fine enough to produce photocurrents in the form of four symmetrically phased signals.
- 6: 2YA271 These are combined to remove DC components and produce sine and cosine signal outputs with high spectral purity and low offset while maintaining *bandwidth to beyond 500 kHz*.
- 7: 2YJ313
Fully integrated advanced dynamic signal conditioning, Auto Gain , Auto Balance and Auto Offset Controls combine to ensure *ultra-low Sub-Divisional Error (SDE) of typically* $<\pm 15\, nm$.
This evolution of filtering optics, combined with carefully-selected electronics, provide incremental signals with wide bandwidth achieving a maximum speed of 12 m/s with the lowest positional jitter (noise) of any encoder in its class.
Interpolation is within the readhead, with fine resolution versions being further augmented by additional noise-reducing electronics to achieve *jitter of just 1.6 nm RMS*.
#+end_quote
The expected interpolation errors (non-linearity) is shown in Figure [[fig:vionic_expected_noise]].
#+name: fig:vionic_expected_noise
#+attr_latex: :width \linewidth
#+caption: Expected interpolation errors for the Vionic Encoder
[[file:./figs/vionic_expected_noise.png]]
The characteristics as advertise in the manual as well as our specifications are shown in Table [[tab:vionic_characteristics]].
#+name: tab:vionic_characteristics
#+caption: Characteristics of the Vionic compared with the specifications
#+attr_latex: :environment tabularx :width 0.6\linewidth :align lcc
#+attr_latex: :center t :booktabs t :float t
| <l> | <c> | <c> |
| *Characteristics* | *Manual* | *Specification* |
|-------------------+--------------+-----------------|
| Time Delay | | < 0.5 ms |
| Bandwidth | > 500 kHz | > 5 kHz |
| Noise | < 1.6 nm rms | < 50 nm rms |
| Linearity | < +/- 15 nm | |
| Range | Ruler length | > 200 um |
* Encoder Model * Encoder Model
<<sec:encoder_model>>
The Encoder is characterized by its dynamics $G_m(s)$ from the "true" displacement $y$ to measured displacement $y_m$. The Encoder is characterized by its dynamics $G_m(s)$ from the "true" displacement $y$ to measured displacement $y_m$.
Ideally, this dynamics is constant over a wide frequency band with very small phase drop. Ideally, this dynamics is constant over a wide frequency band with very small phase drop.
It is also characterized by its measurement noise $n$ that can be described by its Power Spectral Density (PSD). It is also characterized by its measurement noise $n$ that can be described by its Power Spectral Density (PSD) $\Gamma_n(\omega)$.
The model of the encoder is shown in Figure [[fig:encoder-model-schematic]]. The model of the encoder is shown in Figure [[fig:encoder-model-schematic]].
@ -128,24 +167,6 @@ We can also use a transfer function $G_n(s)$ to shape a noise $\tilde{n}$ with u
#+RESULTS: #+RESULTS:
[[file:figs/encoder-model-schematic-with-asd.png]] [[file:figs/encoder-model-schematic-with-asd.png]]
#+name: tab:vionic_characteristics_manual
#+caption: Characteristics of the Vionic Encoder
#+attr_latex: :environment tabularx :width \linewidth :align lXX
#+attr_latex: :center t :booktabs t :float t
| <l> | <c> | <c> |
| *Characteristics* | *Manual* | *Specifications* |
|----------------------+----------------+------------------|
| Range | Ruler length | > 200 [um] |
| Resolution | 2.5 [nm] | < 50 [nm rms] |
| Sub-Divisional Error | $< \pm 15\,nm$ | |
| Bandwidth | To be checked | > 5 [kHz] |
#+name: fig:vionic_expected_noise
#+attr_latex: :width \linewidth
#+caption: Expected interpolation errors for the Vionic Encoder
[[file:./figs/vionic_expected_noise.png]]
* Noise Measurement * Noise Measurement
<<sec:noise_measurement>> <<sec:noise_measurement>>
** Test Bench ** Test Bench
@ -171,34 +192,35 @@ addpath('./matlab/');
addpath('./mat/'); addpath('./mat/');
#+end_src #+end_src
** Results ** TODO Thermal drifts
- [ ] picture of the setup
- [ ] long thermal drifts
- [ ] once stabilize, look at the noise
- [ ] compute low frequency ASD (may still be thermal drifts of the mechanics and not noise)
** Time Domain signals
First we load the data. First we load the data.
#+begin_src matlab #+begin_src matlab :exports none
%% Load Data %% Load all the measurements
enc1 = load('noise_meas_100s_20kHz_1.mat', 't', 'x'); enc = {};
enc2 = load('noise_meas_100s_20kHz_2.mat', 't', 'x'); for i = 1:7
enc3 = load('noise_meas_100s_20kHz_3.mat', 't', 'x'); enc(i) = {load(['mat/noise_meas_100s_20kHz_' num2str(i) '.mat'], 't', 'x')};
enc4 = load('noise_meas_100s_20kHz_4.mat', 't', 'x'); end
enc6 = load('noise_meas_100s_20kHz_6.mat', 't', 'x');
enc7 = load('noise_meas_100s_20kHz_7.mat', 't', 'x');
#+end_src #+end_src
#+begin_src matlab :exports none #+begin_src matlab :exports none
%% Remove initial offset %% Remove initial offset
enc1.x = enc1.x - mean(enc1.x(1:1000)); for i = 1:7
enc2.x = enc2.x - mean(enc2.x(1:1000)); enc{i}.x = enc{i}.x - mean(enc{i}.x(1:1000));
enc3.x = enc3.x - mean(enc3.x(1:1000)); end
enc4.x = enc4.x - mean(enc4.x(1:1000));
enc6.x = enc6.x - mean(enc6.x(1:1000));
enc7.x = enc7.x - mean(enc7.x(1:1000));
#+end_src #+end_src
The raw measured data as well as the low pass filtered data (using a first order low pass filter with a cut-off at 10Hz) are shown in Figure [[fig:vionic_noise_raw_lpf]]. The raw measured data as well as the low pass filtered data (using a first order low pass filter with a cut-off at 10Hz) are shown in Figure [[fig:vionic_noise_raw_lpf]].
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
hold on; hold on;
plot(enc1.t, 1e9*enc1.x, '.', 'DisplayName', 'Enc 1 - Raw'); plot(enc{1}.t, 1e9*enc{1}.x, '.', 'DisplayName', 'Enc 1 - Raw');
plot(enc1.t, 1e9*lsim(1/(1 + s/2/pi/10), enc1.x, enc1.t), '-', 'DisplayName', 'Enc 1 - LPF'); plot(enc{1}.t, 1e9*lsim(1/(1 + s/2/pi/10), enc{1}.x, enc{1}.t), '-', 'DisplayName', 'Enc 1 - LPF');
hold off; hold off;
xlabel('Time [s]'); xlabel('Time [s]');
ylabel('Displacement [nm]'); ylabel('Displacement [nm]');
@ -218,12 +240,10 @@ The time domain data for all the encoders are compared in Figure [[fig:vionic_no
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
hold on; hold on;
plot(enc1.t, 1e9*lsim(1/(1 + s/2/pi/10), enc1.x, enc1.t), '.', 'DisplayName', 'Enc 1'); for i=1:7
plot(enc2.t, 1e9*lsim(1/(1 + s/2/pi/10), enc2.x, enc2.t), '.', 'DisplayName', 'Enc 2'); plot(enc{i}.t, 1e9*lsim(1/(1 + s/2/pi/10), enc{i}.x, enc{i}.t), '.', ...
plot(enc3.t, 1e9*lsim(1/(1 + s/2/pi/10), enc3.x, enc3.t), '.', 'DisplayName', 'Enc 3'); 'DisplayName', sprintf('Enc %i', i));
plot(enc4.t, 1e9*lsim(1/(1 + s/2/pi/10), enc4.x, enc4.t), '.', 'DisplayName', 'Enc 4'); end
plot(enc6.t, 1e9*lsim(1/(1 + s/2/pi/10), enc6.x, enc6.t), '.', 'DisplayName', 'Enc 6');
plot(enc7.t, 1e9*lsim(1/(1 + s/2/pi/10), enc7.x, enc7.t), '.', 'DisplayName', 'Enc 7');
hold off; hold off;
xlabel('Time [s]'); xlabel('Time [s]');
ylabel('Displacement [nm]'); ylabel('Displacement [nm]');
@ -239,32 +259,32 @@ exportFig('figs/vionic_noise_time.pdf', 'width', 'wide', 'height', 'normal');
#+RESULTS: #+RESULTS:
[[file:figs/vionic_noise_time.png]] [[file:figs/vionic_noise_time.png]]
** Noise Spectral Density
The amplitude spectral density is computed and shown in Figure [[fig:vionic_noise_asd]]. The amplitude spectral density is computed and shown in Figure [[fig:vionic_noise_asd]].
#+begin_src matlab :exports none #+begin_src matlab :exports none
% Compute sampling Frequency % Compute sampling Frequency
Ts = (enc1.t(end) - enc1.t(1))/(length(enc1.t)-1); Ts = (enc{1}.t(end) - enc{1}.t(1))/(length(enc{1}.t)-1);
Fs = 1/Ts; Fs = 1/Ts;
% Hannning Windows % Hannning Windows
win = hanning(ceil(0.5/Ts)); win = hanning(ceil(0.5/Ts));
[p1, f] = pwelch(enc1.x, win, [], [], Fs); [pxx, f] = pwelch(enc{1}.x, win, [], [], Fs);
[p2, ~] = pwelch(enc2.x, win, [], [], Fs); enc{1}.pxx = pxx;
[p3, ~] = pwelch(enc3.x, win, [], [], Fs);
[p4, ~] = pwelch(enc4.x, win, [], [], Fs); for i=2:7
[p6, ~] = pwelch(enc6.x, win, [], [], Fs); [pxx, ~] = pwelch(enc{i}.x, win, [], [], Fs);
[p7, ~] = pwelch(enc7.x, win, [], [], Fs); enc{i}.pxx = pxx;
end
#+end_src #+end_src
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
hold on; hold on;
plot(f, sqrt(p1), 'DisplayName', 'Enc 1'); for i=1:7
plot(f, sqrt(p2), 'DisplayName', 'Enc 2'); plot(f, sqrt(enc{i}.pxx), ...
plot(f, sqrt(p3), 'DisplayName', 'Enc 3'); 'DisplayName', sprintf('Enc %i', i));
plot(f, sqrt(p4), 'DisplayName', 'Enc 4'); end
plot(f, sqrt(p6), 'DisplayName', 'Enc 6');
plot(f, sqrt(p7), 'DisplayName', 'Enc 7');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]'); xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
xlim([10, Fs/2]); xlim([10, Fs/2]);
@ -281,6 +301,8 @@ exportFig('figs/vionic_noise_asd.pdf', 'width', 'wide', 'height', 'normal');
#+RESULTS: #+RESULTS:
[[file:figs/vionic_noise_asd.png]] [[file:figs/vionic_noise_asd.png]]
** Noise Model
Let's create a transfer function that approximate the measured noise of the encoder. Let's create a transfer function that approximate the measured noise of the encoder.
#+begin_src matlab #+begin_src matlab
Gn_e = 1.8e-11/(1 + s/2/pi/1e4); Gn_e = 1.8e-11/(1 + s/2/pi/1e4);
@ -292,11 +314,10 @@ The amplitude of the transfer function and the measured ASD are shown in Figure
figure; figure;
hold on; hold on;
plot(f, sqrt(p1), 'color', [0, 0, 0, 0.5], 'DisplayName', '$\Gamma_n(\omega)$'); plot(f, sqrt(p1), 'color', [0, 0, 0, 0.5], 'DisplayName', '$\Gamma_n(\omega)$');
plot(f, sqrt(p2), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off'); for i=2:7
plot(f, sqrt(p3), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off'); plot(f, sqrt(enc{i}.pxx), 'color', [0, 0, 0, 0.5], ...
plot(f, sqrt(p4), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off'); 'HandleVisibility', 'off');
plot(f, sqrt(p6), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off'); end
plot(f, sqrt(p7), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off');
plot(f, abs(squeeze(freqresp(Gn_e, f, 'Hz'))), 'r-', 'DisplayName', '$|G_n(j\omega)|$'); plot(f, abs(squeeze(freqresp(Gn_e, f, 'Hz'))), 'r-', 'DisplayName', '$|G_n(j\omega)|$');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
@ -311,10 +332,48 @@ exportFig('figs/vionic_noise_asd_model.pdf', 'width', 'wide', 'height', 'normal'
#+end_src #+end_src
#+name: fig:vionic_noise_asd_model #+name: fig:vionic_noise_asd_model
#+caption: Measured ASD of the noise and modelled one #+caption: Measured ASD of the noise and modeled one
#+RESULTS: #+RESULTS:
[[file:figs/vionic_noise_asd_model.png]] [[file:figs/vionic_noise_asd_model.png]]
** Validity of the noise model
The cumulative amplitude spectrum is now computed and shown in Figure [[fig:vionic_noise_cas_model]].
We can see that the Root Mean Square value of the measurement noise is $\approx 1.6 \, nm$ as advertise in the datasheet.
#+begin_src matlab :exports none
for i = 1:7
enc{i}.CPS = flip(-cumtrapz(flip(f), flip(enc{i}.pxx)));
end
CAS_Gn = flip(-cumtrapz(flip(f), flip(abs(squeeze(freqresp(Gn_e, f, 'Hz'))).^2)));
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(f, sqrt(enc{1}.CPS), 'color', [0, 0, 0, 0.5], 'DisplayName', '$CAS_n(\omega)$');
for i=2:7
plot(f, sqrt(enc{i}.CPS), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off');
end
plot(f, sqrt(CAS_Gn), 'r-', 'DisplayName', 'model');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('CPS [$m$]');
xlim([10, Fs/2]);
ylim([1e-10, 1e-8]);
legend('location', 'northeast');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_noise_cas_model.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:vionic_noise_cas_model
#+caption: Meassured CAS of the noise and modeled one
#+RESULTS:
[[file:figs/vionic_noise_cas_model.png]]
* Linearity Measurement * Linearity Measurement
<<sec:linearity_measurement>> <<sec:linearity_measurement>>
** Test Bench ** Test Bench
@ -353,26 +412,3 @@ addpath('./mat/');
** Results ** Results
* Dynamical Measurement
<<sec:dynamical_measurement>>
** Test Bench
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
#+begin_src matlab :tangle no
addpath('./matlab/mat/');
addpath('./matlab/');
#+end_src
#+begin_src matlab :eval no
addpath('./mat/');
#+end_src
** Results

Binary file not shown.