2019-01-18 17:20:06 +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 >
2020-11-03 09:42:04 +01:00
<!-- 2020 - 11 - 03 mar. 09:41 -->
2019-01-18 17:20:06 +01:00
< meta http-equiv = "Content-Type" content = "text/html;charset=utf-8" / >
2019-03-26 14:47:27 +01:00
< title > Control in a rotating frame< / title >
2019-01-18 17:20:06 +01:00
< meta name = "generator" content = "Org mode" / >
2019-06-04 10:21:33 +02:00
< meta name = "author" content = "Dehaeze Thomas" / >
< link rel = "stylesheet" type = "text/css" href = "./css/htmlize.css" / >
< link rel = "stylesheet" type = "text/css" href = "./css/readtheorg.css" / >
< script type = "text/javascript" src = "./js/jquery.min.js" > < / script >
< script type = "text/javascript" src = "./js/bootstrap.min.js" > < / script >
< script type = "text/javascript" src = "./js/jquery.stickytableheaders.min.js" > < / script >
< script type = "text/javascript" src = "./js/readtheorg.js" > < / script >
2020-04-09 17:20:39 +02:00
< script > M a t h J a x = {
tex: {
tags: 'ams',
macros: {bm: ["\\boldsymbol{#1}",1],}
}
};
< / script >
< script type = "text/javascript" src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" > < / script >
2019-01-18 17:20:06 +01:00
< / head >
< body >
< div id = "content" >
2019-03-26 14:47:27 +01:00
< h1 class = "title" > Control in a rotating frame< / h1 >
< div id = "table-of-contents" >
< h2 > Table of Contents< / h2 >
< div id = "text-table-of-contents" >
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#org9d31ebf" > 1. System Description and Analysis< / a >
2019-03-26 14:47:27 +01:00
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#orgb0b17d1" > 1.1. System description< / a > < / li >
< li > < a href = "#org93d67af" > 1.2. Equations< / a > < / li >
< li > < a href = "#orgafb64de" > 1.3. Numerical Values for the NASS< / a > < / li >
< li > < a href = "#org7734704" > 1.4. Euler and Coriolis forces - Numerical Result< / a > < / li >
< li > < a href = "#orgd219fde" > 1.5. Negative Spring Effect - Numerical Result< / a > < / li >
< li > < a href = "#orgeed5531" > 1.6. Limitations due to coupling< / a >
2019-03-26 14:47:27 +01:00
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#orgc8347b8" > 1.6.1. Equations< / a > < / li >
< li > < a href = "#org5518e3a" > 1.6.2. Numerical Analysis< / a > < / li >
2019-03-26 14:47:27 +01:00
< / ul >
< / li >
2020-11-03 09:42:04 +01:00
< li > < a href = "#orgacc2fb6" > 1.7. Limitations due to negative stiffness effect< / a > < / li >
< li > < a href = "#org4a117ac" > 1.8. Effect of rotation speed on the plant< / a >
2019-03-26 14:47:27 +01:00
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#org8d0034f" > 1.8.1. Voice coil actuator< / a > < / li >
< li > < a href = "#orgc6a4afe" > 1.8.2. Piezoelectric actuator< / a > < / li >
< li > < a href = "#org9abd50c" > 1.8.3. Analysis< / a > < / li >
< li > < a href = "#org32dd7ee" > 1.8.4. Campbell diagram< / a > < / li >
2019-03-26 14:47:27 +01:00
< / ul >
< / li >
< / ul >
< / li >
2020-11-03 09:42:04 +01:00
< li > < a href = "#org4ed4639" > 2. Integral Force Feedback< / a >
2019-03-26 14:47:27 +01:00
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#org20bb7b5" > 2.1. Analytical Derivation of the transfer function for IFF control< / a > < / li >
< li > < a href = "#org9fdf9c6" > 2.2. Low and High frequency Behavior< / a > < / li >
< li > < a href = "#orgf505f3f" > 2.3. Poles and Zeros< / a > < / li >
< li > < a href = "#orgfe229e8" > 2.4. IFF Plant and Root Locus< / a > < / li >
< li > < a href = "#org48b3791" > 2.5. Conclusion< / a > < / li >
2019-03-26 14:47:27 +01:00
< / ul >
< / li >
2020-11-03 09:42:04 +01:00
< li > < a href = "#orgb3854ea" > 3. Direct Velocity Feedback< / a >
2019-03-26 14:47:27 +01:00
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#org3c36ccd" > 3.1. Analytical Study< / a > < / li >
< li > < a href = "#orgf9cd06a" > 3.2. High and Low frequency behavior< / a > < / li >
< li > < a href = "#org88c4ddf" > 3.3. Poles and Zeros< / a > < / li >
< li > < a href = "#org02b0822" > 3.4. DVF Plant and Root Locus< / a > < / li >
< li > < a href = "#orga6508a6" > 3.5. Conclusion< / a > < / li >
2020-04-09 17:20:39 +02:00
< / ul >
< / li >
2020-11-03 09:42:04 +01:00
< li > < a href = "#org5684294" > 4. Control Strategies< / a >
2019-03-26 14:47:27 +01:00
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#org79e0750" > 4.1. Measurement in the fixed reference frame< / a > < / li >
< li > < a href = "#org52886b3" > 4.2. Measurement in the rotating frame< / a > < / li >
2019-03-26 14:47:27 +01:00
< / ul >
< / li >
2020-11-03 09:42:04 +01:00
< li > < a href = "#orgad82ee5" > 5. Multi Body Model - Simscape< / a >
2020-04-09 17:20:39 +02:00
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#orgda54a97" > 5.1. Initialization< / a > < / li >
< li > < a href = "#org8bfdd83" > 5.2. Identification in the rotating referenced frame< / a > < / li >
< li > < a href = "#org7d54ace" > 5.3. Coupling ratio between \(f_{uv}\) and \(d_{uv}\)< / a > < / li >
< li > < a href = "#org01bf5e1" > 5.4. Transfer function from force to force sensor (IFF plant)< / a > < / li >
< li > < a href = "#org49cd602" > 5.5. Plant Control - SISO approach< / a >
2019-03-26 14:47:27 +01:00
< ul >
2020-11-03 09:42:04 +01:00
< li > < a href = "#org85c1cbe" > 5.5.1. Plant identification< / a > < / li >
< li > < a href = "#org7f63058" > 5.5.2. Effect of rotation speed< / a > < / li >
< li > < a href = "#orgf3bfa99" > 5.5.3. Controller design< / a > < / li >
< li > < a href = "#org31f933f" > 5.5.4. Controlling the rotating system< / a > < / li >
< li > < a href = "#orgd040c32" > 5.5.5. Neglected coupling< / a > < / li >
< li > < a href = "#orgdb38278" > 5.5.6. Close loop performance< / a > < / li >
< li > < a href = "#orgf0df90a" > 5.5.7. Campbell Diagram for the close loop system< / a > < / li >
< li > < a href = "#orgc6a5ee2" > 5.5.8. Conclusion< / a > < / li >
2019-03-26 14:47:27 +01:00
< / ul >
< / li >
2020-04-09 17:20:39 +02:00
< / ul >
< / li >
2019-03-26 14:47:27 +01:00
< / ul >
< / div >
< / div >
< p >
The objective of this note it to highlight some control problems that arises when controlling the position of an object using actuators that are rotating with respect to a fixed reference frame.
< / p >
< p >
2020-11-03 09:42:04 +01:00
In section < a href = "#org78c4865" > 1< / a > , a simple system composed of a spindle and a translation stage is defined and the equations of motion are written.
2019-03-26 14:47:27 +01:00
The rotation induces some coupling between the actuators and their displacement, and modifies the dynamics of the system.
This is studied using the equations, and some numerical computations are used to compare the use of voice coil and piezoelectric actuators.
< / p >
< p >
2020-11-03 09:42:04 +01:00
In sections < a href = "#org28e8610" > 2< / a > and < a href = "#orge9cb2c6" > 3< / a > , the use of Integral Force Feedback and Direct Velocity Feedback is studied for the case of rotating positioning platforms.
2020-04-09 17:36:07 +02:00
< / p >
< p >
2020-11-03 09:42:04 +01:00
Then, in section < a href = "#org702baf3" > 4< / a > , two different control approach are compared where:
2019-03-26 14:47:27 +01:00
< / p >
< ul class = "org-ul" >
< li > the measurement is made in the fixed frame< / li >
< li > the measurement is made in the rotating frame< / li >
< / ul >
< p >
2020-11-03 09:42:04 +01:00
In section < a href = "#orga3b57d4" > 5< / a > , the analytical study will be validated using a multi body model of the studied system.
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org9d31ebf" class = "outline-2" >
< h2 id = "org9d31ebf" > < span class = "section-number-2" > 1< / span > System Description and Analysis< / h2 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-2" id = "text-1" >
2019-03-26 14:47:27 +01:00
< p >
2020-11-03 09:42:04 +01:00
< a id = "org78c4865" > < / a >
2019-03-26 14:47:27 +01:00
< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgb0b17d1" class = "outline-3" >
< h3 id = "orgb0b17d1" > < span class = "section-number-3" > 1.1< / span > System description< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-1-1" >
2019-03-26 14:47:27 +01:00
< p >
2020-11-03 09:42:04 +01:00
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure < a href = "#org92395e8" > 1< / a > ).
2019-03-26 14:47:27 +01:00
< / p >
< p >
The control inputs are the forces applied by the actuators of the translation stage (\(F_u\) and \(F_v\)).
As the translation stage is rotating around the Z axis due to the spindle, the forces are applied along \(u\) and \(v\).
< / p >
< p >
The measurement is either the \(x-y\) displacement of the object located on top of the translation stage or the \(u-v\) displacement of the sample with respect to a fixed reference frame.
< / p >
2020-11-03 09:42:04 +01:00
< div id = "org92395e8" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "./figs/rotating_frame_2dof.png" alt = "rotating_frame_2dof.png" / >
< / p >
2020-11-03 09:42:04 +01:00
< p > < span class = "figure-number" > Figure 1: < / span > Schematic of the mechanical system< / p >
2019-03-26 14:47:27 +01:00
< / div >
< p >
In the following block diagram:
< / p >
< ul class = "org-ul" >
< li > \(G\) is the transfer function from the forces applied in the actuators to the measurement< / li >
< li > \(K\) is the controller to design< / li >
< li > \(J\) is a Jacobian matrix usually used to change the reference frame< / li >
< / ul >
< p >
Indices \(x\) and \(y\) corresponds to signals in the fixed reference frame (along \(\vec{i}_x\) and \(\vec{i}_y\)):
< / p >
2019-01-18 17:20:06 +01:00
< ul class = "org-ul" >
2019-03-26 14:47:27 +01:00
< li > \(D_x\) is the measured position of the sample< / li >
< li > \(r_x\) is the reference signal which corresponds to the wanted \(D_x\)< / li >
< li > \(\epsilon_x\) is the position error< / li >
2019-01-18 17:20:06 +01:00
< / ul >
2019-03-26 14:47:27 +01:00
< p >
Indices \(u\) and \(v\) corresponds to signals in the rotating reference frame (\(\vec{i}_u\) and \(\vec{i}_v\)):
< / p >
< ul class = "org-ul" >
< li > \(F_u\) and \(F_v\) are forces applied by the actuators< / li >
< li > \(\epsilon_u\) and \(\epsilon_v\) are position error of the sample along \(\vec{i}_u\) and \(\vec{i}_v\)< / li >
< / ul >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org93d67af" class = "outline-3" >
< h3 id = "org93d67af" > < span class = "section-number-3" > 1.2< / span > Equations< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-1-2" >
2019-03-26 14:47:27 +01:00
< p >
2020-11-03 09:42:04 +01:00
< a id = "org420a5e0" > < / a >
Based on the figure < a href = "#org92395e8" > 1< / a > , we can write the equations of motion of the system.
2019-03-26 14:47:27 +01:00
< / p >
< p >
2020-04-09 17:20:39 +02:00
Let’ s express the kinetic energy \(T\) and the potential energy \(V\) of the mass \(m\):
2019-03-26 14:47:27 +01:00
< / p >
\begin{align}
2020-11-03 09:42:04 +01:00
\label{orge469b16}
2019-03-26 14:47:27 +01:00
T & = \frac{1}{2} m \left( \dot{x}^2 + \dot{y}^2 \right) \\
V & = \frac{1}{2} k \left( x^2 + y^2 \right)
\end{align}
< p >
The Lagrangian is the kinetic energy minus the potential energy.
< / p >
\begin{equation}
2020-11-03 09:42:04 +01:00
\label{org6735d10}
2019-03-26 14:47:27 +01:00
L = T-V = \frac{1}{2} m \left( \dot{x}^2 + \dot{y}^2 \right) - \frac{1}{2} k \left( x^2 + y^2 \right)
\end{equation}
< p >
The partial derivatives of the Lagrangian with respect to the variables \((x, y)\) are:
< / p >
\begin{align*}
2020-11-03 09:42:04 +01:00
\label{org4bc9dfc}
2019-03-26 14:47:27 +01:00
\frac{\partial L}{\partial x} & = -kx \\
\frac{\partial L}{\partial y} & = -ky \\
\frac{d}{dt}\frac{\partial L}{\partial \dot{x}} & = m\ddot{x} \\
\frac{d}{dt}\frac{\partial L}{\partial \dot{y}} & = m\ddot{y}
\end{align*}
< p >
The external forces applied to the mass are:
< / p >
\begin{align*}
F_{\text{ext}, x} & = F_u \cos{\theta} - F_v \sin{\theta}\\
F_{\text{ext}, y} & = F_u \sin{\theta} + F_v \cos{\theta}
\end{align*}
< p >
2020-11-03 09:42:04 +01:00
By applying the Lagrangian equations, we obtain:
2019-03-26 14:47:27 +01:00
< / p >
\begin{align}
m\ddot{x} + kx = F_u \cos{\theta} - F_v \sin{\theta}\\
m\ddot{y} + ky = F_u \sin{\theta} + F_v \cos{\theta}
\end{align}
< p >
We then change coordinates from \((x, y)\) to \((d_x, d_y, \theta)\).
< / p >
\begin{align*}
x & = d_u \cos{\theta} - d_v \sin{\theta}\\
y & = d_u \sin{\theta} + d_v \cos{\theta}
\end{align*}
< p >
We obtain:
< / p >
\begin{align*}
2020-11-03 09:42:04 +01:00
\dot{x} & = \dot{d_u} \cos{\theta} - d_u\dot{\theta}\sin{\theta} - \dot{d_v}\sin{\theta} - d_v\dot{\theta} \cos{\theta} \\
\dot{y} & = \dot{d_u} \sin{\theta} + d_u\dot{\theta}\cos{\theta} + \dot{d_v}\cos{\theta} - d_v\dot{\theta} \sin{\theta}
\end{align*}
< p >
and:
< / p >
\begin{align*}
2019-03-26 14:47:27 +01:00
\ddot{x} & = \ddot{d_u} \cos{\theta} - 2\dot{d_u}\dot{\theta}\sin{\theta} - d_u\ddot{\theta}\sin{\theta} - d_u\dot{\theta}^2 \cos{\theta}
- \ddot{d_v} \sin{\theta} - 2\dot{d_v}\dot{\theta}\cos{\theta} - d_v\ddot{\theta}\cos{\theta} + d_v\dot{\theta}^2 \sin{\theta} \\
\ddot{y} & = \ddot{d_u} \sin{\theta} + 2\dot{d_u}\dot{\theta}\cos{\theta} + d_u\ddot{\theta}\cos{\theta} - d_u\dot{\theta}^2 \sin{\theta}
+ \ddot{d_v} \cos{\theta} - 2\dot{d_v}\dot{\theta}\sin{\theta} - d_v\ddot{\theta}\sin{\theta} - d_v\dot{\theta}^2 \cos{\theta} \\
\end{align*}
< p >
By injecting the previous result into the Lagrangian equation, we obtain:
< / p >
\begin{align*}
2020-11-03 09:42:04 +01:00
m \ddot{d_u} \cos{\theta} - 2m\dot{d_u}\dot{\theta}\sin{\theta} - m d_u\ddot{\theta}\sin{\theta} - m d_u\dot{\theta}^2 \cos{\theta}
- m \ddot{d_v} \sin{\theta} - 2m\dot{d_v}\dot{\theta}\cos{\theta} - m d_v\ddot{\theta}\cos{\theta} + m d_v\dot{\theta}^2 \sin{\theta}
+ c \dot{d_u} \cos{\theta} - c d_u\dot{\theta}\sin{\theta} - c \dot{d_v}\sin{\theta} - c d_v\dot{\theta} \cos{\theta}
2019-03-26 14:47:27 +01:00
+ k d_u \cos{\theta} - k d_v \sin{\theta} = F_u \cos{\theta} - F_v \sin{\theta} \\
m \ddot{d_u} \sin{\theta} + 2m\dot{d_u}\dot{\theta}\cos{\theta} + m d_u\ddot{\theta}\cos{\theta} - m d_u\dot{\theta}^2 \sin{\theta}
+ m \ddot{d_v} \cos{\theta} - 2m\dot{d_v}\dot{\theta}\sin{\theta} - m d_v\ddot{\theta}\sin{\theta} - m d_v\dot{\theta}^2 \cos{\theta}
2020-11-03 09:42:04 +01:00
+ c \dot{d_u} \sin{\theta} + c d_u\dot{\theta}\cos{\theta} + c \dot{d_v}\cos{\theta} - c d_v\dot{\theta} \sin{\theta}
2019-03-26 14:47:27 +01:00
+ k d_u \sin{\theta} + k d_v \cos{\theta} = F_u \sin{\theta} + F_v \cos{\theta}
\end{align*}
2020-11-03 09:42:04 +01:00
2019-03-26 14:47:27 +01:00
< p >
Which is equivalent to:
< / p >
\begin{align*}
2020-11-03 09:42:04 +01:00
m \ddot{d_u} - 2m\dot{d_u}\dot{\theta}\frac{\sin{\theta}}{\cos{\theta}} - m d_u\ddot{\theta}\frac{\sin{\theta}}{\cos{\theta}} - m d_u\dot{\theta}^2
- m \ddot{d_v} \frac{\sin{\theta}}{\cos{\theta}} - 2m\dot{d_v}\dot{\theta} - m d_v\ddot{\theta} + m d_v\dot{\theta}^2 \frac{\sin{\theta}}{\cos{\theta}}
+ c \dot{d_u} - c d_u\dot{\theta}\frac{\sin{\theta}}{\cos{\theta}} - c \dot{d_v}\frac{\sin{\theta}}{\cos{\theta}} - c d_v\dot{\theta}
2019-03-26 14:47:27 +01:00
+ k d_u - k d_v \frac{\sin{\theta}}{\cos{\theta}} = F_u - F_v \frac{\sin{\theta}}{\cos{\theta}} \\
m \ddot{d_u} + 2m\dot{d_u}\dot{\theta}\frac{\cos{\theta}}{\sin{\theta}} + m d_u\ddot{\theta}\frac{\cos{\theta}}{\sin{\theta}} - m d_u\dot{\theta}^2
+ m \ddot{d_v} \frac{\cos{\theta}}{\sin{\theta}} - 2m\dot{d_v}\dot{\theta} - m d_v\ddot{\theta} - m d_v\dot{\theta}^2 \frac{\cos{\theta}}{\sin{\theta}}
2020-11-03 09:42:04 +01:00
+ c \dot{d_u} + c d_u\dot{\theta}\frac{\cos{\theta}}{\sin{\theta}} + c \dot{d_v}\frac{\cos{\theta}}{\sin{\theta}} - c d_v\dot{\theta}
2019-03-26 14:47:27 +01:00
+ k d_u + k d_v \frac{\cos{\theta}}{\sin{\theta}} = F_u + F_v \frac{\cos{\theta}}{\sin{\theta}}
\end{align*}
< p >
We can then subtract and add the previous equations to obtain the following equations:
< / p >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "orgac0d822" >
2019-03-26 14:47:27 +01:00
\begin{equation}
2020-11-03 09:42:04 +01:00
\label{org7d4895d}
m \ddot{d}_{u} + c \dot{d}_{u} + (k - m\dot{\theta}^2) d_u = F_u + 2 m\dot{d}_v\dot{\theta} + m d_v\ddot{\theta} + c d_{v} \dot{\theta}
2019-03-26 14:47:27 +01:00
\end{equation}
\begin{equation}
2020-11-03 09:42:04 +01:00
\label{org6c67241}
m \ddot{d}_{v} + c \dot{d}_{v} + (k - m\dot{\theta}^2) d_v = F_v - 2 m\dot{d}_u\dot{\theta} - m d_u\ddot{\theta} - c d_{u} \dot{\theta}
2019-03-26 14:47:27 +01:00
\end{equation}
< / div >
< p >
We obtain two differential equations that are coupled through:
< / p >
< ul class = "org-ul" >
< li > < b > Euler forces< / b > : \(m d_v \ddot{\theta}\)< / li >
< li > < b > Coriolis forces< / b > : \(2 m \dot{d_v} \dot{\theta}\)< / li >
< / ul >
< p >
Without the coupling terms, each equation is the equation of a one degree of freedom mass-spring system with mass \(m\) and stiffness \(k- m\dot{\theta}^2\).
Thus, the term \(- m\dot{\theta}^2\) acts like a negative stiffness (due to < b > centrifugal forces< / b > ).
< / p >
< p >
The forces induced by the rotating reference frame are independent of the stiffness of the actuator.
The resulting effect of those forces should then be higher when using softer actuators.
< / p >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgafb64de" class = "outline-3" >
< h3 id = "orgafb64de" > < span class = "section-number-3" > 1.3< / span > Numerical Values for the NASS< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-1-3" >
2019-03-26 14:47:27 +01:00
< p >
2020-04-09 17:20:39 +02:00
Let’ s define the parameters for the NASS.
2019-03-26 14:47:27 +01:00
< / p >
< table border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
< colgroup >
< col class = "org-left" / >
< col class = "org-right" / >
< / colgroup >
< tbody >
< tr >
< td class = "org-left" > Light sample mass [kg]< / td >
< td class = "org-right" > 3.5e+01< / td >
< / tr >
< tr >
< td class = "org-left" > Heavy sample mass [kg]< / td >
< td class = "org-right" > 8.5e+01< / td >
< / tr >
< tr >
< td class = "org-left" > Max rot. speed - light [rpm]< / td >
< td class = "org-right" > 6.0e+01< / td >
< / tr >
< tr >
< td class = "org-left" > Max rot. speed - heavy [rpm]< / td >
< td class = "org-right" > 1.0e+00< / td >
< / tr >
< tr >
< td class = "org-left" > Voice Coil Stiffness [N/m]< / td >
< td class = "org-right" > 1.0e+03< / td >
< / tr >
< tr >
< td class = "org-left" > Piezo Stiffness [N/m]< / td >
< td class = "org-right" > 1.0e+08< / td >
< / tr >
< tr >
< td class = "org-left" > Max rot. acceleration [rad/s2]< / td >
< td class = "org-right" > 1.0e+00< / td >
< / tr >
< tr >
< td class = "org-left" > Max mass excentricity [m]< / td >
< td class = "org-right" > 1.0e-02< / td >
< / tr >
< tr >
< td class = "org-left" > Max Horizontal speed [m/s]< / td >
< td class = "org-right" > 2.0e-01< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org7734704" class = "outline-3" >
< h3 id = "org7734704" > < span class = "section-number-3" > 1.4< / span > Euler and Coriolis forces - Numerical Result< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-1-4" >
2019-03-26 14:47:27 +01:00
< p >
First we will determine the value for Euler and Coriolis forces during regular experiment.
< / p >
< ul class = "org-ul" >
< li > < b > Euler forces< / b > : \(m d_v \ddot{\theta}\)< / li >
< li > < b > Coriolis forces< / b > : \(2 m \dot{d_v} \dot{\theta}\)< / li >
< / ul >
< p >
2020-11-03 09:42:04 +01:00
The obtained values are displayed in table < a href = "#orgcc9bfc6" > 1< / a > .
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< table id = "orgcc9bfc6" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2019-03-26 14:47:27 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 1:< / span > Euler and Coriolis forces for the NASS< / caption >
< colgroup >
< col class = "org-left" / >
< col class = "org-left" / >
< col class = "org-left" / >
< / colgroup >
< thead >
< tr >
< th scope = "col" class = "org-left" >   < / th >
< th scope = "col" class = "org-left" > Light< / th >
< th scope = "col" class = "org-left" > Heavy< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "org-left" > Coriolis< / td >
< td class = "org-left" > 88.0N< / td >
< td class = "org-left" > 3.6N< / td >
< / tr >
< tr >
< td class = "org-left" > Euler< / td >
< td class = "org-left" > 0.4N< / td >
< td class = "org-left" > 0.8N< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgd219fde" class = "outline-3" >
< h3 id = "orgd219fde" > < span class = "section-number-3" > 1.5< / span > Negative Spring Effect - Numerical Result< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-1-5" >
2019-03-26 14:47:27 +01:00
< p >
The negative stiffness due to the rotation is equal to \(-m{\omega_0}^2\).
< / p >
< p >
2020-11-03 09:42:04 +01:00
The values for the negative spring effect are displayed in table < a href = "#orge293b70" > 2< / a > .
2019-03-26 14:47:27 +01:00
< / p >
< p >
This is definitely negligible when using piezoelectric actuators. It may not be the case when using voice coil actuators.
< / p >
2020-11-03 09:42:04 +01:00
< table id = "orge293b70" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2019-03-26 14:47:27 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 2:< / span > Negative Spring effect< / caption >
< colgroup >
< col class = "org-left" / >
< col class = "org-left" / >
< col class = "org-left" / >
< / colgroup >
< thead >
< tr >
< th scope = "col" class = "org-left" >   < / th >
< th scope = "col" class = "org-left" > Light< / th >
< th scope = "col" class = "org-left" > Heavy< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "org-left" > Neg. Spring< / td >
< td class = "org-left" > 1381.7[N/m]< / td >
< td class = "org-left" > 0.9[N/m]< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgeed5531" class = "outline-3" >
< h3 id = "orgeed5531" > < span class = "section-number-3" > 1.6< / span > Limitations due to coupling< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-1-6" >
2020-11-03 09:42:04 +01:00
< / div >
< div id = "outline-container-orgc8347b8" class = "outline-4" >
< h4 id = "orgc8347b8" > < span class = "section-number-4" > 1.6.1< / span > Equations< / h4 >
< div class = "outline-text-4" id = "text-1-6-1" >
2019-03-26 14:47:27 +01:00
< p >
To simplify, we consider a constant rotating speed \(\dot{\theta} = \omega_0\) and thus \(\ddot{\theta} = 0\).
< / p >
< p >
2020-11-03 09:42:04 +01:00
From equations \eqref{org7d4895d} and \eqref{org6c67241}, we obtain:
2019-03-26 14:47:27 +01:00
< / p >
\begin{align*}
2020-11-03 09:42:04 +01:00
(m s^2 + c s + (k - m{\omega_0}^2)) d_u & = F_u + 2 m \omega_0 s d_v + c \omega_0 d_v \\
(m s^2 + c s + (k - m{\omega_0}^2)) d_v & = F_v - 2 m \omega_0 s d_u - c \omega_0 d_v
2019-03-26 14:47:27 +01:00
\end{align*}
< p >
From second equation:
\[ d_v = \frac{1}{m s^2 + (k - m{\omega_0}^2)} F_v - \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} d_u \]
< / p >
< p >
And we re-inject \(d_v\) into the first equation:
< / p >
\begin{equation*}
(m s^2 + (k - m{\omega_0}^2)) d_u = F_u + \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} F_v - \frac{(2 m {\omega_0} s)^2}{m s^2 + (k - m{\omega_0}^2)} d_u
\end{equation*}
\begin{equation*}
\frac{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2}{m s^2 + (k - m{\omega_0}^2)} d_u = F_u + \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} F_v
\end{equation*}
< p >
Finally we obtain \(d_u\) function of \(F_u\) and \(F_v\).
\[ d_u = \frac{m s^2 + (k - m{\omega_0}^2)}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_u + \frac{2 m {\omega_0} s}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_v \]
< / p >
< p >
Similarly we can obtain \(d_v\) function of \(F_u\) and \(F_v\):
\[ d_v = \frac{m s^2 + (k - m{\omega_0}^2)}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_v - \frac{2 m {\omega_0} s}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_u \]
< / p >
< p >
The two previous equations can be written in a matrix form:
< / p >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "org336af8d" >
2019-03-26 14:47:27 +01:00
\begin{equation}
2020-11-03 09:42:04 +01:00
\label{orge98639c}
2019-03-26 14:47:27 +01:00
\begin{bmatrix} d_u \\ d_v \end{bmatrix} =
2020-11-03 09:42:04 +01:00
\frac{1}{(m s^2 + cs + (k - m{\omega_r}^2))^2 + (2 m {\omega_r} s + c \omega_r)^2}
2019-03-26 14:47:27 +01:00
\begin{bmatrix}
2020-11-03 09:42:04 +01:00
ms^2 + cs + (k-m{\omega_r}^2) & 2 m \omega_r s + c \omega_r \\
-2 m \omega_r s + c \omega_r & ms^2 + cs + (k-m{\omega_r}^2)
2019-03-26 14:47:27 +01:00
\end{bmatrix}
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
\end{equation}
< / div >
< p >
Then, coupling is negligible if \(|-m \omega^2 + (k - m{\omega_0}^2)| \gg |2 m {\omega_0} \omega|\).
< / p >
< / div >
2020-11-03 09:42:04 +01:00
< / div >
2019-03-26 14:47:27 +01:00
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org5518e3a" class = "outline-4" >
< h4 id = "org5518e3a" > < span class = "section-number-4" > 1.6.2< / span > Numerical Analysis< / h4 >
< div class = "outline-text-4" id = "text-1-6-2" >
2019-03-26 14:47:27 +01:00
< p >
We plot on the same graph \(\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \omega_0 \omega|}\) for the voice coil and the piezo:
< / p >
< ul class = "org-ul" >
2020-11-03 09:42:04 +01:00
< li > with the light sample (figure < a href = "#org7bcaf39" > 2< / a > ).< / li >
< li > with the heavy sample (figure < a href = "#orgcc69867" > 3< / a > ).< / li >
2019-03-26 14:47:27 +01:00
< / ul >
2020-11-03 09:42:04 +01:00
< div id = "org7bcaf39" class = "figure" >
2019-06-04 10:21:33 +02:00
< p > < img src = "./figs/coupling_light.png" alt = "coupling_light.png" / >
2019-03-26 14:47:27 +01:00
< / p >
< p > < span class = "figure-number" > Figure 2: < / span > Relative Coupling for light mass and high rotation speed< / p >
< / div >
2019-06-04 10:21:33 +02:00
2020-11-03 09:42:04 +01:00
< div id = "orgcc69867" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/coupling_heavy.png" alt = "coupling_heavy.png" / >
< / p >
< p > < span class = "figure-number" > Figure 3: < / span > Relative Coupling for heavy mass and low rotation speed< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "org5a4dd2f" >
2019-03-26 14:47:27 +01:00
< p >
Coupling is higher for actuators with small stiffness.
< / p >
< / div >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgacc2fb6" class = "outline-3" >
< h3 id = "orgacc2fb6" > < span class = "section-number-3" > 1.7< / span > Limitations due to negative stiffness effect< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-1-7" >
2019-03-26 14:47:27 +01:00
< p >
If \(\max{\dot{\theta}} \ll \sqrt{\frac{k}{m}}\), then the negative spring effect is negligible and \(k - m\dot{\theta}^2 \approx k\).
< / p >
< p >
2020-11-03 09:42:04 +01:00
Let’ s estimate what is the maximum rotation speed for which the negative stiffness effect is still negligible (\(\omega_\text{max} = 0.1 \sqrt{\frac{k}{m}}\)). Results are shown table < a href = "#orgf3b67c1" > 3< / a > .
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< table id = "orgf3b67c1" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2019-03-26 14:47:27 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 3:< / span > Maximum rotation speed at which negative stiffness is negligible (\(0.1\sqrt{\frac{k}{m}}\))< / caption >
< colgroup >
< col class = "org-left" / >
< col class = "org-left" / >
< col class = "org-left" / >
< / colgroup >
< thead >
< tr >
< th scope = "col" class = "org-left" >   < / th >
< th scope = "col" class = "org-left" > Voice Coil< / th >
< th scope = "col" class = "org-left" > Piezo< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "org-left" > Light< / td >
< td class = "org-left" > 5[rpm]< / td >
< td class = "org-left" > 1614[rpm]< / td >
< / tr >
< tr >
< td class = "org-left" > Heavy< / td >
< td class = "org-left" > 3[rpm]< / td >
< td class = "org-left" > 1036[rpm]< / td >
< / tr >
< / tbody >
< / table >
< p >
The negative spring effect is proportional to the rotational speed \(\omega\).
The system dynamics will be much more affected when using soft actuator.
< / p >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "org628c018" >
2019-03-26 14:47:27 +01:00
< p >
Negative stiffness effect has very important effect when using soft actuators.
< / p >
< / div >
< p >
The system can even goes unstable when \(m \omega^2 > k\), that is when the centrifugal forces are higher than the forces due to stiffness.
< / p >
< p >
2020-11-03 09:42:04 +01:00
From this analysis, we can determine the lowest practical stiffness that is possible to use: \(k_\text{min} = 10 m \omega^2\) (table sec:tab:min_k)
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< table id = "org673adc7" border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
2019-03-26 14:47:27 +01:00
< caption class = "t-above" > < span class = "table-number" > Table 4:< / span > Minimum possible stiffness< / caption >
< colgroup >
< col class = "org-left" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< thead >
< tr >
< th scope = "col" class = "org-left" >   < / th >
< th scope = "col" class = "org-right" > Light< / th >
< th scope = "col" class = "org-right" > Heavy< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "org-left" > k min [N/m]< / td >
< td class = "org-right" > 2199< / td >
< td class = "org-right" > 89< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org4a117ac" class = "outline-3" >
< h3 id = "org4a117ac" > < span class = "section-number-3" > 1.8< / span > Effect of rotation speed on the plant< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-1-8" >
2019-03-26 14:47:27 +01:00
< p >
2020-11-03 09:42:04 +01:00
As shown in equation \eqref{orge98639c}, the plant changes with the rotation speed \(\omega_0\).
2019-03-26 14:47:27 +01:00
< / p >
< p >
Then, we compute the bode plot of the direct term and coupling term for multiple rotating speed.
< / p >
< p >
Then we compare the result between voice coil and piezoelectric actuators.
< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org8d0034f" class = "outline-4" >
< h4 id = "org8d0034f" > < span class = "section-number-4" > 1.8.1< / span > Voice coil actuator< / h4 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-4" id = "text-1-8-1" >
2019-03-26 14:47:27 +01:00
2020-11-03 09:42:04 +01:00
< div id = "orgfa0016c" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/G_ws_vc.png" alt = "G_ws_vc.png" / >
< / p >
< p > < span class = "figure-number" > Figure 4: < / span > Bode plot of the direct transfer function term (from \(F_u\) to \(D_u\)) for multiple rotation speed - Voice coil< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "orgabc5c0e" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/Gc_ws_vc.png" alt = "Gc_ws_vc.png" / >
< / p >
< p > < span class = "figure-number" > Figure 5: < / span > caption< / p >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgc6a4afe" class = "outline-4" >
< h4 id = "orgc6a4afe" > < span class = "section-number-4" > 1.8.2< / span > Piezoelectric actuator< / h4 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-4" id = "text-1-8-2" >
2019-03-26 14:47:27 +01:00
2020-11-03 09:42:04 +01:00
< div id = "org28c8a3a" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/G_ws_pz.png" alt = "G_ws_pz.png" / >
< / p >
< p > < span class = "figure-number" > Figure 6: < / span > Bode plot of the direct transfer function term (from \(F_u\) to \(D_u\)) for multiple rotation speed - Piezoelectric actuator< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "org83146fe" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/Gc_ws_pz.png" alt = "Gc_ws_pz.png" / >
< / p >
< p > < span class = "figure-number" > Figure 7: < / span > Bode plot of the coupling transfer function term (from \(F_u\) to \(D_v\)) for multiple rotation speed - Piezoelectric actuator< / p >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org9abd50c" class = "outline-4" >
< h4 id = "org9abd50c" > < span class = "section-number-4" > 1.8.3< / span > Analysis< / h4 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-4" id = "text-1-8-3" >
2019-03-26 14:47:27 +01:00
< p >
When the rotation speed is null, the coupling terms are equal to zero and the diagonal terms corresponds to one degree of freedom mass spring system.
< / p >
< p >
When the rotation speed in not null, the resonance frequency is duplicated into two pairs of complex conjugate poles.
< / p >
< p >
As the rotation speed increases, one of the two resonant frequency goes to lower frequencies as the other one goes to higher frequencies.
< / p >
< p >
The poles of the coupling terms are the same as the poles of the diagonal terms. The magnitude of the coupling terms are increasing with the rotation speed.
< / p >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "orgf332f34" >
2019-03-26 14:47:27 +01:00
< p >
As shown in the previous figures, the system with voice coil is much more sensitive to rotation speed.
< / p >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org32dd7ee" class = "outline-4" >
< h4 id = "org32dd7ee" > < span class = "section-number-4" > 1.8.4< / span > Campbell diagram< / h4 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-4" id = "text-1-8-4" >
2019-03-26 14:47:27 +01:00
< p >
The poles of the system are computed for multiple values of the rotation frequency. To simplify the computation of the poles, we add some damping to the system.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > m = mlight;
k = kvc;
2020-04-09 17:20:39 +02:00
c = 0.1< span class = "org-type" > *< / span > sqrt(k< span class = "org-type" > *< / span > m);
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
wsvc = linspace(0, 10, 100); < span class = "org-comment" > % [rad/s]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
polesvc = zeros(2, length(wsvc));
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(wsvc)< / span >
polei = pole(1< span class = "org-type" > /< / span > ((m< span class = "org-type" > *< / span > s< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > c< span class = "org-type" > *< / span > s < span class = "org-type" > +< / span > (k < span class = "org-type" > -< / span > m< span class = "org-type" > *< / span > wsvc(< span class = "org-constant" > i< / span > )< span class = "org-type" > ^< / span > 2))< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > (2< span class = "org-type" > *< / span > m< span class = "org-type" > *< / span > wsvc(< span class = "org-constant" > i< / span > )< span class = "org-type" > *< / span > s)< span class = "org-type" > ^< / span > 2));
polesvc(< span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = sort(polei(imag(polei) < span class = "org-type" > > < / span > 0));
2019-06-04 10:21:33 +02:00
< span class = "org-keyword" > end< / span >
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > m = mlight;
k = kpz;
2020-04-09 17:20:39 +02:00
c = 0.1< span class = "org-type" > *< / span > sqrt(k< span class = "org-type" > *< / span > m);
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
wspz = linspace(0, 1000, 100); < span class = "org-comment" > % [rad/s]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
polespz = zeros(2, length(wspz));
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(wspz)< / span >
polei = pole(1< span class = "org-type" > /< / span > ((m< span class = "org-type" > *< / span > s< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > c< span class = "org-type" > *< / span > s < span class = "org-type" > +< / span > (k < span class = "org-type" > -< / span > m< span class = "org-type" > *< / span > wspz(< span class = "org-constant" > i< / span > )< span class = "org-type" > ^< / span > 2))< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > (2< span class = "org-type" > *< / span > m< span class = "org-type" > *< / span > wspz(< span class = "org-constant" > i< / span > )< span class = "org-type" > *< / span > s)< span class = "org-type" > ^< / span > 2));
polespz(< span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = sort(polei(imag(polei) < span class = "org-type" > > < / span > 0));
2019-06-04 10:21:33 +02:00
< span class = "org-keyword" > end< / span >
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< p >
2020-11-03 09:42:04 +01:00
We then plot the real and imaginary part of the poles as a function of the rotation frequency (figures < a href = "#org5423498" > 8< / a > and < a href = "#org8e96c54" > 9< / a > ).
2019-03-26 14:47:27 +01:00
< / p >
< p >
When the real part of one pole becomes positive, the system goes unstable.
< / p >
< p >
2020-11-03 09:42:04 +01:00
For the voice coil (figure < a href = "#org5423498" > 8< / a > ), the system is unstable when the rotation speed is above 5 rad/s. The real and imaginary part of the poles of the system with piezoelectric actuators are changing much less (figure < a href = "#org8e96c54" > 9< / a > ).
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "org5423498" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/poles_w_vc.png" alt = "poles_w_vc.png" / >
< / p >
< p > < span class = "figure-number" > Figure 8: < / span > Real and Imaginary part of the poles of the system as a function of the rotation speed - Voice Coil and light sample< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "org8e96c54" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/poles_w_pz.png" alt = "poles_w_pz.png" / >
< / p >
< p > < span class = "figure-number" > Figure 9: < / span > Real and Imaginary part of the poles of the system as a function of the rotation speed - Piezoelectric actuator and light sample< / p >
< / div >
< / div >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org4ed4639" class = "outline-2" >
< h2 id = "org4ed4639" > < span class = "section-number-2" > 2< / span > Integral Force Feedback< / h2 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-2" id = "text-2" >
2019-03-26 14:47:27 +01:00
< p >
2020-11-03 09:42:04 +01:00
< a id = "org28e8610" > < / a >
2020-04-09 17:20:39 +02:00
< / p >
< p >
In this section, we study the use of Decentralized Integral Force Feedback (IFF) to damp the resonance of the positioning system.
< / p >
< p >
We thus suppose there is a force sensor in series with the actuator in the \(u\) and \(v\) directions.
2019-03-26 14:47:27 +01:00
< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org20bb7b5" class = "outline-3" >
< h3 id = "org20bb7b5" > < span class = "section-number-3" > 2.1< / span > Analytical Derivation of the transfer function for IFF control< / h3 >
2019-06-04 10:21:33 +02:00
< div class = "outline-text-3" id = "text-2-1" >
2019-03-26 14:47:27 +01:00
< p >
2020-04-09 17:20:39 +02:00
The sensed forces are equal to:
< / p >
\begin{align}
F_{um} & = F_u - k d_u \\
F_{vm} & = F_v - k d_v
\end{align}
< p >
If we consider a constant rotating speed \(\dot{\theta} = \omega\), we have:
< / p >
\begin{equation}
\begin{bmatrix} d_u \\ d_v \end{bmatrix} =
\frac{1}{(m s^2 + (k - m{\omega}^2))^2 + (2 m {\omega} s)^2}
\begin{bmatrix}
ms^2 + (k-m{\omega}^2) & 2 m \omega s \\
-2 m \omega s & ms^2 + (k-m{\omega}^2) \\
\end{bmatrix}
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
\end{equation}
< p >
Which then give:
< / p >
\begin{align}
F_{um} & = \frac{(m s^2 + (k - m\omega^2))^2 + (2 m \omega s)^2 - k(m s^2 + (k - m\omega^2))}{(m s^2 + (k - m\omega^2))^2 + (2 m \omega s)^2} F_u - \frac{2 m \omega s}{(m s^2 + (k - m\omega^2))^2 + (2 m \omega s)^2} F_v\\
F_{vm} & = \frac{2 m \omega s}{(m s^2 + (k - m\omega^2))^2 + (2 m \omega s)^2} F_u + \frac{(m s^2 + (k - m\omega^2))^2 + (2 m \omega s)^2 - k(m s^2 + (k - m\omega^2))}{(m s^2 + (k - m\omega^2))^2 + (2 m \omega s)^2} F_v
\end{align}
< p >
If we note \(\omega_0 = \sqrt{\frac{k}{m}}\), which corresponds to the resonance of the positioning system when not rotating, we obtain:
< / p >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "org88acf99" >
2020-04-09 17:20:39 +02:00
\begin{align}
F_{um} & = \frac{s^4 + (\omega_0^2 + 2\omega^2) s^2 + \omega^2(\omega^2 - \omega_0^2)}{s^4 + 2 (\omega_0^2 + \omega^2) s^2 + (\omega_0^2 - \omega^2)^2} F_u - \frac{2 \omega_0^2 \omega s}{s^4 + 2 (\omega_0^2 + \omega^2) s^2 + (\omega_0^2 - \omega^2)^2} F_v\\
F_{vm} & = \frac{2 \omega_0^2 \omega s}{s^4 + 2 (\omega_0^2 + \omega^2) s^2 + (\omega_0^2 - \omega^2)^2} F_u + \frac{s^4 + (\omega_0^2 + 2\omega^2) s^2 + \omega^2(\omega^2 - \omega_0^2)}{s^4 + 2 (\omega_0^2 + \omega^2) s^2 + (\omega_0^2 - \omega^2)^2} F_v
\end{align}
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org9fdf9c6" class = "outline-3" >
< h3 id = "org9fdf9c6" > < span class = "section-number-3" > 2.2< / span > Low and High frequency Behavior< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-2-2" >
< p >
At high frequency, the force sensors give:
< / p >
\begin{align}
F_{um} & = F_u \\
F_{vm} & = F_v
\end{align}
< p >
which is usual for IFF control.
< / p >
< p >
At low frequency:
< / p >
\begin{align}
F_{um} & = \frac{\omega^2}{\omega_0^2 - \omega^2} F_u \\
F_{vm} & = \frac{\omega^2}{\omega_0^2 - \omega^2} F_v
\end{align}
< p >
The gain at low frequency is no more zero as it is usually the case.
Thus, a constant force will be sensed by the force sensor.
< / p >
< p >
This could be explained by the fact that a constant force will induce some displacement of the mass.
The mass being more off-center with the rotation axis, it is experiencing a larger centrifugal force and this (constant) centrifugal force is sensed by the force sensor.
It is like a < b > negative stiffness is in parallel with both the stiffness and the force sensor< / b > .
< / p >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgf505f3f" class = "outline-3" >
< h3 id = "orgf505f3f" > < span class = "section-number-3" > 2.3< / span > Poles and Zeros< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-2-3" >
< p >
Let’ s use Matlab Symbolic toolbox to find the analytical formula for the poles and zeros of the transfer function from the force actuators to the force sensors.
< / p >
< p >
Let’ s define the parameters and suppose that we have \(\omega > \omega_0\) (stable poles).
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > syms w w0 positive
assume(w < span class = "org-type" > > < / span > w0)
syms x
< / pre >
< / div >
< p >
The characteristic equations to find the poles and zeros are:
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > z = x< span class = "org-type" > ^< / span > 4 < span class = "org-type" > +< / span > (w0< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > 2< span class = "org-type" > *< / span > w< span class = "org-type" > ^< / span > 2)< span class = "org-type" > *< / span > x< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > w< span class = "org-type" > ^< / span > 2< span class = "org-type" > *< / span > (w< span class = "org-type" > ^< / span > 2 < span class = "org-type" > -< / span > w0< span class = "org-type" > ^< / span > 2) < span class = "org-type" > ==< / span > 0
p = x< span class = "org-type" > ^< / span > 4 < span class = "org-type" > +< / span > 2< span class = "org-type" > *< / span > (w0< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > w< span class = "org-type" > ^< / span > 2)< span class = "org-type" > *< / span > x< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > (w< span class = "org-type" > ^< / span > 2 < span class = "org-type" > -< / span > w0< span class = "org-type" > ^< / span > 2)< span class = "org-type" > ^< / span > 2 < span class = "org-type" > ==< / span > 0
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > solve(p, x)
< / pre >
< / div >
< p >
The obtained poles are:
< / p >
\begin{align}
p_1 & = \pm j (\omega_0 - \omega) \\
p_2 & = \pm j (\omega_0 + \omega)
\end{align}
< p >
We obtain two pairs of complex conjugate poles:
< / p >
< ul class = "org-ul" >
< li > \(p_1\) is going to lower frequencies as the rotating speed \(\omega\) is increased< / li >
< li > \(p_2\) is going to higher frequencies as the rotating speed \(\omega\) is increased< / li >
< / ul >
< div class = "org-src-container" >
< pre class = "src src-matlab" > solve(z, x)
< / pre >
< / div >
< p >
The obtained zeros are:
< / p >
\begin{align}
z_1 & = \pm j \sqrt{ \frac{1}{2} \omega_0 \sqrt{(8 \omega^2 + \omega_0^2)} + \omega^2 + \frac{1}{2} \omega_0^2 } \\
z_2 & = \pm \sqrt{ \frac{1}{2} \omega_0 \sqrt{(8 \omega^2 + \omega_0^2)} - \omega^2 - \frac{1}{2} \omega_0^2 }
\end{align}
< p >
Thus, there are < b > two complex conjugate zeros< / b > and < b > two real zeros< / b > .
< / p >
< p >
We can easily show that the frequency of the two complex conjugate zeros is between the frequency of \(p_1\) and \(p_2\).
< / p >
< p >
The effect of the two real zeros is an increase of +2 of the slope without change of phase (non-minimum phase behavior).
< / p >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "org9504827" >
2020-04-09 17:20:39 +02:00
< p >
Also, as one zero has a positive real part, the < b > IFF control is no more unconditionally stable< / b > .
< / p >
< p >
This is due to the fact that the zeros of the plant are the poles of the closed loop system with an infinite gain.
< / p >
< p >
Thus, for some finite IFF gain, one pole will have a positive real part and the system will be unstable.
< / p >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgfe229e8" class = "outline-3" >
< h3 id = "orgfe229e8" > < span class = "section-number-3" > 2.4< / span > IFF Plant and Root Locus< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-2-4" >
< p >
2020-11-03 09:42:04 +01:00
The bode plot for the diagonal and off-diagonal elements are shown in Figure < a href = "#orgd5cdf0c" > 10< / a > .
2020-04-09 17:20:39 +02:00
< / p >
< p >
2020-11-03 09:42:04 +01:00
The change of dynamics from \(F_u\) to \(F_{u,m}\) due to the change in rotation speed is shown in Figure < a href = "#org6c8e078" > 11< / a > .
2020-04-09 17:20:39 +02:00
It is shown that the rotation speed does change the low frequency gain (explained in previous section).
< / p >
< p >
2020-11-03 09:42:04 +01:00
The root locus for Decentralized Direct Velocity Feedback is shown in Figure < a href = "#org974ba7e" > 12< / a > .
2020-04-09 17:20:39 +02:00
< / p >
< p >
It is shown that:
< / p >
< ul class = "org-ul" >
< li > the high frequency pair of complex conjugate poles cannot be critically damped.
There is an optimal gain that gives maximum damping of this resonance.< / li >
< li > the low frequency resonance can be critically damped with sufficient gain< / li >
< li > a closed loop unstable pole is present whatever the gain of the IFF (if the rotation speed in not null)< / li >
< / ul >
2020-11-03 09:42:04 +01:00
< div id = "orgd5cdf0c" class = "figure" >
2020-04-09 17:20:39 +02:00
< p > < img src = "figs/iff_plant_and_coupling.png" alt = "iff_plant_and_coupling.png" / >
< / p >
< p > < span class = "figure-number" > Figure 10: < / span > Transfer Function from \(F_u\) to \(F_{u,m}\) and from \(F_u\) to \(F_{v,m}\) for \(\omega = 0.3 \omega_0\)< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "org6c8e078" class = "figure" >
2020-04-09 17:20:39 +02:00
< p > < img src = "figs/iff_variability_plant_ws.png" alt = "iff_variability_plant_ws.png" / >
< / p >
< p > < span class = "figure-number" > Figure 11: < / span > Transfer Function from \(F_u\) to \(F_{u,m}\) for multiple rotation speed< / p >
< / div >
< p >
Let’ s see how the root locus is changing with the rotation speed.
< / p >
2020-11-03 09:42:04 +01:00
< div id = "org974ba7e" class = "figure" >
2020-04-09 17:20:39 +02:00
< p > < img src = "figs/iff_root_locus_ws.png" alt = "iff_root_locus_ws.png" / >
< / p >
< p > < span class = "figure-number" > Figure 12: < / span > Change of the Root Locus plot for different rotating speed< / p >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org48b3791" class = "outline-3" >
< h3 id = "org48b3791" > < span class = "section-number-3" > 2.5< / span > Conclusion< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-2-5" >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "orgc084e35" >
2020-04-09 17:20:39 +02:00
< p >
The centrifugal forces can be modeled as a negative stiffness in parallel with the actuators and force sensors.
This changes the low frequency gain of the IFF plant.
It also add zeros with positive real part which removes the typical unconditional stability property of the IFF control.
< / p >
< p >
2020-11-03 09:42:04 +01:00
From the Root Locus plot in Figure < a href = "#org974ba7e" > 12< / a > , it is shown that when rotating, unstable poles will be introduced due to IFF control.
2020-04-09 17:20:39 +02:00
Moreover, only one of the two pairs of complex conjugate poles can be critically damped.
< / p >
< p >
Stiffness can be added in parallel to the force sensor to counteract the negative stiffness due to centrifugal forces.
If the added stiffness is higher than the maximum negative stiffness, then the poles of the IFF damped system will stay in the (stable) right half-plane.
< / p >
< p >
Thus, IFF should not be used for rotating positioning platforms unless some stiffness is added in parallel with the force sensor.
If no parallel stiffness is added, an unstable pole is added in the system.
The frequency of this pole can be made small if the frequency of the position system resonance is much larger than the frequency of the rotation.
< / p >
< / div >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgb3854ea" class = "outline-2" >
< h2 id = "orgb3854ea" > < span class = "section-number-2" > 3< / span > Direct Velocity Feedback< / h2 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-2" id = "text-3" >
< p >
2020-11-03 09:42:04 +01:00
< a id = "orge9cb2c6" > < / a >
2020-04-09 17:20:39 +02:00
< / p >
< p >
In this section, we study the use of Direct Velocity Feedback to damp the resonances of the positioning station.
We thus suppose that we are able to measure to relative displacement (or velocity) \(d_u\) and \(d_v\).
< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org3c36ccd" class = "outline-3" >
< h3 id = "org3c36ccd" > < span class = "section-number-3" > 3.1< / span > Analytical Study< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-3-1" >
< p >
The equation of motion are:
< / p >
\begin{equation}
\begin{bmatrix} d_u \\ d_v \end{bmatrix} =
\frac{1}{(m s^2 + (k - m{\omega}^2))^2 + (2 m {\omega} s)^2}
\begin{bmatrix}
ms^2 + (k-m{\omega}^2) & 2 m \omega s \\
-2 m \omega s & ms^2 + (k-m{\omega}^2) \\
\end{bmatrix}
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
\end{equation}
< p >
If we note \(\omega_0 = \sqrt{\frac{k}{m}}\), we obtain
< / p >
\begin{align}
d_u & = \frac{1}{m}\frac{s^2 + (\omega_0^2 - \omega^2)}{s^4 + 2 (\omega_0^2 + \omega^2) s^2 + (\omega_0^2 - \omega^2)^2} F_u + \frac{1}{m} \frac{2 \omega s}{s^4 + 2 (\omega_0^2 + \omega^2) s^2 + (\omega_0^2 - \omega^2)^2} F_v\\
d_v & = - \frac{1}{m} \frac{2 \omega s}{s^4 + 2 (\omega_0^2 + \omega^2) s^2 + (\omega_0^2 - \omega^2)^2} F_u + \frac{1}{m}\frac{s^2 + (\omega_0^2 - \omega^2)}{s^4 + 2 (\omega_0^2 + \omega^2) s^2 + (\omega_0^2 - \omega^2)^2} F_v
\end{align}
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgf9cd06a" class = "outline-3" >
< h3 id = "orgf9cd06a" > < span class = "section-number-3" > 3.2< / span > High and Low frequency behavior< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-3-2" >
< p >
At low frequency:
< / p >
\begin{align}
d_u & = \frac{1}{m}\frac{1}{\omega_0^2 - \omega^2} F_u \\
d_v & = \frac{1}{m}\frac{1}{\omega_0^2 - \omega^2} F_v
\end{align}
< p >
Which can be re-written:
< / p >
\begin{align}
d_u & = \frac{1}{k} \frac{1}{1 - \frac{\omega^2}{\omega_0^2}} F_u \\
d_v & = \frac{1}{k} \frac{1}{1 - \frac{\omega^2}{\omega_0^2}} F_v
\end{align}
< p >
The usual low frequency gain of \(\frac{1}{k}\) is modified by a factor \(\frac{1}{1 - \frac{\omega^2}{\omega_0^2}}\).
< / p >
< p >
At high frequency:
< / p >
\begin{align}
d_u & = \frac{1}{m s^2} F_u + \frac{2 \omega}{m s^3} F_v\\
d_v & = -\frac{2 \omega}{m s^3} F_u + \frac{1}{m s^2} F_v
\end{align}
< p >
Thus the rotating speed does not change the high frequency behavior of the diagonal terms but change the coupling.
< / p >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org88c4ddf" class = "outline-3" >
< h3 id = "org88c4ddf" > < span class = "section-number-3" > 3.3< / span > Poles and Zeros< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-3-3" >
< p >
The direct terms (diagonal terms of the 2x2 transfer function matrix) have two complex conjugate zeros at:
< / p >
\begin{equation}
z = \pm j \sqrt{\omega_0^2 - \omega^2}
\end{equation}
< p >
Which are between the two pairs of complex conjugate poles at:
< / p >
\begin{align}
p_1 & = \pm j (\omega_0 - \omega) \\
p_2 & = \pm j (\omega_0 + \omega)
\end{align}
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org02b0822" class = "outline-3" >
< h3 id = "org02b0822" > < span class = "section-number-3" > 3.4< / span > DVF Plant and Root Locus< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-3-4" >
< p >
2020-11-03 09:42:04 +01:00
The bode plot for the diagonal and off-diagonal elements are shown in Figure < a href = "#orgb9cd22a" > 13< / a > .
2020-04-09 17:20:39 +02:00
< / p >
< p >
2020-11-03 09:42:04 +01:00
The change of dynamics from \(F_u\) to \(d_u\) due to the change in rotation speed is shown in Figure < a href = "#orgab64ad3" > 14< / a > .
2020-04-09 17:20:39 +02:00
It is shown that the rotation speed does not change much the low frequency and high frequency gains.
It only modifies the location of the two pair of complex conjugate pairs.
< / p >
< p >
2020-11-03 09:42:04 +01:00
The root locus for Decentralized Direct Velocity Feedback is shown in Figure < a href = "#org1569da6" > 15< / a > .
2020-04-09 17:20:39 +02:00
It is shown that the closed-loop poles are in the left-half of the complex plane, whatever the gain.
Moreover, has much damping can be added to both pairs of complex conjugate poles.
< / p >
2020-11-03 09:42:04 +01:00
< div id = "orgb9cd22a" class = "figure" >
2020-04-09 17:20:39 +02:00
< p > < img src = "figs/dvf_plant_and_coupling.png" alt = "dvf_plant_and_coupling.png" / >
< / p >
< p > < span class = "figure-number" > Figure 13: < / span > Transfer Function from \(F_u\) to \(d_u\) and from \(F_u\) to \(d_v\) for \(\omega = 0.3 \omega_0\)< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "orgab64ad3" class = "figure" >
2020-04-09 17:20:39 +02:00
< p > < img src = "figs/dvf_variability_plant_ws.png" alt = "dvf_variability_plant_ws.png" / >
< / p >
< p > < span class = "figure-number" > Figure 14: < / span > Transfer Function from \(F_u\) to \(d_u\) for multiple rotation speed< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "org1569da6" class = "figure" >
2020-04-09 17:20:39 +02:00
< p > < img src = "figs/dvf_root_locus_ws.png" alt = "dvf_root_locus_ws.png" / >
< / p >
< p > < span class = "figure-number" > Figure 15: < / span > Change of the Root Locus plot for multiple rotating speed< / p >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orga6508a6" class = "outline-3" >
< h3 id = "orga6508a6" > < span class = "section-number-3" > 3.5< / span > Conclusion< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-3-5" >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "org17d57c9" >
2020-04-09 17:20:39 +02:00
< p >
(Relative) Direct Velocity Feedback can be used to damp the resonance of a rotating positioning stage.
< / p >
< p >
2020-11-03 09:42:04 +01:00
As shown by the Root Locus in Figure < a href = "#org1569da6" > 15< / a > :
2020-04-09 17:20:39 +02:00
< / p >
< ul class = "org-ul" >
< li > DVF permits to critically damp the vibrations of the positioning stage< / li >
< li > DVF is unconditionally stage< / li >
< / ul >
< / div >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org5684294" class = "outline-2" >
< h2 id = "org5684294" > < span class = "section-number-2" > 4< / span > Control Strategies< / h2 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-2" id = "text-4" >
< p >
2020-11-03 09:42:04 +01:00
< a id = "org702baf3" > < / a >
2020-04-09 17:20:39 +02:00
< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org79e0750" class = "outline-3" >
< h3 id = "org79e0750" > < span class = "section-number-3" > 4.1< / span > Measurement in the fixed reference frame< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-4-1" >
< p >
First, let’ s consider a measurement in the fixed referenced frame.
2019-03-26 14:47:27 +01:00
< / p >
< p >
The transfer function from actuator \([F_u, F_v]\) to sensor \([D_x, D_y]\) is then \(G(\theta)\).
< / p >
< p >
Then the measurement is subtracted to the reference signal \([r_x, r_y]\) to obtain the position error in the fixed reference frame \([\epsilon_x, \epsilon_y]\).
< / p >
< p >
The position error \([\epsilon_x, \epsilon_y]\) is then express in the rotating frame corresponding to the actuators \([\epsilon_u, \epsilon_v]\).
< / p >
< p >
Finally, the control low \(K\) links the position errors \([\epsilon_u, \epsilon_v]\) to the actuator forces \([F_u, F_v]\).
< / p >
< p >
2020-11-03 09:42:04 +01:00
The block diagram is shown on figure < a href = "#org3f36057" > 16< / a > .
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "org3f36057" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "./figs/control_measure_fixed_2dof.png" alt = "control_measure_fixed_2dof.png" / >
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 16: < / span > Control with a measure from fixed frame< / p >
2019-03-26 14:47:27 +01:00
< / div >
< p >
The loop gain is then \(L = G(\theta) K J(\theta)\).
< / p >
< p >
One question we wish to answer is: is \(G(\theta) J(\theta) = G(\theta_0) J(\theta_0)\)?
< / p >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org52886b3" class = "outline-3" >
< h3 id = "org52886b3" > < span class = "section-number-3" > 4.2< / span > Measurement in the rotating frame< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-4-2" >
2019-03-26 14:47:27 +01:00
< p >
2020-04-09 17:20:39 +02:00
Let’ s consider that the measurement is made in the rotating reference frame.
2019-03-26 14:47:27 +01:00
< / p >
< p >
2020-11-03 09:42:04 +01:00
The corresponding block diagram is shown figure < a href = "#org7904f59" > 17< / a > .
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "org7904f59" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "./figs/control_measure_rotating_2dof.png" alt = "control_measure_rotating_2dof.png" / >
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 17: < / span > Control with a measure from rotating frame< / p >
2019-03-26 14:47:27 +01:00
< / div >
< p >
The loop gain is \(L = G K\).
< / p >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgad82ee5" class = "outline-2" >
< h2 id = "orgad82ee5" > < span class = "section-number-2" > 5< / span > Multi Body Model - Simscape< / h2 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-2" id = "text-5" >
2019-06-04 10:21:33 +02:00
< p >
2020-11-03 09:42:04 +01:00
< a id = "orga3b57d4" > < / a >
2019-06-04 10:21:33 +02:00
< / p >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgda54a97" class = "outline-3" >
< h3 id = "orgda54a97" > < span class = "section-number-3" > 5.1< / span > Initialization< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-5-1" >
2019-03-26 14:47:27 +01:00
< p >
2020-04-09 17:20:39 +02:00
Let’ s load the previously defined parameters for the model.
2019-03-26 14:47:27 +01:00
< / p >
2019-06-04 10:21:33 +02:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > bode_opts = bodeoptions;
bode_opts.FreqUnits = < span class = "org-string" > 'Hz'< / span > ;
bode_opts.MagUnits = < span class = "org-string" > 'abs'< / span > ;
bode_opts.MagScale = < span class = "org-string" > 'log'< / span > ;
bode_opts.Grid = < span class = "org-string" > 'on'< / span > ;
bode_opts.PhaseVisible = < span class = "org-string" > 'off'< / span > ;
2020-04-09 17:20:39 +02:00
bode_opts.Title.FontSize = 10;
bode_opts.XLabel.FontSize = 10;
bode_opts.YLabel.FontSize = 10;
bode_opts.TickLabel.FontSize = 10;
2019-06-04 10:21:33 +02:00
< / pre >
2019-03-26 14:47:27 +01:00
< / div >
< p >
First we define the parameters that must be defined in order to run the Simscape simulation.
< / p >
< div class = "org-src-container" >
2020-04-09 17:20:39 +02:00
< pre class = "src src-matlab" > w = 2< span class = "org-type" > *< / span > < span class = "org-constant" > pi< / span > ; < span class = "org-comment" > % Rotation speed [rad/s]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
theta_e = 0; < span class = "org-comment" > % Static measurement error on the angle theta [rad]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
m = 5; < span class = "org-comment" > % mass of the sample [kg]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
mTuv = 30;< span class = "org-comment" > % Mass of the moving part of the Tuv stage [kg]< / span >
kTuv = 1e8; < span class = "org-comment" > % Stiffness of the Tuv stage [N/m]< / span >
cTuv = 0; < span class = "org-comment" > % Damping of the Tuv stage [N/(m/s)]< / span >
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< p >
Then, we defined parameters that will be used in the following analysis.
< / p >
< div class = "org-src-container" >
2020-04-09 17:20:39 +02:00
< pre class = "src src-matlab" > mlight = 5; < span class = "org-comment" > % Mass for light sample [kg]< / span >
mheavy = 55; < span class = "org-comment" > % Mass for heavy sample [kg]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
wlight = 2< span class = "org-type" > *< / span > < span class = "org-constant" > pi< / span > ; < span class = "org-comment" > % Max rot. speed for light sample [rad/s]< / span >
wheavy = 2< span class = "org-type" > *< / span > < span class = "org-constant" > pi< / span > < span class = "org-type" > /< / span > 60; < span class = "org-comment" > % Max rot. speed for heavy sample [rad/s]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
kvc = 1e3; < span class = "org-comment" > % Voice Coil Stiffness [N/m]< / span >
kpz = 1e8; < span class = "org-comment" > % Piezo Stiffness [N/m]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
d = 0.01; < span class = "org-comment" > % Maximum excentricity from rotational axis [m]< / span >
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
freqs = logspace(< span class = "org-type" > -< / span > 2, 3, 1000); < span class = "org-comment" > % Frequency vector for analysis [Hz]< / span >
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org8bfdd83" class = "outline-3" >
< h3 id = "org8bfdd83" > < span class = "section-number-3" > 5.2< / span > Identification in the rotating referenced frame< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-5-2" >
2019-03-26 14:47:27 +01:00
< p >
We initialize the inputs and outputs of the system to identify:
< / p >
< ul class = "org-ul" >
< li > Inputs: \(f_u\) and \(f_v\)< / li >
< li > Outputs: \(d_u\) and \(d_v\)< / li >
< / ul >
< div class = "org-src-container" >
2019-06-04 10:21:33 +02:00
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Options for Linearized< / span > < / span >
2019-03-26 14:47:27 +01:00
options = linearizeOptions;
2020-04-09 17:20:39 +02:00
options.SampleTime = 0;
2019-03-26 14:47:27 +01:00
2019-06-04 10:21:33 +02:00
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Name of the Simulink File< / span > < / span >
mdl = < span class = "org-string" > 'rotating_frame'< / span > ;
2019-03-26 14:47:27 +01:00
2019-06-04 10:21:33 +02:00
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Input/Output definition< / span > < / span >
2020-04-09 17:20:39 +02:00
io< span class = "org-type" > (1) < / span > = linio([mdl, < span class = "org-string" > '/fu'< / span > ], 1, < span class = "org-string" > 'input'< / span > );
io< span class = "org-type" > (2) < / span > = linio([mdl, < span class = "org-string" > '/fv'< / span > ], 1, < span class = "org-string" > 'input'< / span > );
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
io< span class = "org-type" > (3) < / span > = linio([mdl, < span class = "org-string" > '/du'< / span > ], 1, < span class = "org-string" > 'output'< / span > );
io< span class = "org-type" > (4) < / span > = linio([mdl, < span class = "org-string" > '/dv'< / span > ], 1, < span class = "org-string" > 'output'< / span > );
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< p >
We start we identify the transfer functions at high speed with the light sample.
< / p >
< div class = "org-src-container" >
2019-06-04 10:21:33 +02:00
< pre class = "src src-matlab" > w = wlight; < span class = "org-comment" > % Rotation speed [rad/s]< / span >
m = mlight; < span class = "org-comment" > % mass of the sample [kg]< / span >
2019-03-26 14:47:27 +01:00
kTuv = kpz;
2020-04-09 17:20:39 +02:00
Gpz_light = linearize(mdl, io, 0.1);
Gpz_light.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
Gpz_light.OutputName = {< span class = "org-string" > 'Du'< / span > , < span class = "org-string" > 'Dv'< / span > };
2019-03-26 14:47:27 +01:00
kTuv = kvc;
2020-04-09 17:20:39 +02:00
Gvc_light = linearize(mdl, io, 0.1);
Gvc_light.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
Gvc_light.OutputName = {< span class = "org-string" > 'Du'< / span > , < span class = "org-string" > 'Dv'< / span > };
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< p >
Then we identify the system with an heavy mass and low speed.
< / p >
< div class = "org-src-container" >
2019-06-04 10:21:33 +02:00
< pre class = "src src-matlab" > w = wheavy; < span class = "org-comment" > % Rotation speed [rad/s]< / span >
m = mheavy; < span class = "org-comment" > % mass of the sample [kg]< / span >
2019-03-26 14:47:27 +01:00
kTuv = kpz;
2020-04-09 17:20:39 +02:00
Gpz_heavy = linearize(mdl, io, 0.1);
Gpz_heavy.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
Gpz_heavy.OutputName = {< span class = "org-string" > 'Du'< / span > , < span class = "org-string" > 'Dv'< / span > };
2019-03-26 14:47:27 +01:00
kTuv = kvc;
2020-04-09 17:20:39 +02:00
Gvc_heavy = linearize(mdl, io, 0.1);
Gvc_heavy.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
Gvc_heavy.OutputName = {< span class = "org-string" > 'Du'< / span > , < span class = "org-string" > 'Dv'< / span > };
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org7d54ace" class = "outline-3" >
< h3 id = "org7d54ace" > < span class = "section-number-3" > 5.3< / span > Coupling ratio between \(f_{uv}\) and \(d_{uv}\)< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-5-3" >
2019-03-26 14:47:27 +01:00
< p >
In order to validate the equations written, we can compute the coupling ratio using the simscape model and compare with the equations.
< / p >
< p >
2020-11-03 09:42:04 +01:00
From the previous identification, we plot the coupling ratio in both case (figure < a href = "#org4d61fbe" > 18< / a > ).
2019-03-26 14:47:27 +01:00
< / p >
< p >
2020-11-03 09:42:04 +01:00
We obtain the same result than the analytical case (figures < a href = "#org7bcaf39" > 2< / a > and < a href = "#orgcc69867" > 3< / a > ).
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "org4d61fbe" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/coupling_ratio_light_heavy.png" alt = "coupling_ratio_light_heavy.png" / >
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 18: < / span > Coupling ratio obtained with the Simscape model< / p >
2019-03-26 14:47:27 +01:00
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org01bf5e1" class = "outline-3" >
< h3 id = "org01bf5e1" > < span class = "section-number-3" > 5.4< / span > Transfer function from force to force sensor (IFF plant)< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-5-4" >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Name of the Simulink File< / span > < / span >
mdl = < span class = "org-string" > 'rotating_frame'< / span > ;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Input/Output definition< / span > < / span >
io< span class = "org-type" > (1) < / span > = linio([mdl, < span class = "org-string" > '/fu'< / span > ], 1, < span class = "org-string" > 'input'< / span > );
io< span class = "org-type" > (2) < / span > = linio([mdl, < span class = "org-string" > '/fv'< / span > ], 1, < span class = "org-string" > 'input'< / span > );
io< span class = "org-type" > (3) < / span > = linio([mdl, < span class = "org-string" > '/fum'< / span > ], 1, < span class = "org-string" > 'output'< / span > );
io< span class = "org-type" > (4) < / span > = linio([mdl, < span class = "org-string" > '/fvm'< / span > ], 1, < span class = "org-string" > 'output'< / span > );
< / pre >
< / div >
< p >
We start we identify the transfer functions at high speed with the light sample.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > w = wlight; < span class = "org-comment" > % Rotation speed [rad/s]< / span >
m = mlight; < span class = "org-comment" > % mass of the sample [kg]< / span >
kTuv = kpz;
Gpz_light = linearize(mdl, io, 0.1);
Gpz_light.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
Gpz_light.OutputName = {< span class = "org-string" > 'Fum'< / span > , < span class = "org-string" > 'Fvm'< / span > };
kTuv = kvc;
Gvc_light = linearize(mdl, io, 0.1);
Gvc_light.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
Gvc_light.OutputName = {< span class = "org-string" > 'Fum'< / span > , < span class = "org-string" > 'Fvm'< / span > };
< / pre >
< / div >
< p >
Then we identify the system with an heavy mass and low speed.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > w = wheavy; < span class = "org-comment" > % Rotation speed [rad/s]< / span >
m = mheavy; < span class = "org-comment" > % mass of the sample [kg]< / span >
kTuv = kpz;
Gpz_heavy = linearize(mdl, io, 0.1);
Gpz_heavy.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
Gpz_heavy.OutputName = {< span class = "org-string" > 'Fum'< / span > , < span class = "org-string" > 'Fvm'< / span > };
kTuv = kvc;
Gvc_heavy = linearize(mdl, io, 0.1);
Gvc_heavy.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
Gvc_heavy.OutputName = {< span class = "org-string" > 'Fum'< / span > , < span class = "org-string" > 'Fvm'< / span > };
< / pre >
2019-03-26 14:47:27 +01:00
< / div >
2020-04-09 17:20:39 +02:00
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org49cd602" class = "outline-3" >
< h3 id = "org49cd602" > < span class = "section-number-3" > 5.5< / span > Plant Control - SISO approach< / h3 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-3" id = "text-5-5" >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org85c1cbe" class = "outline-4" >
< h4 id = "org85c1cbe" > < span class = "section-number-4" > 5.5.1< / span > Plant identification< / h4 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-4" id = "text-5-5-1" >
2019-03-26 14:47:27 +01:00
< p >
The goal is to study the control problems due to the coupling that appears because of the rotation.
< / p >
< p >
First, we identify the system when the rotation speed is null and then when the rotation speed is equal to 60rpm.
< / p >
< p >
The actuators are voice coil with some damping added.
< / p >
< p >
2020-11-03 09:42:04 +01:00
The bode plot of the system not rotating and rotating at 60rpm is shown figure < a href = "#org05e09b5" > 19< / a > .
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "org05e09b5" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/Gvc_speed.png" alt = "Gvc_speed.png" / >
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 19: < / span > Change of transfer functions due to rotating speed< / p >
2019-03-26 14:47:27 +01:00
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org7f63058" class = "outline-4" >
< h4 id = "org7f63058" > < span class = "section-number-4" > 5.5.2< / span > Effect of rotation speed< / h4 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-4" id = "text-5-5-2" >
2019-03-26 14:47:27 +01:00
< p >
We first identify the system (voice coil and light mass) for multiple rotation speed.
2020-11-03 09:42:04 +01:00
Then we compute the bode plot of the system (figure < a href = "#orgd80bd0e" > 20< / a > ).
2019-03-26 14:47:27 +01:00
< / p >
< p >
As the rotation frequency increases:
< / p >
< ul class = "org-ul" >
< li > one pole goes to lower frequencies while the other goes to higher frequencies< / li >
< li > one zero appears between the two poles< / li >
< li > the zero disappears when \(\omega > \sqrt{\frac{k}{m}}\) and the low frequency pole becomes unstable (positive real part)< / li >
< / ul >
< p >
To stabilize the unstable pole, we need a control bandwidth of at least twice of frequency of the unstable pole.
< / p >
2020-11-03 09:42:04 +01:00
< div id = "orgd80bd0e" class = "figure" >
2019-06-04 10:21:33 +02:00
< p > < img src = "figs/Guu_uv_ws.png" alt = "Guu_uv_ws.png" / >
2019-03-26 14:47:27 +01:00
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 20: < / span > Diagonal term as a function of the rotation frequency< / p >
2019-03-26 14:47:27 +01:00
< / div >
< p >
2020-11-03 09:42:04 +01:00
Then, we can look at the same plots for the piezoelectric actuator (figure < a href = "#org69c77ac" > 21< / a > ). The effect of the rotation frequency has very little effect on the dynamics of the system to control.
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "org69c77ac" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/Guu_ws_pz.png" alt = "Guu_ws_pz.png" / >
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 21: < / span > Diagonal term as a function of the rotation frequency< / p >
2019-03-26 14:47:27 +01:00
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgf3bfa99" class = "outline-4" >
< h4 id = "orgf3bfa99" > < span class = "section-number-4" > 5.5.3< / span > Controller design< / h4 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-4" id = "text-5-5-3" >
2019-03-26 14:47:27 +01:00
< p >
We design a controller based on the identification when the system is not rotating.
< / p >
< p >
The obtained controller is a lead-lag controller with the following transfer function.
< / p >
< div class = "org-src-container" >
2020-04-09 17:20:39 +02:00
< pre class = "src src-matlab" > Kll = 2.0698e09< span class = "org-type" > *< / span > (s< span class = "org-type" > +< / span > 40.45)< span class = "org-type" > *< / span > (s< span class = "org-type" > +< / span > 1.181)< span class = "org-type" > /< / span > ((s< span class = "org-type" > +< / span > 0.01)< span class = "org-type" > *< / span > (s< span class = "org-type" > +< / span > 198.4)< span class = "org-type" > *< / span > (s< span class = "org-type" > +< / span > 2790));
K = [Kll 0;
0 Kll];
2019-06-04 10:21:33 +02:00
2020-04-09 17:20:39 +02:00
K.InputName = {< span class = "org-string" > 'Du'< / span > , < span class = "org-string" > 'Dv'< / span > };
K.OutputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< p >
2020-11-03 09:42:04 +01:00
The loop gain is displayed figure < a href = "#orgf8224c6" > 22< / a > .
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "orgf8224c6" class = "figure" >
2019-03-26 14:47:27 +01:00
< p > < img src = "figs/Gvc_loop_gain.png" alt = "Gvc_loop_gain.png" / >
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 22: < / span > Loop gain obtained for a lead-lag controller on the system with a voice coil< / p >
2019-03-26 14:47:27 +01:00
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-org31f933f" class = "outline-4" >
< h4 id = "org31f933f" > < span class = "section-number-4" > 5.5.4< / span > Controlling the rotating system< / h4 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-4" id = "text-5-5-4" >
2019-03-26 14:47:27 +01:00
< p >
2019-06-04 10:21:33 +02:00
We here want to see if the system is robust with respect to the rotation speed.
We use the controller that was designed based on the dynamics of the non-rotating system.
2019-03-26 14:47:27 +01:00
< / p >
< p >
2020-04-09 17:20:39 +02:00
Let’ s first plot the SISO loop gain.
2019-03-26 14:47:27 +01:00
< / p >
2020-11-03 09:42:04 +01:00
< div id = "orgf2b5af8" class = "figure" >
2019-06-04 10:21:33 +02:00
< p > < img src = "figs/loop_gain_turning.png" alt = "loop_gain_turning.png" / >
2019-03-26 14:47:27 +01:00
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 23: < / span > Loop Gain \(G_u * K\)< / p >
2019-03-26 14:47:27 +01:00
< / div >
< p >
2019-06-04 10:21:33 +02:00
We can now compute the close-loop systems.
2019-03-26 14:47:27 +01:00
< / p >
< div class = "org-src-container" >
2020-04-09 17:20:39 +02:00
< pre class = "src src-matlab" > Gvc_cl = {zeros(1, length(ws))};
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(ws)< / span >
Gvc_cl{< span class = "org-constant" > i< / span > } = feedback(Gs_vc{< span class = "org-constant" > i< / span > }, K, < span class = "org-string" > 'name'< / span > );
2019-06-04 10:21:33 +02:00
< span class = "org-keyword" > end< / span >
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
< p >
2020-11-03 09:42:04 +01:00
Let’ s now look on figure < a href = "#org4ae64f0" > 24< / a > at the evolution of the poles of the system when closing only one loop (controlling only one direction). We see that two complex conjugate poles are approaching the real axis and then they separate: one goes to positive real part and the other goes to negative real part.
2019-06-04 10:21:33 +02:00
The system then goes unstable at some point (here for \(\omega=60rpm\)).
2019-03-26 14:47:27 +01:00
< / p >
2019-06-04 10:21:33 +02:00
2019-03-26 14:47:27 +01:00
< div class = "org-src-container" >
2019-06-04 10:21:33 +02:00
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
2020-04-09 17:20:39 +02:00
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(ws)< / span >
sys = feedback(Gs_vc{< span class = "org-constant" > i< / span > }(1, 1), K(1, 1), < span class = "org-string" > 'name'< / span > );
plot(real(pole(sys)), imag(pole(sys)), < span class = "org-string" > 'x'< / span > , < span class = "org-string" > 'DisplayName'< / span > , sprintf(< span class = "org-string" > '$\\omega = %.0f rpm$'< / span > , ws(< span class = "org-constant" > i< / span > )< span class = "org-type" > /< / span > (2< span class = "org-type" > *< / span > < span class = "org-constant" > pi< / span > )< span class = "org-type" > *< / span > 60));
2019-06-04 10:21:33 +02:00
< span class = "org-keyword" > end< / span >
hold off;
2020-04-09 17:20:39 +02:00
xlim([< span class = "org-type" > -< / span > 80, 10]);
xlabel(< span class = "org-string" > 'Real Axis'< / span > ); ylabel(< span class = "org-string" > 'Imaginary Axis'< / span > );
legend(< span class = "org-string" > 'Location'< / span > , < span class = "org-string" > 'northeast'< / span > );
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "org4ae64f0" class = "figure" >
2019-06-04 10:21:33 +02:00
< p > < img src = "figs/evolution_poles_u.png" alt = "evolution_poles_u.png" / >
2019-03-26 14:47:27 +01:00
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 24: < / span > Evolution of the poles of the closed-loop system when closing just one loop< / p >
2019-03-26 14:47:27 +01:00
< / div >
< p >
2020-11-03 09:42:04 +01:00
If we look at the poles of the closed loop-system for multiple rotating speed (figure < a href = "#org4b2a3af" > 25< / a > ) when closing the two loops (MIMO system), we see that they all have a negative real part (stable system), and their evolution on the complex plane is rather small compare to the open loop evolution.
2019-03-26 14:47:27 +01:00
< / p >
< div class = "org-src-container" >
2019-06-04 10:21:33 +02:00
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
2019-03-26 14:47:27 +01:00
hold on;
2020-04-09 17:20:39 +02:00
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(ws)< / span >
plot(real(pole(Gvc_cl{< span class = "org-constant" > i< / span > })), imag(pole(Gvc_cl{< span class = "org-constant" > i< / span > })), < span class = "org-string" > 'x'< / span > , < span class = "org-string" > 'DisplayName'< / span > , sprintf(< span class = "org-string" > '$\\omega = %.0f rpm$'< / span > , ws(< span class = "org-constant" > i< / span > )< span class = "org-type" > /< / span > (2< span class = "org-type" > *< / span > < span class = "org-constant" > pi< / span > )< span class = "org-type" > *< / span > 60));
2019-06-04 10:21:33 +02:00
< span class = "org-keyword" > end< / span >
2019-03-26 14:47:27 +01:00
hold off;
2020-04-09 17:20:39 +02:00
xlim([< span class = "org-type" > -< / span > 80, 0]);
xlabel(< span class = "org-string" > 'Real Axis'< / span > ); ylabel(< span class = "org-string" > 'Imaginary Axis'< / span > );
legend(< span class = "org-string" > 'Location'< / span > , < span class = "org-string" > 'northeast'< / span > );
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "org4b2a3af" class = "figure" >
2019-06-04 10:21:33 +02:00
< p > < img src = "figs/poles_cl_system.png" alt = "poles_cl_system.png" / >
2019-03-26 14:47:27 +01:00
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 25: < / span > Evolution of the poles of the closed-loop system< / p >
2019-03-26 14:47:27 +01:00
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgd040c32" class = "outline-4" >
< h4 id = "orgd040c32" > < span class = "section-number-4" > 5.5.5< / span > Neglected coupling< / h4 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-4" id = "text-5-5-5" >
2019-03-26 14:47:27 +01:00
< p >
2020-04-09 17:20:39 +02:00
Take a diagonal system and apply the diagonal controller.
< / p >
< p >
I expect that the system will be unstable
=> in some way the coupling makes the system stable
< / p >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgdb38278" class = "outline-4" >
< h4 id = "orgdb38278" > < span class = "section-number-4" > 5.5.6< / span > Close loop performance< / h4 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-4" id = "text-5-5-6" >
< p >
2020-11-03 09:42:04 +01:00
First, we create the closed loop systems. Then, we plot the transfer function from the reference signals \([r_u, r_v]\) to the output \([d_u, d_v]\) (figure < a href = "#org0d0e6eb" > 26< / a > ).
2019-03-26 14:47:27 +01:00
< / p >
< div class = "org-src-container" >
2020-04-09 17:20:39 +02:00
< pre class = "src src-matlab" > freqs = logspace(< span class = "org-type" > -< / span > 2, 3, 1000);
2019-03-26 14:47:27 +01:00
2019-06-04 10:21:33 +02:00
< span class = "org-type" > figure< / span > ;
2020-04-09 17:20:39 +02:00
ax1 = subplot(1,2,1);
title(< span class = "org-string" > '$G_{r_u \to d_u}$'< / span > )
2019-06-04 10:21:33 +02:00
hold on;
2020-04-09 17:20:39 +02:00
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(ws)< / span >
sys = Gvc_cl{< span class = "org-constant" > i< / span > }< span class = "org-type" > *< / span > K;
plot(freqs, abs(squeeze(freqresp(sys(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))));
2019-06-04 10:21:33 +02:00
< span class = "org-keyword" > end< / span >
hold off;
2020-04-09 17:20:39 +02:00
xlim([freqs(1), freqs(end)]);
ylim([1e< span class = "org-type" > -< / span > 4, 10]);
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Magnitude [m/N]'< / span > );
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
ax2 = subplot(1,2,2);
title(< span class = "org-string" > '$G_{r_u \to d_v}$'< / span > )
2019-06-04 10:21:33 +02:00
hold on;
2020-04-09 17:20:39 +02:00
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(ws)< / span >
sys = Gvc_cl{< span class = "org-constant" > i< / span > }< span class = "org-type" > *< / span > K;
plot(freqs, abs(squeeze(freqresp(sys(1, 2), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'DisplayName'< / span > , sprintf(< span class = "org-string" > '$\\omega = %.0f rpm$'< / span > , ws(< span class = "org-constant" > i< / span > )< span class = "org-type" > /< / span > (2< span class = "org-type" > *< / span > < span class = "org-constant" > pi< / span > )< span class = "org-type" > *< / span > 60));
2019-06-04 10:21:33 +02:00
< span class = "org-keyword" > end< / span >
hold off;
2020-04-09 17:20:39 +02:00
xlim([freqs(1), freqs(end)]);
ylim([1e< span class = "org-type" > -< / span > 4, 10]);
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > );
legend(< span class = "org-string" > 'Location'< / span > , < span class = "org-string" > 'northeast'< / span > )
2019-03-26 14:47:27 +01:00
2020-04-09 17:20:39 +02:00
linkaxes([ax1,ax2],< span class = "org-string" > 'x'< / span > );
2019-03-26 14:47:27 +01:00
< / pre >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "org0d0e6eb" class = "figure" >
2019-06-04 10:21:33 +02:00
< p > < img src = "figs/perfcomp.png" alt = "perfcomp.png" / >
< / p >
2020-04-09 17:20:39 +02:00
< p > < span class = "figure-number" > Figure 26: < / span > Close loop performance for \(\omega = 0\) and \(\omega = 60 rpm\)< / p >
2019-03-26 14:47:27 +01:00
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgf0df90a" class = "outline-4" >
< h4 id = "orgf0df90a" > < span class = "section-number-4" > 5.5.7< / span > Campbell Diagram for the close loop system< / h4 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-4" id = "text-5-5-7" >
< div class = "org-src-container" >
< pre class = "src src-matlab" > m = mlight;
k = kvc;
c = 0.1< span class = "org-type" > *< / span > sqrt(k< span class = "org-type" > *< / span > m);
wsvc = linspace(0, 10, 100); < span class = "org-comment" > % [rad/s]< / span >
polesvc = zeros(8, length(wsvc));
< span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(wsvc)< / span >
Gs = (m< span class = "org-type" > *< / span > s< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > (k< span class = "org-type" > -< / span > m< span class = "org-type" > *< / span > w< span class = "org-type" > ^< / span > 2))< span class = "org-type" > /< / span > ((m< span class = "org-type" > *< / span > s< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > (k < span class = "org-type" > -< / span > m< span class = "org-type" > *< / span > w< span class = "org-type" > ^< / span > 2))< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > (2< span class = "org-type" > *< / span > m< span class = "org-type" > *< / span > w< span class = "org-type" > *< / span > s)< span class = "org-type" > ^< / span > 2);
Gcs = (2< span class = "org-type" > *< / span > m< span class = "org-type" > *< / span > w< span class = "org-type" > *< / span > s)< span class = "org-type" > /< / span > ((m< span class = "org-type" > *< / span > s< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > (k < span class = "org-type" > -< / span > m< span class = "org-type" > *< / span > w< span class = "org-type" > ^< / span > 2))< span class = "org-type" > ^< / span > 2 < span class = "org-type" > +< / span > (2< span class = "org-type" > *< / span > m< span class = "org-type" > *< / span > w< span class = "org-type" > *< / span > s)< span class = "org-type" > ^< / span > 2);
G = [Gs, Gcs; Gcs, Gs];
G.InputName = {< span class = "org-string" > 'Fu'< / span > , < span class = "org-string" > 'Fv'< / span > };
G.OutputName = {< span class = "org-string" > 'Du'< / span > , < span class = "org-string" > 'Dv'< / span > };
polei = pole(feedback(G, K, < span class = "org-string" > 'name'< / span > ));
polesvc(< span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = sort(polei(imag(polei) < span class = "org-type" > > < / span > 0));
polei = pole(feedback(G, 10< span class = "org-type" > *< / span > K, < span class = "org-string" > 'name'< / span > ));
polesvcb(< span class = "org-type" > :< / span > , < span class = "org-constant" > i< / span > ) = sort(polei(imag(polei) < span class = "org-type" > > < / span > 0));
< span class = "org-keyword" > end< / span >
< / pre >
< / div >
< / div >
< / div >
2020-11-03 09:42:04 +01:00
< div id = "outline-container-orgc6a5ee2" class = "outline-4" >
< h4 id = "orgc6a5ee2" > < span class = "section-number-4" > 5.5.8< / span > Conclusion< / h4 >
2020-04-09 17:20:39 +02:00
< div class = "outline-text-4" id = "text-5-5-8" >
2020-11-03 09:42:04 +01:00
< div class = "important" id = "orgb8d898e" >
2019-03-26 14:47:27 +01:00
< p >
2020-11-03 09:42:04 +01:00
Even though considering one input and output at a time would results in an unstable system (figure < a href = "#org4ae64f0" > 24< / a > ), when using the diagonal MIMO controller, the system stays stable (figure < a href = "#org4b2a3af" > 25< / a > ). This could be understood by saying that when controlling both directions at the same time, the coupling effect should be much lower than when controlling only one direction.
2019-03-26 14:47:27 +01:00
< / p >
< p >
2020-11-03 09:42:04 +01:00
The close-loop performance does not vary a lot with the rotating speed (figure < a href = "#org0d0e6eb" > 26< / a > ) even tough the open loop system is varying quite a lot (figure < a href = "#orgd80bd0e" > 20< / a > ).
2019-03-26 14:47:27 +01:00
< / p >
< / div >
< / div >
< / div >
< / div >
< / div >
2019-01-18 17:20:06 +01:00
< / div >
< div id = "postamble" class = "status" >
2019-06-04 10:21:33 +02:00
< p class = "author" > Author: Dehaeze Thomas< / p >
2020-11-03 09:42:04 +01:00
< p class = "date" > Created: 2020-11-03 mar. 09:41< / p >
2019-01-18 17:20:06 +01:00
< / div >
< / body >
< / html >