Update figure export settings
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 296 KiB After Width: | Height: | Size: 346 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 104 KiB |
Before Width: | Height: | Size: 319 KiB After Width: | Height: | Size: 328 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 272 KiB After Width: | Height: | Size: 278 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 311 KiB After Width: | Height: | Size: 317 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 213 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 131 KiB |
Before Width: | Height: | Size: 395 KiB After Width: | Height: | Size: 422 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 133 KiB |
Before Width: | Height: | Size: 388 KiB After Width: | Height: | Size: 411 KiB |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 323 KiB After Width: | Height: | Size: 386 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 211 KiB After Width: | Height: | Size: 212 KiB |
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 169 KiB |
Before Width: | Height: | Size: 310 KiB After Width: | Height: | Size: 322 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 267 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 235 KiB After Width: | Height: | Size: 236 KiB |
@ -21,22 +21,23 @@
|
|||||||
#+PROPERTY: header-args:matlab+ :exports both
|
#+PROPERTY: header-args:matlab+ :exports both
|
||||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||||
#+PROPERTY: header-args:matlab+ :output-dir Figures
|
#+PROPERTY: header-args:matlab+ :output-dir Figures
|
||||||
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
|
|
||||||
* Introduction
|
* Introduction
|
||||||
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.
|
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.
|
||||||
|
|
||||||
In section [[sec:system]], a simple system composed of a spindle and a translation stage is defined and the equations of motion are written.
|
In section ref:sec:system, a simple system composed of a spindle and a translation stage is defined and the equations of motion are written.
|
||||||
The rotation induces some coupling between the actuators and their displacement, and modifies the dynamics of the system.
|
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.
|
This is studied using the equations, and some numerical computations are used to compare the use of voice coil and piezoelectric actuators.
|
||||||
|
|
||||||
Then, in section [[sec:control_strategies]], two different control approach are compared where:
|
Then, in section ref:sec:control_strategies, two different control approach are compared where:
|
||||||
- the measurement is made in the fixed frame
|
- the measurement is made in the fixed frame
|
||||||
- the measurement is made in the rotating frame
|
- the measurement is made in the rotating frame
|
||||||
|
|
||||||
In section [[sec:simscape]], the analytical study will be validated using a multi body model of the studied system.
|
In section ref:sec:simscape, the analytical study will be validated using a multi body model of the studied system.
|
||||||
|
|
||||||
Finally, in section [[sec:control]], the control strategies are implemented using Simulink and Simscape and compared.
|
Finally, in section ref:sec:control, the control strategies are implemented using Simulink and Simscape and compared.
|
||||||
|
|
||||||
* System Description and Analysis
|
* System Description and Analysis
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@ -44,7 +45,7 @@ Finally, in section [[sec:control]], the control strategies are implemented usin
|
|||||||
:END:
|
:END:
|
||||||
<<sec:system>>
|
<<sec:system>>
|
||||||
** System description
|
** System description
|
||||||
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure [[fig:rotating_frame_2dof]]).
|
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure ref:fig:rotating_frame_2dof).
|
||||||
|
|
||||||
The control inputs are the forces applied by the actuators of the translation stage ($F_u$ and $F_v$).
|
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$.
|
As the translation stage is rotating around the Z axis due to the spindle, the forces are applied along $u$ and $v$.
|
||||||
@ -71,7 +72,7 @@ Indices $u$ and $v$ corresponds to signals in the rotating reference frame ($\ve
|
|||||||
|
|
||||||
** Equations
|
** Equations
|
||||||
<<sec:equations>>
|
<<sec:equations>>
|
||||||
Based on the figure [[fig:rotating_frame_2dof]], we can write the equations of motion of the system.
|
Based on the figure ref:fig:rotating_frame_2dof, we can write the equations of motion of the system.
|
||||||
|
|
||||||
Let's express the kinetic energy $T$ and the potential energy $V$ of the mass $m$:
|
Let's express the kinetic energy $T$ and the potential energy $V$ of the mass $m$:
|
||||||
#+name: eq:energy_inertial_frame
|
#+name: eq:energy_inertial_frame
|
||||||
@ -226,7 +227,7 @@ First we will determine the value for Euler and Coriolis forces during regular e
|
|||||||
Fcheavy = 2*mheavy*ddot*wheavy;
|
Fcheavy = 2*mheavy*ddot*wheavy;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The obtained values are displayed in table [[tab:euler_coriolis]].
|
The obtained values are displayed in table ref:tab:euler_coriolis.
|
||||||
|
|
||||||
#+begin_src matlab :results value table :exports results :post addhdr(*this*)
|
#+begin_src matlab :results value table :exports results :post addhdr(*this*)
|
||||||
data = [Fclight, Fcheavy ;
|
data = [Fclight, Fcheavy ;
|
||||||
@ -250,7 +251,7 @@ The negative stiffness due to the rotation is equal to $-m{\omega_0}^2$.
|
|||||||
Kheavy = mheavy*wheavy^2;
|
Kheavy = mheavy*wheavy^2;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The values for the negative spring effect are displayed in table [[tab:negative_spring]].
|
The values for the negative spring effect are displayed in table ref:tab:negative_spring.
|
||||||
|
|
||||||
This is definitely negligible when using piezoelectric actuators. It may not be the case when using voice coil actuators.
|
This is definitely negligible when using piezoelectric actuators. It may not be the case when using voice coil actuators.
|
||||||
|
|
||||||
@ -267,10 +268,10 @@ This is definitely negligible when using piezoelectric actuators. It may not be
|
|||||||
| Neg. Spring | 1381.7[N/m] | 0.9[N/m] |
|
| Neg. Spring | 1381.7[N/m] | 0.9[N/m] |
|
||||||
|
|
||||||
** Limitations due to coupling
|
** Limitations due to coupling
|
||||||
To simplify, we consider a constant rotating speed $\dot{\theta} = {\omega_0}$ and thus $\ddot{\theta} = 0$.
|
To simplify, we consider a constant rotating speed $\dot{\theta} = \omega_0$ and thus $\ddot{\theta} = 0$.
|
||||||
|
|
||||||
From equations [[eq:du_coupled]] and [[eq:dv_coupled]], we obtain:
|
From equations eqref:eq:du_coupled and eqref:eq:dv_coupled, we obtain:
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
(m s^2 + (k - m{\omega_0}^2)) d_u &= F_u + 2 m {\omega_0} s d_v \\
|
(m s^2 + (k - m{\omega_0}^2)) d_u &= F_u + 2 m {\omega_0} s d_v \\
|
||||||
(m s^2 + (k - m{\omega_0}^2)) d_v &= F_v - 2 m {\omega_0} s d_u \\
|
(m s^2 + (k - m{\omega_0}^2)) d_v &= F_v - 2 m {\omega_0} s d_u \\
|
||||||
\end{align*}
|
\end{align*}
|
||||||
@ -311,8 +312,8 @@ Then, coupling is negligible if $|-m \omega^2 + (k - m{\omega_0}^2)| \gg |2 m {\
|
|||||||
|
|
||||||
*** Numerical Analysis
|
*** Numerical Analysis
|
||||||
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:
|
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:
|
||||||
- with the light sample (figure [[fig:coupling_light]]).
|
- with the light sample (figure ref:fig:coupling_light).
|
||||||
- with the heavy sample (figure [[fig:coupling_heavy]]).
|
- with the heavy sample (figure ref:fig:coupling_heavy).
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent
|
#+begin_src matlab :exports none :results silent
|
||||||
f = logspace(-1, 3, 1000);
|
f = logspace(-1, 3, 1000);
|
||||||
@ -330,9 +331,8 @@ We plot on the same graph $\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \ome
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:coupling_light
|
#+NAME: fig:coupling_light
|
||||||
#+HEADER: :var filepath="Figures/coupling_light.pdf" :var figsize="normal-normal"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/coupling_light.pdf" :var figsize="normal-normal" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file coupling_light.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -354,9 +354,8 @@ We plot on the same graph $\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \ome
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:coupling_heavy
|
#+NAME: fig:coupling_heavy
|
||||||
#+HEADER: :var filepath="Figures/coupling_heavy.pdf" :var figsize="normal-normal"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/coupling_heavy.pdf" :var figsize="normal-normal" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file coupling_heavy.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -372,7 +371,7 @@ Coupling is higher for actuators with small stiffness.
|
|||||||
** Limitations due to negative stiffness effect
|
** Limitations due to negative stiffness effect
|
||||||
If $\max{\dot{\theta}} \ll \sqrt{\frac{k}{m}}$, then the negative spring effect is negligible and $k - m\dot{\theta}^2 \approx k$.
|
If $\max{\dot{\theta}} \ll \sqrt{\frac{k}{m}}$, then the negative spring effect is negligible and $k - m\dot{\theta}^2 \approx k$.
|
||||||
|
|
||||||
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 [[tab:negative_stiffness]].
|
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 ref:tab:negative_stiffness.
|
||||||
#+begin_src matlab :results table :exports results :post addhdr(*this*)
|
#+begin_src matlab :results table :exports results :post addhdr(*this*)
|
||||||
data = 0.1*60*(1/2/pi)*[sqrt(kvc/mlight), sqrt(kpz/mlight);
|
data = 0.1*60*(1/2/pi)*[sqrt(kvc/mlight), sqrt(kpz/mlight);
|
||||||
sqrt(kvc/mheavy), sqrt(kpz/mheavy)];
|
sqrt(kvc/mheavy), sqrt(kpz/mheavy)];
|
||||||
@ -396,7 +395,7 @@ The system dynamics will be much more affected when using soft actuator.
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
From this analysis, we can determine the lowest practical stiffness that is possible to use: $k_\text{min} = 10 m \omega^2$ (table [[tab:min_k]])
|
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)
|
||||||
|
|
||||||
#+begin_src matlab :results table :exports results :post addhdr(*this*)
|
#+begin_src matlab :results table :exports results :post addhdr(*this*)
|
||||||
data = 10*[mlight*2*pi, mheavy*2*pi/60]
|
data = 10*[mlight*2*pi, mheavy*2*pi/60]
|
||||||
@ -411,7 +410,7 @@ From this analysis, we can determine the lowest practical stiffness that is poss
|
|||||||
| k min [N/m] | 2199 | 89 |
|
| k min [N/m] | 2199 | 89 |
|
||||||
|
|
||||||
** Effect of rotation speed on the plant
|
** Effect of rotation speed on the plant
|
||||||
As shown in equation [[eq:coupledplant]], the plant changes with the rotation speed $\omega_0$.
|
As shown in equation eqref:eq:coupledplant, the plant changes with the rotation speed $\omega_0$.
|
||||||
|
|
||||||
Then, we compute the bode plot of the direct term and coupling term for multiple rotating speed.
|
Then, we compute the bode plot of the direct term and coupling term for multiple rotating speed.
|
||||||
|
|
||||||
@ -465,9 +464,8 @@ Then we compare the result between voice coil and piezoelectric actuators.
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:G_ws_vc
|
#+NAME: fig:G_ws_vc
|
||||||
#+HEADER: :var filepath="Figures/G_ws_vc.pdf" :var figsize="wide-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/G_ws_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file G_ws_vc.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -508,9 +506,8 @@ Then we compare the result between voice coil and piezoelectric actuators.
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:Gc_ws_vc
|
#+NAME: fig:Gc_ws_vc
|
||||||
#+HEADER: :var filepath="Figures/Gc_ws_vc.pdf" :var figsize="wide-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/Gc_ws_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file Gc_ws_vc.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -567,9 +564,8 @@ Then we compare the result between voice coil and piezoelectric actuators.
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:G_ws_pz
|
#+NAME: fig:G_ws_pz
|
||||||
#+HEADER: :var filepath="Figures/G_ws_pz.pdf" :var figsize="wide-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/G_ws_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file G_ws_pz.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -607,9 +603,8 @@ Then we compare the result between voice coil and piezoelectric actuators.
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:Gc_ws_pz
|
#+NAME: fig:Gc_ws_pz
|
||||||
#+HEADER: :var filepath="Figures/Gc_ws_pz.pdf" :var figsize="wide-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/Gc_ws_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file Gc_ws_pz.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -664,11 +659,11 @@ The poles of the system are computed for multiple values of the rotation frequen
|
|||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We then plot the real and imaginary part of the poles as a function of the rotation frequency (figures [[fig:poles_w_vc]] and [[fig:poles_w_pz]]).
|
We then plot the real and imaginary part of the poles as a function of the rotation frequency (figures ref:fig:poles_w_vc and ref:fig:poles_w_pz).
|
||||||
|
|
||||||
When the real part of one pole becomes positive, the system goes unstable.
|
When the real part of one pole becomes positive, the system goes unstable.
|
||||||
|
|
||||||
For the voice coil (figure [[fig:poles_w_vc]]), 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 [[fig:poles_w_pz]]).
|
For the voice coil (figure ref:fig:poles_w_vc), 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 ref:fig:poles_w_pz).
|
||||||
|
|
||||||
#+begin_src matlab :results silent :exports none
|
#+begin_src matlab :results silent :exports none
|
||||||
figure;
|
figure;
|
||||||
@ -697,9 +692,8 @@ For the voice coil (figure [[fig:poles_w_vc]]), the system is unstable when the
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:poles_w_vc
|
#+NAME: fig:poles_w_vc
|
||||||
#+HEADER: :var filepath="Figures/poles_w_vc.pdf" :var figsize="wide-tall"
|
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
||||||
#+begin_src matlab :output-dir Figures :file poles_w_vc.pdf :post pdf2svg(file=*this*, ext="png")
|
#+begin_src matlab :var filepath="Figures/poles_w_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -736,9 +730,8 @@ For the voice coil (figure [[fig:poles_w_vc]]), the system is unstable when the
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:poles_w_pz
|
#+NAME: fig:poles_w_pz
|
||||||
#+HEADER: :var filepath="Figures/poles_w_pz.pdf" :var figsize="wide-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/poles_w_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file poles_w_pz.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -760,7 +753,7 @@ The position error $[\epsilon_x, \epsilon_y]$ is then express in the rotating fr
|
|||||||
|
|
||||||
Finally, the control low $K$ links the position errors $[\epsilon_u, \epsilon_v]$ to the actuator forces $[F_u, F_v]$.
|
Finally, the control low $K$ links the position errors $[\epsilon_u, \epsilon_v]$ to the actuator forces $[F_u, F_v]$.
|
||||||
|
|
||||||
The block diagram is shown on figure [[fig:control_measure_fixed_2dof]].
|
The block diagram is shown on figure ref:fig:control_measure_fixed_2dof.
|
||||||
|
|
||||||
#+name: fig:control_measure_fixed_2dof
|
#+name: fig:control_measure_fixed_2dof
|
||||||
#+caption: Control with a measure from fixed frame
|
#+caption: Control with a measure from fixed frame
|
||||||
@ -773,7 +766,7 @@ One question we wish to answer is: is $G(\theta) J(\theta) = G(\theta_0) J(\thet
|
|||||||
** Measurement in the rotating frame
|
** Measurement in the rotating frame
|
||||||
Let's consider that the measurement is made in the rotating reference frame.
|
Let's consider that the measurement is made in the rotating reference frame.
|
||||||
|
|
||||||
The corresponding block diagram is shown figure [[fig:control_measure_rotating_2dof]]
|
The corresponding block diagram is shown figure ref:fig:control_measure_rotating_2dof
|
||||||
|
|
||||||
#+name: fig:control_measure_rotating_2dof
|
#+name: fig:control_measure_rotating_2dof
|
||||||
#+caption: Control with a measure from rotating frame
|
#+caption: Control with a measure from rotating frame
|
||||||
@ -790,7 +783,19 @@ The loop gain is $L = G K$.
|
|||||||
** Initialization
|
** Initialization
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
|
|
||||||
load('./mat/parameters.mat');
|
load('./mat/parameters.mat');
|
||||||
|
|
||||||
|
bode_opts = bodeoptions;
|
||||||
|
bode_opts.FreqUnits = 'Hz';
|
||||||
|
bode_opts.MagUnits = 'abs';
|
||||||
|
bode_opts.MagScale = 'log';
|
||||||
|
bode_opts.Grid = 'on';
|
||||||
|
bode_opts.PhaseVisible = 'off';
|
||||||
|
bode_opts.Title.FontSize = 10;
|
||||||
|
bode_opts.XLabel.FontSize = 10;
|
||||||
|
bode_opts.YLabel.FontSize = 10;
|
||||||
|
bode_opts.TickLabel.FontSize = 10;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent
|
#+begin_src matlab :exports none :results silent
|
||||||
@ -882,9 +887,9 @@ Then we identify the system with an heavy mass and low speed.
|
|||||||
** Coupling ratio between $f_{uv}$ and $d_{uv}$
|
** Coupling ratio between $f_{uv}$ and $d_{uv}$
|
||||||
In order to validate the equations written, we can compute the coupling ratio using the simscape model and compare with the equations.
|
In order to validate the equations written, we can compute the coupling ratio using the simscape model and compare with the equations.
|
||||||
|
|
||||||
From the previous identification, we plot the coupling ratio in both case (figure [[fig:coupling_ratio_light_heavy]]).
|
From the previous identification, we plot the coupling ratio in both case (figure ref:fig:coupling_ratio_light_heavy).
|
||||||
|
|
||||||
We obtain the same result than the analytical case (figures [[fig:coupling_light]] and [[fig:coupling_heavy]]).
|
We obtain the same result than the analytical case (figures ref:fig:coupling_light and ref:fig:coupling_heavy).
|
||||||
#+begin_src matlab :results silent :exports none
|
#+begin_src matlab :results silent :exports none
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
@ -897,18 +902,17 @@ We obtain the same result than the analytical case (figures [[fig:coupling_light
|
|||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Frequency [Hz]'); ylabel('Coupling ratio');
|
xlabel('Frequency [Hz]'); ylabel('Coupling ratio');
|
||||||
legend({'light - VC', 'light - PZ', 'heavy - VC', 'heavy - PZ'})
|
legend({'light - VC', 'light - PZ', 'heavy - VC', 'heavy - PZ'}, 'Location', 'northeast')
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:coupling_ratio_light_heavy
|
#+NAME: fig:coupling_ratio_light_heavy
|
||||||
#+HEADER: :var filepath="Figures/coupling_ratio_light_heavy.pdf" :var figsize="wide-tall"
|
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
||||||
#+begin_src matlab :output-dir Figures :file coupling_ratio_light_heavy.pdf :post pdf2svg(file=*this*, ext="png")
|
#+begin_src matlab :var filepath="Figures/coupling_ratio_light_heavy.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+LABEL: fig:coupling_ratio_light_heavy
|
#+LABEL: fig:coupling_ratio_light_heavy
|
||||||
#+CAPTION: caption
|
#+CAPTION: Coupling ratio obtained with the Simscape model
|
||||||
#+RESULTS: fig:coupling_ratio_light_heavy
|
#+RESULTS: fig:coupling_ratio_light_heavy
|
||||||
[[file:Figures/coupling_ratio_light_heavy.png]]
|
[[file:Figures/coupling_ratio_light_heavy.png]]
|
||||||
|
|
||||||
@ -936,7 +940,7 @@ First, we identify the system when the rotation speed is null and then when the
|
|||||||
|
|
||||||
The actuators are voice coil with some damping added.
|
The actuators are voice coil with some damping added.
|
||||||
|
|
||||||
The bode plot of the system not rotating and rotating at 60rpm is shown figure [[fig:Gvc_speed]].
|
The bode plot of the system not rotating and rotating at 60rpm is shown figure ref:fig:Gvc_speed.
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent
|
#+begin_src matlab :exports none :results silent
|
||||||
w = 0; % Rotation speed [rad/s]
|
w = 0; % Rotation speed [rad/s]
|
||||||
@ -962,208 +966,25 @@ The bode plot of the system not rotating and rotating at 60rpm is shown figure [
|
|||||||
|
|
||||||
#+begin_src matlab :exports none :results silent
|
#+begin_src matlab :exports none :results silent
|
||||||
figure;
|
figure;
|
||||||
bode(Gvc, Gtvc)
|
bode(Gvc, Gtvc, bode_opts)
|
||||||
legend({'Gvc - $\omega = 0$', 'Gvc - $\omega = 60$rpm'}, 'Location', 'southwest');
|
legend({'Gvc - $\omega = 0$', 'Gvc - $\omega = 60$rpm'}, 'Location', 'southwest');
|
||||||
|
title('');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:Gvc_speed
|
#+NAME: fig:Gvc_speed
|
||||||
#+HEADER: :var filepath="Figures/Gvc_speed.pdf" :var figsize="full-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/Gvc_speed.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file Gvc_speed.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+LABEL: fig:Gvc_speed
|
#+LABEL: fig:Gvc_speed
|
||||||
#+CAPTION: Bode plot of the system not rotating and rotating at 60rmp - Voice coil and light sample
|
#+CAPTION: Change of transfer functions due to rotating speed
|
||||||
#+RESULTS: fig:Gvc_speed
|
#+RESULTS: fig:Gvc_speed
|
||||||
[[file:Figures/Gvc_speed.png]]
|
[[file:Figures/Gvc_speed.png]]
|
||||||
|
|
||||||
*** Controller design
|
|
||||||
We design a controller based on the identification when the system is not rotating.
|
|
||||||
|
|
||||||
#+begin_src matlab :results none :exports code
|
|
||||||
sisotool(Gvc('Du', 'fu'))
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
The controller is a lead-lag controller with the following transfer function.
|
|
||||||
#+begin_src matlab :results none :exports code
|
|
||||||
Kll = 2.0698e09*(s+40.45)*(s+1.181)/(s*(s+198.4)*(s+2790));
|
|
||||||
K = [Kll 0;
|
|
||||||
0 Kll];
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
The loop gain is displayed figure [[fig:Gvc_loop_gain]].
|
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent
|
|
||||||
freqs = logspace(-2, 2, 1000);
|
|
||||||
|
|
||||||
figure;
|
|
||||||
% Amplitude
|
|
||||||
ax1 = subaxis(2,1,1);
|
|
||||||
hold on;
|
|
||||||
plot(freqs, abs(squeeze(freqresp(Gvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
|
|
||||||
set(gca,'xscale','log'); set(gca,'yscale','log');
|
|
||||||
ylabel('Amplitude [m/N]');
|
|
||||||
set(gca, 'XTickLabel',[]);
|
|
||||||
hold off;
|
|
||||||
% Phase
|
|
||||||
ax2 = subaxis(2,1,2);
|
|
||||||
hold on;
|
|
||||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gvc('Du', 'fu')*Kll, freqs, 'Hz')))), '-');
|
|
||||||
set(gca,'xscale','log');
|
|
||||||
yticks(-180:180:180);
|
|
||||||
ylim([-180 180]);
|
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
|
||||||
hold off;
|
|
||||||
linkaxes([ax1,ax2],'x');
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+NAME: fig:Gvc_loop_gain
|
|
||||||
#+HEADER: :var filepath="Figures/Gvc_loop_gain.pdf" :var figsize="full-tall"
|
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
|
||||||
#+begin_src matlab :output-dir Figures :file Gvc_loop_gain.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+LABEL: fig:Gvc_loop_gain
|
|
||||||
#+CAPTION: Loop gain obtained for a lead-lag controller on the system with a voice coil
|
|
||||||
#+RESULTS: fig:Gvc_loop_gain
|
|
||||||
[[file:Figures/Gvc_loop_gain.png]]
|
|
||||||
|
|
||||||
*** Controlling the rotating system
|
|
||||||
We here want to see if the system is robust with respect to the rotation speed. We then use the controller based on the non-rotating system, and see if the system is stable and its dynamics.
|
|
||||||
|
|
||||||
We can then plot the same loop gain with the rotating system using the same controller (figure [[fig:Gtvc_loop_gain]]). The result obtained is unstable.
|
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent
|
|
||||||
freqs = logspace(-2, 2, 1000);
|
|
||||||
|
|
||||||
figure;
|
|
||||||
% Amplitude
|
|
||||||
ax1 = subaxis(2,1,1);
|
|
||||||
hold on;
|
|
||||||
plot(freqs, abs(squeeze(freqresp(Gtvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
|
|
||||||
set(gca,'xscale','log'); set(gca,'yscale','log');
|
|
||||||
ylabel('Amplitude [m/N]');
|
|
||||||
set(gca, 'XTickLabel',[]);
|
|
||||||
hold off;
|
|
||||||
% Phase
|
|
||||||
ax2 = subaxis(2,1,2);
|
|
||||||
hold on;
|
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(Gtvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
|
|
||||||
set(gca,'xscale','log');
|
|
||||||
yticks(-180:180:180);
|
|
||||||
ylim([-180 180]);
|
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
|
||||||
hold off;
|
|
||||||
linkaxes([ax1,ax2],'x');
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+NAME: fig:Gtvc_loop_gain
|
|
||||||
#+HEADER: :var filepath="Figures/Gtvc_loop_gain.pdf" :var figsize="full-tall"
|
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
|
||||||
#+begin_src matlab :output-dir Figures :file Gtvc_loop_gain.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+LABEL: fig:Gtvc_loop_gain
|
|
||||||
#+CAPTION: Loop gain with the rotating system
|
|
||||||
#+RESULTS: fig:Gtvc_loop_gain
|
|
||||||
[[file:Figures/Gtvc_loop_gain.png]]
|
|
||||||
|
|
||||||
We can look at the poles of the system where we control only one direction ($u$ for instance). We obtain a pole with a positive real part.
|
|
||||||
#+begin_src matlab :results table :exports both
|
|
||||||
pole(feedback(Gtvc, blkdiag(Kll, 0)))
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+RESULTS:
|
|
||||||
| -2798 |
|
|
||||||
| -58.906+94.246i |
|
|
||||||
| -58.906-94.246i |
|
|
||||||
| -71.654 |
|
|
||||||
| 3.1648 |
|
|
||||||
| -3.3031 |
|
|
||||||
| -1.1902 |
|
|
||||||
|
|
||||||
However, when we look at the poles of the closed loop with a diagonal controller, all the poles have negative real part and the system is stable.
|
|
||||||
#+begin_src matlab :results table :exports both
|
|
||||||
pole(feedback(Gtvc, blkdiag(Kll, Kll)))
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+RESULTS:
|
|
||||||
| -2798+0.035765i |
|
|
||||||
| -2798-0.035765i |
|
|
||||||
| -56.406+105.34i |
|
|
||||||
| -56.406-105.34i |
|
|
||||||
| -64.482+79.308i |
|
|
||||||
| -64.482-79.308i |
|
|
||||||
| -68.521+13.503i |
|
|
||||||
| -68.521-13.503i |
|
|
||||||
| -1.1837+0.0041777i |
|
|
||||||
| -1.1837-0.0041777i |
|
|
||||||
|
|
||||||
*** Close loop performance
|
|
||||||
First, we create the closed loop systems. Then, we plot the transfer function from the reference signals $[\epsilon_u, \epsilon_v]$ to the output $[d_u, d_v]$ (figure [[fig:perfcomp]]).
|
|
||||||
#+begin_src matlab :results none :exports code
|
|
||||||
K.InputName = 'e';
|
|
||||||
K.OutputName = 'u';
|
|
||||||
|
|
||||||
Gtvc.InputName = 'u';
|
|
||||||
Gtvc.OutputName = 'y';
|
|
||||||
|
|
||||||
Gvc.InputName = 'u';
|
|
||||||
Gvc.OutputName = 'y';
|
|
||||||
|
|
||||||
Sum = sumblk('e = r-y', 2);
|
|
||||||
|
|
||||||
Tvc = connect(Gvc, K, Sum, 'r', 'y');
|
|
||||||
Ttvc = connect(Gtvc, K, Sum, 'r', 'y');
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+begin_src matlab :results none :exports code
|
|
||||||
freqs = logspace(-2, 2, 1000);
|
|
||||||
|
|
||||||
figure;
|
|
||||||
ax1 = subplot(1,2,1);
|
|
||||||
hold on;
|
|
||||||
plot(freqs, abs(squeeze(freqresp(Tvc(1, 1), freqs, 'Hz'))));
|
|
||||||
plot(freqs, abs(squeeze(freqresp(Ttvc(1, 1), freqs, 'Hz'))));
|
|
||||||
hold off;
|
|
||||||
xlim([freqs(1), freqs(end)]);
|
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
||||||
xlabel('Frequency [Hz]'); ylabel('Magnitude [m/N]');
|
|
||||||
legend({'w = 0 [rpm]', 'w = 60 [rpm]'}, 'Location', 'southwest')
|
|
||||||
title('$G_{r_u \to d_u}$')
|
|
||||||
|
|
||||||
ax2 = subplot(1,2,2);
|
|
||||||
hold on;
|
|
||||||
plot(freqs, abs(squeeze(freqresp(Tvc(1, 2), freqs, 'Hz'))));
|
|
||||||
plot(freqs, abs(squeeze(freqresp(Ttvc(1, 2), freqs, 'Hz'))));
|
|
||||||
hold off;
|
|
||||||
xlim([freqs(1), freqs(end)]);
|
|
||||||
ylim([1e-5, 1]);
|
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
|
||||||
xlabel('Frequency [Hz]');
|
|
||||||
title('$G_{r_u \to d_v}$')
|
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+NAME: fig:perfconp
|
|
||||||
#+HEADER: :var filepath="Figures/perfconp.pdf" :var figsize="full-tall"
|
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
|
||||||
#+begin_src matlab :output-dir Figures :file perfconp.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+LABEL: fig:perfconp
|
|
||||||
#+CAPTION: Close loop performance for $\omega = 0$ and $\omega = 60 rpm$
|
|
||||||
#+RESULTS: fig:perfconp
|
|
||||||
[[file:Figures/perfconp.png]]
|
|
||||||
|
|
||||||
*** Effect of rotation speed
|
*** Effect of rotation speed
|
||||||
We first identify the system (voice coil and light mass) for multiple rotation speed.
|
We first identify the system (voice coil and light mass) for multiple rotation speed.
|
||||||
Then we compute the bode plot of the diagonal element (figure [[fig:Guu_ws]]) and of the coupling element (figure [[fig:Guv_ws]]).
|
Then we compute the bode plot of the diagonal element (figure ref:fig:Guu_ws) and of the coupling element (figure ref:fig:Guv_ws).
|
||||||
|
|
||||||
As the rotation frequency increases:
|
As the rotation frequency increases:
|
||||||
- one pole goes to lower frequencies while the other goes to higher frequencies
|
- one pole goes to lower frequencies while the other goes to higher frequencies
|
||||||
@ -1218,9 +1039,8 @@ To stabilize the unstable pole, we need a control bandwidth of at least twice of
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:Guu_ws
|
#+NAME: fig:Guu_ws
|
||||||
#+HEADER: :var filepath="Figures/Guu_ws.pdf" :var figsize="full-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/Guu_ws.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file Guu_ws.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1261,9 +1081,8 @@ To stabilize the unstable pole, we need a control bandwidth of at least twice of
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:Guv_ws
|
#+NAME: fig:Guv_ws
|
||||||
#+HEADER: :var filepath="Figures/Guv_ws.pdf" :var figsize="full-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/Guv_ws.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file Guv_ws.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1272,7 +1091,7 @@ To stabilize the unstable pole, we need a control bandwidth of at least twice of
|
|||||||
#+RESULTS: fig:Guv_ws
|
#+RESULTS: fig:Guv_ws
|
||||||
[[file:Figures/Guv_ws.png]]
|
[[file:Figures/Guv_ws.png]]
|
||||||
|
|
||||||
Then, we can look at the same plots for the piezoelectric actuator (figure [[fig:Guu_ws_pz]]). The effect of the rotation frequency has very little effect on the dynamics of the system to control.
|
Then, we can look at the same plots for the piezoelectric actuator (figure ref:fig:Guu_ws_pz). The effect of the rotation frequency has very little effect on the dynamics of the system to control.
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent
|
#+begin_src matlab :exports none :results silent
|
||||||
ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s]
|
ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s]
|
||||||
@ -1320,9 +1139,8 @@ Then, we can look at the same plots for the piezoelectric actuator (figure [[fig
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:Guu_ws_pz
|
#+NAME: fig:Guu_ws_pz
|
||||||
#+HEADER: :var filepath="Figures/Guu_ws_pz.pdf" :var figsize="full-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/Guu_ws_pz.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file Guu_ws_pz.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1331,6 +1149,202 @@ Then, we can look at the same plots for the piezoelectric actuator (figure [[fig
|
|||||||
#+RESULTS: fig:Guu_ws_pz
|
#+RESULTS: fig:Guu_ws_pz
|
||||||
[[file:Figures/Guu_ws_pz.png]]
|
[[file:Figures/Guu_ws_pz.png]]
|
||||||
|
|
||||||
|
*** Controller design
|
||||||
|
We design a controller based on the identification when the system is not rotating.
|
||||||
|
|
||||||
|
The obtained controller is a lead-lag controller with the following transfer function.
|
||||||
|
#+begin_src matlab :results none :exports code
|
||||||
|
Kll = 2.0698e09*(s+40.45)*(s+1.181)/((s+0.01)*(s+198.4)*(s+2790));
|
||||||
|
K = [Kll 0;
|
||||||
|
0 Kll];
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
The loop gain is displayed figure ref:fig:Gvc_loop_gain.
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none :results silent
|
||||||
|
freqs = logspace(-2, 2, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
% Amplitude
|
||||||
|
ax1 = subaxis(2,1,1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Gvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
|
||||||
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
set(gca, 'XTickLabel',[]);
|
||||||
|
hold off;
|
||||||
|
% Phase
|
||||||
|
ax2 = subaxis(2,1,2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gvc('Du', 'fu')*Kll, freqs, 'Hz')))), '-');
|
||||||
|
set(gca,'xscale','log');
|
||||||
|
yticks(-180:180:180);
|
||||||
|
ylim([-180 180]);
|
||||||
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
|
hold off;
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+NAME: fig:Gvc_loop_gain
|
||||||
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
|
#+begin_src matlab :var filepath="Figures/Gvc_loop_gain.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
|
<<plt-matlab>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+LABEL: fig:Gvc_loop_gain
|
||||||
|
#+CAPTION: Loop gain obtained for a lead-lag controller on the system with a voice coil
|
||||||
|
#+RESULTS: fig:Gvc_loop_gain
|
||||||
|
[[file:Figures/Gvc_loop_gain.png]]
|
||||||
|
|
||||||
|
*** Controlling the rotating system
|
||||||
|
We here want to see if the system is robust with respect to the rotation speed. We then use the controller based on the non-rotating system, and see if the system is stable and its dynamics.
|
||||||
|
|
||||||
|
We can then plot the same loop gain with the rotating system using the same controller (figure ref:fig:Gtvc_loop_gain). The result obtained is unstable.
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none :results silent
|
||||||
|
freqs = logspace(-2, 2, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
% Amplitude
|
||||||
|
ax1 = subaxis(2,1,1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Gtvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
|
||||||
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
set(gca, 'XTickLabel',[]);
|
||||||
|
hold off;
|
||||||
|
% Phase
|
||||||
|
ax2 = subaxis(2,1,2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(Gtvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
|
||||||
|
set(gca,'xscale','log');
|
||||||
|
yticks(-180:180:180);
|
||||||
|
ylim([-180 180]);
|
||||||
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
|
hold off;
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+NAME: fig:Gtvc_loop_gain
|
||||||
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
|
#+begin_src matlab :var filepath="Figures/Gtvc_loop_gain.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
|
<<plt-matlab>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+LABEL: fig:Gtvc_loop_gain
|
||||||
|
#+CAPTION: Loop gain with the rotating system
|
||||||
|
#+RESULTS: fig:Gtvc_loop_gain
|
||||||
|
[[file:Figures/Gtvc_loop_gain.png]]
|
||||||
|
|
||||||
|
We can look at the poles of the system where we control only one direction ($u$ for instance). We obtain a pole with a positive real part.
|
||||||
|
|
||||||
|
#+begin_important
|
||||||
|
The system is then unstable when controlling only one direction.
|
||||||
|
#+end_important
|
||||||
|
|
||||||
|
#+begin_src matlab :results table :exports both
|
||||||
|
pole(feedback(Gtvc, blkdiag(Kll, 0)))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
| -2798 |
|
||||||
|
| -58.916+94.248i |
|
||||||
|
| -58.916-94.248i |
|
||||||
|
| -71.644 |
|
||||||
|
| 3.1647 |
|
||||||
|
| -3.3034 |
|
||||||
|
| -1.1901 |
|
||||||
|
|
||||||
|
However, when we look at the poles of the closed loop with a diagonal controller, all the poles have negative real part and the system is stable.
|
||||||
|
#+begin_src matlab :results table :exports both
|
||||||
|
pole(feedback(Gtvc, blkdiag(Kll, Kll)))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
| -2798+0.035765i |
|
||||||
|
| -2798-0.035765i |
|
||||||
|
| -56.414+105.34i |
|
||||||
|
| -56.414-105.34i |
|
||||||
|
| -64.495+79.314i |
|
||||||
|
| -64.495-79.314i |
|
||||||
|
| -68.509+13.499i |
|
||||||
|
| -68.509-13.499i |
|
||||||
|
| -1.1837+0.0041422i |
|
||||||
|
| -1.1837-0.0041422i |
|
||||||
|
|
||||||
|
Check stability of MIMO system.
|
||||||
|
#+begin_src matlab :result silent
|
||||||
|
isstable(1/(1+K*Gtvc))
|
||||||
|
isstable(Gtvc/(1+K*Gtvc))
|
||||||
|
isstable(Gtvc/(1+K*Gtvc))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
: 0
|
||||||
|
|
||||||
|
*** Close loop performance
|
||||||
|
First, we create the closed loop systems. Then, we plot the transfer function from the reference signals $[\epsilon_u, \epsilon_v]$ to the output $[d_u, d_v]$ (figure ref:fig:perfcomp).
|
||||||
|
|
||||||
|
#+begin_src matlab :results none :exports code
|
||||||
|
S = eye(2)/(eye(2) + Gvc*K);
|
||||||
|
T = Gvc*K /(eye(2) + Gvc*K);
|
||||||
|
|
||||||
|
St = eye(2)/(eye(2) + Gtvc*K);
|
||||||
|
Tt = Gtvc*K/(eye(2) + Gtvc*K);
|
||||||
|
|
||||||
|
freqs = logspace(-3, 3, 1000);
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :results none :exports code
|
||||||
|
figure;
|
||||||
|
bode(S, St, 2*pi*freqs, bode_opts)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :results none :exports code
|
||||||
|
figure;
|
||||||
|
bode(T, Tt, 2*pi*freqs, bode_opts)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :results none :exports code
|
||||||
|
freqs = logspace(-2, 2, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
ax1 = subplot(1,2,1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Tvc(1, 1), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Ttvc(1, 1), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
xlim([freqs(1), freqs(end)]);
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
xlabel('Frequency [Hz]'); ylabel('Magnitude [m/N]');
|
||||||
|
legend({'w = 0 [rpm]', 'w = 60 [rpm]'}, 'Location', 'southwest')
|
||||||
|
title('$G_{r_u \to d_u}$')
|
||||||
|
|
||||||
|
ax2 = subplot(1,2,2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Tvc(1, 2), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Ttvc(1, 2), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
xlim([freqs(1), freqs(end)]);
|
||||||
|
ylim([1e-5, 1]);
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
xlabel('Frequency [Hz]');
|
||||||
|
title('$G_{r_u \to d_v}$')
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+NAME: fig:perfconp
|
||||||
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
|
#+begin_src matlab :var filepath="Figures/perfconp.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
|
<<plt-matlab>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+LABEL: fig:perfconp
|
||||||
|
#+CAPTION: Close loop performance for $\omega = 0$ and $\omega = 60 rpm$
|
||||||
|
#+RESULTS: fig:perfconp
|
||||||
|
[[file:Figures/perfconp.png]]
|
||||||
|
|
||||||
** Plant Control - MIMO approach
|
** Plant Control - MIMO approach
|
||||||
*** TODO Analysis - SVD
|
*** TODO Analysis - SVD
|
||||||
\[ G = U \Sigma V^H \]
|
\[ G = U \Sigma V^H \]
|
||||||
@ -1340,7 +1354,7 @@ With:
|
|||||||
- $U$ is an $2 \times 2$ unitary matrix. The columns vectors of $U$, denoted $u_i$, represent the *output directions* of the plant. They are orthonomal
|
- $U$ is an $2 \times 2$ unitary matrix. The columns vectors of $U$, denoted $u_i$, represent the *output directions* of the plant. They are orthonomal
|
||||||
- $V$ is an $2 \times 2$ unitary matrix. The columns vectors of $V$, denoted $v_i$, represent the *input directions* of the plant. They are orthonomal
|
- $V$ is an $2 \times 2$ unitary matrix. The columns vectors of $V$, denoted $v_i$, represent the *input directions* of the plant. They are orthonomal
|
||||||
|
|
||||||
We first look at the evolution of the singular values as a function of frequency (figure [[fig:G_sigma]]).
|
We first look at the evolution of the singular values as a function of frequency (figure ref:fig:G_sigma).
|
||||||
#+begin_src matlab :exports none :results silent
|
#+begin_src matlab :exports none :results silent
|
||||||
ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s]
|
ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s]
|
||||||
m = mlight; % mass of the sample [kg]
|
m = mlight; % mass of the sample [kg]
|
||||||
@ -1386,9 +1400,8 @@ We first look at the evolution of the singular values as a function of frequency
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:G_sigma
|
#+NAME: fig:G_sigma
|
||||||
#+HEADER: :var filepath="Figures/G_sigma.pdf" :var figsize="full-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/G_sigma.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file G_sigma.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1498,9 +1511,8 @@ So, if we consider an input in the direction $v_i$, then the output is in the di
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:coupling_simscape
|
#+NAME: fig:coupling_simscape
|
||||||
#+HEADER: :var filepath="Figures/coupling_simscape.pdf" :var figsize="full-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/coupling_simscape.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file coupling_simscape.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1535,9 +1547,8 @@ And then with the heavy sample.
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:coupling_simscape_heavy
|
#+NAME: fig:coupling_simscape_heavy
|
||||||
#+HEADER: :var filepath="Figures/coupling_simscape_heavy.pdf" :var figsize="full-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/coupling_simscape_heavy.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file coupling_simscape_heavy.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1562,9 +1573,8 @@ Plot the ratio between the main transfer function and the coupling term:
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:coupling_ratio_simscape_light
|
#+NAME: fig:coupling_ratio_simscape_light
|
||||||
#+HEADER: :var filepath="Figures/coupling_ratio_simscape_light.pdf" :var figsize="wide-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/coupling_ratio_simscape_light.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file coupling_ratio_simscape_light.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1588,9 +1598,8 @@ Plot the ratio between the main transfer function and the coupling term:
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+NAME: fig:coupling_ratio_simscape_heavy
|
#+NAME: fig:coupling_ratio_simscape_heavy
|
||||||
#+HEADER: :var filepath="Figures/coupling_ratio_simscape_heavy.pdf" :var figsize="wide-tall"
|
#+HEADER: :tangle no :exports results :results raw :noweb yes
|
||||||
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
|
#+begin_src matlab :var filepath="Figures/coupling_ratio_simscape_heavy.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
|
||||||
#+begin_src matlab :output-dir Figures :file coupling_ratio_simscape_heavy.pdf :post pdf2svg(file=*this*, ext="png")
|
|
||||||
<<plt-matlab>>
|
<<plt-matlab>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1734,17 +1743,6 @@ Finally, we run the linearization.
|
|||||||
exportFig('G_u_v_to_x_y', 'wide-tall');
|
exportFig('G_u_v_to_x_y', 'wide-tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Effect of the rotating Speed
|
|
||||||
<<sec:effect_rot_speed>>
|
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
|
||||||
<<matlab-init>>
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
*** TODO Use realistic parameters for the mass of the sample and stiffness of the X-Y stage
|
|
||||||
|
|
||||||
*** TODO Check if the plant is changing a lot when we are not turning to when we are turning at the maximum speed (60rpm)
|
|
||||||
|
|
||||||
** Effect of the X-Y stage stiffness
|
** Effect of the X-Y stage stiffness
|
||||||
<<sec:effect_stiffness>>
|
<<sec:effect_stiffness>>
|
||||||
|
|
||||||
|