Add rotation speed analysis

This commit is contained in:
Thomas Dehaeze 2019-01-28 11:22:15 +01:00
parent b0482babe6
commit ba2944e057
7 changed files with 120 additions and 31 deletions

BIN
Figures/Guu_ws.pdf Normal file

Binary file not shown.

BIN
Figures/Guu_ws.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
Figures/Guu_ws.svg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 KiB

BIN
Figures/Guv_ws.pdf Normal file

Binary file not shown.

BIN
Figures/Guv_ws.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
Figures/Guv_ws.svg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

View File

@ -1,22 +1,27 @@
#+TITLE: Control in a rotating frame #+TITLE: Control in a rotating frame
:DRAWER:
#+STARTUP: overview
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="css/htmlize.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="css/htmlize.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="css/readtheorg.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="css/readtheorg.css"/>
#+HTML_HEAD: <script src="js/jquery.min.js"></script> #+HTML_HEAD: <script src="js/jquery.min.js"></script>
#+HTML_HEAD: <script src="js/bootstrap.min.js"></script> #+HTML_HEAD: <script src="js/bootstrap.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="js/jquery.stickytableheaders.min.js"></script> #+HTML_HEAD: <script type="text/javascript" src="js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="js/readtheorg.js"></script> #+HTML_HEAD: <script type="text/javascript" src="js/readtheorg.js"></script>
#+LATEX_CLASS: cleanreport #+LATEX_CLASS: cleanreport
#+LaTeX_CLASS_OPTIONS: [tocnp, secbreak, minted] #+LaTeX_CLASS_OPTIONS: [tocnp, secbreak, minted]
#+STARTUP: overview
#+LaTeX_HEADER: \usepackage{svg} #+LaTeX_HEADER: \usepackage{svg}
#+LaTeX_HEADER: \newcommand{\authorFirstName}{Thomas} #+LaTeX_HEADER: \newcommand{\authorFirstName}{Thomas}
#+LaTeX_HEADER: \newcommand{\authorLastName}{Dehaeze} #+LaTeX_HEADER: \newcommand{\authorLastName}{Dehaeze}
#+LaTeX_HEADER: \newcommand{\authorEmail}{dehaeze.thomas@gmail.com} #+LaTeX_HEADER: \newcommand{\authorEmail}{dehaeze.thomas@gmail.com}
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org
#+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
: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.
@ -902,7 +907,8 @@ We obtain the same result than the analytical case (figures [[fig:coupling_light
#+RESULTS: #+RESULTS:
[[file:Figures/coupling_ratio_light_heavy.png]] [[file:Figures/coupling_ratio_light_heavy.png]]
** Plant Control ** Plant Control - SISO approach
*** Plant identification
The goal is to study the control problems due to the coupling that appears because of the rotation. The goal is to study the control problems due to the coupling that appears because of the rotation.
#+begin_src matlab :exports none :results silent #+begin_src matlab :exports none :results silent
@ -1086,45 +1092,128 @@ However, when we look at the poles of the closed loop with a diagonal controller
| -1.1837+0.0041777i | | -1.1837+0.0041777i |
| -1.1837-0.0041777i | | -1.1837-0.0041777i |
*** *** TODO Close loop performance
First we compute the close loop transfer functions.
#+begin_src matlab :results none :exports code
figure;
bode(Kll*Gvc('Du', 'fu'))
#+end_src
#+begin_src matlab :results none :exports code
sisotool(Gtvc('Du', 'fu'), Kll)
#+end_src
#+begin_src matlab :results none :exports code
figure;
bode(Kll*Gtvc('Du', 'fu'))
#+end_src
#+begin_src matlab :results none :exports code #+begin_src matlab :results none :exports code
Gcl = feedback(Gvc, K); Gcl = feedback(Gvc, K);
#+end_src
#+begin_src matlab :results none :exports code
Gtcl = feedback(Gtvc, K); Gtcl = feedback(Gtvc, K);
#+end_src #+end_src
#+begin_src matlab :results none :exports code #+begin_src matlab :results none :exports code
figure; figure;
bode(Gcl, Gtcl) bode(Gcl, Gtcl)
#+end_src #+end_src
*** Effect of 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]]).
As the rotation frequency increases:
- one pole goes to lower frequencies while the other goes to higher frequencies
- one zero appears between the two poles
- the zero disappears when $\omega > \sqrt{\frac{k}{m}}$ and the low frequency pole becomes unstable (positive real part)
To stabilize the unstable pole, we need a control bandwidth of at least twice of frequency of the unstable pole.
#+begin_src matlab :exports none :results silent
ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s]
m = mlight; % mass of the sample [kg]
kTuv = kvc;
cTuv = 0.1*sqrt(kTuv*m);
Gs = {zeros(1, length(ws))};
for i = 1:length(ws)
w = ws(i);
Gs{i} = linearize(mdl, io, 0.1);
end
#+end_src
#+begin_src matlab :exports none :results silent
freqs = logspace(-2, 2, 1000);
figure;
ax1 = subaxis(2,1,1);
hold on;
for i = 1:length(ws)
plot(freqs, abs(squeeze(freqresp(Gs{i}(1, 1), freqs, 'Hz'))));
end
hold off;
xlim([freqs(1), freqs(end)]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
set(gca, 'XTickLabel',[]);
ylabel('Magnitude [m/N]');
ax2 = subaxis(2,1,2);
hold on;
for i = 1:length(ws)
plot(freqs, 180/pi*angle(squeeze(freqresp(Gs{i}(1, 1), freqs, 'Hz'))), 'DisplayName', sprintf('w = %.0f [rpm]', ws(i)*60/2/pi));
end
hold off;
yticks(-180:90:180);
ylim([-180 180]);
xlim([freqs(1), freqs(end)]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
legend('Location', 'northeast');
linkaxes([ax1,ax2],'x');
#+end_src
#+HEADER: :tangle no :exports results :results file :noweb yes
#+HEADER: :var filepath="Figures/Guu_ws.png" :var figsize="full-tall"
#+begin_src matlab
<<plt-matlab>>
#+end_src
#+NAME: fig:Guu_ws
#+CAPTION: Diagonal term as a function of the rotation frequency
#+RESULTS:
[[file:Figures/Guu_ws.png]]
#+begin_src matlab :exports none :results silent
freqs = logspace(-2, 2, 1000);
figure;
ax1 = subaxis(2,1,1);
hold on;
for i = 1:length(ws)
plot(freqs, abs(squeeze(freqresp(Gs{i}(1, 2), freqs, 'Hz'))));
end
hold off;
xlim([freqs(1), freqs(end)]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
set(gca, 'XTickLabel',[]);
ylabel('Magnitude [m/N]');
ax2 = subaxis(2,1,2);
hold on;
for i = 1:length(ws)
plot(freqs, 180/pi*angle(squeeze(freqresp(Gs{i}(1, 2), freqs, 'Hz'))), 'DisplayName', sprintf('w = %.0f [rpm]', ws(i)*60/2/pi));
end
hold off;
yticks(-180:90:180);
ylim([-180 180]);
xlim([freqs(1), freqs(end)]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
legend('Location', 'northeast');
linkaxes([ax1,ax2],'x');
#+end_src
#+HEADER: :tangle no :exports results :results file :noweb yes
#+HEADER: :var filepath="Figures/Guv_ws.png" :var figsize="full-tall"
#+begin_src matlab
<<plt-matlab>>
#+end_src
#+NAME: fig:Guv_ws
#+CAPTION: Couplin term as a function of the rotation frequency
#+RESULTS:
[[file:Figures/Guv_ws.png]]
** TODO Plant Control - MIMO approach
** test ** test