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 15:17:23 +01:00
<!-- 2021 - 11 - 30 mar. 15:17 -->
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 15:17:23 +01:00
< li > < a href = "#org3fb7374" > 1. System Kinematics< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 15:17:23 +01:00
< li > < a href = "#org1ef1423" > 1.1. Bragg Angle< / a > < / li >
< li > < a href = "#orgcd8fbe6" > 1.2. Kinematics (111 Crystal)< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 15:17:23 +01:00
< li > < a href = "#org542b06e" > 1.2.1. Interferometers - 111 Crystal< / a > < / li >
< li > < a href = "#org52f68f7" > 1.2.2. Piezo - 111 Crystal< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
2021-11-30 15:17:23 +01:00
< li > < a href = "#org616bb45" > 1.3. Save Kinematics< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
2021-11-30 15:17:23 +01:00
< li > < a href = "#org0000e6d" > 2. Open Loop System Identification< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 15:17:23 +01:00
< li > < a href = "#org16c8552" > 2.1. Identification< / a > < / li >
< li > < a href = "#orgc2236c5" > 2.2. Plant in the frame of the fastjacks< / a > < / li >
< li > < a href = "#orgb0e1668" > 2.3. Plant in the frame of the crystal< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
2021-11-30 15:17:23 +01:00
< li > < a href = "#org4bda37c" > 3. Active Damping Plant (Strain gauges)< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 15:17:23 +01:00
< li > < a href = "#orga8033f0" > 3.1. Identification< / a > < / li >
< li > < a href = "#org78fe7a9" > 3.2. Relative Active Damping< / a > < / li >
< li > < a href = "#org760bce8" > 3.3. Damped Plant< / a > < / li >
2021-11-30 11:28:07 +01:00
< / ul >
< / li >
2021-11-30 15:17:23 +01:00
< li > < a href = "#org09dff16" > 4. Active Damping Plant (Force Sensors)< / a >
2021-11-30 11:28:07 +01:00
< ul >
2021-11-30 15:17:23 +01:00
< li > < a href = "#orgeb8c92e" > 4.1. Identification< / a > < / li >
< li > < a href = "#orgae5e7fb" > 4.2. Controller - Root Locus< / a > < / li >
< li > < a href = "#orgde5a8cd" > 4.3. Damped Plant< / a > < / li >
< / ul >
< / li >
< li > < a href = "#org27e3538" > 5. HAC-LAC (IFF) architecture< / a >
< ul >
< li > < a href = "#org72519d4" > 5.1. System Identification< / a > < / li >
< li > < a href = "#org6919788" > 5.2. High Authority Controller< / a > < / li >
< li > < a href = "#orgc5ddfb6" > 5.3. Performances< / 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 15:17:23 +01:00
< li > Section < a href = "#org14dc352" > 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 = "#orgc1f64db" > 2< / a > : the system dynamics is identified in the absence of control.< / li >
< li > Section < a href = "#org80ca2a0" > 3< / 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 = "#orgb029a8b" > 4< / 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 = "#orgee34a4d" > 5< / 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 15:17:23 +01:00
< div id = "outline-container-org3fb7374" class = "outline-2" >
< h2 id = "org3fb7374" > < 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 15:17:23 +01:00
< a id = "org14dc352" > < / a >
2021-11-30 11:28:07 +01:00
< / p >
< / div >
2021-11-30 15:17:23 +01:00
< div id = "outline-container-org1ef1423" class = "outline-3" >
< h3 id = "org1ef1423" > < 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" >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Tested bragg angles< / span >
bragg = linspace(5, 80, 1000); < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Bragg angle [deg]< / span >
d_off = 10.5e< span class = "org-builtin" > -< / span > 3; < span class = "org-comment-delimiter" > % < / span > < span class = "org-comment" > Wanted offset between x-rays [m]< / span >
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > %% Vertical Jack motion as a function of Bragg angle< / span >
dz = d_off< span class = "org-builtin" > ./< / span > (2< span class = "org-builtin" > *< / span > cos(bragg< span class = "org-builtin" > *< / span > < span class = "org-matlab-math" > pi< / span > < span class = "org-builtin" > /< / span > 180));
< / pre >
< / div >
2021-11-30 15:17:23 +01:00
< div id = "org6064b2d" 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 >
< 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 15:17:23 +01:00
< div id = "outline-container-orgcd8fbe6" class = "outline-3" >
< h3 id = "orgcd8fbe6" > < 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 15:17:23 +01:00
< div id = "outline-container-org542b06e" class = "outline-4" >
< h4 id = "org542b06e" > < 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 15:17:23 +01:00
The position of the measurement points are shown in Figure < a href = "#org8f69a58" > 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 15:17:23 +01:00
< div id = "org8f69a58" 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 15:17:23 +01:00
The inverse kinematics consisting of deriving the interferometer measurements from the motion of the crystal (see Figure < a href = "#org6470cc1" > 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 15:17:23 +01:00
< div id = "org6470cc1" 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 15:17:23 +01:00
From the Figure < a href = "#org8f69a58" > 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 15:17:23 +01:00
< table id = "org9ac8ea9" 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 15:17:23 +01:00
The forward kinematics is solved by inverting the Jacobian matrix (see Figure < a href = "#orgacd4853" > 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 15:17:23 +01:00
< div id = "orgacd4853" 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 15:17:23 +01:00
< table id = "org1305abc" 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 15:17:23 +01:00
< div id = "outline-container-org52f68f7" class = "outline-4" >
< h4 id = "org52f68f7" > < 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 15:17:23 +01:00
The location of the actuators with respect with the center of the 111 second crystal are shown in Figure < a href = "#org6ddaa8b" > 5< / a > .
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 15:17:23 +01:00
< div id = "org6ddaa8b" 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 15:17:23 +01:00
< div id = "orgd947fd1" 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 15:17:23 +01:00
Based on the geometry in Figure < a href = "#org6ddaa8b" > 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 15:17:23 +01:00
< table id = "org96d1229" 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 15:17:23 +01:00
< div id = "orgbdeca35" 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 15:17:23 +01:00
< table id = "orgb28ebac" 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 15:17:23 +01:00
< div id = "outline-container-org616bb45" class = "outline-3" >
< h3 id = "org616bb45" > < 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 15:17:23 +01:00
< div id = "outline-container-org0000e6d" class = "outline-2" >
< h2 id = "org0000e6d" > < 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 15:17:23 +01:00
< a id = "orgc1f64db" > < / a >
2021-11-30 11:28:07 +01:00
< / p >
< / div >
2021-11-30 15:17:23 +01:00
< div id = "outline-container-org16c8552" class = "outline-3" >
< h3 id = "org16c8552" > < 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 15:17:23 +01:00
It is schematically shown in Figure < a href = "#orga1c2462" > 8< / a > .
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 15:17:23 +01:00
< div id = "orga1c2462" 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 15:17:23 +01:00
< div id = "outline-container-orgc2236c5" class = "outline-3" >
< h3 id = "orgc2236c5" > < 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 15:17:23 +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 = "#org015dc10" > 9< / a > ).
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 15:17:23 +01:00
< div id = "org015dc10" 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 15:17:23 +01:00
< table id = "orgb47db5c" 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 15:17:23 +01:00
The bode plot of \(\bm{G}_{\text{fj}}(s)\) is shown in Figure < a href = "#org3a99582" > 10< / a > .
2021-11-30 11:28:07 +01:00
< / p >
2021-11-30 15:17:23 +01:00
< div id = "org3a99582" 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 15:17:23 +01:00
< div class = "important" id = "orge3e331d" >
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 15:17:23 +01:00
< div id = "outline-container-orgb0e1668" class = "outline-3" >
< h3 id = "orgb0e1668" > < 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 15:17:23 +01:00
< div id = "orge8c1108" 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 15:17:23 +01:00
< div id = "outline-container-org4bda37c" class = "outline-2" >
< h2 id = "org4bda37c" > < span class = "section-number-2" > 3.< / span > Active Damping Plant (Strain gauges)< / h2 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-2" id = "text-3" >
< p >
2021-11-30 15:17:23 +01:00
< a id = "org80ca2a0" > < / 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 15:17:23 +01:00
< div id = "outline-container-orga8033f0" class = "outline-3" >
< h3 id = "orga8033f0" > < span class = "section-number-3" > 3.1.< / span > Identification< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-3-1" >
< 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 15:17:23 +01:00
< div id = "org8f04d26" 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 >
< p > < span class = "figure-number" > Figure 12: < / span > Bode Plot of the transfer functions from piezoelectric forces to strain gauges measuremed displacements< / p >
< / div >
2021-11-30 15:17:23 +01:00
< div class = "important" id = "orgd585bf5" >
2021-11-30 11:45:05 +01:00
< p >
2021-11-30 15:17:23 +01:00
As the distance between the poles and zeros in Figure < a href = "#org11a1e17" > 15< / 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 15:17:23 +01:00
< div id = "outline-container-org78fe7a9" class = "outline-3" >
< h3 id = "org78fe7a9" > < span class = "section-number-3" > 3.2.< / span > Relative Active Damping< / h3 >
2021-11-30 11:45:05 +01:00
< div class = "outline-text-3" id = "text-3-2" >
< 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 15:17:23 +01:00
As can be seen in Figure < a href = "#orgec235bb" > 13< / 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 15:17:23 +01:00
< div id = "orgec235bb" 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 >
< p > < span class = "figure-number" > Figure 13: < / span > Root Locus for the relative damping control< / p >
< / 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 15:17:23 +01:00
< div id = "outline-container-org760bce8" class = "outline-3" >
< h3 id = "org760bce8" > < span class = "section-number-3" > 3.3.< / span > Damped Plant< / h3 >
2021-11-30 11:45:05 +01:00
< div class = "outline-text-3" id = "text-3-3" >
< 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 15:17:23 +01:00
< div id = "orgca0b154" 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 >
< p > < span class = "figure-number" > Figure 14: < / span > Bode plot of both the open-loop plant and the damped plant using relative active damping< / p >
< / div >
2021-11-30 11:28:07 +01:00
< / div >
< / div >
< / div >
2021-11-30 15:17:23 +01:00
< div id = "outline-container-org09dff16" class = "outline-2" >
< h2 id = "org09dff16" > < span class = "section-number-2" > 4.< / span > Active Damping Plant (Force Sensors)< / h2 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-2" id = "text-4" >
< p >
2021-11-30 15:17:23 +01:00
< a id = "orgb029a8b" > < / 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 15:17:23 +01:00
< div id = "outline-container-orgeb8c92e" class = "outline-3" >
< h3 id = "orgeb8c92e" > < span class = "section-number-3" > 4.1.< / span > Identification< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-4-1" >
< 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 >
The Bode plot of the identified dynamics is shown in Figure < a href = "#org11a1e17" > 15< / a > .
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 15:17:23 +01:00
< div id = "org11a1e17" 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 11:45:05 +01:00
< p > < span class = "figure-number" > Figure 15: < / span > Bode plot of IFF Plant< / p >
2021-11-30 11:28:07 +01:00
< / div >
< / div >
< / div >
2021-11-30 15:17:23 +01:00
< div id = "outline-container-orgae5e7fb" class = "outline-3" >
< h3 id = "orgae5e7fb" > < span class = "section-number-3" > 4.2.< / span > Controller - Root Locus< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-4-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 15:17:23 +01:00
< div id = "org5b2bab0" 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 11:45:05 +01:00
< p > < span class = "figure-number" > Figure 16: < / 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 15:17:23 +01:00
< div id = "outline-container-orgde5a8cd" class = "outline-3" >
< h3 id = "orgde5a8cd" > < span class = "section-number-3" > 4.3.< / span > Damped Plant< / h3 >
2021-11-30 11:28:07 +01:00
< div class = "outline-text-3" id = "text-4-3" >
2021-11-30 15:17:23 +01:00
< p >
Both the Open Loop dynamics (see Figure < a href = "#org015dc10" > 9< / a > ) and the dynamics with IFF (see Figure < a href = "#org7a880a7" > 17< / a > ) are identified.
< / 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).
This is schematically represented in Figure < a href = "#org7a880a7" > 17< / a > .
< / p >
2021-11-30 11:28:07 +01:00
2021-11-30 15:17:23 +01:00
< div id = "org7a880a7" class = "figure" >
< p > < img src = "figs/schematic_jacobian_frame_fastjack_iff.png" alt = "schematic_jacobian_frame_fastjack_iff.png" / >
< / p >
< p > < span class = "figure-number" > Figure 17: < / span > Use of Jacobian matrices to obtain the system in the frame of the fastjacks< / p >
< / div >
< p >
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 = "#org9f5d048" > 18< / a > .
It is clear that the Integral Force Feedback control strategy is very effective in damping the resonances of the plant.
< / p >
< div id = "org9f5d048" class = "figure" >
< p > < img src = "figs/comp_damped_undamped_plant_iff_bode_plot.png" alt = "comp_damped_undamped_plant_iff_bode_plot.png" / >
< / p >
< p > < span class = "figure-number" > Figure 18: < / span > Bode plot of both the open-loop plant and the damped plant using IFF< / p >
< / div >
< div class = "important" id = "org8586fa6" >
< p >
The Integral Force Feedback control strategy is very effective in damping the modes present in the plant.
< / p >
< / div >
< / div >
< / div >
< / div >
< div id = "outline-container-org27e3538" class = "outline-2" >
< h2 id = "org27e3538" > < span class = "section-number-2" > 5.< / span > HAC-LAC (IFF) architecture< / h2 >
< div class = "outline-text-2" id = "text-5" >
< p >
< a id = "orgee34a4d" > < / a >
< / p >
< p >
The HAC-LAC architecture is shown in Figure < a href = "#orgb03e1da" > 19< / a > .
< / p >
< div id = "orgb03e1da" class = "figure" >
< p > < img src = "figs/schematic_jacobian_frame_fastjack_hac_iff.png" alt = "schematic_jacobian_frame_fastjack_hac_iff.png" / >
< / p >
< p > < span class = "figure-number" > Figure 19: < / span > HAC-LAC architecture< / p >
< / div >
2021-11-30 11:28:07 +01:00
< / div >
2021-11-30 15:17:23 +01:00
< div id = "outline-container-org72519d4" class = "outline-3" >
< h3 id = "org72519d4" > < span class = "section-number-3" > 5.1.< / span > System Identification< / h3 >
< div class = "outline-text-3" id = "text-5-1" >
< p >
Let’ s identify the damped plant.
< / p >
< div id = "org022508f" class = "figure" >
< p > < img src = "figs/bode_plot_hac_iff_plant.png" alt = "bode_plot_hac_iff_plant.png" / >
< / p >
< p > < span class = "figure-number" > Figure 20: < / span > Bode Plot of the plant for the High Authority Controller (transfer function from \(\bm{u}^\prime\) to \(\bm{\epsilon}_d\))< / p >
< / div >
< / div >
< / div >
< div id = "outline-container-org6919788" class = "outline-3" >
< h3 id = "org6919788" > < span class = "section-number-3" > 5.2.< / span > High Authority Controller< / h3 >
< div class = "outline-text-3" id = "text-5-2" >
< 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 15:17:23 +01:00
< div id = "org1eefea2" class = "figure" >
< 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 15:17:23 +01:00
< p > < span class = "figure-number" > Figure 21: < / 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 15:17:23 +01:00
As shown in the Root Locus plot in Figure < a href = "#orgc90ee63" > 22< / 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
< div id = "orgc90ee63" class = "figure" >
< p > < img src = "figs/loci_hac_iff_fast_jack.png" alt = "loci_hac_iff_fast_jack.png" / >
< / p >
< p > < span class = "figure-number" > Figure 22: < / span > Root Locus for the High Authority Controller< / p >
2021-11-30 11:28:07 +01:00
< / div >
< / div >
< / div >
2021-11-30 15:17:23 +01:00
< div id = "outline-container-orgc5ddfb6" class = "outline-3" >
< h3 id = "orgc5ddfb6" > < span class = "section-number-3" > 5.3.< / span > Performances< / h3 >
< div class = "outline-text-3" id = "text-5-3" >
< 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 >
And both transmissibilities are compared in Figure < a href = "#org152d7e8" > 23< / a > .
< / p >
< div id = "org152d7e8" class = "figure" >
< p > < img src = "figs/stepper_transmissibility_comp_ol_hac_iff.png" alt = "stepper_transmissibility_comp_ol_hac_iff.png" / >
< / p >
< p > < span class = "figure-number" > Figure 23: < / 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 15:17:23 +01:00
< div class = "important" id = "org755e221" >
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
< / 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 15:17:23 +01:00
< p class = "date" > Created: 2021-11-30 mar. 15:17< / p >
2021-11-30 11:28:07 +01:00
< / div >
< / body >
< / html >