Merge branch 'master' of https://git.tdehaeze.xyz/tdehaeze/test-bench-vionic
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 86 KiB |
BIN
figs/vionic_noise_cas_model.pdf
Normal file
BIN
figs/vionic_noise_cas_model.png
Normal file
After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 57 KiB |
@ -3,7 +3,7 @@
|
||||
"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-02-03 mer. 11:20 -->
|
||||
<!-- 2021-02-10 mer. 15:14 -->
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
<title>Encoder Renishaw Vionic - Test Bench</title>
|
||||
<meta name="generator" content="Org mode" />
|
||||
@ -39,23 +39,22 @@
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#org691fd8d">1. Encoder Model</a></li>
|
||||
<li><a href="#org6d49234">2. Noise Measurement</a>
|
||||
<li><a href="#orgee60877">1. Expected Performances</a></li>
|
||||
<li><a href="#org78808d1">2. Encoder Model</a></li>
|
||||
<li><a href="#org07e5c0c">3. Noise Measurement</a>
|
||||
<ul>
|
||||
<li><a href="#orga5ff56c">2.1. Test Bench</a></li>
|
||||
<li><a href="#org14877fe">2.2. Results</a></li>
|
||||
<li><a href="#org1171cfb">3.1. Test Bench</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>
|
||||
</li>
|
||||
<li><a href="#org2b0bcde">3. Linearity Measurement</a>
|
||||
<li><a href="#orgbcdb22e">4. Linearity Measurement</a>
|
||||
<ul>
|
||||
<li><a href="#org175ba6f">3.1. Test Bench</a></li>
|
||||
<li><a href="#org69056ec">3.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>
|
||||
<li><a href="#org0508ec2">4.1. Test Bench</a></li>
|
||||
<li><a href="#org4e41106">4.2. Results</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
@ -65,9 +64,9 @@
|
||||
<p>This report is also available as a <a href="./test-bench-vionic.pdf">pdf</a>.</p>
|
||||
<hr>
|
||||
|
||||
<div class="note" id="org978e8ad">
|
||||
<div class="note" id="orgf0dfbf1">
|
||||
<p>
|
||||
You can find below the document of:
|
||||
You can find below the documentation of:
|
||||
</p>
|
||||
<ul class="org-ul">
|
||||
<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>
|
||||
|
||||
<p>
|
||||
We would like to characterize the encoder measurement system.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
In this document, we wish to characterize the performances of the encoder measurement system.
|
||||
In particular, we would like to measure:
|
||||
</p>
|
||||
<ul class="org-ul">
|
||||
<li>Power Spectral Density of the measurement noise</li>
|
||||
<li>Bandwidth of the sensor</li>
|
||||
<li>Linearity of the sensor</li>
|
||||
<li>the measurement noise</li>
|
||||
<li>the linearity of the sensor</li>
|
||||
<li>the bandwidth of the sensor</li>
|
||||
</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>
|
||||
<p><span class="figure-number">Figure 1: </span>Picture of the Vionic Encoder</p>
|
||||
</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>
|
||||
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.
|
||||
From the Renishaw <a href="https://www.renishaw.com/en/how-optical-encoders-work--36979">website</a>:
|
||||
</p>
|
||||
<blockquote>
|
||||
<p>
|
||||
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.
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
|
||||
|
||||
<div id="orgb6cf5b4" class="figure">
|
||||
<p><img src="figs/encoder-model-schematic.png" alt="encoder-model-schematic.png" />
|
||||
<div id="org35c5a3c" class="figure">
|
||||
<p><img src="./figs/vionic_expected_noise.png" alt="vionic_expected_noise.png" />
|
||||
</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>
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
<div id="org2725c4b" class="figure">
|
||||
<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>
|
||||
<table id="org025a9b8" 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 compared with the specifications</caption>
|
||||
|
||||
<colgroup>
|
||||
<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>
|
||||
<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>Specifications</b></th>
|
||||
<th scope="col" class="org-center"><b>Specification</b></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="org-left">Range</td>
|
||||
<td class="org-center">Ruler length</td>
|
||||
<td class="org-center">> 200 [um]</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-left">Resolution</td>
|
||||
<td class="org-center">2.5 [nm]</td>
|
||||
<td class="org-center">< 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-left">Time Delay</td>
|
||||
<td class="org-center"> </td>
|
||||
<td class="org-center">< 0.5 ms</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-left">Bandwidth</td>
|
||||
<td class="org-center">To be checked</td>
|
||||
<td class="org-center">> 5 [kHz]</td>
|
||||
<td class="org-center">> 500 kHz</td>
|
||||
<td class="org-center">> 5 kHz</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-left">Noise</td>
|
||||
<td class="org-center">< 1.6 nm rms</td>
|
||||
<td class="org-center">< 50 nm rms</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-left">Linearity</td>
|
||||
<td class="org-center">< +/- 15 nm</td>
|
||||
<td class="org-center"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-left">Range</td>
|
||||
<td class="org-center">Ruler length</td>
|
||||
<td class="org-center">> 200 um</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</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 id="outline-container-org6d49234" class="outline-2">
|
||||
<h2 id="org6d49234"><span class="section-number-2">2</span> Noise Measurement</h2>
|
||||
<div id="outline-container-org78808d1" class="outline-2">
|
||||
<h2 id="org78808d1"><span class="section-number-2">2</span> Encoder Model</h2>
|
||||
<div class="outline-text-2" id="text-2">
|
||||
<p>
|
||||
<a id="org4cb96c9"></a>
|
||||
<a id="org886dc10"></a>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</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>
|
||||
</div>
|
||||
<div id="outline-container-orga5ff56c" class="outline-3">
|
||||
<h3 id="orga5ff56c"><span class="section-number-3">2.1</span> Test Bench</h3>
|
||||
<div class="outline-text-3" id="text-2-1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
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\).
|
||||
@ -210,53 +257,62 @@ Then, the measured signal \(y_m\) corresponds to the noise \(n\).
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org14877fe" class="outline-3">
|
||||
<h3 id="org14877fe"><span class="section-number-3">2.2</span> Results</h3>
|
||||
<div class="outline-text-3" id="text-2-2">
|
||||
<p>
|
||||
First we load the data.
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span>
|
||||
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>);
|
||||
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>);
|
||||
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 id="outline-container-org2d3c7ed" class="outline-3">
|
||||
<h3 id="org2d3c7ed"><span class="section-number-3">3.2</span> Thermal drifts</h3>
|
||||
<div class="outline-text-3" id="text-3-2">
|
||||
<ul class="org-ul">
|
||||
<li class="off"><code>[ ]</code> picture of the setup</li>
|
||||
<li class="off"><code>[ ]</code> long thermal drifts</li>
|
||||
<li class="off"><code>[ ]</code> once stabilize, look at the noise</li>
|
||||
<li class="off"><code>[ ]</code> compute low frequency ASD (may still be thermal drifts of the mechanics and not noise)</li>
|
||||
</ul>
|
||||
</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>
|
||||
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>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<div id="orgf7f2fda" class="figure">
|
||||
<div id="org5c2c4fa" class="figure">
|
||||
<p><img src="figs/vionic_noise_time.png" alt="vionic_noise_time.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 6: </span>Comparison of the time domain measurement</p>
|
||||
</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>
|
||||
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>
|
||||
|
||||
<div id="orgf3c083c" class="figure">
|
||||
<div id="orged52478" class="figure">
|
||||
<p><img src="figs/vionic_noise_asd.png" alt="vionic_noise_asd.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 7: </span>Amplitude Spectral Density of the measured signal</p>
|
||||
</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>
|
||||
Let’s create a transfer function that approximate the measured noise of the encoder.
|
||||
</p>
|
||||
@ -266,29 +322,49 @@ Let’s create a transfer function that approximate the measured noise of th
|
||||
</div>
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
<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>
|
||||
<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 id="outline-container-org2b0bcde" class="outline-2">
|
||||
<h2 id="org2b0bcde"><span class="section-number-2">3</span> Linearity Measurement</h2>
|
||||
<div class="outline-text-2" id="text-3">
|
||||
<div id="outline-container-orgbcdb22e" class="outline-2">
|
||||
<h2 id="orgbcdb22e"><span class="section-number-2">4</span> Linearity Measurement</h2>
|
||||
<div class="outline-text-2" id="text-4">
|
||||
<p>
|
||||
<a id="orgc339bfd"></a>
|
||||
<a id="org0a6ada3"></a>
|
||||
</p>
|
||||
</div>
|
||||
<div id="outline-container-org175ba6f" class="outline-3">
|
||||
<h3 id="org175ba6f"><span class="section-number-3">3.1</span> Test Bench</h3>
|
||||
<div class="outline-text-3" id="text-3-1">
|
||||
<div id="outline-container-org0508ec2" class="outline-3">
|
||||
<h3 id="org0508ec2"><span class="section-number-3">4.1</span> Test Bench</h3>
|
||||
<div class="outline-text-3" id="text-4-1">
|
||||
<p>
|
||||
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.
|
||||
@ -296,7 +372,7 @@ An actuator should also be there so impose a displacement.
|
||||
</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>
|
||||
@ -309,38 +385,22 @@ As the interferometer has a very large bandwidth, we should be able to estimate
|
||||
</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>
|
||||
<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 id="outline-container-org69056ec" class="outline-3">
|
||||
<h3 id="org69056ec"><span class="section-number-3">3.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 id="outline-container-org4e41106" class="outline-3">
|
||||
<h3 id="org4e41106"><span class="section-number-3">4.2</span> Results</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="postamble" class="status">
|
||||
<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>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -49,36 +49,75 @@
|
||||
* Introduction :ignore:
|
||||
|
||||
#+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-9862-01-C_Data_sheet_RKLC_EN.pdf][Linear Scale]]
|
||||
#+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:
|
||||
- Power Spectral Density of the measurement noise
|
||||
- Bandwidth of the sensor
|
||||
- Linearity of the sensor
|
||||
- the measurement noise
|
||||
- the 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
|
||||
#+caption: Picture of the Vionic Encoder
|
||||
#+attr_latex: :width 0.6\linewidth
|
||||
[[file:figs/encoder_vionic.png]]
|
||||
|
||||
- 1: 2YA275
|
||||
- 2: 2YA274
|
||||
- 3: 2YA273
|
||||
- 4: 2YA270
|
||||
- 5: 2YA272
|
||||
- 6: 2YA271
|
||||
- 7: 2YJ313
|
||||
From the Renishaw [[https://www.renishaw.com/en/how-optical-encoders-work--36979][website]]:
|
||||
#+begin_quote
|
||||
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.
|
||||
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 *bandwidth to beyond 500 kHz*.
|
||||
|
||||
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
|
||||
<<sec:encoder_model>>
|
||||
|
||||
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.
|
||||
|
||||
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]].
|
||||
|
||||
@ -128,24 +167,6 @@ We can also use a transfer function $G_n(s)$ to shape a noise $\tilde{n}$ with u
|
||||
#+RESULTS:
|
||||
[[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
|
||||
<<sec:noise_measurement>>
|
||||
** Test Bench
|
||||
@ -171,34 +192,35 @@ addpath('./matlab/');
|
||||
addpath('./mat/');
|
||||
#+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.
|
||||
#+begin_src matlab
|
||||
%% Load Data
|
||||
enc1 = load('noise_meas_100s_20kHz_1.mat', 't', 'x');
|
||||
enc2 = load('noise_meas_100s_20kHz_2.mat', 't', 'x');
|
||||
enc3 = load('noise_meas_100s_20kHz_3.mat', 't', 'x');
|
||||
enc4 = load('noise_meas_100s_20kHz_4.mat', 't', 'x');
|
||||
enc6 = load('noise_meas_100s_20kHz_6.mat', 't', 'x');
|
||||
enc7 = load('noise_meas_100s_20kHz_7.mat', 't', 'x');
|
||||
#+begin_src matlab :exports none
|
||||
%% Load all the measurements
|
||||
enc = {};
|
||||
for i = 1:7
|
||||
enc(i) = {load(['mat/noise_meas_100s_20kHz_' num2str(i) '.mat'], 't', 'x')};
|
||||
end
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Remove initial offset
|
||||
enc1.x = enc1.x - mean(enc1.x(1:1000));
|
||||
enc2.x = enc2.x - mean(enc2.x(1:1000));
|
||||
enc3.x = enc3.x - mean(enc3.x(1:1000));
|
||||
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));
|
||||
for i = 1:7
|
||||
enc{i}.x = enc{i}.x - mean(enc{i}.x(1:1000));
|
||||
end
|
||||
#+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]].
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(enc1.t, 1e9*enc1.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*enc{1}.x, '.', 'DisplayName', 'Enc 1 - Raw');
|
||||
plot(enc{1}.t, 1e9*lsim(1/(1 + s/2/pi/10), enc{1}.x, enc{1}.t), '-', 'DisplayName', 'Enc 1 - LPF');
|
||||
hold off;
|
||||
xlabel('Time [s]');
|
||||
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
|
||||
figure;
|
||||
hold on;
|
||||
plot(enc1.t, 1e9*lsim(1/(1 + s/2/pi/10), enc1.x, enc1.t), '.', 'DisplayName', 'Enc 1');
|
||||
plot(enc2.t, 1e9*lsim(1/(1 + s/2/pi/10), enc2.x, enc2.t), '.', 'DisplayName', 'Enc 2');
|
||||
plot(enc3.t, 1e9*lsim(1/(1 + s/2/pi/10), enc3.x, enc3.t), '.', 'DisplayName', 'Enc 3');
|
||||
plot(enc4.t, 1e9*lsim(1/(1 + s/2/pi/10), enc4.x, enc4.t), '.', 'DisplayName', 'Enc 4');
|
||||
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');
|
||||
for i=1:7
|
||||
plot(enc{i}.t, 1e9*lsim(1/(1 + s/2/pi/10), enc{i}.x, enc{i}.t), '.', ...
|
||||
'DisplayName', sprintf('Enc %i', i));
|
||||
end
|
||||
hold off;
|
||||
xlabel('Time [s]');
|
||||
ylabel('Displacement [nm]');
|
||||
@ -239,32 +259,32 @@ exportFig('figs/vionic_noise_time.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+RESULTS:
|
||||
[[file:figs/vionic_noise_time.png]]
|
||||
|
||||
** Noise Spectral Density
|
||||
The amplitude spectral density is computed and shown in Figure [[fig:vionic_noise_asd]].
|
||||
#+begin_src matlab :exports none
|
||||
% 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;
|
||||
|
||||
% Hannning Windows
|
||||
win = hanning(ceil(0.5/Ts));
|
||||
|
||||
[p1, f] = pwelch(enc1.x, win, [], [], Fs);
|
||||
[p2, ~] = pwelch(enc2.x, win, [], [], Fs);
|
||||
[p3, ~] = pwelch(enc3.x, win, [], [], Fs);
|
||||
[p4, ~] = pwelch(enc4.x, win, [], [], Fs);
|
||||
[p6, ~] = pwelch(enc6.x, win, [], [], Fs);
|
||||
[p7, ~] = pwelch(enc7.x, win, [], [], Fs);
|
||||
[pxx, f] = pwelch(enc{1}.x, win, [], [], Fs);
|
||||
enc{1}.pxx = pxx;
|
||||
|
||||
for i=2:7
|
||||
[pxx, ~] = pwelch(enc{i}.x, win, [], [], Fs);
|
||||
enc{i}.pxx = pxx;
|
||||
end
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, sqrt(p1), 'DisplayName', 'Enc 1');
|
||||
plot(f, sqrt(p2), 'DisplayName', 'Enc 2');
|
||||
plot(f, sqrt(p3), 'DisplayName', 'Enc 3');
|
||||
plot(f, sqrt(p4), 'DisplayName', 'Enc 4');
|
||||
plot(f, sqrt(p6), 'DisplayName', 'Enc 6');
|
||||
plot(f, sqrt(p7), 'DisplayName', 'Enc 7');
|
||||
for i=1:7
|
||||
plot(f, sqrt(enc{i}.pxx), ...
|
||||
'DisplayName', sprintf('Enc %i', i));
|
||||
end
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
|
||||
xlim([10, Fs/2]);
|
||||
@ -281,6 +301,8 @@ exportFig('figs/vionic_noise_asd.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+RESULTS:
|
||||
[[file:figs/vionic_noise_asd.png]]
|
||||
|
||||
** Noise Model
|
||||
|
||||
Let's create a transfer function that approximate the measured noise of the encoder.
|
||||
#+begin_src matlab
|
||||
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;
|
||||
hold on;
|
||||
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');
|
||||
plot(f, sqrt(p3), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off');
|
||||
plot(f, sqrt(p4), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off');
|
||||
plot(f, sqrt(p6), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off');
|
||||
plot(f, sqrt(p7), 'color', [0, 0, 0, 0.5], 'HandleVisibility', 'off');
|
||||
for i=2:7
|
||||
plot(f, sqrt(enc{i}.pxx), 'color', [0, 0, 0, 0.5], ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
plot(f, abs(squeeze(freqresp(Gn_e, f, 'Hz'))), 'r-', 'DisplayName', '$|G_n(j\omega)|$');
|
||||
hold off;
|
||||
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
|
||||
|
||||
#+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:
|
||||
[[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
|
||||
<<sec:linearity_measurement>>
|
||||
** Test Bench
|
||||
@ -353,26 +412,3 @@ addpath('./mat/');
|
||||
|
||||
** 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
|
||||
|