test-bench-vionic/test-bench-vionic.org

573 lines
20 KiB
Org Mode
Raw Permalink Normal View History

2020-12-16 11:51:26 +01:00
#+TITLE: Encoder Renishaw Vionic - Test Bench
:DRAWER:
#+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com
#+AUTHOR: Dehaeze Thomas
#+HTML_LINK_HOME: ../index.html
#+HTML_LINK_UP: ../index.html
#+HTML_HEAD: <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>
#+BIND: org-latex-image-default-option "scale=1"
#+BIND: org-latex-image-default-width ""
#+LaTeX_CLASS: scrreprt
#+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full]
#+LaTeX_HEADER_EXTRA: \input{preamble.tex}
#+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org
#+PROPERTY: header-args:matlab+ :exports both
#+PROPERTY: header-args:matlab+ :results none
#+PROPERTY: header-args:matlab+ :eval no-export
#+PROPERTY: header-args:matlab+ :noweb yes
#+PROPERTY: header-args:matlab+ :mkdirp yes
#+PROPERTY: header-args:matlab+ :output-dir figs
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
#+PROPERTY: header-args:latex+ :results file raw replace
#+PROPERTY: header-args:latex+ :buffer no
#+PROPERTY: header-args:latex+ :tangle no
#+PROPERTY: header-args:latex+ :eval no-export
#+PROPERTY: header-args:latex+ :exports results
#+PROPERTY: header-args:latex+ :mkdirp yes
#+PROPERTY: header-args:latex+ :output-dir figs
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
:END:
2021-02-02 18:46:58 +01:00
#+begin_export html
<hr>
<p>This report is also available as a <a href="./test-bench-vionic.pdf">pdf</a>.</p>
<hr>
#+end_export
2020-12-16 11:51:26 +01:00
* Introduction :ignore:
2020-12-16 14:07:07 +01:00
#+begin_note
2021-02-10 15:14:14 +01:00
You can find below the documentation of:
2020-12-16 11:51:26 +01:00
- [[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]]
2020-12-16 14:07:07 +01:00
#+end_note
2021-02-10 15:14:14 +01:00
In this document, we wish to characterize the performances of the encoder measurement system.
2020-12-16 14:07:07 +01:00
In particular, we would like to measure:
2021-02-10 15:14:14 +01:00
- 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]].
2020-12-16 11:51:26 +01:00
2021-01-04 11:44:11 +01:00
#+name: fig:encoder_vionic
#+caption: Picture of the Vionic Encoder
2021-02-02 18:46:58 +01:00
#+attr_latex: :width 0.6\linewidth
2021-01-04 11:44:11 +01:00
[[file:figs/encoder_vionic.png]]
2021-02-10 15:14:14 +01:00
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* |
|-------------------+--------------+-----------------|
2021-02-11 10:09:23 +01:00
| Time Delay | < 10 ns | < 0.5 ms |
2021-02-10 15:14:14 +01:00
| Bandwidth | > 500 kHz | > 5 kHz |
| Noise | < 1.6 nm rms | < 50 nm rms |
| Linearity | < +/- 15 nm | |
| Range | Ruler length | > 200 um |
2021-02-03 10:16:49 +01:00
2020-12-16 11:51:26 +01:00
* Encoder Model
2021-02-10 15:14:14 +01:00
<<sec:encoder_model>>
2020-12-16 11:51:26 +01:00
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.
2021-02-10 15:14:14 +01:00
It is also characterized by its measurement noise $n$ that can be described by its Power Spectral Density (PSD) $\Gamma_n(\omega)$.
2020-12-16 11:51:26 +01:00
2020-12-16 14:07:07 +01:00
The model of the encoder is shown in Figure [[fig:encoder-model-schematic]].
2020-12-16 11:51:26 +01:00
#+begin_src latex :file encoder-model-schematic.pdf
\begin{tikzpicture}
\node[block] (G) at (0,0){$G_m(s)$};
\node[addb, left=0.8 of G] (add){};
\draw[<-] (add.west) -- ++(-1.0, 0) node[above right]{$y$};
\draw[->] (add.east) -- (G.west);
\draw[->] (G.east) -- ++(1.0, 0) node[above left]{$y_m$};
\draw[<-] (add.north) -- ++(0, 0.6) node[below right](n){$n$};
\begin{scope}[on background layer]
\node[fit={(add.west|-G.south) (n.north-|G.east)}, inner sep=8pt, draw, dashed, fill=black!20!white] (P) {};
\node[below left] at (P.north east) {Encoder};
\end{scope}
\end{tikzpicture}
#+end_src
#+name: fig:encoder-model-schematic
#+caption: Model of the Encoder
#+RESULTS:
[[file:figs/encoder-model-schematic.png]]
2021-02-02 18:46:58 +01:00
We can also use a transfer function $G_n(s)$ to shape a noise $\tilde{n}$ with unity ASD as shown in Figure [[fig:vionic_expected_noise]].
#+begin_src latex :file encoder-model-schematic-with-asd.pdf
\begin{tikzpicture}
\node[block] (G) at (0,0){$G_m(s)$};
\node[addb, left=0.8 of G] (add){};
\node[block, above=0.5 of add] (Gn) {$G_n(s)$};
\draw[<-] (add.west) -- ++(-1.0, 0) node[above right]{$y$};
\draw[->] (add.east) -- (G.west);
\draw[->] (G.east) -- ++(1.0, 0) node[above left]{$y_m$};
\draw[->] (Gn.south) -- (add.north) node[above right]{$n$};
\draw[<-] (Gn.north) -- ++(0, 0.6) node[below right](n){$\tilde{n}$};
\begin{scope}[on background layer]
\node[fit={(Gn.west|-G.south) (n.north-|G.east)}, inner sep=8pt, draw, dashed, fill=black!20!white] (P) {};
\node[below left] at (P.north east) {Encoder};
\end{scope}
\end{tikzpicture}
#+end_src
#+RESULTS:
[[file:figs/encoder-model-schematic-with-asd.png]]
2020-12-17 14:54:16 +01:00
2021-02-02 18:46:58 +01:00
* Noise Measurement
<<sec:noise_measurement>>
2021-02-11 15:22:02 +01:00
** Introduction :ignore:
This part is structured as follow:
- Section [[sec:noise_bench]]: the measurement bench is described
- Section [[sec:thermal_drifts]]: long measurement is performed to estimate the low frequency drifts in the measurement
- Section [[sec:vionic_noise_time]]: high frequency measurements are performed to estimate the high frequency noise
- Section [[sec:noise_asd]]: the Spectral density of the measurement noise is estimated
- Section [[sec:vionic_noise_model]]: finally, the measured noise is modeled
2021-02-02 18:46:58 +01:00
** Test Bench
2021-02-11 15:22:02 +01:00
<<sec:noise_bench>>
2020-12-16 11:51:26 +01:00
2020-12-16 14:07:07 +01:00
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$.
2020-12-16 11:51:26 +01:00
2021-02-12 18:26:24 +01:00
The measurement bench is shown in Figures [[fig:meas_bench_top_view]] and [[fig:meas_bench_side_view]].
Note that the bench is then covered with a "plastic bubble sheet" in order to keep disturbances as small as possible.
#+name: fig:meas_bench_top_view
#+caption: Top view picture of the measurement bench
#+attr_latex: :width 0.8\linewidth
[[file:figs/IMG_20210211_170554.jpg]]
#+name: fig:meas_bench_side_view
#+caption: Side view picture of the measurement bench
#+attr_latex: :width 0.8\linewidth
[[file:figs/IMG_20210211_170607.jpg]]
2021-02-02 18:46:58 +01:00
** Matlab Init :noexport:ignore:
2021-02-02 18:25:28 +01:00
#+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
2021-02-11 15:22:02 +01:00
** Thermal drifts
<<sec:thermal_drifts>>
Measured displacement were recording during approximately 40 hours with a sample frequency of 100Hz.
A first order low pass filter with a corner frequency of 1Hz
2021-02-10 15:14:14 +01:00
2021-02-11 10:09:23 +01:00
#+begin_src matlab
2021-02-11 15:22:02 +01:00
enc_l = load('mat/noise_meas_40h_100Hz_1.mat', 't', 'x');
#+end_src
The measured time domain data are shown in Figure [[fig:vionic_drifts_time]].
#+begin_src matlab :exports none
enc_l.x = enc_l.x(enc_l.t > 5); % Remove first 5 seconds
enc_l.t = enc_l.t(enc_l.t > 5); % Remove first 5 seconds
enc_l.t = enc_l.t - enc_l.t(1); % Start at 0
2021-02-11 10:09:23 +01:00
enc_l.x = enc_l.x - mean(enc_l.x(enc_l.t < 1)); % Start at zero displacement
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(enc_l.t/3600, 1e9*enc_l.x, '-');
hold off;
xlabel('Time [h]');
ylabel('Displacement [nm]');
2021-02-11 15:22:02 +01:00
xlim([0, 40]);
2021-02-11 10:09:23 +01:00
#+end_src
2021-02-11 15:22:02 +01:00
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_drifts_time.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:vionic_drifts_time
#+caption: Measured thermal drifts
#+RESULTS:
[[file:figs/vionic_drifts_time.png]]
2021-02-11 10:09:23 +01:00
2021-02-11 15:22:02 +01:00
The measured data seems to experience a constant drift after approximately 20 hour.
Let's estimate this drift.
2021-02-11 10:09:23 +01:00
2021-02-11 15:22:02 +01:00
#+begin_src matlab :exports none
t0 = 20*3600; % Start time [s]
x_stab = enc_l.x(enc_l.t > t0);
x_stab = x_stab - x_stab(1);
t_stab = enc_l.t(enc_l.t > t0);
t_stab = t_stab - t_stab(1);
2021-02-11 10:09:23 +01:00
#+end_src
#+begin_src matlab :results value replace :exports results
2021-02-11 15:22:02 +01:00
sprintf('The mean drift is approximately %.1f [nm/hour] or %.1f [nm/min]', 3600*1e9*(t_stab\x_stab), 60*1e9*(t_stab\x_stab))
2021-02-11 10:09:23 +01:00
#+end_src
2021-02-11 15:22:02 +01:00
#+RESULTS:
: The mean drift is approximately 60.9 [nm/hour] or 1.0 [nm/min]
Comparison between the data and the linear fit is shown in Figure [[fig:vionic_drifts_linear_fit]].
2021-02-11 10:09:23 +01:00
#+begin_src matlab :exports none
figure;
hold on;
2021-02-11 15:22:02 +01:00
plot(t_stab/3600, 1e9*x_stab, '-');
plot(t_stab/3600, 1e9*t_stab*(t_stab\x_stab), 'k--');
2021-02-11 10:09:23 +01:00
hold off;
2021-02-11 15:22:02 +01:00
xlabel('Time [h]');
ylabel('Displacement [nm]');
xlim([0, 20]);
2021-02-11 10:09:23 +01:00
#+end_src
2021-02-11 15:22:02 +01:00
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_drifts_linear_fit.pdf', 'width', 'wide', 'height', 'normal');
2021-02-11 10:09:23 +01:00
#+end_src
2021-02-11 15:22:02 +01:00
#+name: fig:vionic_drifts_linear_fit
#+caption: Measured drift and linear fit
#+RESULTS:
[[file:figs/vionic_drifts_linear_fit.png]]
Let's now estimate the Power Spectral Density of the measured displacement.
The obtained low frequency ASD is shown in Figure [[fig:vionic_noise_asd_low_freq]].
2021-02-11 10:09:23 +01:00
#+begin_src matlab :exports none
% Compute sampling Frequency
2021-02-11 15:22:02 +01:00
Ts = (enc_l.t(end) - enc_l.t(1))/(length(enc_l.t)-1);
2021-02-11 10:09:23 +01:00
Fs = 1/Ts;
% Hannning Windows
2021-02-11 15:22:02 +01:00
win = hanning(ceil(60*10/Ts));
2021-02-11 10:09:23 +01:00
2021-02-11 15:22:02 +01:00
[pxx_l, f_l] = pwelch(x_stab, win, [], [], Fs);
2021-02-11 10:09:23 +01:00
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
2021-02-11 15:22:02 +01:00
plot(f_l, sqrt(pxx_l))
2021-02-11 10:09:23 +01:00
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
2021-02-11 15:22:02 +01:00
xlim([1e-2, 1e0]);
ylim([1e-11, 1e-8]);
2021-02-11 10:09:23 +01:00
#+end_src
2021-02-11 15:22:02 +01:00
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_noise_asd_low_freq.pdf', 'width', 'side', 'height', 'normal');
#+end_src
#+name: fig:vionic_noise_asd_low_freq
#+caption: Amplitude Spectral density of the measured displacement
#+RESULTS:
[[file:figs/vionic_noise_asd_low_freq.png]]
2021-02-10 15:14:14 +01:00
** Time Domain signals
2021-02-11 15:22:02 +01:00
<<sec:vionic_noise_time>>
Then, and for all the 7 encoders, we record the measured motion during 100s with a sampling frequency of 20kHz.
2021-02-04 20:23:22 +01:00
#+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
2021-02-02 18:25:28 +01:00
#+end_src
#+begin_src matlab :exports none
%% Remove initial offset
2021-02-04 20:23:22 +01:00
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]].
2021-02-02 18:46:58 +01:00
#+begin_src matlab :exports none
2021-02-02 18:25:28 +01:00
figure;
hold on;
2021-02-04 20:23:22 +01:00
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');
2021-02-02 18:25:28 +01:00
hold off;
xlabel('Time [s]');
ylabel('Displacement [nm]');
legend('location', 'northwest');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_noise_raw_lpf.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:vionic_noise_raw_lpf
#+caption: Time domain measurement (raw data and low pass filtered data with first order 10Hz LPF)
#+RESULTS:
[[file:figs/vionic_noise_raw_lpf.png]]
The time domain data for all the encoders are compared in Figure [[fig:vionic_noise_time]].
2021-02-11 15:22:02 +01:00
We can see some drifts that are in the order of few nm to 20nm per minute.
As shown in Section [[sec:thermal_drifts]], these drifts should diminish over time down to 1nm/min.
#+begin_src matlab :exports none
figure;
hold on;
2021-02-04 20:23:22 +01:00
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]');
legend('location', 'northwest');
2021-02-02 18:25:28 +01:00
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_noise_time.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:vionic_noise_time
#+caption: Comparison of the time domain measurement
2021-02-02 18:25:28 +01:00
#+RESULTS:
[[file:figs/vionic_noise_time.png]]
2021-02-10 15:14:14 +01:00
** Noise Spectral Density
2021-02-11 15:22:02 +01:00
<<sec:noise_asd>>
The amplitude spectral densities for all the encoder are computed and shown in Figure [[fig:vionic_noise_asd]].
2021-02-02 18:25:28 +01:00
#+begin_src matlab :exports none
% Compute sampling Frequency
2021-02-10 15:14:14 +01:00
Ts = (enc{1}.t(end) - enc{1}.t(1))/(length(enc{1}.t)-1);
2021-02-02 18:25:28 +01:00
Fs = 1/Ts;
% Hannning Windows
win = hanning(ceil(0.5/Ts));
2021-02-04 20:23:22 +01:00
[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
2021-02-02 18:25:28 +01:00
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
2021-02-04 20:23:22 +01:00
for i=1:7
plot(f, sqrt(enc{i}.pxx), ...
'DisplayName', sprintf('Enc %i', i));
end
2021-02-02 18:25:28 +01:00
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
xlim([10, Fs/2]);
2021-02-11 15:22:02 +01:00
ylim([1e-11, 1e-9]);
legend('location', 'northeast');
2021-02-02 18:25:28 +01:00
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_noise_asd.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:vionic_noise_asd
#+caption: Amplitude Spectral Density of the measured signal
#+RESULTS:
[[file:figs/vionic_noise_asd.png]]
2021-02-11 15:22:02 +01:00
We can combine these measurements with the low frequency noise computed in Section [[sec:thermal_drifts]].
The obtained ASD is shown in Figure [[fig:vionic_noise_asd_combined]].
#+begin_src matlab :exports none
[pxx_h, f_h] = pwelch(enc{2}.x, hanning(ceil(10/Ts)), [], [], Fs);
figure;
hold on;
plot(f_h(f_h>0.6), sqrt(pxx_h(f_h>0.6)), 'k-');
plot(f_l(f_l<1), sqrt(pxx_l(f_l<1)), 'k-')
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
xlim([1e-2, Fs/2]);
ylim([1e-12, 1e-8]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_noise_asd_combined.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:vionic_noise_asd_combined
#+caption: Combined low frequency and high frequency noise measurements
#+RESULTS:
[[file:figs/vionic_noise_asd_combined.png]]
2021-02-10 15:14:14 +01:00
** Noise Model
2021-02-11 15:22:02 +01:00
<<sec:vionic_noise_model>>
2021-02-02 18:25:28 +01:00
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);
2021-02-02 18:25:28 +01:00
#+end_src
2021-02-02 18:46:58 +01:00
The amplitude of the transfer function and the measured ASD are shown in Figure [[fig:vionic_noise_asd_model]].
2021-02-02 18:25:28 +01:00
#+begin_src matlab :exports none
figure;
hold on;
2021-02-11 15:22:02 +01:00
plot(f, sqrt(enc{1}.pxx), 'color', [0, 0, 0, 0.5], 'DisplayName', '$\Gamma_n(\omega)$');
2021-02-04 20:23:22 +01:00
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)|$');
2021-02-02 18:25:28 +01:00
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD [$m/\sqrt{Hz}$]');
xlim([10, Fs/2]);
ylim([1e-11, 1e-10]);
legend('location', 'northeast');
2021-02-02 18:25:28 +01:00
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/vionic_noise_asd_model.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:vionic_noise_asd_model
2021-02-10 15:14:14 +01:00
#+caption: Measured ASD of the noise and modeled one
2021-02-02 18:25:28 +01:00
#+RESULTS:
[[file:figs/vionic_noise_asd_model.png]]
2021-02-10 15:14:14 +01:00
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]]
2021-02-02 18:46:58 +01:00
* Linearity Measurement
<<sec:linearity_measurement>>
** Test Bench
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 actuator should also be there so impose a displacement.
One idea is to use the test-bench shown in Figure [[fig:test_bench_encoder_calibration]].
The APA300ML is used to excite the mass in a broad bandwidth.
The motion is measured at the same time by the Vionic Encoder and by an interferometer (most likely an Attocube).
As the interferometer has a very large bandwidth, we should be able to estimate the bandwidth of the encoder if it is less than the Nyquist frequency that can be around 10kHz.
#+name: fig:test_bench_encoder_calibration
#+caption: Schematic of the test bench
[[file:figs/test_bench_encoder_calibration.png]]
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<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