2020-04-07 15:26:29 +02:00
#+TITLE : Determination of the optimal nano-hexapod's stiffness for reducing the effect of disturbances
:DRAWER:
#+STARTUP : overview
#+LANGUAGE : en
#+EMAIL : dehaeze.thomas@gmail.com
#+AUTHOR : Dehaeze Thomas
#+HTML_HEAD : <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
#+HTML_HEAD : <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
#+HTML_HEAD : <link rel="stylesheet" type="text/css" href="./css/zenburn.css"/>
#+HTML_HEAD : <script type="text/javascript" src="./js/jquery.min.js"></script>
#+HTML_HEAD : <script type="text/javascript" src="./js/bootstrap.min.js"></script>
#+HTML_HEAD : <script type="text/javascript" src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD : <script type="text/javascript" src="./js/readtheorg.js"></script>
#+HTML_MATHJAX : align: center tagside: right font: TeX
#+PROPERTY : header-args:matlab :session *MATLAB*
#+PROPERTY : header-args:matlab+ :comments org
#+PROPERTY : header-args:matlab+ :results none
#+PROPERTY : header-args:matlab+ :exports both
#+PROPERTY : header-args:matlab+ :eval no-export
#+PROPERTY : header-args:matlab+ :output-dir figs
#+PROPERTY : header-args:matlab+ :tangle ../matlab/optimal_stiffness.m
#+PROPERTY : header-args:matlab+ :mkdirp yes
#+PROPERTY : header-args:shell :eval no-export
#+PROPERTY : header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/thesis/latex/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+ :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:
* Introduction :ignore:
In this document is studied how the stiffness of the nano-hexapod will impact the effect of disturbances on the position error of the sample.
It is divided in the following sections:
- Section [[sec:psd_disturbances ]]: the disturbances are listed and their Power Spectral Densities (PSD) are shown
- Section [[sec:effect_disturbances ]]: the transfer functions from disturbances to the position error of the sample are computed for a wide range of nano-hexapod stiffnesses
- Section [[sec:granite_stiffness ]]:
- Section [[sec:open_loop_budget_error ]]: from both the PSD of the disturbances and the transfer function from disturbances to sample's position errors, we compute the resulting PSD and Cumulative Amplitude Spectrum (CAS)
- Section [[sec:closed_loop_budget_error ]]: from a simplistic model is computed the required control bandwidth to reduce the position error to acceptable values
* Disturbances
<<sec:psd_disturbances >>
** Introduction :ignore:
The main disturbances considered here are:
- $D_w$: Ground displacement in the $x$, $y$ and $z$ directions
- $F_{ty}$: Forces applied by the Translation stage in the $x$ and $z$ directions
- $F_{rz}$: Forces applied by the Spindle in the $z$ direction
- $F_d$: Direct forces applied at the center of mass of the Payload
The level of these disturbances has been identified form experiments which are detailed in [[file:disturbances.org ][this ]] document.
** 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
simulinkproject('../');
#+end_src
** Plots :ignore:
The measured Amplitude Spectral Densities (ASD) of these forces are shown in Figures [[fig:opt_stiff_dist_gm ]] and [[fig:opt_stiff_dist_fty_frz ]].
In this study, the expected frequency content of the direct forces applied to the payload is not considered.
#+begin_src matlab :exports none
load('./mat/dist_psd.mat', 'dist_f');
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(dist_f.f, sqrt(dist_f.psd_gm));
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('$\Gamma_{D_w}$ $\left[\frac{m}{\sqrt{Hz}}\right]$')
xlim([1, 500]);
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_dist_gm.pdf" :var figsize= "wide-normal" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+name : fig:opt_stiff_dist_gm
#+caption : Amplitude Spectral Density of the Ground Displacement ([[./figs/opt_stiff_dist_gm.png][png]], [[./figs/opt_stiff_dist_gm.pdf][pdf]])
[[file:figs/opt_stiff_dist_gm.png ]]
#+begin_src matlab :exports none
figure;
hold on;
plot(dist_f.f, sqrt(dist_f.psd_ty), 'DisplayName', '$F_ {T_y}$');
plot(dist_f.f, sqrt(dist_f.psd_rz), 'DisplayName', '$F_ {R_z}$');
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{F}{\sqrt{Hz}}\right]$')
legend('Location', 'southwest');
xlim([1, 500]);
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_dist_fty_frz.pdf" :var figsize= "wide-normal" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+name : fig:opt_stiff_dist_fty_frz
#+caption : Amplitude Spectral Density of the "parasitic" forces comming from the Translation stage and the spindle ([[./figs/opt_stiff_dist_fty_frz.png][png]], [[./figs/opt_stiff_dist_fty_frz.pdf][pdf]])
[[file:figs/opt_stiff_dist_fty_frz.png ]]
* Effect of disturbances on the position error
<<sec:effect_disturbances >>
** Introduction :ignore:
2020-04-07 15:58:26 +02:00
In this section, we use the Simscape model to identify the transfer function from disturbances to the position error of the sample.
We do that for a wide range of nano-hexapod stiffnesses and we compare the obtained results.
2020-04-07 15:26:29 +02:00
** 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
simulinkproject('../');
#+end_src
#+begin_src matlab
load('mat/conf_simulink.mat');
open('nass_model.slx')
#+end_src
2020-04-07 19:34:05 +02:00
2020-04-07 15:26:29 +02:00
** Initialization
We initialize all the stages with the default parameters.
#+begin_src matlab
initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc();
initializeMirror();
#+end_src
We use a sample mass of 10kg.
#+begin_src matlab
initializeSample('mass', 10);
#+end_src
2020-04-07 15:58:26 +02:00
We include gravity, and we use no controller.
2020-04-07 15:26:29 +02:00
#+begin_src matlab
initializeSimscapeConfiguration('gravity', true);
2020-04-07 15:58:26 +02:00
initializeController();
2020-04-07 15:26:29 +02:00
initializeDisturbances('enable', false);
initializeLoggingConfiguration('log', 'none');
#+end_src
** Identification
2020-04-07 15:58:26 +02:00
The considered inputs are:
2020-04-07 15:26:29 +02:00
- =Dwx= : Ground displacement in the $x$ direction
- =Dwy= : Ground displacement in the $y$ direction
- =Dwz= : Ground displacement in the $z$ direction
- =Fty_x= : Forces applied by the Translation stage in the $x$ direction
- =Fty_z= : Forces applied by the Translation stage in the $z$ direction
- =Frz_z= : Forces applied by the Spindle in the $z$ direction
- =Fd= : Direct forces applied at the center of mass of the Payload
2020-04-07 15:58:26 +02:00
The outputs are =Ex= , =Ey= , =Ez= , =Erx= , =Ery= , =Erz= which are the 3 positions and 3 orientations errors of the sample.
We initialize the set of the nano-hexapod stiffnesses, and for each of them, we identify the dynamics from defined inputs to defined outputs.
2020-04-07 15:26:29 +02:00
#+begin_src matlab
Ks = logspace(3,9,7); % [N/m]
#+end_src
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'nass_model';
%% Micro-Hexapod
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwx'); io_i = io_i + 1; % X Ground motion
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwy'); io_i = io_i + 1; % Y Ground motion
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwz'); io_i = io_i + 1; % Z Ground motion
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fty_x'); io_i = io_i + 1; % Parasitic force Ty - X
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fty_z'); io_i = io_i + 1; % Parasitic force Ty - Z
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Frz_z'); io_i = io_i + 1; % Parasitic force Rz - Z
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fd'); io_i = io_i + 1; % Direct forces
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'En'); io_i = io_i + 1; % Position Error
#+end_src
2020-04-07 15:58:26 +02:00
#+begin_src matlab :exports none
Gd = {zeros(length(Ks), 1)};
2020-04-07 15:26:29 +02:00
for i = 1:length(Ks)
initializeNanoHexapod('k', Ks(i));
% Run the linearization
G = linearize(mdl, io);
G.InputName = {'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
Gd(i) = {minreal(G)};
end
#+end_src
2020-04-07 15:58:26 +02:00
** Sensitivity to Stages vibration (Filtering)
The sensitivity the stage vibrations are displayed:
- Figure [[fig:opt_stiff_sensitivity_Frz ]]: sensitivity to vertical spindle vibrations
- Figure [[fig:opt_stiff_sensitivity_Fty_z ]]: sensitivity to vertical translation stage vibrations
- Figure [[fig:opt_stiff_sensitivity_Fty_x ]]: sensitivity to horizontal (x) translation stage vibrations
2020-04-07 15:26:29 +02:00
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
figure;
hold on;
for i = 1:length(Ks)
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
2020-04-07 15:58:26 +02:00
ylabel('Effect of $F_{rz}$ on $E_z$ [m/N]'); xlabel('Frequency [Hz]');
legend('location', 'southwest');
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_sensitivity_Frz.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 15:58:26 +02:00
#+name : fig:opt_stiff_sensitivity_Frz
#+caption : Sensitivity to Spindle vertical motion error ($F_{rz}$) to the vertical error position of the sample ($E_z$) ([[./figs/opt_stiff_sensitivity_Frz.png][png]], [[./figs/opt_stiff_sensitivity_Frz.pdf][pdf]])
[[file:figs/opt_stiff_sensitivity_Frz.png ]]
2020-04-07 15:26:29 +02:00
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
figure;
2020-04-07 15:58:26 +02:00
hold on;
for i = 1:length(Ks)
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Fty_z'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Effect of $F_{ty}$ on $E_z$ [m/N]'); xlabel('Frequency [Hz]');
legend('location', 'southwest');
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_sensitivity_Fty_z.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+name : fig:opt_stiff_sensitivity_Fty_z
#+caption : Sensitivity to Translation stage vertical motion error ($F_{ty,z}$) to the vertical error position of the sample ($E_z$) ([[./figs/opt_stiff_sensitivity_Fty_z.png][png]], [[./figs/opt_stiff_sensitivity_Fty_z.pdf][pdf]])
[[file:figs/opt_stiff_sensitivity_Fty_z.png ]]
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
2020-04-07 15:26:29 +02:00
2020-04-07 15:58:26 +02:00
figure;
2020-04-07 15:26:29 +02:00
hold on;
for i = 1:length(Ks)
2020-04-07 15:58:26 +02:00
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ex', 'Fty_x'), freqs, 'Hz'))), '-', ...
2020-04-07 15:26:29 +02:00
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
2020-04-07 15:58:26 +02:00
ylabel('Effect of $F_{ty}$ on $E_x$ [m/N]'); xlabel('Frequency [Hz]');
legend('location', 'northeast');
#+end_src
2020-04-07 15:26:29 +02:00
2020-04-07 15:58:26 +02:00
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_sensitivity_Fty_x.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+name : fig:opt_stiff_sensitivity_Fty_x
#+caption : Sensitivity to Translation stage $x$ motion error ($F_{ty,x}$) to the error position of the sample in the $x$ direction ($E_x$) ([[./figs/opt_stiff_sensitivity_Fty_x.png][png]], [[./figs/opt_stiff_sensitivity_Fty_x.pdf][pdf]])
[[file:figs/opt_stiff_sensitivity_Fty_x.png ]]
** Effect of Ground motion (Transmissibility).
The effect of Ground motion on the position error of the sample is shown in Figure [[fig:opt_stiff_sensitivity_Dw ]].
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
figure;
ax1 = subplot(1, 2, 1);
2020-04-07 15:26:29 +02:00
hold on;
for i = 1:length(Ks)
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ey', 'Dwy'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
2020-04-07 15:58:26 +02:00
ylabel('$E_y/D_ {wy}$ [m/m]'); xlabel('Frequency [Hz]');
2020-04-07 15:26:29 +02:00
2020-04-07 15:58:26 +02:00
ax2 = subplot(1, 2, 2);
2020-04-07 15:26:29 +02:00
hold on;
for i = 1:length(Ks)
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
2020-04-07 15:58:26 +02:00
ylabel('$E_z/D_ {wz}$ [m/m]'); xlabel('Frequency [Hz]');
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_sensitivity_Dw.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 15:58:26 +02:00
#+name : fig:opt_stiff_sensitivity_Dw
#+caption : Sensitivity to Ground motion ($D_{w}$) to the position error of the sample ($E_y$ and $E_z$) ([[./figs/opt_stiff_sensitivity_Dw.png][png]], [[./figs/opt_stiff_sensitivity_Dw.pdf][pdf]])
[[file:figs/opt_stiff_sensitivity_Dw.png ]]
** Direct Forces (Compliance).
The effect of direct forces/torques applied on the sample (cable forces for instance) on the position error of the sample is shown in Figure [[fig:opt_stiff_sensitivity_Fd ]].
2020-04-07 15:26:29 +02:00
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
figure;
2020-04-07 15:58:26 +02:00
ax1 = subplot(1, 2, 1);
hold on;
for i = 1:length(Ks)
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ery', 'Mdy'), freqs, 'Hz'))), '-');
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('$E_{ry}/M_ {d,y}\ \left[\frac{rad}{N m}\right]$'); xlabel('Frequency [Hz]');
ax2 = subplot(1, 2, 2);
2020-04-07 15:26:29 +02:00
hold on;
for i = 1:length(Ks)
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Fdz'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
2020-04-07 15:58:26 +02:00
ylabel('$E_{z}/F_ {d,z}$ [m/N]'); xlabel('Frequency [Hz]');
legend('location', 'northeast');
linkaxes([ax1 ax2], 'xy')
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_sensitivity_Fd.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 15:58:26 +02:00
#+name : fig:opt_stiff_sensitivity_Fd
#+caption : Sensitivity to Direct forces and torques applied to the sample ($F_d$, $M_d$) to the position error of the sample ([[./figs/opt_stiff_sensitivity_Fd.png][png]], [[./figs/opt_stiff_sensitivity_Fd.pdf][pdf]])
[[file:figs/opt_stiff_sensitivity_Fd.png ]]
** Save :noexport:
2020-04-07 15:26:29 +02:00
#+begin_src matlab
2020-04-07 15:58:26 +02:00
save('./mat/opt_stiffness_disturbances.mat', 'Ks', 'Gd')
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 15:58:26 +02:00
** Conclusion
#+begin_important
2020-04-07 17:10:39 +02:00
Reducing the nano-hexapod stiffness generally lowers the sensitivity to stages vibration but increases the sensitivity to ground motion and direct forces.
2020-04-07 15:58:26 +02:00
2020-04-07 17:10:39 +02:00
In order to conclude on the optimal stiffness that will yield the smallest sample vibration, one has to include the level of disturbances. This is done in Section [[sec:open_loop_budget_error ]].
2020-04-07 15:58:26 +02:00
#+end_important
2020-04-07 15:26:29 +02:00
* Effect of granite stiffness
<<sec:granite_stiffness >>
2020-04-07 17:10:39 +02:00
** Introduction :ignore:
In this section, we wish to see if a soft granite suspension could help in reducing the effect of disturbances on the position error of the sample.
2020-04-07 19:34:05 +02:00
** 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
simulinkproject('../');
#+end_src
2020-04-07 15:26:29 +02:00
** Analytical Analysis
2020-04-07 17:10:39 +02:00
*** Simple mass-spring-damper model
Let's consider the system shown in Figure [[fig:2dof_system_granite_stiffness ]] consisting of two stacked mass-spring-damper systems.
The bottom one represents the granite, and the top one all the positioning stages.
We want the smallest stage "deformation" $d = x^\prime - x$ due to ground motion $w$.
2020-04-07 15:26:29 +02:00
#+begin_src latex :file 2dof_system_granite_stiffness.pdf
\begin{tikzpicture}
% ====================
% Parameters
% ====================
\def\massw{2.2} % Width of the masses
\def\massh{0.8} % Height of the masses
\def\spaceh{1.2} % Height of the springs/dampers
\def\dispw{0.3} % Width of the dashed line for the displacement
\def\disph{0.5} % Height of the arrow for the displacements
\def\bracs{0.05} % Brace spacing vertically
\def\brach{-10pt} % Brace shift horizontaly
% ====================
% ====================
% Ground
% ====================
\draw (-0.5*\massw, 0) -- (0.5* \massw, 0);
\draw[dashed] (0.5*\massw, 0) -- ++(\dispw, 0) coordinate(dlow);
2020-04-07 17:10:39 +02:00
\draw[->] (0.5*\massw+0.5* \dispw, 0) -- ++(0, \disph) node[right]{$w$};
2020-04-07 15:26:29 +02:00
% ====================
% Micro Station
% ====================
\begin{scope}[shift={(0, 0)}]
% Mass
\draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5* \massw, \spaceh+\massh) node[pos=0.5]{$m$};
% Spring, Damper, and Actuator
2020-04-07 17:10:39 +02:00
\draw[spring] (-0.3*\massw, 0) -- (-0.3* \massw, \spaceh) node[midway, left=0.1]{$k$};
\draw[damper] ( 0.3*\massw, 0) -- ( 0.3* \massw, \spaceh) node[midway, left=0.2]{$c$};
2020-04-07 15:26:29 +02:00
% Displacements
\draw[dashed] (0.5*\massw, \spaceh) -- ++(\dispw, 0);
\draw[->] (0.5*\massw+0.5* \dispw, \spaceh) -- ++(0, \disph) node[right]{$x$};
% Legend
\draw[decorate, decoration={brace, amplitude=8pt}, xshift= \brach] %
2020-04-07 17:10:39 +02:00
(-0.5*\massw, \bracs) -- (-0.5* \massw, \spaceh+\massh-\bracs) %
node[midway,rotate=90,anchor=south,yshift=10pt,align=center]{Granite};
2020-04-07 15:26:29 +02:00
\end{scope}
% ====================
% Nano Station
% ====================
\begin{scope}[shift={(0, \spaceh+\massh)}]
% Mass
\draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5* \massw, \spaceh+\massh) node[pos=0.5]{$m^\prime$};
% Spring, Damper, and Actuator
2020-04-07 17:10:39 +02:00
\draw[spring] (-0.3*\massw, 0) -- (-0.3* \massw, \spaceh) node[midway, left=0.1]{$k^\prime$};
\draw[damper] ( 0.3*\massw, 0) -- ( 0.3* \massw, \spaceh) node[midway, left=0.2]{$c^\prime$};
2020-04-07 15:26:29 +02:00
% Displacements
\draw[dashed] (0.5*\massw, \spaceh) -- ++(\dispw, 0) coordinate(dhigh);
\draw[->] (0.5*\massw+0.5* \dispw, \spaceh) -- ++(0, \disph) node[right]{$x^\prime$};
% Legend
\draw[decorate, decoration={brace, amplitude=8pt}, xshift= \brach] %
2020-04-07 17:10:39 +02:00
(-0.5*\massw, \bracs) -- (-0.5* \massw, \spaceh+\massh-\bracs) %
node[midway,rotate=90,anchor=south,yshift=10pt,align=center]{Positioning\\Stages};
2020-04-07 15:26:29 +02:00
\end{scope}
\end{tikzpicture}
#+end_src
#+name : fig:2dof_system_granite_stiffness
2020-04-07 17:10:39 +02:00
#+caption : Mass Spring Damper system consisting of a granite and a positioning stage
2020-04-07 15:26:29 +02:00
#+RESULTS :
[[file:figs/2dof_system_granite_stiffness.png ]]
If we write the equation of motion of the system in Figure [[fig:2dof_system_granite_stiffness ]], we obtain:
\begin{align}
m^\prime s^2 x^\prime &= (c^\prime s + k^\prime) (x - x^\prime) \\
2020-04-07 17:10:39 +02:00
ms^2 x &= (c^\prime s + k^\prime) (x^\prime - x) + (cs + k) (w - x)
2020-04-07 15:26:29 +02:00
\end{align}
If we note $d = x^\prime - x$, we obtain:
\begin{equation}
2020-04-07 17:10:39 +02:00
\frac{d}{w} = \frac{-m^\prime s^2 (cs + k)}{ (m^\prime s^2 + c^\prime s + k^\prime) (ms^2 + cs + k) + m^\prime s^2(c^\prime s + k^\prime)}
2020-04-07 15:26:29 +02:00
\end{equation}
2020-04-07 17:10:39 +02:00
*** General Case
Let's now considering a general positioning stage defined by:
- $G^\prime(s) = \frac{F}{x}$: its mechanical "impedance"
- $D^\prime(s) = \frac{d}{x}$: its "deformation" transfer function
#+begin_src latex :file general_system_granite_stiffness.pdf
\begin{tikzpicture}
\def\massw{2.2} % Width of the masses
\def\massh{0.8} % Height of the masses
\def\spaceh{1.2} % Height of the springs/dampers
\def\dispw{0.3} % Width of the dashed line for the displacement
\def\disph{0.5} % Height of the arrow for the displacements
\def\bracs{0.05} % Brace spacing vertically
\def\brach{-10pt} % Brace shift horizontaly
% Mass
\draw[fill=white] (-0.5*\massw, \spaceh) rectangle node[left=6pt]{$m$} (0.5* \massw, \spaceh+\massh);
% Spring, Damper, and Actuator
\draw[spring] (-0.3*\massw, 0) -- (-0.3* \massw, \spaceh) node[midway, left=0.1]{$k$};
\draw[damper] ( 0.3*\massw, 0) -- ( 0.3* \massw, \spaceh) node[midway, left=0.2]{$c$};
% Ground
\draw (-0.5*\massw, 0) -- (0.5* \massw, 0);
% Groud Motion
\draw[dashed] (0.5*\massw, 0) -- ++(\dispw, 0);
\draw[->] (0.5*\massw+0.5* \dispw, 0) -- ++(0, \disph) node[right]{$w$};
% Displacements
\draw[dashed] (0.5*\massw, \spaceh+\massh) -- ++(2* \dispw, 0) coordinate(dhigh);
\draw[->] (0.5*\massw+1.5* \dispw, \spaceh+\massh) -- + +(0, \disph) node[right]{$x$};
% Legend
\draw[decorate, decoration={brace, amplitude=8pt}, xshift= \brach] %
(-0.5*\massw, \bracs) -- (-0.5* \massw, \spaceh+\massh-\bracs) %
node[midway,rotate=90,anchor=south,yshift=10pt,align=center]{Granite};
\begin{scope}[shift={(0, \spaceh+\massh)}]
\node[piezo={2.2}{1.5}{6}, anchor=south] (piezo) at (0, 0){};
\draw[->] (0,0)node[branch]{} -- ++(0, -0.6)node[above right]{$F$}
\draw[<- >] (1.1+0.5*\dispw,0) -- node[midway, right]{$d$} + +(0,1.5);
\draw[decorate, decoration={brace, amplitude=8pt}, xshift= \brach] %
($(piezo.south west) + (-10pt, 0)$) -- ($(piezo.north west) + (-10pt, 0)$) %
node[midway,rotate=90,anchor=south,yshift=10pt,align=center]{Positioning\\Stages};
\end{scope}
\end{tikzpicture}
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 17:10:39 +02:00
#+name : fig:general_system_granite_stiffness
#+caption : Mass Spring Damper representing the granite and a general representation of positioning stages
#+RESULTS :
[[file:figs/general_system_granite_stiffness.png ]]
The equation of motion are:
\begin{align}
ms^2 x &= (cs + k) (x - w) - F \\
F &= G^\prime(s) x \\
d &= D^\prime(s) x
\end{align}
where:
- $F$ is the force applied by the position stages on the granite mass
#+begin_important
We can express $d$ as a function of $w$:
\begin{equation}
\frac{d}{w} = \frac{D^\prime(s) (cs + k)}{ms^2 + cs + k + G^\prime(s)}
\end{equation}
This is the transfer function that we would like to minimize.
#+end_important
Let's verify this formula for a simple mass/spring/damper positioning stage.
In that case, we have:
\begin{align*}
D^\prime(s) &= \frac{d}{x} = \frac{- m^\prime s^2}{m^\prime s^2 + c^\prime s + k^\prime} \\
G^\prime(s) &= \frac{F}{x} = \frac{m^\prime s^2(c^\prime s + k)}{m^\prime s^2 + c^\prime s + k^\prime}
\end{align*}
And finally:
\begin{equation}
\frac{d}{w} = \frac{-m^\prime s^2 (cs + k)}{ (m^\prime s^2 + c^\prime s + k^\prime) (ms^2 + cs + k) + m^\prime s^2(c^\prime s + k^\prime)}
\end{equation}
which is the same as the previously derived equation.
** Soft Granite
Let's initialize a soft granite and see how the sensitivity to disturbances will change.
2020-04-07 15:26:29 +02:00
#+begin_src matlab
2020-04-07 17:10:39 +02:00
initializeGranite('K', 5e5*ones(3,1), 'C', 5e3*ones(3,1));
2020-04-07 15:26:29 +02:00
#+end_src
#+begin_src matlab :exports none
Gdr = {zeros(length(Ks), 1)};
for i = 1:length(Ks)
initializeNanoHexapod('k', Ks(i));
G = linearize(mdl, io);
G.InputName = {'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
Gdr(i) = {minreal(G)};
end
#+end_src
** Effect of the Granite transfer function
2020-04-07 17:10:39 +02:00
From Figure [[fig:opt_stiff_soft_granite_Dw ]], we can see that having a "soft" granite suspension greatly lowers the sensitivity to ground motion.
The sensitivity is indeed lowered starting from the resonance of the granite on its soft suspension (few Hz here).
From Figures [[fig:opt_stiff_soft_granite_Frz ]] and [[fig:opt_stiff_soft_granite_Fd ]], we see that the change of granite suspension does not change a lot the sensitivity to both direct forces and stage vibrations.
2020-04-07 15:26:29 +02:00
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
figure;
hold on;
for i = 1:length(Ks)
set(gca,'ColorOrderIndex',i);
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
set(gca,'ColorOrderIndex',i);
plot(freqs, abs(squeeze(freqresp(Gdr{i}('Ez', 'Dwz'), freqs, 'Hz'))), '--', ...
'HandleVisibility', 'off');
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
2020-04-07 17:10:39 +02:00
legend('location', 'southwest');
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_soft_granite_Dw.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 17:10:39 +02:00
#+name : fig:opt_stiff_soft_granite_Dw
#+caption : Change of sensibility to Ground motion when using a stiff Granite (solid curves) and a soft Granite (dashed curves) ([[./figs/opt_stiff_soft_granite_Dw.png][png]], [[./figs/opt_stiff_soft_granite_Dw.pdf][pdf]])
[[file:figs/opt_stiff_soft_granite_Dw.png ]]
2020-04-07 15:26:29 +02:00
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
figure;
hold on;
for i = 1:length(Ks)
set(gca,'ColorOrderIndex',i);
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
set(gca,'ColorOrderIndex',i);
plot(freqs, abs(squeeze(freqresp(Gdr{i}('Ez', 'Frz_z'), freqs, 'Hz'))), '--', ...
'HandleVisibility', 'off');
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
2020-04-07 17:10:39 +02:00
legend('location', 'southwest');
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_soft_granite_Frz.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 17:10:39 +02:00
#+name : fig:opt_stiff_soft_granite_Frz
#+caption : Change of sensibility to Spindle vibrations when using a stiff Granite (solid curves) and a soft Granite (dashed curves) ([[./figs/opt_stiff_soft_granite_Frz.png][png]], [[./figs/opt_stiff_soft_granite_Frz.pdf][pdf]])
[[file:figs/opt_stiff_soft_granite_Frz.png ]]
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
figure;
hold on;
for i = 1:length(Ks)
set(gca,'ColorOrderIndex',i);
plot(freqs, abs(squeeze(freqresp(Gd{i}( 'Ez', 'Fdz'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
set(gca,'ColorOrderIndex',i);
plot(freqs, abs(squeeze(freqresp(Gdr{i}('Ez', 'Fdz'), freqs, 'Hz'))), '--', ...
'HandleVisibility', 'off');
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('$E_{z}/F_ {d,z}$ [m/N]'); xlabel('Frequency [Hz]');
legend('location', 'northeast');
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_soft_granite_Fd.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+name : fig:opt_stiff_soft_granite_Fd
#+caption : Change of sensibility to direct forces when using a stiff Granite (solid curves) and a soft Granite (dashed curves) ([[./figs/opt_stiff_soft_granite_Fd.png][png]], [[./figs/opt_stiff_soft_granite_Fd.pdf][pdf]])
[[file:figs/opt_stiff_soft_granite_Fd.png ]]
** Conclusion
#+begin_important
Having a soft granite suspension could greatly improve the sensitivity the ground motion and thus the level of sample vibration if it is found that ground motion is the limiting factor.
#+end_important
2020-04-07 15:26:29 +02:00
* Open Loop Budget Error
<<sec:open_loop_budget_error >>
** Introduction :ignore:
2020-04-07 19:34:05 +02:00
Now that the frequency content of disturbances have been estimated (Section [[sec:psd_disturbances ]]) and the transfer functions from disturbances to the position error of the sample have been identified (Section [[sec:effect_disturbances ]]), we can compute the level of sample vibration due to the disturbances.
We then can conclude and the nano-hexapod stiffness that will lower the sample position error.
2020-04-07 15:26:29 +02:00
** 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
simulinkproject('../');
#+end_src
2020-04-07 19:34:05 +02:00
** Noise Budgeting - Theory
Let's consider Figure [[fig:psd_change_tf ]] there $G_d(s)$ is the transfer function from a signal $d$ (the perturbation) to a signal $y$ (the sample's position error).
2020-04-07 15:26:29 +02:00
2020-04-07 19:34:05 +02:00
#+begin_src latex :file psd_change_tf.pdf
\begin{tikzpicture}
\node[block] (G) at (0, 0) {$G_d(s)$};
\draw[<-] (G.west) -- ++(-1, 0) node[above right]{$d$};
\draw[->] (G.east) -- ++( 1, 0) node[above left ]{$y$};
\end{tikzpicture}
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 19:34:05 +02:00
#+name : fig:psd_change_tf
#+caption : Figure caption
#+RESULTS :
[[file:figs/psd_change_tf.png ]]
We can compute the Power Spectral Density (PSD) of signal $y$ from the PSD of $d$ and the norm of $G_d(s)$:
\begin{equation}
S_{y}(\omega) = \left|G_d(j\omega)\right|^2 S_ {d}(\omega) \label{eq:psd_transfer_function}
\end{equation}
If we now consider multiple disturbances $d_1, \dots, d_n$ as shown in Figure [[fig:psd_change_tf_multiple_pert ]], we have that:
\begin{equation}
S_{y}(\omega) = \left|G_ {d_1}(j\omega)\right|^2 S_ {d_1}(\omega) + \dots + \left|G_ {d_n}(j\omega)\right|^2 S_ {d_n}(\omega) \label{eq:sum_psd}
\end{equation}
Sometimes, we prefer to compute the *Amplitude* Spectral Density (ASD) which is related to the PSD by:
\[ \Gamma_y(\omega) = \sqrt{S_y(\omega)} \]
#+begin_src latex :file psd_change_tf_multiple_pert.pdf
\begin{tikzpicture}
\node[block] (Gm) at (0, 0) {$\dots$};
\draw[<-] (Gm.west) -- ++(-1, 0);
\node[block, above=0.5 of Gm] (G1) {$G_{d_1}(s)$};
\draw[<-] (G1.west) -- ++(-1, 0) node[above right]{$d_1$};
\node[block, below=0.5 of Gm] (Gn) {$G_{d_n}(s)$};
\draw[<-] (Gn.west) -- ++(-1, 0) node[above right]{$d_n$};
\node[addb, right= of Gm] (add) {};
\draw[->] (G1.east) -| (add.north);
\draw[->] (Gm.east) -- (add.west);
\draw[->] (Gn.east) -| (add.south);
\draw[->] (add) -- ++( 1, 0) node[above left]{$y$};
\end{tikzpicture}
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 19:34:05 +02:00
#+name : fig:psd_change_tf_multiple_pert
#+caption : Figure caption
#+RESULTS :
[[file:figs/psd_change_tf_multiple_pert.png ]]
2020-04-07 15:26:29 +02:00
2020-04-07 19:34:05 +02:00
The Cumulative Power Spectrum (CPS) is here defined as:
\begin{equation}
\Phi_y(\omega) = \int_ \omega^\infty S_y(\nu) d\nu
\end{equation}
2020-04-07 15:26:29 +02:00
2020-04-07 19:34:05 +02:00
And the Cumulative Amplitude Spectrum (CAS):
\begin{equation}
\Psi(\omega) = \sqrt{\Phi(\omega)} = \sqrt{\int_\omega^\infty S_y(\nu) d\nu}
\end{equation}
The CAS evaluation for all frequency corresponds to the rms value of the considered quantity:
\[ y_{\text{rms}} = \Psi(\omega = 0) = \sqrt{\int_0^\infty S_y(\nu) d\nu} \]
** Power Spectral Densities
We compute the effect of perturbations on the motion error thanks to Eq. eqref:eq:psd_transfer_function.
The result is shown in:
- Figure [[fig:opt_stiff_psd_dz_gm ]]: PSD of the vertical sample's motion error due to vertical ground motion
- Figure [[fig:opt_stiff_psd_dz_rz ]]: PSD of the vertical sample's motion error due to vertical vibrations of the Spindle
#+begin_src matlab :exports none
load('./mat/dist_psd.mat', 'dist_f');
load('./mat/opt_stiffness_disturbances.mat', 'Gd')
#+end_src
#+begin_src matlab :exports none
2020-04-07 15:26:29 +02:00
freqs = dist_f.f;
figure;
hold on;
for i = 1:length(Ks)
2020-04-07 19:34:05 +02:00
plot(freqs, sqrt(dist_f.psd_gm).*abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'), freqs, 'Hz'))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
2020-04-07 15:26:29 +02:00
end
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m}{\sqrt{Hz}}\right]$')
2020-04-07 19:34:05 +02:00
legend('location', 'southwest');
xlim([1, 500]);
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 19:34:05 +02:00
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_psd_dz_gm.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+name : fig:opt_stiff_psd_dz_gm
#+caption : Amplitude Spectral Density of the Sample vertical position error due to Ground motion for multiple nano-hexapod stiffnesses ([[./figs/opt_stiff_psd_dz_gm.png][png]], [[./figs/opt_stiff_psd_dz_gm.pdf][pdf]])
[[file:figs/opt_stiff_psd_dz_gm.png ]]
#+begin_src matlab :exports none
2020-04-07 15:26:29 +02:00
freqs = dist_f.f;
figure;
hold on;
for i = 1:length(Ks)
2020-04-07 19:34:05 +02:00
plot(freqs, sqrt(dist_f.psd_rz).*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))), '-', ...
2020-04-07 15:26:29 +02:00
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
2020-04-07 19:34:05 +02:00
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m}{\sqrt{Hz}}\right]$')
2020-04-07 15:26:29 +02:00
legend('Location', 'southwest');
2020-04-07 19:34:05 +02:00
xlim([2, 500]);
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 19:34:05 +02:00
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_psd_dz_rz.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+name : fig:opt_stiff_psd_dz_rz
#+caption : Amplitude Spectral Density of the Sample vertical position error due to Vertical vibration of the Spindle for multiple nano-hexapod stiffnesses ([[./figs/opt_stiff_psd_dz_rz.png][png]], [[./figs/opt_stiff_psd_dz_rz.pdf][pdf]])
[[file:figs/opt_stiff_psd_dz_rz.png ]]
We compute the effect of all perturbations on the vertical position error using Eq. eqref:eq:sum_psd and the resulting PSD is shown in Figure [[fig:opt_stiff_psd_dz_tot ]].
#+begin_src matlab :exports none
psd_tot = zeros(length(freqs), length(Ks));
2020-04-07 15:26:29 +02:00
for i = 1:length(Ks)
2020-04-07 19:34:05 +02:00
psd_tot(:,i) = dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz' ), freqs, 'Hz'))).^2 + ...
dist_f.psd_ty.*abs(squeeze(freqresp(Gd{i}('Ez', 'Fty_z'), freqs, 'Hz'))).^2 + ...
dist_f.psd_rz.*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))).^2;
2020-04-07 15:26:29 +02:00
end
#+end_src
2020-04-07 19:34:05 +02:00
#+begin_src matlab :exports none
2020-04-07 15:26:29 +02:00
freqs = dist_f.f;
figure;
hold on;
for i = 1:length(Ks)
2020-04-07 19:34:05 +02:00
plot(freqs, sqrt(psd_tot(:,i)), '-', ...
2020-04-07 15:26:29 +02:00
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
2020-04-07 19:34:05 +02:00
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m}{\sqrt{Hz}}\right]$')
legend('location', 'southwest')
xlim([1, 500]);
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_psd_dz_tot.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 19:34:05 +02:00
#+name : fig:opt_stiff_psd_dz_tot
#+caption : Amplitude Spectral Density of the Sample vertical position error due to all considered perturbations for multiple nano-hexapod stiffnesses ([[./figs/opt_stiff_psd_dz_tot.png][png]], [[./figs/opt_stiff_psd_dz_tot.pdf][pdf]])
[[file:figs/opt_stiff_psd_dz_tot.png ]]
** Cumulative Amplitude Spectrum
Similarly, the Cumulative Amplitude Spectrum of the sample vibrations are shown:
- Figure [[fig:opt_stiff_cas_dz_gm ]]: due to vertical ground motion
- Figure [[fig:opt_stiff_cas_dz_rz ]]: due to vertical vibrations of the Spindle
- Figure [[fig:opt_stiff_cas_dz_tot ]]: due to all considered perturbations
The black dashed line corresponds to the performance objective of a sample vibration equal to $10\ nm [rms]$.
2020-04-07 15:26:29 +02:00
#+begin_src matlab
freqs = dist_f.f;
figure;
hold on;
for i = 1:length(Ks)
2020-04-07 19:34:05 +02:00
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'), freqs, 'Hz'))).^2)))), '-', ...
2020-04-07 15:26:29 +02:00
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
hold off;
2020-04-07 19:34:05 +02:00
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
2020-04-07 15:26:29 +02:00
xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
legend('Location', 'northeast');
2020-04-07 19:34:05 +02:00
xlim([1, 500]); ylim([1e-10 1e-6]);
#+end_src
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_cas_dz_gm.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 19:34:05 +02:00
#+name : fig:opt_stiff_cas_dz_gm
#+caption : Cumulative Amplitude Spectrum of the Sample vertical position error due to Ground motion for multiple nano-hexapod stiffnesses ([[./figs/opt_stiff_cas_dz_gm.png][png]], [[./figs/opt_stiff_cas_dz_gm.pdf][pdf]])
[[file:figs/opt_stiff_cas_dz_gm.png ]]
2020-04-07 15:26:29 +02:00
#+begin_src matlab
freqs = dist_f.f;
figure;
hold on;
for i = 1:length(Ks)
2020-04-07 19:34:05 +02:00
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_rz.*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))).^2)))), '-', ...
2020-04-07 15:26:29 +02:00
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
hold off;
2020-04-07 19:34:05 +02:00
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('CAS $[m]$')
legend('Location', 'southwest');
xlim([1, 500]); ylim([1e-10 1e-6]);
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 19:34:05 +02:00
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_cas_dz_rz.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
2020-04-07 15:26:29 +02:00
#+end_src
2020-04-07 19:34:05 +02:00
#+name : fig:opt_stiff_cas_dz_rz
#+caption : Cumulative Amplitude Spectrum of the Sample vertical position error due to Vertical vibration of the Spindle for multiple nano-hexapod stiffnesses ([[./figs/opt_stiff_cas_dz_rz.png][png]], [[./figs/opt_stiff_cas_dz_rz.pdf][pdf]])
[[file:figs/opt_stiff_cas_dz_rz.png ]]
2020-04-07 15:26:29 +02:00
#+begin_src matlab
freqs = dist_f.f;
figure;
hold on;
for i = 1:length(Ks)
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(psd_tot(:,i))))), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
end
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('CAS $E_z$ $[m]$')
legend('Location', 'northeast');
xlim([1, 500]); ylim([1e-10 1e-6]);
#+end_src
2020-04-07 19:34:05 +02:00
#+header : :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/opt_stiff_cas_dz_tot.pdf" :var figsize= "full-tall" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+name : fig:opt_stiff_cas_dz_tot
#+caption : Cumulative Amplitude Spectrum of the Sample vertical position error due to all considered perturbations for multiple nano-hexapod stiffnesses ([[./figs/opt_stiff_cas_dz_tot.png][png]], [[./figs/opt_stiff_cas_dz_tot.pdf][pdf]])
[[file:figs/opt_stiff_cas_dz_tot.png ]]
** Conclusion
#+begin_important
From Figure [[fig:opt_stiff_cas_dz_tot ]], we can see that a soft nano-hexapod $k<10^6\ [N/m]$ significantly reduces the effect of perturbations from 20Hz to 300Hz.
#+end_important
2020-04-07 15:26:29 +02:00
* Closed Loop Budget Error
<<sec:closed_loop_budget_error >>
** Introduction :ignore:
2020-04-07 19:34:05 +02:00
** 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
simulinkproject('../');
#+end_src
** Approximation of the effect of feedback on the motion error
Let's consider Figure [[fig:effect_feedback_disturbance_diagram ]] where a controller $K$ is used to reduce the effect of the disturbance $d$ on the position error $y$.
#+begin_src latex :file effect_feedback_disturbance_diagram.pdf
\begin{tikzpicture}
\node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
\node[block, right=0.6 of addfb] (K){$K$};
\node[block, right=0.6 of K] (G){$G$};
\node[addb={+}{}{}{}{}, right=0.6 of G] (adddy){};
\node[block, above=0.6 of adddy] (Gd){$G_d$};
\draw[<-] (addfb.west) -- ++(-0.6, 0) node[above right]{$r$};
\draw[->] (addfb.east) -- (K.west);
\draw[->] (K.east) -- (G.west) node[above left]{$u$};
\draw[->] (G.east) -- (adddy.west);
\draw[->] (adddy.east) -- ++(1, 0) node[above left]{$y$};
\draw[->] ($(adddy.east)+(0.6, 0)$) node[branch]{} -- + +(0, -1) -| (addfb.south);
\draw[<-] (Gd.north) -- ++(0, 0.6) node[below right]{$d$};
\draw[->] (Gd.south) -- (adddy.north);
\end{tikzpicture}
#+end_src
#+name : fig:effect_feedback_disturbance_diagram
#+caption : Feedback System
#+RESULTS :
[[file:figs/effect_feedback_disturbance_diagram.png ]]
The reduction of the impact of $d$ on $y$ thanks to feedback is described by the following equation:
\begin{equation}
\frac{y}{d} = \frac{G_d}{1 + KG}
\end{equation}
As a first approximation, we can consider that the controller is designed in such a way that the loop gain $KG$ is a pure integrator:
\[ L_1(s) = K_1(s) G(s) = \frac{\omega_c}{s} \]
where $\omega_c$ is the crossover frequency.
We may then consider another controller in such a way that the loop gain corresponds to a double integrator with a lead centered with the crossover frequency $\omega_c$:
\[ L_2(s) = K_2(s) G(s) = \left( \frac{\omega_c}{s} \right)^2 \cdot \frac{1 + \frac{s}{\omega_c/2}}{1 + \frac{s}{2\omega_c}} \]
2020-04-07 15:26:29 +02:00
** Reduction thanks to feedback - Required bandwidth
#+begin_src matlab
wc = 1*2*pi; % [rad/s]
xic = 0.5;
S = (s/wc)/ (1 + s/wc);
bodeFig({S}, logspace(-1,2,1000))
#+end_src
#+begin_src matlab
wc = [1, 5, 10, 20, 50, 100, 200];
S1 = {zeros(length(wc), 1)};
S2 = {zeros(length(wc), 1)};
for j = 1:length(wc)
L = (2*pi*wc(j))/s; % Simple integrator
S1{j} = 1/(1 + L);
L = ((2*pi*wc(j))/s)^2* (1 + s/(2*pi*wc(j)/2))/(1 + s/(2*pi*wc(j)*2));
S2{j} = 1/(1 + L);
end
#+end_src
#+begin_src matlab
freqs = dist_f.f;
figure;
hold on;
i = 6;
for j = 1:length(wc)
set(gca,'ColorOrderIndex',j);
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(abs(squeeze(freqresp(S1{j}, freqs, 'Hz'))).^2.*psd_tot(:,i))))), '-', ...
'DisplayName', sprintf('$\\omega_c = %.0f$ [Hz]', wc(j)));
end
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(psd_tot(:,i))))), 'k-', ...
'DisplayName', 'Open-Loop');
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
legend('Location', 'northeast');
xlim([0.5, 500]); ylim([1e-10 1e-6]);
#+end_src
#+begin_src matlab
wc = logspace(0, 3, 100);
Dz1_rms = zeros(length(Ks), length(wc));
Dz2_rms = zeros(length(Ks), length(wc));
for i = 1:length(Ks)
for j = 1:length(wc)
L = (2*pi*wc(j))/s;
Dz1_rms(i, j) = sqrt(trapz(freqs, abs(squeeze(freqresp(1/(1 + L), freqs, 'Hz'))).^2.*psd_tot(:,i)));
L = ((2*pi*wc(j))/s)^2* (1 + s/(2*pi*wc(j)/2))/(1 + s/(2*pi*wc(j)*2));
Dz2_rms(i, j) = sqrt(trapz(freqs, abs(squeeze(freqresp(1/(1 + L), freqs, 'Hz'))).^2.*psd_tot(:,i)));
end
end
#+end_src
#+begin_src matlab
freqs = dist_f.f;
figure;
hold on;
for i = 1:length(Ks)
set(gca,'ColorOrderIndex',i);
plot(wc, Dz1_rms(i, :), '-', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)))
set(gca,'ColorOrderIndex',i);
plot(wc, Dz2_rms(i, :), '--', ...
'HandleVisibility', 'off')
end
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Control Bandwidth [Hz]'); ylabel('$E_z\ [m, rms]$')
legend('Location', 'southwest');
xlim([1, 500]);
#+end_src
* Conclusion