dcm-metrology/dcm-metrology.org
2022-02-15 14:25:31 +01:00

40 KiB

ESRF Double Crystal Monochromator - Metrology


This report is also available as a pdf.


Introduction   ignore

In this document, the metrology system is studied. First, in Section sec:metrology_concept the goal of the metrology system is stated and the proposed concept is described. In order to increase the accuracy of the metrology system, two problems are to be dealt with:

Metrology Concept

<<sec:metrology_concept>>

Introduction   ignore

The goal of the metrology system is to measure the distance and default of parallelism orientation between the first and second crystals

Only 3 degrees of freedom are of interest:

  • $d_z$
  • $r_y$
  • $r_x$

Sensor Topology

In order to measure the relative pose of the two crystals, instead of performing a direct measurement which is complicated, the pose of the two crystals are measured from a metrology frame. Three interferometers are used to measured the 3dof of interest for each crystals. Three additional interferometers are used to measured the relative motion of the metrology frame.

Notation Meaning
d "Downstream": Positive X
u "Upstream": Negative X
h "Hall": Positive Y
r "Ring": Negative Y
f "Frame"
1 "First Crystals"
2 "Second Crystals"
/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/metrology_schematic.png
Schematic of the Metrology System

Crystal's motion computation

From the raw interferometric measurements, the pose between the first and second crystals can be computed.

First, Jacobian matrices can be used to convert raw interferometer measurements to axial displacement and orientation of the crystals and metrology frame.

For the 311 crystals:

Notation Description
um Metrology Frame - Upstream
dhm Metrology Frame - Downstream Hall
drm Metrology Frame - Downstream Ring
ur1 First Crystal - Upstream Ring
h1 First Crystal - Hall
dr1 First Crystal - Downstream Ring
ur2 First Crystal - Upstream Ring
h2 First Crystal - Hall
dr2 First Crystal - Downstream Ring
Notation Description
dzm Positive: increase of distance
rym
rxm
dz1 Positive: decrease of distance
ry1
rx1
dz2 Positive: increase of distance
ry2
rx2
\begin{tikzpicture}
  % Blocs
  \node[block] (Js_inv) {$\bm{J}_{s,m}^{-1}$};

  % Connections and labels
  \draw[->] ($(Js_inv.west)+(-1.5,0)$) node[above right]{$\begin{bmatrix} u_{m} \\ dh_{m} \\ dr_{m} \end{bmatrix}$} -- (Js_inv.west);
  \draw[->] (Js_inv.east)  -- ++(1.5, 0) node[above left]{$\begin{bmatrix} d_{zm} \\ r_{ym} \\ r_{xm} \end{bmatrix}$};
\end{tikzpicture}

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/schematic_sensor_jacobian_forward_kinematics_m.png

Forward Kinematics for the Metrology frame
\begin{tikzpicture}
  % Blocs
  \node[block] (Js_inv) {$\bm{J}_{s,1}^{-1}$};

  % Connections and labels
  \draw[->] ($(Js_inv.west)+(-1.5,0)$) node[above right]{$\begin{bmatrix} u_{r1} \\ h_1 \\ d_{r1} \end{bmatrix}$} -- (Js_inv.west);
  \draw[->] (Js_inv.east)  -- ++(1.5, 0) node[above left]{$\begin{bmatrix} d_{z1} \\ r_{y1} \\ r_{x1} \end{bmatrix}$};
\end{tikzpicture}

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/schematic_sensor_jacobian_forward_kinematics_1.png

Forward Kinematics for the 1st crystal
\begin{tikzpicture}
  % Blocs
  \node[block] (Js_inv) {$\bm{J}_{s,2}^{-1}$};

  % Connections and labels
  \draw[->] ($(Js_inv.west)+(-1.5,0)$) node[above right]{$\begin{bmatrix} u_{r2} \\ h_2 \\ d_{r2} \end{bmatrix}$} -- (Js_inv.west);
  \draw[->] (Js_inv.east)  -- ++(1.5, 0) node[above left]{$\begin{bmatrix} d_{z2} \\ r_{y2} \\ r_{x2} \end{bmatrix}$};
\end{tikzpicture}

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/schematic_sensor_jacobian_forward_kinematics_2.png

Forward Kinematics for the 2nd crystal

Then, the displacement and orientations can be combined as follows:

\begin{align} d_{z} &= + d_{z1} - d_{z2} + d_{zm} \\ d_{r_y} &= - r_{y1} + r_{y2} - r_{ym} \\ d_{r_x} &= - r_{x1} + r_{x2} - r_{xm} \end{align}

Therefore:

  • $d_z$ represents the distance between the two crystals
  • $d_{r_y}$ represents the rotation of the second crystal w.r.t. the first crystal around $y$ axis
  • $d_{r_x}$ represents the rotation of the second crystal w.r.t. the first crystal around $x$ axis

If $d_{r_y}$ is positive, the second crystal has a positive rotation around $y$ w.r.t. the first crystal. Therefore, the second crystal should be actuated such that it is making a negative rotation around $y$ w.r.t. metrology frame.

The Jacobian matrices are defined as follow:

%% Sensor Jacobian matrix for the metrology frame
J_m = [1,  0.102,  0
       1, -0.088,  0.1275
       1, -0.088, -0.1275];

%% Sensor Jacobian matrix for 1st "111" crystal
J_s_111_1 = [-1, -0.036, -0.015
             -1,  0,      0.015
             -1,  0.036, -0.015];

%% Sensor Jacobian matrix for 2nd "111" crystal
J_s_111_2 = [1,  0.07,  0.015
             1,  0,    -0.015
             1, -0.07,  0.015];

Therefore, the matrix that gives the relative pose of the crystal from the 9 interferometers is:

%% Compute the transformation matrix
G_111_t = [-inv(J_s_111_1), inv(J_s_111_2), -inv(J_m)];

% Sign convention for the axial motion
G_111_t(1,:) = -G_111_t(1,:);
ur1 [nm] h1 [nm] dr1 [nm] ur2 [nm] h2 [nm] dr1 [nm] um [nm] dhm [nm] drm [nm]
dz [nm] -0.25 -0.5 -0.25 -0.25 -0.5 -0.25 0.463 0.268 0.268
rx [nrad] 13.889 0.0 -13.889 7.143 0.0 -7.143 -5.263 2.632 2.632
ry [nrad] 16.667 -33.333 16.667 16.667 -33.333 16.667 0.0 -3.922 3.922

From table fig:schematic_sensor_jacobian_forward_kinematics_2, we can determine the effect of each interferometer on the estimated relative pose between the crystals. For instance, an error on dr1 will have much greater impact on ry than an error on drm.

Relation Between Crystal position and X-ray measured displacement

Setup

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/calibration_setup.png
Schematic of the setup

Detector:

https://www.baslerweb.com/en/products/cameras/area-scan-cameras/ace/aca1920-40gc/

Pixel size depends on the magnification used (1x, 6x, 12x).

Pixel size of camera is 5.86 um x 5.86 um. With typical magnification of 6x, pixel size is ~1.44um x 1.44um

Frame rate is: 42 fps

Relation between second crystal motion and beam motion

Axial motion of second crystal

Let's consider the relation between the $[y, z]$ motion of the beam and the motion of the second crystal $[z^\prime, R_{y^\prime}, R_{x^\prime}]$.

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/relation_dz_output_beam.png
Relation between $d_{z^\prime}$ motion of the second crystal and vertical motion of the beam
\begin{equation} d_z = d_{z^\prime} 2 \cos \theta \end{equation}

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/relation_vert_motion_crystal_beam.png

Relation between vertical motion of the second crystal and vertical motion of the output beam

Ry motion of second crystal

\begin{equation} d_z = D_{\text{vlm}} d_{R_y^\prime} \end{equation}

with $D_{\text{vlm}} \approx 10\,m$.

Rx motion of second crystal

\begin{equation} d_y = 2 D_{\text{vlm}} \sin \theta \cdot d_{R_x^\prime} \end{equation}

Deformations of the Metrology Frame

<<sec:frame_deformations>>

Introduction   ignore

The transformation matrix in Table tab:transformation_matrix is valid only if the metrology frames are solid bodies.

The metrology frame itself is experiencing some deformations due to the gravity. When the bragg axis is scanned, the effect of gravity on the metrology frame is changing and this introduce some measurement errors.

This can be calibrated.

Measurement Setup

Two beam viewers:

  • one close to the DCM to measure position of the beam
  • one far away to the DCM to measure orientation of the beam

For each Bragg angle, the Fast Jacks are actuated to that the beam is at the center of the beam viewer. Then, then position of the crystals as measured by the interferometers is recorded. This position is the wanted position for a given Bragg angle.

Simulations

The deformations of the metrology frame and therefore the expected interferometric measurements can be computed as a function of the Bragg angle. This may be done using FE software.

Comparison

Test

aa = importdata("correctInterf-vlm-220201.dat");
figure;
plot(aa.data(:,1), aa.data(:,24))

Measured frame deformation

data = table2array(readtable('itf_polynom.csv','NumHeaderLines',1));
th = pi/180*data(:,1); % [rad]
fj = 0.030427 - 10.51e-3./(2*cos(th)); % [m]
rx2 = 1e-9*data(:,2); % [rad]
ry2 = 1e-9*data(:,3); % [rad]
rx1 = 1e-9*data(:,4); % [rad]
ry1 = 1e-9*data(:,5); % [rad]
figure;
hold on;
plot(180/pi*th, 1e6*detrend(-rx2, 1), '.')
% plot(180/pi*th, detrend(ry2, 1))
% plot(180/pi*th, detrend(rx1, 1))
% plot(180/pi*th, detrend(ry1, 1))
hold off;
xlabel('Bragg Angle [deg]');
ylabel('Measured $R_x$ [$\mu$rad]')
xlim([10, 75]);

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/calibration_drx_pres.png

description

Strange that there is correlation between Rx and Ry.

figure;
hold on;
plot(108/pi*th, 1e9*detrend(rx1, 0), '-', 'DisplayName', '$Rx_1$')
plot(108/pi*th, 1e9*detrend(ry1, 0), '-', 'DisplayName', '$Ry_1$')
hold off;
xlabel('Bragg Angle [deg]'); ylabel('Angle Offset [nrad]');
legend()
figure;
hold on;
plot(1e3*fj, detrend(rx2, 1), 'DisplayName', '$Rx_1$')
plot(1e3*fj, detrend(ry2, 1), 'DisplayName', '$Ry_1$')
hold off;
xlabel('Fast Jack Displacement [mm]'); ylabel('Angle Offset [nrad]');
legend()
%% Compute best polynomial fit
f_rx2 = fit(180/pi*th, 1e9*rx2, 'poly4');
f_ry2 = fit(180/pi*th, 1e9*ry2, 'poly4');
f_rx1 = fit(180/pi*th, 1e9*rx1, 'poly4');
f_ry1 = fit(180/pi*th, 1e9*ry1, 'poly4');
figure;
hold on;
plot(180/pi*th, f_rx2(180/pi*th))
plot(180/pi*th, f_ry2(180/pi*th))
plot(180/pi*th, f_rx1(180/pi*th))
plot(180/pi*th, f_ry1(180/pi*th))
hold off;
figure;
hold on;
plot(th, f_rx2(th) - rx2)
plot(th, f_ry2(th) - ry2)
plot(th, f_rx1(th) - rx1)
plot(th, f_ry1(th) - ry1)
hold off;
figure;
hold on;
plot(th, f(th))
plot(th, rx2, '.')

Test

filename = "/home/thomas/mnt/data_id21/22Jan/blc13550/id21/test_xtal1_interf/test_xtal1_interf_0001/test_xtal1_interf_0001.h5";
data = struct();

data.xtal1_111_u = double(h5read(filename, '/7.1/instrument/FPGA1_SSIM4/data'));
data.xtal1_111_m = double(h5read(filename, '/7.1/instrument/FPGA1_SSIM5/data'));
data.xtal1_111_d = double(h5read(filename, '/7.1/instrument/FPGA1_SSIM6/data'));
data.mframe_u = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM3/data'));
data.mframe_dh = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM4/data'));
data.mframe_dr = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM5/data'));
data.bragg = (pi/180)*double(h5read(filename, '/7.1/instrument/FPGA2_SSIM6/data'));
data.fj_pos = 0.030427 - 10.5e-3./(2*cos(data.bragg));
data.time  = double(h5read(filename, '/7.1/instrument/time/data'));
data.rx    = 1e-9*double(h5read(filename, '/7.1/instrument/xtal1_111_rx/data'));
data.ry    = 1e-9*double(h5read(filename, '/7.1/instrument/xtal1_111_ry/data'));
data.z     = 1e-9*double(h5read(filename, '/7.1/instrument/xtal1_111_z/data'));
data.drx   = 1e-9*double(h5read(filename, '/7.1/instrument/xtal_111_drx_filter/data'));
data.dry   = 1e-9*double(h5read(filename, '/7.1/instrument/xtal_111_dry_filter/data'));
data.dz    = 1e-9*double(h5read(filename, '/7.1/instrument/xtal_111_dz_filter/data'));
data.xtal2_111_u = double(h5read(filename, '/7.1/instrument/FPGA1_SSIM10/data'))+10.5e6./(2*cos(data.bragg));
data.xtal2_111_m = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM1/data'))+10.5e6./(2*cos(data.bragg));
data.xtal2_111_d = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM2/data'))+10.5e6./(2*cos(data.bragg));

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/drifts_xtal2_detrend.png

Drifts of the second crystal as a function of Bragg Angle
figure;
hold on;
plot(108/pi*data.bragg, data.drx)
plot(108/pi*data.bragg, data.dry)
hold off;

Repeatability of frame deformation

filename = "/home/thomas/mnt/data_id21/22Jan/blc13550/id21/test_xtal1_interf/test_xtal1_interf_0001/test_xtal1_interf_0001.h5";
data_1 = struct();
data_1.time  = double(h5read(filename, '/7.1/instrument/time/data'));
data_1.bragg = (pi/180)*double(h5read(filename, '/7.1/instrument/FPGA2_SSIM6/data'));
data_1.fj_pos = 0.030427 - 10.5e-3./(2*cos(data_1.bragg));
data_1.xtal1_111_u = double(h5read(filename, '/7.1/instrument/FPGA1_SSIM4/data'));
data_1.xtal1_111_m = double(h5read(filename, '/7.1/instrument/FPGA1_SSIM5/data'));
data_1.xtal1_111_d = double(h5read(filename, '/7.1/instrument/FPGA1_SSIM6/data'));
data_1.xtal2_111_u = double(h5read(filename, '/7.1/instrument/FPGA1_SSIM10/data'))+10.5e6./(2*cos(data_1.bragg));
data_1.xtal2_111_m = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM1/data'))+10.5e6./(2*cos(data_1.bragg));
data_1.xtal2_111_d = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM2/data'))+10.5e6./(2*cos(data_1.bragg));
data_1.mframe_u = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM3/data'));
data_1.mframe_dh = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM4/data'));
data_1.mframe_dr = double(h5read(filename, '/7.1/instrument/FPGA2_SSIM5/data'));
data_1.drx   = 1e-9*double(h5read(filename, '/7.1/instrument/xtal_111_drx_filter/data'));
data_1.dry   = 1e-9*double(h5read(filename, '/7.1/instrument/xtal_111_dry_filter/data'));
data_1.dz    = 1e-9*double(h5read(filename, '/7.1/instrument/xtal_111_dz_filter/data'));
data_2 = struct();
data_2.time  = double(h5read(filename, '/6.1/instrument/time/data'));
data_2.bragg = (pi/180)*double(h5read(filename, '/6.1/instrument/FPGA2_SSIM6/data'));
data_2.fj_pos = 0.030427 - 10.5e-3./(2*cos(data_2.bragg));
data_2.xtal1_111_u = double(h5read(filename, '/6.1/instrument/FPGA1_SSIM4/data'));
data_2.xtal1_111_m = double(h5read(filename, '/6.1/instrument/FPGA1_SSIM5/data'));
data_2.xtal1_111_d = double(h5read(filename, '/6.1/instrument/FPGA1_SSIM6/data'));
data_2.xtal2_111_u = double(h5read(filename, '/6.1/instrument/FPGA1_SSIM10/data'))+10.5e6./(2*cos(data_2.bragg));
data_2.xtal2_111_m = double(h5read(filename, '/6.1/instrument/FPGA2_SSIM1/data'))+10.5e6./(2*cos(data_2.bragg));
data_2.xtal2_111_d = double(h5read(filename, '/6.1/instrument/FPGA2_SSIM2/data'))+10.5e6./(2*cos(data_2.bragg));
data_2.mframe_u = double(h5read(filename, '/6.1/instrument/FPGA2_SSIM3/data'));
data_2.mframe_dh = double(h5read(filename, '/6.1/instrument/FPGA2_SSIM4/data'));
data_2.mframe_dr = double(h5read(filename, '/6.1/instrument/FPGA2_SSIM5/data'));
data_2.drx   = 1e-9*double(h5read(filename, '/6.1/instrument/xtal_111_drx_filter/data'));
data_2.dry   = 1e-9*double(h5read(filename, '/6.1/instrument/xtal_111_dry_filter/data'));
data_2.dz    = 1e-9*double(h5read(filename, '/6.1/instrument/xtal_111_dz_filter/data'));

Attocube - Periodic Non-Linearity

<<sec:dcm_attocube_lut>>

Introduction   ignore

Interferometers have some periodic nonlinearity [cite:@thurner15_fiber_based_distan_sensin_inter]. The period is a fraction of the wavelength (usually $\lambda/2$) and can be due to polarization mixing, non perfect alignment of the optical components and unwanted reflected beams [cite:See @ducourtieux18_towar_high_precis_posit_contr page 67 to 69;@thurner15_fiber_based_distan_sensin_inter;]. The amplitude of the nonlinearity can vary from a fraction of a nanometer to tens of nanometers.

In the DCM case, when using Attocube interferometers, the period non-linearity are in the order of several nanometers with a period of $765\,nm$. This is inducing some positioning errors which are too high.

In order to overcome this issue, the periodic non-linearity of the interferometers have to be calibrated. To do so, a displacement is imposed and measured both by the interferometers and by another metrology system which does not have this nonlinearity. By comparing the two measured displacements, the nonlinearity can be calibration. This process is performed over several periods in order to characterize the error over the full stroke.

Measurement Setup

The metrology that will be compared with the interferometers are the strain gauges incorporated in the PI piezoelectric stacks.

It is here supposed that the measured displacement by the strain gauges are converted to the displacement at the interferometer locations. It is also supposed that we are at a certain Bragg angle, and that the stepper motors are not moving: only the piezoelectric actuators are used.

Note that the strain gauges are measuring the relative displacement of the piezoelectric stacks while the interferometers are measuring the relative motion between the second crystals and the metrology frame.

Only the interferometers measuring the second crystal motion can be calibrated here.

As any deformations of the metrology frame of deformation of the crystal's support can degrade the quality of the calibration, it is better to perform this calibration without any bragg angle motion.

The setup is schematically with the block diagram in Figure fig:block_diagram_lut_attocube.

The signals are:

  • $u$: Reference Signal sent to the PI controller (position where we wish to three stacks to be). The PI controller takes care or controlling to position as measured by the strain gauges such that it is close to the reference position.
  • $d$: Disturbances affecting the position of the crystals
  • $y$: Displacement of the crystal as measured by one interferometer
  • $y_g$: Measurement of the motion in the frame of the interferometer by the strain gauge with some noise $n_g$
  • $y_a$: Measurement of the crystal motion by the interferometer with some noise $n_a$
\definecolor{myblue}{rgb}{0, 0.447, 0.741}
\definecolor{myred}{rgb}{0.8500, 0.325, 0.098}

\begin{tikzpicture}
  \node[block] (G) at (0,0){$G(s)$};
  \node[block, align=center, right=1 of G] (non_linearity) {Periodic\\Non-linearity};
  \node[addb, right=1 of non_linearity] (addna) {};
  \node[addb, below=1.8 of addna] (addnsg) {};

  \draw[->] ($(G.west) + (-1.0, 0)$) node[above right]{$u$} -- (G.west);
  \draw[->] ($(G.north) + (0, 1.0)$) node[below right]{$d$} -- (G.north);
  \draw[->] (G.east) -- (non_linearity.west);
  \draw[->] (non_linearity.east) -- (addna.west);
  \draw[->] (addna.east) -- ++(1.2, 0) node[above left]{$y_a$};
  \draw[->] ($(addna.north) + (0, 1.0)$) node[below right](na){$n_a$} -- (addna.north);
  \draw[->] ($(G.east) + (0.4, 0)$)node[branch]{} node[above]{$y$} |- (addnsg.west);
  \draw[->] (addnsg.east) -- ++(1.2, 0) node[above left]{$y_g$};
  \draw[->] ($(addnsg.north) + (0, 1.0)$) node[below right](nsg){$n_{g}$} -- (addnsg.north);

  \begin{scope}[on background layer]
    \node[fit={(non_linearity.south west) (na.north east)}, fill=myblue!20!white, draw, inner sep=6pt] (attocube) {};
    \node[fit={(non_linearity.west|-addnsg.south) (nsg.north east)}, fill=myred!20!white, draw, inner sep=6pt] (straingauge) {};
    \node[below right] at (attocube.north west) {Attocube};
    \node[below right] at (straingauge.north west) {Strain Gauge};
  \end{scope}
\end{tikzpicture}

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/block_diagram_lut_attocube.png

Block Diagram schematic of the setup used to measure the periodic non-linearity of the Attocube

The problem is to estimate the periodic non-linearity of the Attocube from the imperfect measurements $y_a$ and $y_g$.

Choice of the reference signal

The main specifications for the reference signal are;

  • sweep several periods (i.e. several micrometers)
  • stay in the linear region of the strain gauge
  • no excitation of mechanical modes (i.e. the frequency content of the signal should be at low frequency)
  • no phase shift due to limited bandwidth of both the interferometers and the strain gauge
  • the full process should be quite fast

The travel range of the piezoelectric stacks is 15 micrometers, the resolution of the strain gauges is 0.3nm and the maximum non-linearity is 0.15%. If one non-linear period is swept (765nm), the maximum estimation error of the strain gauge is around 1nm.

Based on the above discussion, one suitable excitation signal is a sinusoidal sweep with a frequency of 10Hz.

Repeatability of the non-linearity

Instead of calibrating the non-linear errors of the interferometers over the full fast jack stroke (25mm), one can only calibrate the errors of one period.

For that, we need to make sure that the errors are repeatable from one period to the other and also the period should be very precisely estimated (i.e. the wavelength of the laser).

Also, the laser wavelength should be very stable (specified at 50ppb).

One way to precisely estimate the laser wavelength is to estimate the non linear errors of the interferometer at an initial position, and then to estimate the non linear errors at a large offset, say 10mm.

Simulation

Suppose we have a first approximation of the non-linear period.

period_est = 765e-9;  % Estimated period [m]

And suppose the real period of the non-linear errors is a little bit above (by 0.02nm):

period_err = 0.02e-9; % Error on the period estimation [m]
period_nl = period_est + period_err; % Period of the non-linear errors [m]

The non-linear errors are first estimated at the beginning of the stroke (Figure fig:non_linear_errors_start_stroke).

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/non_linear_errors_start_stroke.png

Estimation of the non-linear errors at the beginning of the stroke

From this only measurement, it is not possible to estimate with great accuracy the period of the error. To do so, the same measurement is performed with a stroke of several millimeters (Figure fig:non_linear_errors_middle_stroke).

It can be seen that there is an offset between the estimated and the measured errors. This is due to a mismatch between the estimated period and the true period of the error.

/tdehaeze/dcm-metrology/media/commit/6214a64b214738457501dcac6c8b48ee090dc74f/figs/non_linear_errors_middle_stroke.png

Estimated non-linear errors at a latter position

Suppose the non-linear error is characterized by a periodic function $\mathcal{E}$, to simplify let's take a sinusoidal function (this can be generalized by taking the fourier transform of the function):

\begin{equation} \mathcal{E}(x) = \sin\left(\frac{x}{\lambda}\right) \end{equation}

with $x$ the displacement and $\lambda$ the period of the error.

The measured error at $x_0$ is then:

\begin{equation} \mathcal{E}_m(x_0) = \sin\left( \frac{x_0}{\lambda} \right) \end{equation}

And the estimated one is:

\begin{equation} \mathcal{E}_e(x_0) = \sin \left( \frac{x_0}{\lambda_{\text{est}}} \right) \end{equation}

with $\lambda_{\text{est}}$ the estimated error's period.

From Figure fig:non_linear_errors_middle_stroke, we can see that there is an offset between the two curves. Let's call this offset $\epsilon_x$, we then have:

\begin{equation} \mathcal{E}_m(x_0) = \mathcal{E}_e(x_0 + \epsilon_x) \end{equation}

Which gives us:

\begin{equation} \sin\left( \frac{x_0}{\lambda} \right) = \sin \left( \frac{x_0 + \epsilon_x}{\lambda_{\text{est}}} \right) \end{equation}

Finally:

\begin{equation} \boxed{\lambda = \lambda_{\text{est}} \frac{x_0}{x_0 + \epsilon_x}} \end{equation}

The estimated delay is computed:

%% Estimation of the offset between the estimated and measured errors
i_period = stroke > 5e-3-period_nl/2 & stroke < 5e-3+period_nl/2;
epsilon_x = finddelay(nl_errors(i_period), est_errors(i_period)) % [m]
Estimated delay x0 is -120 [nm]

And the period $\lambda$ can be estimated:

%% Computation of the period [m]
period_fin = period_est * (5e-3)/(5e-3 + d_offset); % Estimated period after measurement [m]
The estimated period is 765.020 [nm]

And the results confirms that this method is working on paper.

When doing this computation, we suppose that there are at most one half period of offset between the estimated and the measured non-linear (to not have any ambiguity whether the estimated period is too large or too small). Mathematically this means that the displacement $x_0$ should be smaller than:

\begin{equation} x_0 < \frac{1}{2} \cdot \lambda \cdot \frac{\lambda}{\epsilon_\lambda} \end{equation}

With $\epsilon_\lambda$ the absolute estimation error of the period in meters.

For instance, if we estimate the error on the period to be less than 0.1nm, the maximum displacement is:

%% Estimated maximum stroke [m]
max_x0 = 0.5 * 765e-9 * (765e-9)/(0.1e-9);
The maximum stroke is 2.9 [mm]

Measurements

We have some constrains on the way the motion is imposed and measured:

  • We want the frequency content of the imposed motion to be at low frequency in order not to induce vibrations of the structure. We have to make sure the forces applied by the piezoelectric actuator only moves the crystal and not the fast jack below. Therefore, we have to move much slower than the first resonance frequency in the system.
  • As both $y_a$ and $y_g$ should have rather small noise, we have to filter them with low pass filters. The cut-off frequency of the low pass filter should be high as compared to the motion (to not induce any distortion) but still reducing sufficiently the noise. Let's say we want the noise to be less than 1nm ($6 \sigma$).

Suppose we have the power spectral density (PSD) of both $n_a$ and $n_g$.

  • Take the PSD of the Attocube
  • Take the PSD of the strain gauge
  • Using 2nd order low pass filter, estimate the required low pass filter cut-off frequency to have sufficiently low noise

Bibliography