Start the analysis of a budget error

This commit is contained in:
Thomas Dehaeze 2019-09-18 18:08:02 +02:00
parent b0333f3917
commit 0543f123a1
4 changed files with 266 additions and 22 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

288
index.org
View File

@ -1857,6 +1857,7 @@ The file =mat/plant.mat= is accessible [[./mat/plant.mat][here]].
#+end_src #+end_src
* Huddle Test * Huddle Test
** Introduction :ignore:
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
@ -1960,16 +1961,274 @@ We compute the Power Spectral Density of the voltage across the inductance used
xlim([1, 1000]); xlim([1, 1000]);
#+end_src #+end_src
* Budget Error
** Introduction :ignore:
Goals:
- List all sources of error and their effects on the Attocube measurement
- Think about how to determine the value of the individual sources of error
Sources of error for the Attocube measurement:
- Cercalo rotation error
- Cercalo unwanted translation perpendicular to its surface
- Newport rotation error
- Newport unwanted translation perpendicular to its surface
- Temperature variations of the metrology frame
- Temperature / Pressure / Humidity variations of the air in the beam path
** 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
** Effect of the Cercalo angle error on the measured distance by the Attocube
To simplify, we suppose that the Newport mirror is a flat mirror.
The geometry of the setup is shown in Fig. [[fig:angle_error_schematic_cercalo]].
We define the angle error range where we want to evaluate the distance error measured by the Attocube.
#+begin_src matlab
thetas_c = logspace(-7, -4, 100); % [rad]
#+end_src
The geometrical parameters of the setup are defined below.
#+begin_src matlab
H = 0.05; % [m]
L = 0.05; % [m]
#+end_src
#+begin_src latex :file angle_error_schematic_cercalo.pdf :exports results
\begin{tikzpicture}
\draw[->] (0, 0)node[branch](O){}node[below]{$O (0,0)$} -- ++(1, 0) node[above left]{$x$};
\draw[->] (0, 0) -- ++(0, 1) node[below right]{$y$};
\draw[] (4, 0)node[branch](S){}node[below right]{$S (L,0)$} -- ++(45:1);
\draw[] (4, 0) -- ++(225:1);
\draw[] (3, 2) --node[midway, branch](X){}node[above]{$X (0,H)$} (5, 2);
\draw[<->] ([shift=(30:1.2)]S.center) arc (30:60:1.2) node[midway, above right]{$\theta_c$};
\draw[red, ->-=.7, -<-=0.3] (O.center) -- (S.center);
\draw[red, ->-=.7, -<-=0.3] (S.center) -- (X.center);
\end{tikzpicture}
#+end_src
#+NAME: fig:angle_error_schematic_cercalo
#+CAPTION: Caption
#+RESULTS:
[[file:figs/angle_error_schematic_cercalo.png]]
The nominal points $O$, $S$ and $X$ are defined.
#+begin_src matlab
O = [-L, 0];
S = [0, 0];
X = [0, H];
#+end_src
Thus, the initial path length is:
#+begin_src matlab
path_nominal = norm(S-O) + norm(X-S) + norm(S-X) + norm(O-S);
#+end_src
We now compute the new path length when there is an error angle $\delta \theta_c$ of the Cercalo.
#+begin_src matlab
path_length = zeros(size(thetas_c));
for i = 1:length(thetas_c)
theta_c = thetas_c(i);
Y = [H*tan(2*theta_c), H];
M = 2*H/(tan(pi/4-theta_c)+1/tan(2*theta_c))*[1, tan(pi/4-theta_c)];
T = [-L, M(2)+(L+M(1))*tan(4*theta_c)];
path_length(i) = norm(S-O) + norm(Y-S) + norm(M-Y) + norm(T-M);
end
#+end_src
We then compute the distance error and we plot it as a function of the Cercalo angle error (Fig. [[]]).
#+begin_src matlab
path_error = path_length - path_nominal;
#+end_src
#+begin_src matlab :exports none
figure;
plot(thetas_c, path_error)
set(gca,'xscale','log');
set(gca,'yscale','log');
xlabel('Cercalo angle error [rad]');
ylabel('Attocube measurement error [m]');
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/effect_cercalo_angle_distance_meas.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+NAME: fig:effect_cercalo_angle_distance_meas
#+CAPTION: Effect of an angle error of the Cercalo on the distance error measured by the Attocube ([[./figs/effect_cercalo_angle_distance_meas.png][png]], [[./figs/effect_cercalo_angle_distance_meas.pdf][pdf]])
[[file:figs/effect_cercalo_angle_distance_meas.png]]
And we plot the beam path using Matlab for an high angle to verify that the code is working (Fig. [[]]).
#+begin_src matlab
theta = 2*2*pi/360; % [rad]
H = 0.05; % [m]
L = 0.05; % [m]
O = [-L, 0];
S = [0, 0];
X = [0, H];
Y = [H*tan(2*theta), H];
M = 2*H/(tan(pi/4-theta)+1/tan(2*theta))*[1, tan(pi/4-theta)];
T = [-L, M(2)+(L+M(1))*tan(4*theta)];
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot([-L, -L], [0, H], 'k-'); % Interferometer
plot([-L, 0.1*L], [H, H], 'k-'); % Reflector
plot(0.5*min(L, H)*[-cos(pi/4-theta), cos(pi/4-theta)], 0.5*min(L, H)*[-sin(pi/4-theta), sin(pi/4-theta)], 'k-'); % Tilt-Mirror
plot(0.5*min(L, H)*[-cos(pi/4), cos(pi/4)], 0.5*min(L, H)*[-sin(pi/4), sin(pi/4)], 'k--'); % Initial position of tilt mirror
plot([O(1), S(1), Y(1), M(1), T(1)], [O(2), S(2), Y(2), M(2), T(2)], 'r-');
plot([O(1), S(1), X(1), S(1), O(1)], [O(2), S(2), X(2), S(2), O(2)], 'b--');
hold off;
xlabel('X [m]'); ylabel('Y [m]');
axis equal
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/simulation_beam_path_high_angle.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+NAME: fig:simulation_beam_path_high_angle
#+CAPTION: Simulation of a beam path for high angle error ([[./figs/simulation_beam_path_high_angle.png][png]], [[./figs/simulation_beam_path_high_angle.pdf][pdf]])
[[file:figs/simulation_beam_path_high_angle.png]]
#+begin_important
An angle error $\delta\theta_c$ of the Attocube produces a distance error measured by the attocube of
\begin{equation}
\delta L = 10^{-6} \cdot \delta\theta_c
\end{equation}
Thus, $1 \mu \text{rad}$ of angle error corresponds to $1mn$ of distance error.
#+end_important
** Estimation of the Cercalo angle error due to Noise
*** Perfect Control
If the feedback is perfect, the Cercalo angle error will be equal to the 4 quadrant diode noise.
Let's estimate the 4QD noise in radians.
If we note $V_1$, $V_2$, $V_3$ and $V_4$ the voltage of each of the quadrant, a measurement error $\delta V_i$ of one of the quadrant will have an effect $\delta \theta$ on the measured angle:
\[ \delta\theta = G \frac{\delta V_i}{V_1 + V_2 + V_3 + V_4} \]
with $G$ is the gain of the 4QD in [rad].
We should then have that the voltage of each quadrant is as large as possible.
Suppose here that $V_i \approx 5V$, $\delta V_i = 1mV$ and $G = 0.03\,rad$, we obtain:
\[ \delta \theta = 0.03 \frac{0.001}{20} = 1.5\, \mu\text{rad} \]
This then corresponds to
\[ \delta L = 10^{-6} \cdot \delta \theta = 1.5\,nm \]
If we just consider the ADC noise:
- the ADC range is $\pm 10V$ with $16\text{ bits}$.
- thus, the LSB corresponds to:
\[ \frac{20}{2^{16}} \approx 0.000305\,V = 0.305\,mV \]
- this corresponds to an error $\delta L \approx 0.5 nm$
*** Error due to DAC noise used for the Cercalo
#+begin_src matlab
load('./mat/plant.mat', 'Gi', 'Gc', 'Gd');
#+end_src
#+begin_src matlab
G = inv(Gd)*Gc*Gi;
#+end_src
Dynamical estimation:
- ASD of DAC noise used for the Cercalo
- Multiply by transfer function from Cercalo voltage to angle estimation using the 4QD
#+begin_src matlab
freqs = logspace(1, 3, 1000);
fs = 1e4;
% ASD of the DAC voltage going to the Cercalo in [V/sqrt(Hz)]
asd_uc = (20/2^16)/sqrt(12*fs)*ones(length(freqs), 1);
% ASD of the measured angle by the QD in [rad/sqrt(Hz)]
asd_theta = asd_uc.*abs(squeeze(freqresp(G(1,1), freqs, 'Hz')));
figure;
loglog(freqs, asd_theta)
#+end_src
Then the corresponding ASD of the measured displacement by the interferometer is:
#+begin_src matlab
asd_L = asd_theta*10^(-6); % [m/sqrt(Hz)]
#+end_src
And we integrate that to have the RMS value:
#+begin_src matlab
cps_L = 1/pi*cumtrapz(2*pi*freqs, (asd_L).^2);
#+end_src
The RMS value is:
#+begin_src matlab :results value replace
sqrt(cps_L(end))
#+end_src
#+RESULTS:
: 1.647e-11
#+begin_src matlab
figure;
loglog(freqs, cps_L)
#+end_src
Let's estimate the beam angle error corresponding to 1 LSB of the cercalo's DAC.
Gain of the Cercalo is approximatively 5 degrees for 10V.
However the beam angle deviation is 4 times the angle deviation of the cercalo mirror, thus:
#+begin_src matlab :results value replace
d_alpha = 4*(20/2^16)*(5*pi/180)/10 % [rad]
#+end_src
#+RESULTS:
: 1.0653e-05
This corresponds to a measurement error of the Attocube equals to (in [m])
#+begin_src matlab :results value replace
1e-6*d_alpha % [m]
#+end_src
#+RESULTS:
: 1.0653e-11
#+begin_important
The DAC noise use for the Cercalo does not limit the performance of the system.
#+end_important
* Plant Scaling * Plant Scaling
| | Value | Unit | | | | Value | Unit | |
|------------------------+-------+-------------+---| |------------------------+-------+-------------+----------|
| Expected perturbations | 1 | [V] | $U_n$ | | Expected perturbations | 1 | [V] | $U_n$ |
| Maximum input usage | 10 | [V] | $U_c$ | | Maximum input usage | 10 | [V] | $U_c$ |
| Maximum wanted error | 10 | [$\mu rad$] | $\theta$ | | Maximum wanted error | 10 | [$\mu rad$] | $\theta$ |
| Measured noise | 5 | [$\mu rad$] | | | Measured noise | 5 | [$\mu rad$] | |
** General Configuration ** General Configuration
* Control Objective
The maximum expected stroke is $y_\text{max} = 3mm \approx 5e^{-2} rad$ at $1Hz$.
The maximum wanted error is $e_\text{max} = 10 \mu rad$.
Thus, we require the sensitivity function at $\omega_0 = 1\text{ Hz}$:
\begin{align*}
|S(j\omega_0)| &< \left| \frac{e_\text{max}}{y_\text{max}} \right| \\
&< 2 \cdot 10^{-4}
\end{align*}
In terms of loop gain, this is equivalent to:
\[ |L(j\omega_0)| > 5 \cdot 10^{3} \]
* Plant Analysis * Plant Analysis
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
@ -2023,20 +2282,7 @@ We compute the Power Spectral Density of the voltage across the inductance used
G0 = freqresp(G, 0); G0 = freqresp(G, 0);
#+end_src #+end_src
* Control Objective * Decentralized Control of the Cercalo
The maximum expected stroke is $y_\text{max} = 3mm \approx 5e^{-2} rad$ at $1Hz$.
The maximum wanted error is $e_\text{max} = 10 \mu rad$.
Thus, we require the sensitivity function at $\omega_0 = 1\text{ Hz}$:
\begin{align*}
|S(j\omega_0)| &< \left| \frac{e_\text{max}}{y_\text{max}} \right| \\
&< 2 \cdot 10^{-4}
\end{align*}
In terms of loop gain, this is equivalent to:
\[ |L(j\omega_0)| > 5 \cdot 10^{3} \]
* Decentralized Control
:PROPERTIES: :PROPERTIES:
:header-args:matlab+: :tangle matlab/decentralized_control.m :header-args:matlab+: :tangle matlab/decentralized_control.m
:header-args:matlab+: :comments org :mkdirp yes :header-args:matlab+: :comments org :mkdirp yes
@ -2249,11 +2495,9 @@ The controllers can be downloaded [[./mat/K_newport.mat][here]].
save('mat/K_newport.mat', 'Kn', 'Knd'); save('mat/K_newport.mat', 'Kn', 'Knd');
#+end_src #+end_src
* Measuement of the non-repeatability * Measurement of the non-repeatability
** Introduction :ignore: ** Introduction :ignore:
- Explanation of the procedure - Explanation of the procedure
- List all sources of error and their effects on the Attocube measurement
- Think about how to determine the value of the individual sources of error
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)