2021-11-30 11:28:07 +01:00
<?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" lang = "en" xml:lang = "en" >
< head >
2021-11-30 17:54:19 +01:00
<!-- 2021 - 11 - 30 mar. 17:54 -->
2021-11-30 11:28:07 +01:00
< meta http-equiv = "Content-Type" content = "text/html;charset=utf-8" / >
2021-11-30 15:17:23 +01:00
< title > ESRF Double Crystal Monochromator - Dynamical Multi-Body Model< / title >
2021-11-30 11:28:07 +01:00
< meta name = "author" content = "Dehaeze Thomas" / >
< meta name = "generator" content = "Org Mode" / >
< link rel = "stylesheet" type = "text/css" href = "https://research.tdehaeze.xyz/css/style.css" / >
< script type = "text/javascript" src = "https://research.tdehaeze.xyz/js/script.js" > < / script >
< script >
MathJax = {
svg: {
scale: 1,
fontCache: "global"
},
tex: {
tags: "ams",
multlineWidth: "%MULTLINEWIDTH",
tagSide: "right",
macros: {bm: ["\\boldsymbol{#1}",1],},
tagIndent: ".8em"
}
};
< / script >
< script id = "MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">< / script >
< / head >
< body >
< div id = "org-div-home-and-up" >
< a accesskey = "h" href = "../index.html" > UP < / a >
|
< a accesskey = "H" href = "../index.html" > HOME < / a >
< / div > < div id = "content" class = "content" >
2021-11-30 15:17:23 +01:00
< h1 class = "title" > ESRF Double Crystal Monochromator - Dynamical Multi-Body Model< / h1 >
2021-11-30 11:28:07 +01:00
< div id = "table-of-contents" role = "doc-toc" >
< h2 > Table of Contents< / h2 >
< div id = "text-table-of-contents" role = "doc-toc" >
< ul >
2021-11-30 17:54:19 +01:00
< li > < a href = "#orgbeabbac" > 1. System Kinematics< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 17:54:19 +01:00
< li > < a href = "#org72840a7" > 1.1. Bragg Angle< / a > < / li >
< li > < a href = "#org330c2ee" > 1.2. Kinematics (111 Crystal)< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 17:54:19 +01:00
< li > < a href = "#orgcf6be49" > 1.2.1. Interferometers - 111 Crystal< / a > < / li >
< li > < a href = "#org729d4fd" > 1.2.2. Piezo - 111 Crystal< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
2021-11-30 17:54:19 +01:00
< li > < a href = "#orgd9564bd" > 1.3. Save Kinematics< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
2021-11-30 17:54:19 +01:00
< li > < a href = "#org94165e4" > 2. Open Loop System Identification< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 17:54:19 +01:00
< li > < a href = "#org49f773d" > 2.1. Identification< / a > < / li >
< li > < a href = "#orga27ac31" > 2.2. Plant in the frame of the fastjacks< / a > < / li >
< li > < a href = "#org1d08b17" > 2.3. Plant in the frame of the crystal< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
2021-11-30 17:54:19 +01:00
< li > < a href = "#orge94151e" > 3. Open-Loop Noise Budgeting< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 17:54:19 +01:00
< li > < a href = "#org20060df" > 3.1. Power Spectral Density of signals< / a > < / li >
< li > < a href = "#orgea5b4ad" > 3.2. Open Loop disturbance and measurement noise< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
2021-11-30 17:54:19 +01:00
< li > < a href = "#org987b6b1" > 4. Active Damping Plant (Strain gauges)< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 17:54:19 +01:00
< li > < a href = "#orge45c4d8" > 4.1. Identification< / a > < / li >
< li > < a href = "#org65bc5e9" > 4.2. Relative Active Damping< / a > < / li >
< li > < a href = "#orgc83a897" > 4.3. Damped Plant< / a > < / li >
2021-11-30 15:17:23 +01:00
< / ul >
< / li >
2021-11-30 17:54:19 +01:00
< li > < a href = "#orgf9782ba" > 5. Active Damping Plant (Force Sensors)< / a >
2021-11-30 15:17:23 +01:00
< ul >
2021-11-30 17:54:19 +01:00
< li > < a href = "#orge8c03e7" > 5.1. Identification< / a > < / li >
< li > < a href = "#org135d9f2" > 5.2. Controller - Root Locus< / a > < / li >
< li > < a href = "#org4072236" > 5.3. Damped Plant< / a > < / li >
< / ul >
< / li >
< li > < a href = "#org5b57c31" > 6. HAC-LAC (IFF) architecture< / a >
< ul >
< li > < a href = "#orgb4b8d52" > 6.1. System Identification< / a > < / li >
< li > < a href = "#org714ec0f" > 6.2. High Authority Controller< / a > < / li >
< li > < a href = "#org9c9ea48" > 6.3. Performances< / a > < / li >
< li > < a href = "#orgbdf7b28" > 6.4. Close Loop noise budget< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
< / ul >
< / div >
< / div >
< hr >
< p > This report is also available as a < a href = "./dcm-simscape.pdf" > pdf< / a > .< / p >
< hr >
< p >
In this document, a Simscape (.e.g. multi-body) model of the ESRF Double Crystal Monochromator (DCM) is presented and used to develop and optimize the control strategy.
< / p >
< p >
It is structured as follow:
< / p >
< ul class = "org-ul" >
2021-11-30 17:54:19 +01:00
< li > Section < a href = "#org02dd8b0" > 1< / a > : the kinematics of the DCM is presented, and Jacobian matrices which are used to solve the inverse and forward kinematics are computed.< / li >
< li > Section < a href = "#orgf62c035" > 2< / a > : the system dynamics is identified in the absence of control.< / li >
< li > Section < a href = "#org47df825" > 3< / a > : an open-loop noise budget is performed.< / li >
< li > Section < a href = "#org64d9ba7" > 4< / a > : it is studied whether if the strain gauges fixed to the piezoelectric actuators can be used to actively damp the plant.< / li >
< li > Section < a href = "#org7fbe16a" > 5< / a > : piezoelectric force sensors are added in series with the piezoelectric actuators and are used to actively damp the plant using the Integral Force Feedback (IFF) control strategy.< / li >
< li > Section < a href = "#org226a3fc" > 6< / a > : the High Authority Control - Low Authority Control (HAC-LAC) strategy is tested on the Simscape model.< / li >
2021-11-30 11:28:07 +01:00
< / ul >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orgbeabbac" class = "outline-2" >
< h2 id = "orgbeabbac" > < span class = "section-number-2" > 1.< / span > System Kinematics< / h2 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-2" id = "text-1" >
< p >
2021-11-30 17:54:19 +01:00
< a id = "org02dd8b0" > < / a >
2021-11-30 11:28:07 +01:00
< / p >
< / div >
2021-11-30 15:17:23 +01:00
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org72840a7" class = "outline-3" >
< h3 id = "org72840a7" > < span class = "section-number-3" > 1.1.< / span > Bragg Angle< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-1-1" >
2021-11-30 17:54:19 +01:00
< p >
There is a simple relation < a href = "eq:bragg_angle_formula" > eq:bragg_angle_formula< / a > between:
< / p >
< ul class = "org-ul" >
< li > \(d_{\text{off}}\) is the wanted offset between the incident x-ray and the output x-ray< / li >
< li > \(\theta_b\) is the bragg angle< / li >
< li > \(d_z\) is the corresponding distance between the first and second crystals< / li >
< / ul >
2021-11-30 11:28:07 +01:00
2021-11-30 17:54:19 +01:00
\begin{equation} \label{eq:bragg_angle_formula}
d_z = \frac{d_{\text{off}}}{2 \cos \theta_b}
\end{equation}
2021-11-30 11:28:07 +01:00
2021-11-30 17:54:19 +01:00
< p >
This relation is shown in Figure < a href = "#orgd56c0ff" > 1< / a > .
< / p >
2021-11-30 11:28:07 +01:00
2021-11-30 17:54:19 +01:00
< div id = "orgd56c0ff" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/jack_motion_bragg_angle.png" alt = "jack_motion_bragg_angle.png" / >
< / p >
< p > < span class = "figure-number" > Figure 1: < / span > Jack motion as a function of Bragg angle< / p >
< / div >
2021-11-30 17:54:19 +01:00
< p >
The required jack stroke is approximately 25mm.
< / p >
2021-11-30 11:28:07 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Required Jack stroke< / span >
< span class = "org-matlab-math" > ans< / span > = 1e3< span class = "org-builtin" > *< / span > (dz(end) < span class = "org-builtin" > -< / span > dz(1))
< / pre >
< / div >
< pre class = "example" >
24.963
< / pre >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org330c2ee" class = "outline-3" >
< h3 id = "org330c2ee" > < span class = "section-number-3" > 1.2.< / span > Kinematics (111 Crystal)< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-1-2" >
< p >
The reference frame is taken at the center of the 111 second crystal.
< / p >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orgcf6be49" class = "outline-4" >
< h4 id = "orgcf6be49" > < span class = "section-number-4" > 1.2.1.< / span > Interferometers - 111 Crystal< / h4 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-4" id = "text-1-2-1" >
< p >
Three interferometers are pointed to the bottom surface of the 111 crystal.
< / p >
< p >
2021-11-30 17:54:19 +01:00
The position of the measurement points are shown in Figure < a href = "#org7cdbbab" > 2< / a > as well as the origin where the motion of the crystal is computed.
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< div id = "org7cdbbab" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/sensor_111_crystal_points.png" alt = "sensor_111_crystal_points.png" / >
< / p >
< p > < span class = "figure-number" > Figure 2: < / span > Bottom view of the second crystal 111. Position of the measurement points.< / p >
< / div >
< p >
2021-11-30 17:54:19 +01:00
The inverse kinematics consisting of deriving the interferometer measurements from the motion of the crystal (see Figure < a href = "#orgea687e1" > 3< / a > ):
2021-11-30 11:28:07 +01:00
< / p >
\begin{equation}
\begin{bmatrix}
x_1 \\ x_2 \\ x_3
\end{bmatrix}
=
\bm{J}_{s,111}
\begin{bmatrix}
d_z \\ r_y \\ r_x
\end{bmatrix}
\end{equation}
2021-11-30 17:54:19 +01:00
< div id = "orgea687e1" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/schematic_sensor_jacobian_inverse_kinematics.png" alt = "schematic_sensor_jacobian_inverse_kinematics.png" / >
< / p >
< p > < span class = "figure-number" > Figure 3: < / span > Inverse Kinematics - Interferometers< / p >
< / div >
< p >
2021-11-30 17:54:19 +01:00
From the Figure < a href = "#org7cdbbab" > 2< / a > , the inverse kinematics can be solved as follow (for small motion):
2021-11-30 11:28:07 +01:00
< / p >
\begin{equation}
\bm{J}_{s,111}
=
\begin{bmatrix}
1 & 0.07 & -0.015 \\
1 & 0 & 0.015 \\
1 & -0.07 & -0.015
\end{bmatrix}
\end{equation}
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Sensor Jacobian matrix for 111 crystal< / span >
J_s_111 = [1, 0.07, < span class = "org-builtin" > -< / span > 0.015
1, 0, 0.015
1, < span class = "org-builtin" > -< / span > 0.07, < span class = "org-builtin" > -< / span > 0.015];
< / pre >
< / div >
2021-11-30 17:54:19 +01:00
< table id = "org31f833a" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2021-11-30 11:28:07 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 1:< / span > Sensor Jacobian \(\bm{J}_{s,111}\)< / caption >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< tbody >
< tr >
< td class = "org-right" > 1.0< / td >
< td class = "org-right" > 0.07< / td >
< td class = "org-right" > -0.015< / td >
< / tr >
< tr >
< td class = "org-right" > 1.0< / td >
< td class = "org-right" > 0.0< / td >
< td class = "org-right" > 0.015< / td >
< / tr >
< tr >
< td class = "org-right" > 1.0< / td >
< td class = "org-right" > -0.07< / td >
< td class = "org-right" > -0.015< / td >
< / tr >
< / tbody >
< / table >
< p >
2021-11-30 17:54:19 +01:00
The forward kinematics is solved by inverting the Jacobian matrix (see Figure < a href = "#org220e3fd" > 4< / a > ).
2021-11-30 11:28:07 +01:00
< / p >
\begin{equation}
\begin{bmatrix}
d_z \\ r_y \\ r_x
\end{bmatrix}
=
\bm{J}_{s,111}^{-1}
\begin{bmatrix}
x_1 \\ x_2 \\ x_3
\end{bmatrix}
\end{equation}
2021-11-30 17:54:19 +01:00
< div id = "org220e3fd" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/schematic_sensor_jacobian_forward_kinematics.png" alt = "schematic_sensor_jacobian_forward_kinematics.png" / >
< / p >
< p > < span class = "figure-number" > Figure 4: < / span > Forward Kinematics - Interferometers< / p >
< / div >
2021-11-30 17:54:19 +01:00
< table id = "orga06a454" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2021-11-30 11:28:07 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 2:< / span > Inverse of the sensor Jacobian \(\bm{J}_{s,111}^{-1}\)< / caption >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< tbody >
< tr >
< td class = "org-right" > 0.25< / td >
< td class = "org-right" > 0.5< / td >
< td class = "org-right" > 0.25< / td >
< / tr >
< tr >
< td class = "org-right" > 7.14< / td >
< td class = "org-right" > 0.0< / td >
< td class = "org-right" > -7.14< / td >
< / tr >
< tr >
< td class = "org-right" > -16.67< / td >
< td class = "org-right" > 33.33< / td >
< td class = "org-right" > -16.67< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org729d4fd" class = "outline-4" >
< h4 id = "org729d4fd" > < span class = "section-number-4" > 1.2.2.< / span > Piezo - 111 Crystal< / h4 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-4" id = "text-1-2-2" >
< p >
2021-11-30 17:54:19 +01:00
The location of the actuators with respect with the center of the 111 second crystal are shown in Figure < a href = "#org92f0f11" > 5< / a > .
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< div id = "org92f0f11" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/actuator_jacobian_111_points.png" alt = "actuator_jacobian_111_points.png" / >
< / p >
< p > < span class = "figure-number" > Figure 5: < / span > Location of actuators with respect to the center of the 111 second crystal (bottom view)< / p >
< / div >
< p >
Inverse Kinematics consist of deriving the axial (z) motion of the 3 actuators from the motion of the crystal’ s center.
< / p >
\begin{equation}
\begin{bmatrix}
d_{u_r} \\ d_{u_h} \\ d_{d}
\end{bmatrix}
=
\bm{J}_{a,111}
\begin{bmatrix}
d_z \\ r_y \\ r_x
\end{bmatrix}
\end{equation}
2021-11-30 17:54:19 +01:00
< div id = "org87ec19c" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/schematic_actuator_jacobian_inverse_kinematics.png" alt = "schematic_actuator_jacobian_inverse_kinematics.png" / >
< / p >
< p > < span class = "figure-number" > Figure 6: < / span > Inverse Kinematics - Actuators< / p >
< / div >
< p >
2021-11-30 17:54:19 +01:00
Based on the geometry in Figure < a href = "#org92f0f11" > 5< / a > , we obtain:
2021-11-30 11:28:07 +01:00
< / p >
\begin{equation}
\bm{J}_{a,111}
=
\begin{bmatrix}
1 & 0.14 & -0.1525 \\
1 & 0.14 & 0.0675 \\
1 & -0.14 & -0.0425
\end{bmatrix}
\end{equation}
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Actuator Jacobian - 111 crystal< / span >
J_a_111 = [1, 0.14, < span class = "org-builtin" > -< / span > 0.1525
1, 0.14, 0.0675
1, < span class = "org-builtin" > -< / span > 0.14, < span class = "org-builtin" > -< / span > 0.0425];
< / pre >
< / div >
2021-11-30 17:54:19 +01:00
< table id = "orga19c158" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2021-11-30 11:28:07 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 3:< / span > Actuator Jacobian \(\bm{J}_{a,111}\)< / caption >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< tbody >
< tr >
< td class = "org-right" > 1.0< / td >
< td class = "org-right" > 0.14< / td >
< td class = "org-right" > -0.1525< / td >
< / tr >
< tr >
< td class = "org-right" > 1.0< / td >
< td class = "org-right" > 0.14< / td >
< td class = "org-right" > 0.0675< / td >
< / tr >
< tr >
< td class = "org-right" > 1.0< / td >
< td class = "org-right" > -0.14< / td >
< td class = "org-right" > -0.0425< / td >
< / tr >
< / tbody >
< / table >
< p >
The forward Kinematics is solved by inverting the Jacobian matrix:
< / p >
\begin{equation}
\begin{bmatrix}
d_z \\ r_y \\ r_x
\end{bmatrix}
=
\bm{J}_{a,111}^{-1}
\begin{bmatrix}
d_{u_r} \\ d_{u_h} \\ d_{d}
\end{bmatrix}
\end{equation}
2021-11-30 17:54:19 +01:00
< div id = "orga0d447c" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/schematic_actuator_jacobian_forward_kinematics.png" alt = "schematic_actuator_jacobian_forward_kinematics.png" / >
< / p >
< p > < span class = "figure-number" > Figure 7: < / span > Forward Kinematics - Actuators for 111 crystal< / p >
< / div >
2021-11-30 17:54:19 +01:00
< table id = "orga2ec14c" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2021-11-30 11:28:07 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 4:< / span > Inverse of the actuator Jacobian \(\bm{J}_{a,111}^{-1}\)< / caption >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< tbody >
< tr >
< td class = "org-right" > 0.0568< / td >
< td class = "org-right" > 0.4432< / td >
< td class = "org-right" > 0.5< / td >
< / tr >
< tr >
< td class = "org-right" > 1.7857< / td >
< td class = "org-right" > 1.7857< / td >
< td class = "org-right" > -3.5714< / td >
< / tr >
< tr >
< td class = "org-right" > -4.5455< / td >
< td class = "org-right" > 4.5455< / td >
< td class = "org-right" > 0.0< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orgd9564bd" class = "outline-3" >
< h3 id = "orgd9564bd" > < span class = "section-number-3" > 1.3.< / span > Save Kinematics< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-1-3" >
< div class = "org-src-container" >
< pre class = "src src-matlab" > save(< span class = "org-string" > 'mat/dcm_kinematics.mat'< / span > , < span class = "org-string" > 'J_a_111'< / span > , < span class = "org-string" > 'J_s_111'< / span > )
< / pre >
< / div >
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org94165e4" class = "outline-2" >
< h2 id = "org94165e4" > < span class = "section-number-2" > 2.< / span > Open Loop System Identification< / h2 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-2" id = "text-2" >
< p >
2021-11-30 17:54:19 +01:00
< a id = "orgf62c035" > < / a >
2021-11-30 11:28:07 +01:00
< / p >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org49f773d" class = "outline-3" >
< h3 id = "org49f773d" > < span class = "section-number-3" > 2.1.< / span > Identification< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-2-1" >
< p >
Let’ s considered the system \(\bm{G}(s)\) with:
< / p >
< ul class = "org-ul" >
< li > 3 inputs: force applied to the 3 fast jacks< / li >
< li > 3 outputs: measured displacement by the 3 interferometers pointing at the 111 second crystal< / li >
< / ul >
< p >
2021-11-30 17:54:19 +01:00
It is schematically shown in Figure < a href = "#org03d9ffb" > 8< / a > .
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< div id = "org03d9ffb" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/schematic_system_inputs_outputs.png" alt = "schematic_system_inputs_outputs.png" / >
< / p >
< p > < span class = "figure-number" > Figure 8: < / span > Dynamical system with inputs and outputs< / p >
< / div >
< p >
The system is identified from the Simscape model.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Input/Output definition< / span >
clear io; io_i = 1;
< span class = "org-matlab-cellbreak" > %% Inputs< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Control Input {3x1} [N]< / span >
io(io_i) = linio([mdl, < span class = "org-string" > '/control_system'< / span > ], 1, < span class = "org-string" > 'openinput'< / span > ); io_i = io_i < span class = "org-builtin" > +< / span > 1;
< span class = "org-matlab-cellbreak" > %% Outputs< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Interferometers {3x1} [m]< / span >
io(io_i) = linio([mdl, < span class = "org-string" > '/DCM'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-builtin" > +< / span > 1;
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Extraction of the dynamics< / span >
G = linearize(mdl, io);
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > size(G)
< / pre >
< / div >
< pre class = "example" >
size(G)
State-space model with 3 outputs, 3 inputs, and 24 states.
< / pre >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orga27ac31" class = "outline-3" >
< h3 id = "orga27ac31" > < span class = "section-number-3" > 2.2.< / span > Plant in the frame of the fastjacks< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-2-2" >
< div class = "org-src-container" >
2021-11-30 15:17:23 +01:00
< pre class = "src src-matlab" > load(< span class = "org-string" > 'dcm_kinematics.mat'< / span > );
2021-11-30 11:28:07 +01:00
< / pre >
< / div >
< p >
2021-11-30 17:54:19 +01:00
Using the forward and inverse kinematics, we can computed the dynamics from piezo forces to axial motion of the 3 fastjacks (see Figure < a href = "#org5f538a8" > 9< / a > ).
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< div id = "org5f538a8" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/schematic_jacobian_frame_fastjack.png" alt = "schematic_jacobian_frame_fastjack.png" / >
< / p >
< p > < span class = "figure-number" > Figure 9: < / span > Use of Jacobian matrices to obtain the system in the frame of the fastjacks< / p >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Compute the system in the frame of the fastjacks< / span >
G_pz = J_a_111< span class = "org-builtin" > *< / span > inv(J_s_111)< span class = "org-builtin" > *< / span > G;
< / pre >
< / div >
< p >
The DC gain of the new system shows that the system is well decoupled at low frequency.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > dcgain(G_pz)
< / pre >
< / div >
2021-11-30 17:54:19 +01:00
< table id = "orgdc8a086" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2021-11-30 11:28:07 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 5:< / span > DC gain of the plant in the frame of the fast jacks \(\bm{G}_{\text{fj}}\)< / caption >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< tbody >
< tr >
< td class = "org-right" > 4.4407e-09< / td >
< td class = "org-right" > 2.7656e-12< / td >
< td class = "org-right" > 1.0132e-12< / td >
< / tr >
< tr >
< td class = "org-right" > 2.7656e-12< / td >
< td class = "org-right" > 4.4407e-09< / td >
< td class = "org-right" > 1.0132e-12< / td >
< / tr >
< tr >
< td class = "org-right" > 1.0109e-12< / td >
< td class = "org-right" > 1.0109e-12< / td >
< td class = "org-right" > 4.4424e-09< / td >
< / tr >
< / tbody >
< / table >
< p >
2021-11-30 17:54:19 +01:00
The bode plot of \(\bm{G}_{\text{fj}}(s)\) is shown in Figure < a href = "#org4618cac" > 10< / a > .
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< div id = "org4618cac" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/bode_plot_plant_fj.png" alt = "bode_plot_plant_fj.png" / >
< / p >
< p > < span class = "figure-number" > Figure 10: < / span > Bode plot of the diagonal and off-diagonal elements of the plant in the frame of the fast jacks< / p >
< / div >
2021-11-30 17:54:19 +01:00
< div class = "important" id = "org834d546" >
2021-11-30 11:28:07 +01:00
< p >
Computing the system in the frame of the fastjack gives good decoupling at low frequency (until the first resonance of the system).
< / p >
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org1d08b17" class = "outline-3" >
< h3 id = "org1d08b17" > < span class = "section-number-3" > 2.3.< / span > Plant in the frame of the crystal< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-2-3" >
2021-11-30 17:54:19 +01:00
< div id = "orgd94c3c6" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/schematic_jacobian_frame_crystal.png" alt = "schematic_jacobian_frame_crystal.png" / >
< / p >
< p > < span class = "figure-number" > Figure 11: < / span > Use of Jacobian matrices to obtain the system in the frame of the crystal< / p >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > G_mr = inv(J_s_111)< span class = "org-builtin" > *< / span > G< span class = "org-builtin" > *< / span > inv(J_a_111< span class = "org-builtin" > '< / span > );
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > dcgain(G_mr)
< / pre >
< / div >
< table border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< tbody >
< tr >
< td class = "org-right" > 1.9978e-09< / td >
< td class = "org-right" > 3.9657e-09< / td >
< td class = "org-right" > 7.7944e-09< / td >
< / tr >
< tr >
< td class = "org-right" > 3.9656e-09< / td >
< td class = "org-right" > 8.4979e-08< / td >
< td class = "org-right" > -1.5135e-17< / td >
< / tr >
< tr >
< td class = "org-right" > 7.7944e-09< / td >
< td class = "org-right" > -3.9252e-17< / td >
< td class = "org-right" > 1.834e-07< / td >
< / tr >
< / tbody >
< / table >
< p >
This results in a coupled system.
The main reason is that, as we map forces to the center of the 111 crystal and not at the center of mass/stiffness of the moving part, vertical forces will induce rotation and torques will induce vertical motion.
< / p >
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orge94151e" class = "outline-2" >
< h2 id = "orge94151e" > < span class = "section-number-2" > 3.< / span > Open-Loop Noise Budgeting< / h2 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-2" id = "text-3" >
< p >
2021-11-30 17:54:19 +01:00
< a id = "org47df825" > < / a >
< / p >
< div id = "org2ed8210" class = "figure" >
< p > < img src = "figs/noise_budget_dcm_schematic_fast_jack_frame.png" alt = "noise_budget_dcm_schematic_fast_jack_frame.png" / >
< / p >
< p > < span class = "figure-number" > Figure 12: < / span > Schematic representation of the control loop in the frame of one fast jack< / p >
< / div >
< / div >
< div id = "outline-container-org20060df" class = "outline-3" >
< h3 id = "org20060df" > < span class = "section-number-3" > 3.1.< / span > Power Spectral Density of signals< / h3 >
< div class = "outline-text-3" id = "text-3-1" >
< p >
Interferometer noise:
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > Wn = 6e< span class = "org-builtin" > -< / span > 11< span class = "org-builtin" > *< / span > (1 < span class = "org-builtin" > +< / span > s< span class = "org-builtin" > /< / span > 2< span class = "org-builtin" > /< / span > < span class = "org-matlab-math" > pi< / span > < span class = "org-builtin" > /< / span > 200)< span class = "org-builtin" > /< / span > (1 < span class = "org-builtin" > +< / span > s< span class = "org-builtin" > /< / span > 2< span class = "org-builtin" > /< / span > < span class = "org-matlab-math" > pi< / span > < span class = "org-builtin" > /< / span > 60); < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > m/sqrt(Hz)< / span >
< / pre >
< / div >
< pre class = "example" >
Measurement noise: 0.79 [nm,rms]
< / pre >
< p >
DAC noise (amplified by the PI voltage amplifier, and converted to newtons):
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > Wdac = tf(3e< span class = "org-builtin" > -< / span > 8); < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > V/sqrt(Hz)< / span >
Wu = Wdac< span class = "org-builtin" > *< / span > 22.5< span class = "org-builtin" > *< / span > 10; < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > N/sqrt(Hz)< / span >
< / pre >
< / div >
< pre class = "example" >
DAC noise: 0.95 [uV,rms]
< / pre >
< p >
Disturbances:
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > Wd = 5e< span class = "org-builtin" > -< / span > 7< span class = "org-builtin" > /< / span > (1 < span class = "org-builtin" > +< / span > s< span class = "org-builtin" > /< / span > 2< span class = "org-builtin" > /< / span > < span class = "org-matlab-math" > pi< / span > ); < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > m/sqrt(Hz)< / span >
< / pre >
< / div >
< pre class = "example" >
Disturbance motion: 0.61 [um,rms]
< / pre >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Save ASD of noise and disturbances< / span >
save(< span class = "org-string" > 'mat/asd_noises_disturbances.mat'< / span > , < span class = "org-string" > 'Wn'< / span > , < span class = "org-string" > 'Wu'< / span > , < span class = "org-string" > 'Wd'< / span > );
< / pre >
< / div >
< / div >
< / div >
< div id = "outline-container-orgea5b4ad" class = "outline-3" >
< h3 id = "orgea5b4ad" > < span class = "section-number-3" > 3.2.< / span > Open Loop disturbance and measurement noise< / h3 >
< div class = "outline-text-3" id = "text-3-2" >
< p >
The comparison of the amplitude spectral density of the measurement noise and of the jack parasitic motion is performed in Figure < a href = "#orge20b337" > 13< / a > .
It confirms that the sensor noise is low enough to measure the motion errors of the crystal.
< / p >
< div id = "orge20b337" class = "figure" >
< p > < img src = "figs/open_loop_noise_budget_fast_jack.png" alt = "open_loop_noise_budget_fast_jack.png" / >
< / p >
< p > < span class = "figure-number" > Figure 13: < / span > Open Loop noise budgeting< / p >
< / div >
< / div >
< / div >
< / div >
< div id = "outline-container-org987b6b1" class = "outline-2" >
< h2 id = "org987b6b1" > < span class = "section-number-2" > 4.< / span > Active Damping Plant (Strain gauges)< / h2 >
< div class = "outline-text-2" id = "text-4" >
< p >
< a id = "org64d9ba7" > < / a >
2021-11-30 11:28:07 +01:00
< / p >
< p >
In this section, we wish to see whether if strain gauges fixed to the piezoelectric actuator can be used for active damping.
< / p >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orge45c4d8" class = "outline-3" >
< h3 id = "orge45c4d8" > < span class = "section-number-3" > 4.1.< / span > Identification< / h3 >
< div class = "outline-text-3" id = "text-4-1" >
2021-11-30 11:28:07 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Input/Output definition< / span >
clear io; io_i = 1;
< span class = "org-matlab-cellbreak" > %% Inputs< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Control Input {3x1} [N]< / span >
2021-11-30 11:45:05 +01:00
io(io_i) = linio([mdl, < span class = "org-string" > '/control_system'< / span > ], 1, < span class = "org-string" > 'openinput'< / span > ); io_i = io_i < span class = "org-builtin" > +< / span > 1;
2021-11-30 11:28:07 +01:00
< span class = "org-matlab-cellbreak" > %% Outputs< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Strain Gauges {3x1} [m]< / span >
2021-11-30 11:45:05 +01:00
io(io_i) = linio([mdl, < span class = "org-string" > '/DCM'< / span > ], 2, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-builtin" > +< / span > 1;
2021-11-30 11:28:07 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Extraction of the dynamics< / span >
G_sg = linearize(mdl, io);
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > dcgain(G_sg)
< / pre >
< / div >
< table border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< tbody >
< tr >
2021-11-30 11:45:05 +01:00
< td class = "org-right" > 4.4443e-09< / td >
2021-11-30 11:28:07 +01:00
< td class = "org-right" > 1.0339e-13< / td >
< td class = "org-right" > 3.774e-14< / td >
< / tr >
< tr >
< td class = "org-right" > 1.0339e-13< / td >
2021-11-30 11:45:05 +01:00
< td class = "org-right" > 4.4443e-09< / td >
2021-11-30 11:28:07 +01:00
< td class = "org-right" > 3.774e-14< / td >
< / tr >
< tr >
< td class = "org-right" > 3.7792e-14< / td >
< td class = "org-right" > 3.7792e-14< / td >
2021-11-30 11:45:05 +01:00
< td class = "org-right" > 4.4444e-09< / td >
2021-11-30 11:28:07 +01:00
< / tr >
< / tbody >
< / table >
2021-11-30 11:45:05 +01:00
2021-11-30 17:54:19 +01:00
< div id = "org782b33f" class = "figure" >
2021-11-30 11:45:05 +01:00
< p > < img src = "figs/strain_gauge_plant_bode_plot.png" alt = "strain_gauge_plant_bode_plot.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 14: < / span > Bode Plot of the transfer functions from piezoelectric forces to strain gauges measuremed displacements< / p >
2021-11-30 11:45:05 +01:00
< / div >
2021-11-30 17:54:19 +01:00
< div class = "important" id = "org9ec0d6c" >
2021-11-30 11:45:05 +01:00
< p >
2021-11-30 17:54:19 +01:00
As the distance between the poles and zeros in Figure < a href = "#org0e9b8f2" > 17< / a > is very small, little damping can be actively added using the strain gauges.
2021-11-30 11:45:05 +01:00
This will be confirmed using a Root Locus plot.
< / p >
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org65bc5e9" class = "outline-3" >
< h3 id = "org65bc5e9" > < span class = "section-number-3" > 4.2.< / span > Relative Active Damping< / h3 >
< div class = "outline-text-3" id = "text-4-2" >
2021-11-30 11:45:05 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > Krad_g1 = eye(3)< span class = "org-builtin" > *< / span > s< span class = "org-builtin" > /< / span > (s< span class = "org-builtin" > ^< / span > 2< span class = "org-builtin" > /< / span > (2< span class = "org-builtin" > *< / span > < span class = "org-matlab-math" > pi< / span > < span class = "org-builtin" > *< / span > 500)< span class = "org-builtin" > ^< / span > 2 < span class = "org-builtin" > +< / span > 2< span class = "org-builtin" > *< / span > s< span class = "org-builtin" > /< / span > (2< span class = "org-builtin" > *< / span > < span class = "org-matlab-math" > pi< / span > < span class = "org-builtin" > *< / span > 500) < span class = "org-builtin" > +< / span > 1);
< / pre >
< / div >
< p >
2021-11-30 17:54:19 +01:00
As can be seen in Figure < a href = "#orgc3707d5" > 15< / a > , very little damping can be added using relative damping strategy using strain gauges.
2021-11-30 11:45:05 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< div id = "orgc3707d5" class = "figure" >
2021-11-30 11:45:05 +01:00
< p > < img src = "figs/relative_damping_root_locus.png" alt = "relative_damping_root_locus.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 15: < / span > Root Locus for the relative damping control< / p >
2021-11-30 11:45:05 +01:00
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > Krad = < span class = "org-builtin" > -< / span > g< span class = "org-builtin" > *< / span > Krad_g1;
< / pre >
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orgc83a897" class = "outline-3" >
< h3 id = "orgc83a897" > < span class = "section-number-3" > 4.3.< / span > Damped Plant< / h3 >
< div class = "outline-text-3" id = "text-4-3" >
2021-11-30 11:45:05 +01:00
< p >
The controller is implemented on Simscape, and the damped plant is identified.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Input/Output definition< / span >
clear io; io_i = 1;
< span class = "org-matlab-cellbreak" > %% Inputs< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Control Input {3x1} [N]< / span >
io(io_i) = linio([mdl, < span class = "org-string" > '/control_system'< / span > ], 1, < span class = "org-string" > 'input'< / span > ); io_i = io_i < span class = "org-builtin" > +< / span > 1;
< span class = "org-matlab-cellbreak" > %% Outputs< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Force Sensor {3x1} [m]< / span >
io(io_i) = linio([mdl, < span class = "org-string" > '/DCM'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-builtin" > +< / span > 1;
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% DCM Kinematics< / span >
2021-11-30 15:17:23 +01:00
load(< span class = "org-string" > 'dcm_kinematics.mat'< / span > );
2021-11-30 11:45:05 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Identification of the Open Loop plant< / span >
controller.type = 0; < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Open Loop< / span >
G_ol = J_a_111< span class = "org-builtin" > *< / span > inv(J_s_111)< span class = "org-builtin" > *< / span > linearize(mdl, io);
G_ol.InputName = {< span class = "org-string" > 'u_ur'< / span > , < span class = "org-string" > 'u_uh'< / span > , < span class = "org-string" > 'u_d'< / span > };
G_ol.OutputName = {< span class = "org-string" > 'd_ur'< / span > , < span class = "org-string" > 'd_uh'< / span > , < span class = "org-string" > 'd_d'< / span > };
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Identification of the damped plant with Relative Active Damping< / span >
controller.type = 2; < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > RAD< / span >
G_dp = J_a_111< span class = "org-builtin" > *< / span > inv(J_s_111)< span class = "org-builtin" > *< / span > linearize(mdl, io);
G_dp.InputName = {< span class = "org-string" > 'u_ur'< / span > , < span class = "org-string" > 'u_uh'< / span > , < span class = "org-string" > 'u_d'< / span > };
G_dp.OutputName = {< span class = "org-string" > 'd_ur'< / span > , < span class = "org-string" > 'd_uh'< / span > , < span class = "org-string" > 'd_d'< / span > };
< / pre >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "org5d6f27c" class = "figure" >
2021-11-30 11:45:05 +01:00
< p > < img src = "figs/comp_damp_undamped_plant_rad_bode_plot.png" alt = "comp_damp_undamped_plant_rad_bode_plot.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 16: < / span > Bode plot of both the open-loop plant and the damped plant using relative active damping< / p >
2021-11-30 11:45:05 +01:00
< / div >
2021-11-30 11:28:07 +01:00
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orgf9782ba" class = "outline-2" >
< h2 id = "orgf9782ba" > < span class = "section-number-2" > 5.< / span > Active Damping Plant (Force Sensors)< / h2 >
< div class = "outline-text-2" id = "text-5" >
2021-11-30 11:28:07 +01:00
< p >
2021-11-30 17:54:19 +01:00
< a id = "org7fbe16a" > < / a >
2021-11-30 11:28:07 +01:00
< / p >
< p >
Force sensors are added above the piezoelectric actuators.
They can consists of a simple piezoelectric ceramic stack.
See for instance < a href = "fleming10_integ_strain_force_feedb_high" > fleming10_integ_strain_force_feedb_high< / a > .
< / p >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orge8c03e7" class = "outline-3" >
< h3 id = "orge8c03e7" > < span class = "section-number-3" > 5.1.< / span > Identification< / h3 >
< div class = "outline-text-3" id = "text-5-1" >
2021-11-30 11:28:07 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Input/Output definition< / span >
clear io; io_i = 1;
< span class = "org-matlab-cellbreak" > %% Inputs< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Control Input {3x1} [N]< / span >
io(io_i) = linio([mdl, < span class = "org-string" > '/control_system'< / span > ], 1, < span class = "org-string" > 'openinput'< / span > ); io_i = io_i < span class = "org-builtin" > +< / span > 1;
< span class = "org-matlab-cellbreak" > %% Outputs< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Force Sensor {3x1} [m]< / span >
io(io_i) = linio([mdl, < span class = "org-string" > '/DCM'< / span > ], 3, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-builtin" > +< / span > 1;
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Extraction of the dynamics< / span >
G_fs = linearize(mdl, io);
< / pre >
< / div >
2021-11-30 15:17:23 +01:00
< p >
2021-11-30 17:54:19 +01:00
The Bode plot of the identified dynamics is shown in Figure < a href = "#org0e9b8f2" > 17< / a > .
2021-11-30 15:17:23 +01:00
At high frequency, the diagonal terms are constants while the off-diagonal terms have some roll-off.
< / p >
2021-11-30 11:28:07 +01:00
2021-11-30 17:54:19 +01:00
< div id = "org0e9b8f2" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/iff_plant_bode_plot.png" alt = "iff_plant_bode_plot.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 17: < / span > Bode plot of IFF Plant< / p >
2021-11-30 11:28:07 +01:00
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org135d9f2" class = "outline-3" >
< h3 id = "org135d9f2" > < span class = "section-number-3" > 5.2.< / span > Controller - Root Locus< / h3 >
< div class = "outline-text-3" id = "text-5-2" >
2021-11-30 15:17:23 +01:00
< p >
We want to have integral action around the resonances of the system, but we do not want to integrate at low frequency.
Therefore, we can use a low pass filter.
< / p >
2021-11-30 11:28:07 +01:00
< div class = "org-src-container" >
2021-11-30 15:17:23 +01:00
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Integral Force Feedback Controller< / span >
Kiff_g1 = eye(3)< span class = "org-builtin" > *< / span > 1< span class = "org-builtin" > /< / span > (1 < span class = "org-builtin" > +< / span > s< span class = "org-builtin" > /< / span > 2< span class = "org-builtin" > /< / span > < span class = "org-matlab-math" > pi< / span > < span class = "org-builtin" > /< / span > 20);
2021-11-30 11:28:07 +01:00
< / pre >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "org14798b7" class = "figure" >
2021-11-30 11:28:07 +01:00
< p > < img src = "figs/iff_root_locus.png" alt = "iff_root_locus.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 18: < / span > Root Locus plot for the IFF Control strategy< / p >
2021-11-30 11:28:07 +01:00
< / div >
< div class = "org-src-container" >
2021-11-30 15:17:23 +01:00
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Integral Force Feedback Controller with optimal gain< / span >
2021-11-30 11:28:07 +01:00
Kiff = g< span class = "org-builtin" > *< / span > Kiff_g1;
< / pre >
< / div >
2021-11-30 15:17:23 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Save the IFF controller< / span >
save(< span class = "org-string" > 'mat/Kiff.mat'< / span > , < span class = "org-string" > 'Kiff'< / span > );
< / pre >
< / div >
2021-11-30 11:28:07 +01:00
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org4072236" class = "outline-3" >
< h3 id = "org4072236" > < span class = "section-number-3" > 5.3.< / span > Damped Plant< / h3 >
< div class = "outline-text-3" id = "text-5-3" >
2021-11-30 15:17:23 +01:00
< p >
2021-11-30 17:54:19 +01:00
Both the Open Loop dynamics (see Figure < a href = "#org5f538a8" > 9< / a > ) and the dynamics with IFF (see Figure < a href = "#org8cbe7f9" > 19< / a > ) are identified.
2021-11-30 15:17:23 +01:00
< / p >
2021-11-30 11:28:07 +01:00
2021-11-30 15:17:23 +01:00
< p >
We are here interested in the dynamics from \(\bm{u}^\prime = [u_{u_r}^\prime,\ u_{u_h}^\prime,\ u_d^\prime]\) (input of the damped plant) to \(\bm{d}_{\text{fj}} = [d_{u_r},\ d_{u_h},\ d_d]\) (motion of the crystal expressed in the frame of the fast-jacks).
2021-11-30 17:54:19 +01:00
This is schematically represented in Figure < a href = "#org8cbe7f9" > 19< / a > .
2021-11-30 15:17:23 +01:00
< / p >
2021-11-30 11:28:07 +01:00
2021-11-30 15:17:23 +01:00
2021-11-30 17:54:19 +01:00
< div id = "org8cbe7f9" class = "figure" >
2021-11-30 15:17:23 +01:00
< p > < img src = "figs/schematic_jacobian_frame_fastjack_iff.png" alt = "schematic_jacobian_frame_fastjack_iff.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 19: < / span > Use of Jacobian matrices to obtain the system in the frame of the fastjacks< / p >
2021-11-30 15:17:23 +01:00
< / div >
< p >
2021-11-30 17:54:19 +01:00
The dynamics from \(\bm{u}\) to \(\bm{d}_{\text{fj}}\) (open-loop dynamics) and from \(\bm{u}^\prime\) to \(\bm{d}_{\text{fs}}\) are compared in Figure < a href = "#org73485e9" > 20< / a > .
2021-11-30 15:17:23 +01:00
It is clear that the Integral Force Feedback control strategy is very effective in damping the resonances of the plant.
< / p >
2021-11-30 17:54:19 +01:00
< div id = "org73485e9" class = "figure" >
2021-11-30 15:17:23 +01:00
< p > < img src = "figs/comp_damped_undamped_plant_iff_bode_plot.png" alt = "comp_damped_undamped_plant_iff_bode_plot.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 20: < / span > Bode plot of both the open-loop plant and the damped plant using IFF< / p >
2021-11-30 15:17:23 +01:00
< / div >
2021-11-30 17:54:19 +01:00
< div class = "important" id = "org91bfa66" >
2021-11-30 15:17:23 +01:00
< p >
The Integral Force Feedback control strategy is very effective in damping the modes present in the plant.
< / p >
< / div >
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org5b57c31" class = "outline-2" >
< h2 id = "org5b57c31" > < span class = "section-number-2" > 6.< / span > HAC-LAC (IFF) architecture< / h2 >
< div class = "outline-text-2" id = "text-6" >
2021-11-30 15:17:23 +01:00
< p >
2021-11-30 17:54:19 +01:00
< a id = "org226a3fc" > < / a >
2021-11-30 15:17:23 +01:00
< / p >
< p >
2021-11-30 17:54:19 +01:00
The HAC-LAC architecture is shown in Figure < a href = "#org604ef36" > 21< / a > .
2021-11-30 15:17:23 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< div id = "org604ef36" class = "figure" >
2021-11-30 15:17:23 +01:00
< p > < img src = "figs/schematic_jacobian_frame_fastjack_hac_iff.png" alt = "schematic_jacobian_frame_fastjack_hac_iff.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 21: < / span > HAC-LAC architecture< / p >
2021-11-30 15:17:23 +01:00
< / div >
2021-11-30 11:28:07 +01:00
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-orgb4b8d52" class = "outline-3" >
< h3 id = "orgb4b8d52" > < span class = "section-number-3" > 6.1.< / span > System Identification< / h3 >
< div class = "outline-text-3" id = "text-6-1" >
2021-11-30 15:17:23 +01:00
< p >
Let’ s identify the damped plant.
< / p >
2021-11-30 17:54:19 +01:00
< div id = "orgb9d93cb" class = "figure" >
2021-11-30 15:17:23 +01:00
< p > < img src = "figs/bode_plot_hac_iff_plant.png" alt = "bode_plot_hac_iff_plant.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 22: < / span > Bode Plot of the plant for the High Authority Controller (transfer function from \(\bm{u}^\prime\) to \(\bm{\epsilon}_d\))< / p >
2021-11-30 15:17:23 +01:00
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org714ec0f" class = "outline-3" >
< h3 id = "org714ec0f" > < span class = "section-number-3" > 6.2.< / span > High Authority Controller< / h3 >
< div class = "outline-text-3" id = "text-6-2" >
2021-11-30 15:17:23 +01:00
< p >
Let’ s design a controller with a bandwidth of 100Hz.
As the plant is well decoupled and well approximated by a constant at low frequency, the high authority controller can easily be designed with SISO loop shaping.
< / p >
2021-11-30 11:28:07 +01:00
< div class = "org-src-container" >
2021-11-30 15:17:23 +01:00
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Controller design< / span >
wc = 2< span class = "org-builtin" > *< / span > < span class = "org-matlab-math" > pi< / span > < span class = "org-builtin" > *< / span > 100; < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Wanted crossover frequency [rad/s]< / span >
a = 2; < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Lead parameter< / span >
Khac = diag(1< span class = "org-builtin" > ./< / span > diag(abs(evalfr(G_dp, 1< span class = "org-constant" > j< / span > < span class = "org-builtin" > *< / span > wc)))) < span class = "org-builtin" > *< / span > < span class = "org-comment-delimiter" > .< / span > < span class = "org-comment" > .. % Diagonal controller< / span >
wc< span class = "org-builtin" > /< / span > s < span class = "org-builtin" > *< / span > < span class = "org-comment-delimiter" > .< / span > < span class = "org-comment" > .. % Integrator< / span >
1< span class = "org-builtin" > /< / span > (sqrt(a))< span class = "org-builtin" > *< / span > (1 < span class = "org-builtin" > +< / span > s< span class = "org-builtin" > /< / span > (wc< span class = "org-builtin" > /< / span > sqrt(a)))< span class = "org-builtin" > /< / span > (1 < span class = "org-builtin" > +< / span > s< span class = "org-builtin" > /< / span > (wc< span class = "org-builtin" > *< / span > sqrt(a))) < span class = "org-builtin" > *< / span > < span class = "org-comment-delimiter" > .< / span > < span class = "org-comment" > .. % Lead< / span >
1< span class = "org-builtin" > /< / span > (s< span class = "org-builtin" > ^< / span > 2< span class = "org-builtin" > /< / span > (4< span class = "org-builtin" > *< / span > wc)< span class = "org-builtin" > ^< / span > 2 < span class = "org-builtin" > +< / span > 2< span class = "org-builtin" > *< / span > s< span class = "org-builtin" > /< / span > (4< span class = "org-builtin" > *< / span > wc) < span class = "org-builtin" > +< / span > 1); < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Low pass filter< / span >
2021-11-30 11:28:07 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2021-11-30 15:17:23 +01:00
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Save the HAC controller< / span >
save(< span class = "org-string" > 'mat/Khac_iff.mat'< / span > , < span class = "org-string" > 'Khac'< / span > );
2021-11-30 11:28:07 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2021-11-30 15:17:23 +01:00
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Loop Gain< / span >
L_hac_lac = G_dp < span class = "org-builtin" > *< / span > Khac;
2021-11-30 11:28:07 +01:00
< / pre >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "orgc55c5d0" class = "figure" >
2021-11-30 15:17:23 +01:00
< p > < img src = "figs/hac_iff_loop_gain_bode_plot.png" alt = "hac_iff_loop_gain_bode_plot.png" / >
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 23: < / span > Bode Plot of the Loop gain for the High Authority Controller< / p >
2021-11-30 11:28:07 +01:00
< / div >
< p >
2021-11-30 17:54:19 +01:00
As shown in the Root Locus plot in Figure < a href = "#org54bbcb8" > 24< / a > , the closed loop system should be stable.
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 15:17:23 +01:00
2021-11-30 17:54:19 +01:00
< div id = "org54bbcb8" class = "figure" >
2021-11-30 15:17:23 +01:00
< p > < img src = "figs/loci_hac_iff_fast_jack.png" alt = "loci_hac_iff_fast_jack.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 24: < / span > Root Locus for the High Authority Controller< / p >
2021-11-30 11:28:07 +01:00
< / div >
< / div >
< / div >
2021-11-30 17:54:19 +01:00
< div id = "outline-container-org9c9ea48" class = "outline-3" >
< h3 id = "org9c9ea48" > < span class = "section-number-3" > 6.3.< / span > Performances< / h3 >
< div class = "outline-text-3" id = "text-6-3" >
2021-11-30 15:17:23 +01:00
< p >
In order to estimate the performances of the HAC-IFF control strategy, the transfer function from motion errors of the stepper motors to the motion error of the crystal is identified both in open loop and with the HAC-IFF strategy.
< / p >
< p >
It is first verified that the closed-loop system is stable:
< / p >
2021-11-30 11:28:07 +01:00
< div class = "org-src-container" >
2021-11-30 15:17:23 +01:00
< pre class = "src src-matlab" > isstable(T_hl)
2021-11-30 11:28:07 +01:00
< / pre >
< / div >
2021-11-30 15:17:23 +01:00
< pre class = "example" >
1
< / pre >
< p >
2021-11-30 17:54:19 +01:00
And both transmissibilities are compared in Figure < a href = "#org948d6ba" > 25< / a > .
2021-11-30 15:17:23 +01:00
< / p >
2021-11-30 17:54:19 +01:00
< div id = "org948d6ba" class = "figure" >
2021-11-30 15:17:23 +01:00
< p > < img src = "figs/stepper_transmissibility_comp_ol_hac_iff.png" alt = "stepper_transmissibility_comp_ol_hac_iff.png" / >
< / p >
2021-11-30 17:54:19 +01:00
< p > < span class = "figure-number" > Figure 25: < / span > Comparison of the transmissibility of errors from vibrations of the stepper motor between the open-loop case and the hac-iff case.< / p >
2021-11-30 11:28:07 +01:00
< / div >
2021-11-30 17:54:19 +01:00
< div class = "important" id = "orgc81cfdd" >
2021-11-30 11:28:07 +01:00
< p >
2021-11-30 15:17:23 +01:00
The HAC-IFF control strategy can effectively reduce the transmissibility of the motion errors of the stepper motors.
This reduction is effective inside the bandwidth of the controller.
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 15:17:23 +01:00
2021-11-30 17:54:19 +01:00
< / div >
< / div >
< / div >
< div id = "outline-container-orgbdf7b28" class = "outline-3" >
< h3 id = "orgbdf7b28" > < span class = "section-number-3" > 6.4.< / span > Close Loop noise budget< / h3 >
< div class = "outline-text-3" id = "text-6-4" >
< p >
Let’ s compute the amplitude spectral density of the jack motion errors due to the sensor noise, the actuator noise and disturbances.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Computation of ASD of contribution of inputs to the closed-loop motion< / span >
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Error due to disturbances< / span >
asd_d = abs(squeeze(freqresp(Wd< span class = "org-builtin" > *< / span > (1< span class = "org-builtin" > /< / span > (1 < span class = "org-builtin" > +< / span > G_dp(1,1)< span class = "org-builtin" > *< / span > Khac(1,1))), f, < span class = "org-string" > 'Hz'< / span > )));
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Error due to actuator noise< / span >
asd_u = abs(squeeze(freqresp(Wu< span class = "org-builtin" > *< / span > (G_dp(1,1)< span class = "org-builtin" > /< / span > (1 < span class = "org-builtin" > +< / span > G_dp(1,1)< span class = "org-builtin" > *< / span > Khac(1,1))), f, < span class = "org-string" > 'Hz'< / span > )));
< span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Error due to sensor noise< / span >
asd_n = abs(squeeze(freqresp(Wn< span class = "org-builtin" > *< / span > (G_dp(1,1)< span class = "org-builtin" > *< / span > Khac(1,1)< span class = "org-builtin" > /< / span > (1 < span class = "org-builtin" > +< / span > G_dp(1,1)< span class = "org-builtin" > *< / span > Khac(1,1))), f, < span class = "org-string" > 'Hz'< / span > )));
< / pre >
< / div >
< p >
The closed-loop ASD is then:
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% ASD of the closed-loop motion< / span >
asd_cl = sqrt(asd_d< span class = "org-builtin" > .^< / span > 2 < span class = "org-builtin" > +< / span > asd_u< span class = "org-builtin" > .^< / span > 2 < span class = "org-builtin" > +< / span > asd_n< span class = "org-builtin" > .^< / span > 2);
< / pre >
< / div >
< p >
The obtained ASD are shown in Figure < a href = "#orgf0027c6" > 26< / a > .
< / p >
< div id = "orgf0027c6" class = "figure" >
< p > < img src = "figs/close_loop_asd_noise_budget_hac_iff.png" alt = "close_loop_asd_noise_budget_hac_iff.png" / >
< / p >
< p > < span class = "figure-number" > Figure 26: < / span > Closed Loop noise budget< / p >
< / div >
< p >
Let’ s compare the open-loop and close-loop cases (Figure < a href = "#org691e64a" > 27< / a > ).
< / p >
< div id = "org691e64a" class = "figure" >
< p > < img src = "figs/cps_comp_ol_cl_hac_iff.png" alt = "cps_comp_ol_cl_hac_iff.png" / >
< / p >
< p > < span class = "figure-number" > Figure 27: < / span > Cumulative Power Spectrum of the open-loop and closed-loop motion error along one fast-jack< / p >
2021-11-30 15:17:23 +01:00
< / div >
< / div >
2021-11-30 11:28:07 +01:00
< / div >
< / div >
< / div >
< div id = "postamble" class = "status" >
< p class = "author" > Author: Dehaeze Thomas< / p >
2021-11-30 17:54:19 +01:00
< p class = "date" > Created: 2021-11-30 mar. 17:54< / p >
2021-11-30 11:28:07 +01:00
< / div >
< / body >
< / html >