2047 lines
128 KiB
HTML
2047 lines
128 KiB
HTML
<?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>
|
|
<!-- 2019-09-17 mar. 15:53 -->
|
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Cercalo Test Bench</title>
|
|
<meta name="generator" content="Org mode" />
|
|
<meta name="author" content="Dehaeze Thomas" />
|
|
<style type="text/css">
|
|
<!--/*--><![CDATA[/*><!--*/
|
|
.title { text-align: center;
|
|
margin-bottom: .2em; }
|
|
.subtitle { text-align: center;
|
|
font-size: medium;
|
|
font-weight: bold;
|
|
margin-top:0; }
|
|
.todo { font-family: monospace; color: red; }
|
|
.done { font-family: monospace; color: green; }
|
|
.priority { font-family: monospace; color: orange; }
|
|
.tag { background-color: #eee; font-family: monospace;
|
|
padding: 2px; font-size: 80%; font-weight: normal; }
|
|
.timestamp { color: #bebebe; }
|
|
.timestamp-kwd { color: #5f9ea0; }
|
|
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
|
|
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
|
|
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
|
|
.underline { text-decoration: underline; }
|
|
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
|
|
p.verse { margin-left: 3%; }
|
|
pre {
|
|
border: 1px solid #ccc;
|
|
box-shadow: 3px 3px 3px #eee;
|
|
padding: 8pt;
|
|
font-family: monospace;
|
|
overflow: auto;
|
|
margin: 1.2em;
|
|
}
|
|
pre.src {
|
|
position: relative;
|
|
overflow: visible;
|
|
padding-top: 1.2em;
|
|
}
|
|
pre.src:before {
|
|
display: none;
|
|
position: absolute;
|
|
background-color: white;
|
|
top: -10px;
|
|
right: 10px;
|
|
padding: 3px;
|
|
border: 1px solid black;
|
|
}
|
|
pre.src:hover:before { display: inline;}
|
|
/* Languages per Org manual */
|
|
pre.src-asymptote:before { content: 'Asymptote'; }
|
|
pre.src-awk:before { content: 'Awk'; }
|
|
pre.src-C:before { content: 'C'; }
|
|
/* pre.src-C++ doesn't work in CSS */
|
|
pre.src-clojure:before { content: 'Clojure'; }
|
|
pre.src-css:before { content: 'CSS'; }
|
|
pre.src-D:before { content: 'D'; }
|
|
pre.src-ditaa:before { content: 'ditaa'; }
|
|
pre.src-dot:before { content: 'Graphviz'; }
|
|
pre.src-calc:before { content: 'Emacs Calc'; }
|
|
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
|
|
pre.src-fortran:before { content: 'Fortran'; }
|
|
pre.src-gnuplot:before { content: 'gnuplot'; }
|
|
pre.src-haskell:before { content: 'Haskell'; }
|
|
pre.src-hledger:before { content: 'hledger'; }
|
|
pre.src-java:before { content: 'Java'; }
|
|
pre.src-js:before { content: 'Javascript'; }
|
|
pre.src-latex:before { content: 'LaTeX'; }
|
|
pre.src-ledger:before { content: 'Ledger'; }
|
|
pre.src-lisp:before { content: 'Lisp'; }
|
|
pre.src-lilypond:before { content: 'Lilypond'; }
|
|
pre.src-lua:before { content: 'Lua'; }
|
|
pre.src-matlab:before { content: 'MATLAB'; }
|
|
pre.src-mscgen:before { content: 'Mscgen'; }
|
|
pre.src-ocaml:before { content: 'Objective Caml'; }
|
|
pre.src-octave:before { content: 'Octave'; }
|
|
pre.src-org:before { content: 'Org mode'; }
|
|
pre.src-oz:before { content: 'OZ'; }
|
|
pre.src-plantuml:before { content: 'Plantuml'; }
|
|
pre.src-processing:before { content: 'Processing.js'; }
|
|
pre.src-python:before { content: 'Python'; }
|
|
pre.src-R:before { content: 'R'; }
|
|
pre.src-ruby:before { content: 'Ruby'; }
|
|
pre.src-sass:before { content: 'Sass'; }
|
|
pre.src-scheme:before { content: 'Scheme'; }
|
|
pre.src-screen:before { content: 'Gnu Screen'; }
|
|
pre.src-sed:before { content: 'Sed'; }
|
|
pre.src-sh:before { content: 'shell'; }
|
|
pre.src-sql:before { content: 'SQL'; }
|
|
pre.src-sqlite:before { content: 'SQLite'; }
|
|
/* additional languages in org.el's org-babel-load-languages alist */
|
|
pre.src-forth:before { content: 'Forth'; }
|
|
pre.src-io:before { content: 'IO'; }
|
|
pre.src-J:before { content: 'J'; }
|
|
pre.src-makefile:before { content: 'Makefile'; }
|
|
pre.src-maxima:before { content: 'Maxima'; }
|
|
pre.src-perl:before { content: 'Perl'; }
|
|
pre.src-picolisp:before { content: 'Pico Lisp'; }
|
|
pre.src-scala:before { content: 'Scala'; }
|
|
pre.src-shell:before { content: 'Shell Script'; }
|
|
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
|
|
/* additional language identifiers per "defun org-babel-execute"
|
|
in ob-*.el */
|
|
pre.src-cpp:before { content: 'C++'; }
|
|
pre.src-abc:before { content: 'ABC'; }
|
|
pre.src-coq:before { content: 'Coq'; }
|
|
pre.src-groovy:before { content: 'Groovy'; }
|
|
/* additional language identifiers from org-babel-shell-names in
|
|
ob-shell.el: ob-shell is the only babel language using a lambda to put
|
|
the execution function name together. */
|
|
pre.src-bash:before { content: 'bash'; }
|
|
pre.src-csh:before { content: 'csh'; }
|
|
pre.src-ash:before { content: 'ash'; }
|
|
pre.src-dash:before { content: 'dash'; }
|
|
pre.src-ksh:before { content: 'ksh'; }
|
|
pre.src-mksh:before { content: 'mksh'; }
|
|
pre.src-posh:before { content: 'posh'; }
|
|
/* Additional Emacs modes also supported by the LaTeX listings package */
|
|
pre.src-ada:before { content: 'Ada'; }
|
|
pre.src-asm:before { content: 'Assembler'; }
|
|
pre.src-caml:before { content: 'Caml'; }
|
|
pre.src-delphi:before { content: 'Delphi'; }
|
|
pre.src-html:before { content: 'HTML'; }
|
|
pre.src-idl:before { content: 'IDL'; }
|
|
pre.src-mercury:before { content: 'Mercury'; }
|
|
pre.src-metapost:before { content: 'MetaPost'; }
|
|
pre.src-modula-2:before { content: 'Modula-2'; }
|
|
pre.src-pascal:before { content: 'Pascal'; }
|
|
pre.src-ps:before { content: 'PostScript'; }
|
|
pre.src-prolog:before { content: 'Prolog'; }
|
|
pre.src-simula:before { content: 'Simula'; }
|
|
pre.src-tcl:before { content: 'tcl'; }
|
|
pre.src-tex:before { content: 'TeX'; }
|
|
pre.src-plain-tex:before { content: 'Plain TeX'; }
|
|
pre.src-verilog:before { content: 'Verilog'; }
|
|
pre.src-vhdl:before { content: 'VHDL'; }
|
|
pre.src-xml:before { content: 'XML'; }
|
|
pre.src-nxml:before { content: 'XML'; }
|
|
/* add a generic configuration mode; LaTeX export needs an additional
|
|
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
|
|
pre.src-conf:before { content: 'Configuration File'; }
|
|
|
|
table { border-collapse:collapse; }
|
|
caption.t-above { caption-side: top; }
|
|
caption.t-bottom { caption-side: bottom; }
|
|
td, th { vertical-align:top; }
|
|
th.org-right { text-align: center; }
|
|
th.org-left { text-align: center; }
|
|
th.org-center { text-align: center; }
|
|
td.org-right { text-align: right; }
|
|
td.org-left { text-align: left; }
|
|
td.org-center { text-align: center; }
|
|
dt { font-weight: bold; }
|
|
.footpara { display: inline; }
|
|
.footdef { margin-bottom: 1em; }
|
|
.figure { padding: 1em; }
|
|
.figure p { text-align: center; }
|
|
.equation-container {
|
|
display: table;
|
|
text-align: center;
|
|
width: 100%;
|
|
}
|
|
.equation {
|
|
vertical-align: middle;
|
|
}
|
|
.equation-label {
|
|
display: table-cell;
|
|
text-align: right;
|
|
vertical-align: middle;
|
|
}
|
|
.inlinetask {
|
|
padding: 10px;
|
|
border: 2px solid gray;
|
|
margin: 10px;
|
|
background: #ffffcc;
|
|
}
|
|
#org-div-home-and-up
|
|
{ text-align: right; font-size: 70%; white-space: nowrap; }
|
|
textarea { overflow-x: auto; }
|
|
.linenr { font-size: smaller }
|
|
.code-highlighted { background-color: #ffff00; }
|
|
.org-info-js_info-navigation { border-style: none; }
|
|
#org-info-js_console-label
|
|
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
|
|
.org-info-js_search-highlight
|
|
{ background-color: #ffff00; color: #000000; font-weight: bold; }
|
|
.org-svg { width: 90%; }
|
|
/*]]>*/-->
|
|
</style>
|
|
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
|
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
|
<link rel="stylesheet" type="text/css" href="./css/zenburn.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>
|
|
<script type="text/javascript">
|
|
/*
|
|
@licstart The following is the entire license notice for the
|
|
JavaScript code in this tag.
|
|
|
|
Copyright (C) 2012-2019 Free Software Foundation, Inc.
|
|
|
|
The JavaScript code in this tag is free software: you can
|
|
redistribute it and/or modify it under the terms of the GNU
|
|
General Public License (GNU GPL) as published by the Free Software
|
|
Foundation, either version 3 of the License, or (at your option)
|
|
any later version. The code is distributed WITHOUT ANY WARRANTY;
|
|
without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
|
|
|
|
As additional permission under GNU GPL version 3 section 7, you
|
|
may distribute non-source (e.g., minimized or compacted) forms of
|
|
that code without the copy of the GNU GPL normally required by
|
|
section 4, provided you include this license notice and a URL
|
|
through which recipients can access the Corresponding Source.
|
|
|
|
|
|
@licend The above is the entire license notice
|
|
for the JavaScript code in this tag.
|
|
*/
|
|
<!--/*--><![CDATA[/*><!--*/
|
|
function CodeHighlightOn(elem, id)
|
|
{
|
|
var target = document.getElementById(id);
|
|
if(null != target) {
|
|
elem.cacheClassElem = elem.className;
|
|
elem.cacheClassTarget = target.className;
|
|
target.className = "code-highlighted";
|
|
elem.className = "code-highlighted";
|
|
}
|
|
}
|
|
function CodeHighlightOff(elem, id)
|
|
{
|
|
var target = document.getElementById(id);
|
|
if(elem.cacheClassElem)
|
|
elem.className = elem.cacheClassElem;
|
|
if(elem.cacheClassTarget)
|
|
target.className = elem.cacheClassTarget;
|
|
}
|
|
/*]]>*///-->
|
|
</script>
|
|
<script type="text/x-mathjax-config">
|
|
MathJax.Hub.Config({
|
|
displayAlign: "center",
|
|
displayIndent: "0em",
|
|
|
|
"HTML-CSS": { scale: 100,
|
|
linebreaks: { automatic: "false" },
|
|
webFont: "TeX"
|
|
},
|
|
SVG: {scale: 100,
|
|
linebreaks: { automatic: "false" },
|
|
font: "TeX"},
|
|
NativeMML: {scale: 100},
|
|
TeX: { equationNumbers: {autoNumber: "AMS"},
|
|
MultLineWidth: "85%",
|
|
TagSide: "right",
|
|
TagIndent: ".8em"
|
|
}
|
|
});
|
|
</script>
|
|
<script type="text/javascript"
|
|
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
|
|
</head>
|
|
<body>
|
|
<div id="content">
|
|
<h1 class="title">Cercalo Test Bench</h1>
|
|
<div id="table-of-contents">
|
|
<h2>Table of Contents</h2>
|
|
<div id="text-table-of-contents">
|
|
<ul>
|
|
<li><a href="#org3519192">1. Introduction</a>
|
|
<ul>
|
|
<li><a href="#org872df99">1.1. Block Diagram</a></li>
|
|
<li><a href="#orgeb18df8">1.2. Cercalo</a></li>
|
|
<li><a href="#orgabd5452">1.3. Optical Setup</a></li>
|
|
<li><a href="#orga857b69">1.4. Newport</a></li>
|
|
<li><a href="#org65c50b5">1.5. 4 quadrant Diode</a></li>
|
|
<li><a href="#orge0ab4f9">1.6. ADC/DAC</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org29ba44d">2. Identification of the system dynamics</a>
|
|
<ul>
|
|
<li><a href="#orgf19c09b">2.1. Calibration of the 4 Quadrant Diode</a>
|
|
<ul>
|
|
<li><a href="#org488413f">2.1.1. Input / Output data</a></li>
|
|
<li><a href="#orgbbc3ad2">2.1.2. Linear Regression to obtain the gain of the 4QD</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org7dd4e6c">2.2. Identification of the Cercalo Impedance, Current Amplifier and Voltage Amplifier dynamics</a>
|
|
<ul>
|
|
<li><a href="#org6078ef0">2.2.1. Electrical Schematic</a></li>
|
|
<li><a href="#orgaa575f2">2.2.2. Theoretical Transfer Functions</a></li>
|
|
<li><a href="#orgc24d0bd">2.2.3. Identified Transfer Functions</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org8b914fd">2.3. Identification of the Cercalo Dynamics</a>
|
|
<ul>
|
|
<li><a href="#org45f478a">2.3.1. Input / Output data</a></li>
|
|
<li><a href="#orga76fba2">2.3.2. Coherence</a></li>
|
|
<li><a href="#org131ac39">2.3.3. Estimation of the Frequency Response Function Matrix</a></li>
|
|
<li><a href="#orgf0a3476">2.3.4. Time Delay</a></li>
|
|
<li><a href="#org0174055">2.3.5. Extraction of a transfer function matrix</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org29f709e">2.4. Identification of the Newport Dynamics</a>
|
|
<ul>
|
|
<li><a href="#org18a03ed">2.4.1. Input / Output data</a></li>
|
|
<li><a href="#org978a0c9">2.4.2. Coherence</a></li>
|
|
<li><a href="#orgc0c5d02">2.4.3. Estimation of the Frequency Response Function Matrix</a></li>
|
|
<li><a href="#orgdfcee7e">2.4.4. Time Delay</a></li>
|
|
<li><a href="#org314a223">2.4.5. Extraction of a transfer function matrix</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org8fe71fd">2.5. Full System</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org07fb936">3. Active Damping</a>
|
|
<ul>
|
|
<li><a href="#org07da045">3.1. Load Plant</a></li>
|
|
<li><a href="#orge1669f2">3.2. Test</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgf4f85b9">4. <span class="todo TODO">TODO</span> Huddle Test</a></li>
|
|
<li><a href="#org03828c5">5. Plant Scaling</a></li>
|
|
<li><a href="#org8254d1a">6. Plant Analysis</a>
|
|
<ul>
|
|
<li><a href="#org592969b">6.1. Load Plant</a></li>
|
|
<li><a href="#org966d85b">6.2. RGA-Number</a></li>
|
|
<li><a href="#org7063733">6.3. Rotation Matrix</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org759298e">7. Control Objective</a></li>
|
|
<li><a href="#org96df63d">8. Decentralized Control</a>
|
|
<ul>
|
|
<li><a href="#orgde6febc">8.1. Load Plant</a></li>
|
|
<li><a href="#orgf815918">8.2. Diagonal Controller</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orge641704">9. Measurement of the non-repeatability</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org3519192" class="outline-2">
|
|
<h2 id="org3519192"><span class="section-number-2">1</span> Introduction</h2>
|
|
<div class="outline-text-2" id="text-1">
|
|
</div>
|
|
<div id="outline-container-org872df99" class="outline-3">
|
|
<h3 id="org872df99"><span class="section-number-3">1.1</span> Block Diagram</h3>
|
|
<div class="outline-text-3" id="text-1-1">
|
|
<p>
|
|
The block diagram of the setup to be controlled is shown in Fig. <a href="#org3b04014">1</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org3b04014" class="figure">
|
|
<p><img src="figs/cercalo_diagram_simplify.png" alt="cercalo_diagram_simplify.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 1: </span>Block Diagram of the Experimental Setup</p>
|
|
</div>
|
|
|
|
<p>
|
|
The transfer functions in the system are:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li><b>Current Amplifier</b>: from the voltage set by the DAC to the current going to the Cercalo's inductors
|
|
\[ G_i = \begin{bmatrix} G_{i,h} & 0 \\ 0 & G_{i,v} \end{bmatrix} \text{ in } \left[ \frac{A}{V} \right] \]
|
|
\[ \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} = G_i \begin{bmatrix} U_{c,h} \\ U_{c,v} \end{bmatrix} \]</li>
|
|
<li><b>Impedance of the Cercalo</b> that converts the current going to the cercalo to the voltage across the cercalo:
|
|
\[ Z_c = \begin{bmatrix} Z_{c,h} & 0 \\ 0 & Z_{c,v} \end{bmatrix} \text{ in } \left[ \frac{V}{A} \right] \]
|
|
\[ \begin{bmatrix} \tilde{V}_{c,h} \\ \tilde{V}_{c,v} \end{bmatrix} = Z_c \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} \]</li>
|
|
<li><b>Voltage Amplifier</b>: from the voltage across the Cercalo inductors to the measured voltage
|
|
\[ G_a = \begin{bmatrix} G_{a,h} & 0 \\ 0 & G_{a,v} \end{bmatrix} \text{ in } \left[ \frac{V}{V} \right] \]
|
|
\[ \begin{bmatrix} V_{c,h} \\ V_{c,v} \end{bmatrix} = G_a \begin{bmatrix} \tilde{V}_{c,h} \\ \tilde{V}_{c,v} \end{bmatrix} \]</li>
|
|
<li><b>Cercalo</b>: Transfer function from the current going through the cercalo inductors to the 4 quadrant measurement
|
|
\[ G_c = \begin{bmatrix} G_{\frac{V_{p,h}}{\tilde{U}_{c,h}}} & G_{\frac{V_{p,h}}{\tilde{U}_{c,v}}} \\ G_{\frac{V_{p,v}}{\tilde{U}_{c,h}}} & G_{\frac{V_{p,v}}{\tilde{U}_{c,v}}} \end{bmatrix} \text{ in } \left[ \frac{V}{A} \right] \]
|
|
\[ \begin{bmatrix} V_{p,h} \\ V_{p,v} \end{bmatrix} = G_c \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} \]</li>
|
|
<li><b>Newport</b> Transfer function from the command signal of the Newport to the 4 quadrant measurement
|
|
\[ G_n = \begin{bmatrix} G_{\frac{V_{p,h}}{U_{n,h}}} & G_{\frac{V_{p,h}}{U_{n,v}}} \\ G_{\frac{V_{p,v}}{U_{n,h}}} & G_{\frac{V_{n,v}}{U_{n,v}}} \end{bmatrix} \text{ in } \left[ \frac{V}{V} \right] \]
|
|
\[ \begin{bmatrix} V_{p,h} \\ V_{p,v} \end{bmatrix} = G_c \begin{bmatrix} V_{n,h} \\ V_{n,v} \end{bmatrix} \]</li>
|
|
<li><b>4 Quadrant Diode</b>: the gain of the 4 quadrant diode in [V/rad] is inverse in order to obtain the physical angle of the beam
|
|
\[ G_d = \begin{bmatrix} G_{d,h} & 0 \\ 0 & G_{d,v} \end{bmatrix} \text{ in } \left[\frac{V}{rad}\right] \]</li>
|
|
</ul>
|
|
|
|
<p>
|
|
The block diagram with each transfer function is shown in Fig. <a href="#org0ea7908">2</a>.
|
|
</p>
|
|
|
|
<div id="org0ea7908" class="figure">
|
|
<p><img src="figs/cercalo_diagram.png" alt="cercalo_diagram.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 2: </span>Block Diagram of the Experimental Setup with detailed dynamics</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgeb18df8" class="outline-3">
|
|
<h3 id="orgeb18df8"><span class="section-number-3">1.2</span> Cercalo</h3>
|
|
<div class="outline-text-3" id="text-1-2">
|
|
<p>
|
|
From the Cercalo documentation, we have the parameters shown on table <a href="#org6430d98">1</a>.
|
|
</p>
|
|
|
|
<table id="org6430d98" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 1:</span> Cercalo Parameters</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left"> </th>
|
|
<th scope="col" class="org-right">Maximum Stroke [deg]</th>
|
|
<th scope="col" class="org-right">Resonance Frequency [Hz]</th>
|
|
<th scope="col" class="org-right">DC Gain [mA/deg]</th>
|
|
<th scope="col" class="org-right">Gain at resonance [deg/V]</th>
|
|
<th scope="col" class="org-right">RC Resistance [Ohm]</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">AX1 (Horizontal)</td>
|
|
<td class="org-right">5</td>
|
|
<td class="org-right">411.13</td>
|
|
<td class="org-right">28.4</td>
|
|
<td class="org-right">382.9</td>
|
|
<td class="org-right">9.41</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">AX2 (Vertical)</td>
|
|
<td class="org-right">5</td>
|
|
<td class="org-right">252.5</td>
|
|
<td class="org-right">35.2</td>
|
|
<td class="org-right">350.4</td>
|
|
<td class="org-right"> </td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>
|
|
The Inductance and DC resistance of the two axis of the Cercalo have been measured:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(L_{c,h} = 0.1\ \text{mH}\)</li>
|
|
<li>\(L_{c,v} = 0.1\ \text{mH}\)</li>
|
|
<li>\(R_{c,h} = 9.3\ \Omega\)</li>
|
|
<li>\(R_{c,v} = 8.3\ \Omega\)</li>
|
|
</ul>
|
|
|
|
<p>
|
|
Let's first consider the <b>horizontal direction</b> and we try to model the Cercalo by a spring/mass/damper system (Fig. <a href="#org1c65c6f">3</a>).
|
|
</p>
|
|
|
|
|
|
<div id="org1c65c6f" class="figure">
|
|
<p><img src="figs/mech_cercalo.png" alt="mech_cercalo.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 3: </span>1 degree-of-freedom model of the Cercalo</p>
|
|
</div>
|
|
|
|
|
|
<p>
|
|
The equation of motion is:
|
|
</p>
|
|
\begin{align*}
|
|
\frac{x}{F} &= \frac{1}{k + c s + m s^2} \\
|
|
&= \frac{G_0}{1 + 2 \xi \frac{s}{\omega_0} + \frac{s^2}{\omega_0^2}}
|
|
\end{align*}
|
|
<p>
|
|
with:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(G_0 = 1/k\) is the gain at DC in rad/N</li>
|
|
<li>\(\xi = \frac{c}{2 \sqrt{km}}\) is the damping ratio of the system</li>
|
|
<li>\(\omega_0 = \sqrt{\frac{k}{m}}\) is the resonance frequency in rad</li>
|
|
</ul>
|
|
|
|
<p>
|
|
The force \(F\) applied to the mass is proportional to the current \(I\) flowing through the voice coils:
|
|
\[ \frac{F}{I} = \alpha \]
|
|
with \(\alpha\) is in \(N/A\) and is to be determined.
|
|
</p>
|
|
|
|
<p>
|
|
The current \(I\) is also proportional to the voltage at the output of the buffer:
|
|
</p>
|
|
\begin{align*}
|
|
\frac{I_c}{U_c} &= \frac{1}{(R + R_c) + L_c s} \\
|
|
&\approx 0.02 \left[ \frac{A}{V} \right]
|
|
\end{align*}
|
|
|
|
<p>
|
|
Let's try to determine the equivalent mass and spring values.
|
|
From table <a href="#org6430d98">1</a>, for the horizontal direction:
|
|
\[ \left| \frac{x}{I} \right|(0) = \left| \alpha \frac{x}{F} \right|(0) = 28.4\ \frac{mA}{deg} = 1.63\ \frac{A}{rad} \]
|
|
</p>
|
|
|
|
<p>
|
|
So:
|
|
\[ \alpha \frac{1}{k} = 1.63 \Longleftrightarrow k = \frac{\alpha}{1.63} \left[\frac{N}{rad}\right] \]
|
|
</p>
|
|
|
|
<p>
|
|
We also know the resonance frequency:
|
|
\[ \omega_0 = 411.1\ \text{Hz} = 2583\ \frac{rad}{s} \]
|
|
</p>
|
|
|
|
<p>
|
|
And the gain at resonance:
|
|
</p>
|
|
\begin{align*}
|
|
\left| \frac{x}{U_c} \right|(j\omega_0) &= \left| 0.02 \frac{x}{I_c} \right| (j\omega_0) \\
|
|
&= \left| 0.02 \alpha \frac{x}{F} \right| (j\omega_0) \\
|
|
&= 0.02 \alpha \frac{1/k}{2\xi} \\
|
|
&= 282.9\ \left[\frac{deg}{V}\right] \\
|
|
&= 4.938\ \left[\frac{rad}{V}\right]
|
|
\end{align*}
|
|
|
|
<p>
|
|
Thus:
|
|
</p>
|
|
\begin{align*}
|
|
& \frac{\alpha}{2 \xi k} = 245 \\
|
|
\Leftrightarrow & \frac{1.63}{2 \xi} = 245 \\
|
|
\Leftrightarrow & \xi = 0.0033 \\
|
|
\Leftrightarrow & \xi = 0.33 \%
|
|
\end{align*}
|
|
|
|
<div class="important">
|
|
\begin{align*}
|
|
G_0 &= \frac{1.63}{\alpha}\ \frac{rad}{N} \\
|
|
\xi &= 0.0033 \\
|
|
\omega_0 &= 2583\ \frac{rad}{s}
|
|
\end{align*}
|
|
<p>
|
|
and in terms of the physical properties:
|
|
</p>
|
|
\begin{align*}
|
|
k &= \frac{\alpha}{1.63}\ \frac{N}{rad} \\
|
|
\xi &= 0.0033 \\
|
|
m &= \frac{\alpha}{1.1 \cdot 10^7}\ \frac{kg}{m^2}
|
|
\end{align*}
|
|
|
|
<p>
|
|
Thus, we have to determine \(\alpha\).
|
|
This can be done experimentally by determining the gain at DC or at resonance of the system.
|
|
For that, we need to know the angle of the mirror, thus we need to <b>calibrate</b> the photo-diodes.
|
|
This will be done using the Newport.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgabd5452" class="outline-3">
|
|
<h3 id="orgabd5452"><span class="section-number-3">1.3</span> Optical Setup</h3>
|
|
</div>
|
|
<div id="outline-container-orga857b69" class="outline-3">
|
|
<h3 id="orga857b69"><span class="section-number-3">1.4</span> Newport</h3>
|
|
<div class="outline-text-3" id="text-1-4">
|
|
<p>
|
|
Parameters of the Newport are shown in Fig. <a href="#org882caed">4</a>.
|
|
</p>
|
|
|
|
<p>
|
|
It's dynamics for small angle excitation is shown in Fig. <a href="#orgbe2df74">5</a>.
|
|
</p>
|
|
|
|
<p>
|
|
And we have:
|
|
</p>
|
|
\begin{align*}
|
|
G_{n, h}(0) &= 2.62 \cdot 10^{-3}\ \frac{rad}{V} \\
|
|
G_{n, v}(0) &= 2.62 \cdot 10^{-3}\ \frac{rad}{V}
|
|
\end{align*}
|
|
|
|
|
|
<div id="org882caed" class="figure">
|
|
<p><img src="figs/newport_doc.png" alt="newport_doc.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 4: </span>Documentation of the Newport</p>
|
|
</div>
|
|
|
|
|
|
<div id="orgbe2df74" class="figure">
|
|
<p><img src="figs/newport_gain.png" alt="newport_gain.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 5: </span>Transfer function of the Newport</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org65c50b5" class="outline-3">
|
|
<h3 id="org65c50b5"><span class="section-number-3">1.5</span> 4 quadrant Diode</h3>
|
|
<div class="outline-text-3" id="text-1-5">
|
|
<p>
|
|
The front view of the 4 quadrant photo-diode is shown in Fig. <a href="#org0b9b9ab">6</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org0b9b9ab" class="figure">
|
|
<p><img src="figs/4qd_naming.png" alt="4qd_naming.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 6: </span>Front view of the 4QD</p>
|
|
</div>
|
|
|
|
<p>
|
|
Each of the photo-diode is amplified using a 4-channel amplifier as shown in Fig. <a href="#org9c0de93">7</a>.
|
|
</p>
|
|
|
|
<div id="org9c0de93" class="figure">
|
|
<p><img src="figs/4qd_amplifier.png" alt="4qd_amplifier.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 7: </span>Wiring of the amplifier. The amplifier is located on the bottom right of the board</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orge0ab4f9" class="outline-3">
|
|
<h3 id="orge0ab4f9"><span class="section-number-3">1.6</span> ADC/DAC</h3>
|
|
<div class="outline-text-3" id="text-1-6">
|
|
<p>
|
|
Let's compute the theoretical noise of the ADC/DAC.
|
|
</p>
|
|
|
|
\begin{align*}
|
|
\Delta V &= 20 V \\
|
|
n &= 16bits \\
|
|
q &= \Delta V/2^n = 305 \mu V \\
|
|
f_N &= 10kHz \\
|
|
\Gamma_n &= \frac{q^2}{12 f_N} = 7.76 \cdot 10^{-13} \frac{V^2}{Hz}
|
|
\end{align*}
|
|
<p>
|
|
with \(\Delta V\) the total range of the ADC, \(n\) its number of bits, \(q\) the quantization, \(f_N\) the sampling frequency and \(\Gamma_n\) its theoretical Power Spectral Density.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org29ba44d" class="outline-2">
|
|
<h2 id="org29ba44d"><span class="section-number-2">2</span> Identification of the system dynamics</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
<p>
|
|
<a id="org15c1ca3"></a>
|
|
</p>
|
|
<p>
|
|
In this section, we seek to identify all the blocks as shown in Fig. <a href="#org3b04014">1</a>.
|
|
</p>
|
|
|
|
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Signal</th>
|
|
<th scope="col" class="org-left">Name</th>
|
|
<th scope="col" class="org-left">Unit</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">Voltage Sent to Cercalo - Horizontal</td>
|
|
<td class="org-left"><code>Uch</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Voltage Sent to Cercalo - Vertical</td>
|
|
<td class="org-left"><code>Ucv</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Voltage Sent to Newport - Horizontal</td>
|
|
<td class="org-left"><code>Unh</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Voltage Sent to Newport - Vertical</td>
|
|
<td class="org-left"><code>Unv</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">4Q Photodiode Measurement - Horizontal</td>
|
|
<td class="org-left"><code>Vph</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">4Q Photodiode Measurement - Vertical</td>
|
|
<td class="org-left"><code>Vpv</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Measured Voltage across the Inductance - Horizontal</td>
|
|
<td class="org-left"><code>Vch</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Measured Voltage across the Inductance - Vertical</td>
|
|
<td class="org-left"><code>Vcv</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Newport Metrology - Horizontal</td>
|
|
<td class="org-left"><code>Vnh</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Newport Metrology - Vertical</td>
|
|
<td class="org-left"><code>Vnv</code></td>
|
|
<td class="org-left">[V]</td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">Attocube Measurement</td>
|
|
<td class="org-left"><code>Va</code></td>
|
|
<td class="org-left">[m]</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="note">
|
|
<p>
|
|
All the files (data and Matlab scripts) are accessible <a href="data/cercalo_identification.zip">here</a>.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-orgf19c09b" class="outline-3">
|
|
<h3 id="orgf19c09b"><span class="section-number-3">2.1</span> Calibration of the 4 Quadrant Diode</h3>
|
|
<div class="outline-text-3" id="text-2-1">
|
|
<p>
|
|
Prior to any dynamic identification, we would like to be able to determine the meaning of the 4 quadrant diode measurement.
|
|
For instance, instead of obtaining transfer function in [V/V] from the input of the cercalo to the measurement voltage of the 4QD, we would like to obtain the transfer function in [rad/V].
|
|
This will give insight to physical interpretation.
|
|
</p>
|
|
|
|
<p>
|
|
To calibrate the 4 quadrant photo-diode, we can use the metrology included in the Newport.
|
|
We can choose precisely the angle of the Newport mirror and see what is the value measured by the 4 Quadrant Diode.
|
|
We then should be able to obtain the "gain" of the 4QD in [V/rad].
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org488413f" class="outline-4">
|
|
<h4 id="org488413f"><span class="section-number-4">2.1.1</span> Input / Output data</h4>
|
|
<div class="outline-text-4" id="text-2-1-1">
|
|
<p>
|
|
The identification data is loaded
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">uh = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_cal_pd_h.mat', 't', 'Vph', 'Vpv', 'Vnh'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
uv = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_cal_pd_v.mat', 't', 'Vph', 'Vpv', 'Vnv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We remove the first seconds where the Cercalo is turned on.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">t0 = <span class="org-highlight-numbers-number">1</span>;
|
|
|
|
uh.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.Vnh<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.t<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.t = uh.t <span class="org-type">-</span> uh.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
|
|
|
|
t0 = <span class="org-highlight-numbers-number">1</span>;
|
|
|
|
uv.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.Vnv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.t<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.t = uv.t <span class="org-type">-</span> uv.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="orgc9d2415" class="figure">
|
|
<p><img src="figs/calib_4qd_h.png" alt="calib_4qd_h.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 8: </span>Identification signals when exciting the horizontal direction (<a href="./figs/calib_4qd_h.png">png</a>, <a href="./figs/calib_4qd_h.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
|
|
|
|
<div id="org116dcc2" class="figure">
|
|
<p><img src="figs/calib_4qd_v.png" alt="calib_4qd_v.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 9: </span>Identification signals when exciting in the vertical direction (<a href="./figs/calib_4qd_v.png">png</a>, <a href="./figs/calib_4qd_v.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgbbc3ad2" class="outline-4">
|
|
<h4 id="orgbbc3ad2"><span class="section-number-4">2.1.2</span> Linear Regression to obtain the gain of the 4QD</h4>
|
|
<div class="outline-text-4" id="text-2-1-2">
|
|
<p>
|
|
We plot the angle of mirror
|
|
</p>
|
|
|
|
<p>
|
|
Gain of the Newport metrology in [rad/V].
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">gn0 = <span class="org-highlight-numbers-number">2</span>.<span class="org-highlight-numbers-number">62e</span><span class="org-type">-</span><span class="org-highlight-numbers-number">3</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The angular displacement of the beam is twice the angular displacement of the Newport mirror.
|
|
</p>
|
|
|
|
<p>
|
|
We do a linear regression
|
|
\[ y = a x + b \]
|
|
where:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(y\) is the measured voltage of the 4QD in [V]</li>
|
|
<li>\(x\) is the beam angle (twice the mirror angle) in [rad]</li>
|
|
<li>\(a\) is the identified gain of the 4QD in [rad/V]</li>
|
|
</ul>
|
|
|
|
<p>
|
|
The linear regression is shown in Fig. <a href="#org3b7b1cd">10</a>.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">bh = <span class="org-rainbow-delimiters-depth-1">[</span>ones<span class="org-rainbow-delimiters-depth-2">(</span>size<span class="org-rainbow-delimiters-depth-3">(</span>uh.Vnh<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span>gn0<span class="org-type">*</span>uh.Vnh<span class="org-rainbow-delimiters-depth-1">]</span><span class="org-type">\</span>uh.Vph;
|
|
bv = <span class="org-rainbow-delimiters-depth-1">[</span>ones<span class="org-rainbow-delimiters-depth-2">(</span>size<span class="org-rainbow-delimiters-depth-3">(</span>uv.Vnv<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span>gn0<span class="org-type">*</span>uv.Vnv<span class="org-rainbow-delimiters-depth-1">]</span><span class="org-type">\</span>uv.Vpv;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org3b7b1cd" class="figure">
|
|
<p><img src="figs/4qd_linear_reg.png" alt="4qd_linear_reg.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 10: </span>Linear Regression (<a href="./figs/4qd_linear_reg.png">png</a>, <a href="./figs/4qd_linear_reg.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
<p>
|
|
Thus, we obtain the "gain of the 4 quadrant photo-diode as shown on table <a href="#org27870f3">2</a>.
|
|
</p>
|
|
|
|
<table id="org27870f3" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 2:</span> Identified Gain of the 4 quadrant diode</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-right">Horizontal [V/rad]</th>
|
|
<th scope="col" class="org-right">Vertical [V/rad]</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-right">-31.0</td>
|
|
<td class="org-right">36.3</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Gd = tf<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">[</span>bh<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-3">)</span> <span class="org-highlight-numbers-number">0</span> ;
|
|
<span class="org-highlight-numbers-number">0</span> bv<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">]</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We obtain:
|
|
</p>
|
|
\begin{align*}
|
|
\frac{V_{qd,h}}{\alpha_{0,h}} &\approx 0.032\ \left[ \frac{rad}{V} \right] \\
|
|
&\approx 32.3\ \left[ \frac{\mu rad}{mV} \right]
|
|
\end{align*}
|
|
|
|
\begin{align*}
|
|
\frac{V_{qd,v}}{\alpha_{0,v}} &\approx 0.028\ \left[ \frac{rad}{V} \right] \\
|
|
&\approx 27.6\ \left[ \frac{\mu rad}{mV} \right]
|
|
\end{align*}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org7dd4e6c" class="outline-3">
|
|
<h3 id="org7dd4e6c"><span class="section-number-3">2.2</span> Identification of the Cercalo Impedance, Current Amplifier and Voltage Amplifier dynamics</h3>
|
|
<div class="outline-text-3" id="text-2-2">
|
|
<p>
|
|
We wish here to determine \(G_i\) and \(G_a\) shown in Fig. <a href="#org3b04014">1</a>.
|
|
</p>
|
|
|
|
<p>
|
|
We ignore the electro-mechanical coupling.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org6078ef0" class="outline-4">
|
|
<h4 id="org6078ef0"><span class="section-number-4">2.2.1</span> Electrical Schematic</h4>
|
|
<div class="outline-text-4" id="text-2-2-1">
|
|
<p>
|
|
The schematic of the electrical circuit used to drive the Cercalo is shown in Fig. <a href="#orge5d70b8">11</a>.
|
|
</p>
|
|
|
|
|
|
<div id="orge5d70b8" class="figure">
|
|
<p><img src="figs/cercalo_amplifier.png" alt="cercalo_amplifier.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 11: </span>Current Amplifier Schematic</p>
|
|
</div>
|
|
|
|
<p>
|
|
The elements are:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(U_c\): the voltage generated by the DAC</li>
|
|
<li>BUF: is a unity-gain open-loop buffer that allows to increase the output current</li>
|
|
<li>\(R\): a chosen resistor that will determine the gain of the current amplifier</li>
|
|
<li>\(L_c\): inductor present in the Cercalo</li>
|
|
<li>\(R_c\): resistance of the inductor</li>
|
|
<li>\(\tilde{V}_c\): voltage measured across the Cercalo's inductor</li>
|
|
<li>\(V_c\): amplified voltage measured across the Cercalo's inductor</li>
|
|
<li>\(I_c\) is the current going through the Cercalo's inductor</li>
|
|
</ul>
|
|
|
|
|
|
<p>
|
|
The values of the components have been measured for the horizontal and vertical directions:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(R_h = 41 \Omega\)</li>
|
|
<li>\(L_{c,h} = 0.1 mH\)</li>
|
|
<li>\(R_{c,h} = 9.3 \Omega\)</li>
|
|
<li>\(R_v = 41 \Omega\)</li>
|
|
<li>\(L_{c,v} = 0.1 mH\)</li>
|
|
<li>\(R_{c,v} = 8.3 \Omega\)</li>
|
|
</ul>
|
|
|
|
<p>
|
|
Let's first determine the transfer function from \(U_c\) to \(I_c\).
|
|
</p>
|
|
|
|
<p>
|
|
We have that:
|
|
\[ U_c = (R + R_c) I_c + L_c s I_c \]
|
|
</p>
|
|
|
|
<p>
|
|
Thus:
|
|
</p>
|
|
\begin{align}
|
|
G_i(s) &= \frac{I_c}{U_c} \\
|
|
&= \frac{1}{(R + R_c) + L_c s} \\
|
|
&= \frac{G_{i,0}}{1 + s/\omega_0}
|
|
\end{align}
|
|
<p>
|
|
with
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(G_{i,0} = \frac{1}{R + R_c}\)</li>
|
|
<li>\(\omega_0 = \frac{R + R_c}{L_c}\)</li>
|
|
</ul>
|
|
|
|
|
|
<p>
|
|
Now, determine the transfer function from \(I_c\) to \(\tilde{V}_c\):
|
|
\[ \tilde{V}_C = R_c I_c + L_c s I_c \]
|
|
Thus:
|
|
</p>
|
|
\begin{align}
|
|
Z_c(s) &= \frac{\tilde{V}_c}{I_c} \\
|
|
&= R_c + L_c s
|
|
\end{align}
|
|
|
|
|
|
<p>
|
|
Finally, the transfer function of the voltage amplifier \(G_a\) is simply a low pass filter:
|
|
</p>
|
|
\begin{align}
|
|
G_a(s) &= \frac{V_c}{\tilde{V}_c} \\
|
|
&= \frac{G_{a,0}}{1 + s/\omega_c}
|
|
\end{align}
|
|
<p>
|
|
with
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(G_{a,0}\) is the gain 1000 (60dB)</li>
|
|
<li>\(\omega_c\) is the cut-off frequency of the voltage amplifier set to 1000Hz</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgaa575f2" class="outline-4">
|
|
<h4 id="orgaa575f2"><span class="section-number-4">2.2.2</span> Theoretical Transfer Functions</h4>
|
|
<div class="outline-text-4" id="text-2-2-2">
|
|
<p>
|
|
The values of the components in the current amplifier have been measured.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Rh = <span class="org-highlight-numbers-number">41</span>; <span class="org-comment">% [Ohm]</span>
|
|
Lch = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">1e</span><span class="org-type">-</span><span class="org-highlight-numbers-number">3</span>; <span class="org-comment">% [H]</span>
|
|
Rch = <span class="org-highlight-numbers-number">9</span>.<span class="org-highlight-numbers-number">3</span>; <span class="org-comment">% [Ohm]</span>
|
|
|
|
Rv = <span class="org-highlight-numbers-number">41</span>; <span class="org-comment">% [Ohm]</span>
|
|
Lcv = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">1e</span><span class="org-type">-</span><span class="org-highlight-numbers-number">3</span>; <span class="org-comment">% [H]</span>
|
|
Rcv = <span class="org-highlight-numbers-number">8</span>.<span class="org-highlight-numbers-number">3</span>; <span class="org-comment">% [Ohm]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
\begin{align*}
|
|
G_i(s) &= \frac{1}{(R + R_c) + L_c s} \\
|
|
Z_c(s) &= R_c + L_c s \\
|
|
G_a(s) &= \frac{1000}{1 + s/\omega_c}
|
|
\end{align*}
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Gi = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span>Rh <span class="org-type">+</span> Rch <span class="org-type">+</span> Lch <span class="org-type">*</span> s<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span>Rv <span class="org-type">+</span> Rcv <span class="org-type">+</span> Lcv <span class="org-type">*</span> s<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
Zc = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span>Rch<span class="org-type">+</span>Lch<span class="org-type">*</span>s, Rcv<span class="org-type">+</span>Lcv<span class="org-type">*</span>s<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
Ga = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1000</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> s<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span><span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">1000</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> s<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span><span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org3761ab1" class="figure">
|
|
<p><img src="figs/current_amplifier_tf.png" alt="current_amplifier_tf.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 12: </span>Transfer function for the current amplifier (<a href="./figs/current_amplifier_tf.png">png</a>, <a href="./figs/current_amplifier_tf.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
<div class="important">
|
|
<p>
|
|
Over the frequency band of interest, the current amplifier transfer function \(G_i\) can be considered as constant.
|
|
This is the same for the impedance \(Z_c\).
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Gi = tf<span class="org-rainbow-delimiters-depth-1">(</span>blkdiag<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-3">(</span>Rh <span class="org-type">+</span> Rch<span class="org-rainbow-delimiters-depth-3">)</span>, <span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-3">(</span>Rv <span class="org-type">+</span> Rcv<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
Zc = tf<span class="org-rainbow-delimiters-depth-1">(</span>blkdiag<span class="org-rainbow-delimiters-depth-2">(</span>Rch, Rcv<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc24d0bd" class="outline-4">
|
|
<h4 id="orgc24d0bd"><span class="section-number-4">2.2.3</span> Identified Transfer Functions</h4>
|
|
<div class="outline-text-4" id="text-2-2-3">
|
|
<p>
|
|
Noise is generated using the DAC (\([U_{c,h}\ U_{c,v}]\)) and we measure the output of the voltage amplifier \([V_{c,h}, V_{c,v}]\).
|
|
From that, we should be able to identify \(G_a Z_c G_i\).
|
|
</p>
|
|
|
|
<p>
|
|
The identification data is loaded.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">uh = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_uch.mat', 't', 'Uch', 'Vch'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
uv = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_ucv.mat', 't', 'Ucv', 'Vcv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We remove the first seconds where the Cercalo is turned on.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>ceil<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>GaZcGi_h, f<span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vch, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>GaZcGi_v, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vcv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org96f6b44" class="figure">
|
|
<p><img src="figs/current_amplifier_comp_theory_id.png" alt="current_amplifier_comp_theory_id.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 13: </span>Identified and Theoretical Transfer Function \(G_a G_i\) (<a href="./figs/current_amplifier_comp_theory_id.png">png</a>, <a href="./figs/current_amplifier_comp_theory_id.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
<p>
|
|
There is a gain mismatch, that is probably due to bad identification of the inductance and resistance measurement of the cercalo inductors.
|
|
Thus, we suppose \(G_a\) is perfectly known (the gain and cut-off frequency of the voltage amplifier is very accurate) and that \(G_i\) is also well determined as it mainly depends on the resistor used in the amplifier that is well measured.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Gi_resp_h = abs<span class="org-rainbow-delimiters-depth-1">(</span>GaZcGi_h<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">./</span>squeeze<span class="org-rainbow-delimiters-depth-1">(</span>abs<span class="org-rainbow-delimiters-depth-2">(</span>freqresp<span class="org-rainbow-delimiters-depth-3">(</span>Ga<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">1</span>,<span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">*</span>Zc<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">1</span>,<span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-4">)</span>, f, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
Gi_resp_v = abs<span class="org-rainbow-delimiters-depth-1">(</span>GaZcGi_v<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">./</span>squeeze<span class="org-rainbow-delimiters-depth-1">(</span>abs<span class="org-rainbow-delimiters-depth-2">(</span>freqresp<span class="org-rainbow-delimiters-depth-3">(</span>Ga<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">2</span>,<span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">*</span>Zc<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">2</span>,<span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-4">)</span>, f, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
Gi = tf<span class="org-rainbow-delimiters-depth-1">(</span>blkdiag<span class="org-rainbow-delimiters-depth-2">(</span>mean<span class="org-rainbow-delimiters-depth-3">(</span>Gi_resp_h<span class="org-rainbow-delimiters-depth-4">(</span>f<span class="org-type">></span><span class="org-highlight-numbers-number">20</span> <span class="org-type">&</span> f<span class="org-type"><</span><span class="org-highlight-numbers-number">200</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>, mean<span class="org-rainbow-delimiters-depth-3">(</span>Gi_resp_v<span class="org-rainbow-delimiters-depth-4">(</span>f<span class="org-type">></span><span class="org-highlight-numbers-number">20</span> <span class="org-type">&</span> f<span class="org-type"><</span><span class="org-highlight-numbers-number">200</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org4ac2439" class="figure">
|
|
<p><img src="figs/current_amplifier_comp_theory_id_bis.png" alt="current_amplifier_comp_theory_id_bis.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 14: </span>Identified and Theoretical Transfer Function \(G_a G_i\) (<a href="./figs/current_amplifier_comp_theory_id_bis.png">png</a>, <a href="./figs/current_amplifier_comp_theory_id_bis.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
<p>
|
|
Finally, we have the following transfer functions:
|
|
</p>
|
|
<pre class="example">
|
|
ans = filepath;
|
|
if ischar(ans), fid = fopen('/tmp/babel-ZKMGJu/matlab-FA7h5L', 'w'); fprintf(fid, '%s\n', ans); fclose(fid);
|
|
else, dlmwrite('/tmp/babel-ZKMGJu/matlab-FA7h5L', ans, '\t')
|
|
end
|
|
'org_babel_eoe'
|
|
Gi,Zc,Ga
|
|
'org_babel_eoe'
|
|
ans = filepath;
|
|
if ischar(ans), fid = fopen('/tmp/babel-ZKMGJu/matlab-FA7h5L', 'w'); fprintf(fid, '%s\n', ans); fclose(fid);
|
|
else, dlmwrite('/tmp/babel-ZKMGJu/matlab-FA7h5L', ans, '\t')
|
|
end
|
|
'org_babel_eoe'
|
|
ans =
|
|
'org_babel_eoe'
|
|
Gi,Zc,Ga
|
|
|
|
Gi =
|
|
|
|
From input 1 to output...
|
|
1: 0.01275
|
|
|
|
2: 0
|
|
|
|
From input 2 to output...
|
|
1: 0
|
|
|
|
2: 0.01382
|
|
|
|
Static gain.
|
|
|
|
|
|
Zc =
|
|
|
|
From input 1 to output...
|
|
1: 9.3
|
|
|
|
2: 0
|
|
|
|
From input 2 to output...
|
|
1: 0
|
|
|
|
2: 8.3
|
|
|
|
Static gain.
|
|
|
|
|
|
Ga =
|
|
|
|
From input 1 to output...
|
|
6.2832e+06
|
|
1: ----------
|
|
(s+6283)
|
|
|
|
2: 0
|
|
|
|
From input 2 to output...
|
|
1: 0
|
|
|
|
6.2832e+06
|
|
2: ----------
|
|
(s+6283)
|
|
|
|
Continuous-time zero/pole/gain model.
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org8b914fd" class="outline-3">
|
|
<h3 id="org8b914fd"><span class="section-number-3">2.3</span> Identification of the Cercalo Dynamics</h3>
|
|
<div class="outline-text-3" id="text-2-3">
|
|
<p>
|
|
We now wish to identify the dynamics of the Cercalo identified by \(G_c\) on the block diagram in Fig. <a href="#org3b04014">1</a>.
|
|
</p>
|
|
|
|
<p>
|
|
To do so, we inject some noise at the input of the current amplifier \([U_{c,h},\ U_{c,v}]\) (one input after the other) and we measure simultaneously the output of the 4QD \([V_{p,h},\ V_{p,v}]\).
|
|
</p>
|
|
|
|
<p>
|
|
The transfer function obtained will be \(G_c G_i\), and because we have already identified \(G_i\), we can obtain \(G_c\) by multiplying the obtained transfer function matrix by \({G_i}^{-1}\).
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org45f478a" class="outline-4">
|
|
<h4 id="org45f478a"><span class="section-number-4">2.3.1</span> Input / Output data</h4>
|
|
<div class="outline-text-4" id="text-2-3-1">
|
|
<p>
|
|
The identification data is loaded
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">uh = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_uch.mat', 't', 'Uch', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
uv = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_ucv.mat', 't', 'Ucv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We remove the first seconds where the Cercalo is turned on.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">t0 = <span class="org-highlight-numbers-number">1</span>;
|
|
|
|
uh.Uch<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.t<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.t = uh.t <span class="org-type">-</span> uh.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
|
|
|
|
t0 = <span class="org-highlight-numbers-number">1</span>;
|
|
|
|
uv.Ucv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.t<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
|
|
uv.t = uv.t <span class="org-type">-</span> uv.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org11b6434" class="figure">
|
|
<p><img src="figs/identification_uh.png" alt="identification_uh.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 15: </span>Identification signals when exciting the horizontal direction (<a href="./figs/identification_uh.png">png</a>, <a href="./figs/identification_uh.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
|
|
|
|
<div id="org12f9542" class="figure">
|
|
<p><img src="figs/identification_uv.png" alt="identification_uv.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 16: </span>Identification signals when exciting in the vertical direction (<a href="./figs/identification_uv.png">png</a>, <a href="./figs/identification_uv.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orga76fba2" class="outline-4">
|
|
<h4 id="orga76fba2"><span class="section-number-4">2.3.2</span> Coherence</h4>
|
|
<div class="outline-text-4" id="text-2-3-2">
|
|
<p>
|
|
The window used for the spectral analysis is an <code>hanning</code> windows with temporal size equal to 1 second.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>ceil<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>coh_Uch_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Uch_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Ucv_Vph, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Ucv_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org7963278" class="figure">
|
|
<p><img src="figs/coh_cercalo.png" alt="coh_cercalo.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 17: </span>Coherence (<a href="./figs/coh_cercalo.png">png</a>, <a href="./figs/coh_cercalo.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org131ac39" class="outline-4">
|
|
<h4 id="org131ac39"><span class="section-number-4">2.3.3</span> Estimation of the Frequency Response Function Matrix</h4>
|
|
<div class="outline-text-4" id="text-2-3-3">
|
|
<p>
|
|
We compute an estimate of the transfer functions.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>tf_Uch_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Uch_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Ucv_Vph, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Ucv_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org7bbc71b" class="figure">
|
|
<p><img src="figs/frf_cercalo_gain.png" alt="frf_cercalo_gain.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 18: </span>Frequency Response Matrix (<a href="./figs/frf_cercalo_gain.png">png</a>, <a href="./figs/frf_cercalo_gain.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
|
|
<div id="orge616ff8" class="figure">
|
|
<p><img src="figs/frf_cercalo_phase.png" alt="frf_cercalo_phase.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 19: </span>Frequency Response Matrix<sub>Phase</sub> (<a href="./figs/frf_cercalo_phase.png">png</a>, <a href="./figs/frf_cercalo_phase.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf0a3476" class="outline-4">
|
|
<h4 id="orgf0a3476"><span class="section-number-4">2.3.4</span> Time Delay</h4>
|
|
<div class="outline-text-4" id="text-2-3-4">
|
|
<p>
|
|
Now, we would like to remove the time delay included in the FRF prior to the model extraction.
|
|
</p>
|
|
|
|
<p>
|
|
Estimation of the time delay:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts_delay = Ts; <span class="org-comment">% [s]</span>
|
|
|
|
G_delay = tf<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1</span>, <span class="org-string">'InputDelay'</span>, Ts_delay<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
|
|
G_delay_resp = squeeze<span class="org-rainbow-delimiters-depth-1">(</span>freqresp<span class="org-rainbow-delimiters-depth-2">(</span>G_delay, f, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We then remove the time delay from the frequency response function.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">tf_Uch_Vph = tf_Uch_Vph<span class="org-type">./</span>G_delay_resp;
|
|
tf_Uch_Vpv = tf_Uch_Vpv<span class="org-type">./</span>G_delay_resp;
|
|
tf_Ucv_Vph = tf_Ucv_Vph<span class="org-type">./</span>G_delay_resp;
|
|
tf_Ucv_Vpv = tf_Ucv_Vpv<span class="org-type">./</span>G_delay_resp;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0174055" class="outline-4">
|
|
<h4 id="org0174055"><span class="section-number-4">2.3.5</span> Extraction of a transfer function matrix</h4>
|
|
<div class="outline-text-4" id="text-2-3-5">
|
|
<p>
|
|
First we define the initial guess for the resonance frequencies and the weights associated.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">freqs_res_uh = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">410</span><span class="org-rainbow-delimiters-depth-1">]</span>; <span class="org-comment">% [Hz]</span>
|
|
freqs_res_uv = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">250</span><span class="org-rainbow-delimiters-depth-1">]</span>; <span class="org-comment">% [Hz]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We then make an initial guess on the complex values of the poles.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">xi = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">001</span>; <span class="org-comment">% Approximate modal damping</span>
|
|
poles_uh = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uh<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>xi <span class="org-type">+</span> <span class="org-highlight-numbers-number">1i</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uh<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>xi <span class="org-type">-</span> <span class="org-highlight-numbers-number">1i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">]</span>;
|
|
poles_uv = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uv<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>xi <span class="org-type">+</span> <span class="org-highlight-numbers-number">1i</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uv<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>xi <span class="org-type">-</span> <span class="org-highlight-numbers-number">1i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">]</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We then define the weight that will be used for the fitting.
|
|
Basically, we want more weight around the resonance and at low frequency (below the first resonance).
|
|
Also, we want more importance where we have a better coherence.
|
|
Finally, we ignore data above some frequency.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">weight_Uch_Vph = coh_Uch_Vph';
|
|
weight_Uch_Vpv = coh_Uch_Vpv';
|
|
weight_Ucv_Vph = coh_Ucv_Vph';
|
|
weight_Ucv_Vpv = coh_Ucv_Vpv';
|
|
|
|
alpha = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">1</span>;
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name">freq_i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">freqs_res_uh</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
|
|
weight_Uch_Vph<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">></span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">-</span>alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uh<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">&</span> f<span class="org-type"><</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uh<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">10</span>;
|
|
weight_Uch_Vpv<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">></span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">-</span>alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uh<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">&</span> f<span class="org-type"><</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uh<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">10</span>;
|
|
weight_Ucv_Vph<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">></span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">-</span>alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uv<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">&</span> f<span class="org-type"><</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uv<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">10</span>;
|
|
weight_Ucv_Vpv<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">></span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">-</span>alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uv<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">&</span> f<span class="org-type"><</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uv<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">10</span>;
|
|
<span class="org-keyword">end</span>
|
|
|
|
weight_Uch_Vph<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">></span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">0</span>;
|
|
weight_Uch_Vpv<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">></span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">0</span>;
|
|
weight_Ucv_Vph<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">></span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">0</span>;
|
|
weight_Ucv_Vpv<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">></span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">0</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The weights are shown in Fig. <a href="#org38a4998">20</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org38a4998" class="figure">
|
|
<p><img src="figs/weights_cercalo.png" alt="weights_cercalo.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 20: </span>Weights amplitude (<a href="./figs/weights_cercalo.png">png</a>, <a href="./figs/weights_cercalo.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
<p>
|
|
When we set some options for <code>vfit3</code>.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">opts = struct<span class="org-rainbow-delimiters-depth-1">()</span>;
|
|
|
|
opts.stable = <span class="org-highlight-numbers-number">1</span>; <span class="org-comment">% Enforce stable poles</span>
|
|
opts.asymp = <span class="org-highlight-numbers-number">1</span>; <span class="org-comment">% Force D matrix to be null</span>
|
|
opts.relax = <span class="org-highlight-numbers-number">1</span>; <span class="org-comment">% Use vector fitting with relaxed non-triviality constraint</span>
|
|
opts.skip_pole = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% Do NOT skip pole identification</span>
|
|
opts.skip_res = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% Do NOT skip identification of residues (C,D,E)</span>
|
|
opts.cmplx_ss = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% Create real state space model with block diagonal A</span>
|
|
|
|
opts.spy1 = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% No plotting for first stage of vector fitting</span>
|
|
opts.spy2 = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% Create magnitude plot for fitting of f(s)</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We define the number of iteration.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Niter = <span class="org-highlight-numbers-number">5</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
An we run the <code>vectfit3</code> algorithm.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:Niter</span>
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>SER_Uch_Vph, poles, <span class="org-type">~</span>, fit_Uch_Vph<span class="org-rainbow-delimiters-depth-1">]</span> = vectfit3<span class="org-rainbow-delimiters-depth-1">(</span>tf_Uch_Vph<span class="org-type">.'</span>, <span class="org-highlight-numbers-number">1i</span><span class="org-type">*</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uh, weight_Uch_Vph, opts<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-keyword">end</span>
|
|
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:Niter</span>
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>SER_Uch_Vpv, poles, <span class="org-type">~</span>, fit_Uch_Vpv<span class="org-rainbow-delimiters-depth-1">]</span> = vectfit3<span class="org-rainbow-delimiters-depth-1">(</span>tf_Uch_Vpv<span class="org-type">.'</span>, <span class="org-highlight-numbers-number">1i</span><span class="org-type">*</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uh, weight_Uch_Vpv, opts<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-keyword">end</span>
|
|
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:Niter</span>
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>SER_Ucv_Vph, poles, <span class="org-type">~</span>, fit_Ucv_Vph<span class="org-rainbow-delimiters-depth-1">]</span> = vectfit3<span class="org-rainbow-delimiters-depth-1">(</span>tf_Ucv_Vph<span class="org-type">.'</span>, <span class="org-highlight-numbers-number">1i</span><span class="org-type">*</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uv, weight_Ucv_Vph, opts<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-keyword">end</span>
|
|
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:Niter</span>
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>SER_Ucv_Vpv, poles, <span class="org-type">~</span>, fit_Ucv_Vpv<span class="org-rainbow-delimiters-depth-1">]</span> = vectfit3<span class="org-rainbow-delimiters-depth-1">(</span>tf_Ucv_Vpv<span class="org-type">.'</span>, <span class="org-highlight-numbers-number">1i</span><span class="org-type">*</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uv, weight_Ucv_Vpv, opts<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-keyword">end</span>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org6e49a66" class="figure">
|
|
<p><img src="figs/identification_matrix_fit.png" alt="identification_matrix_fit.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 21: </span>Transfer Function Extraction of the FRF matrix (<a href="./figs/identification_matrix_fit.png">png</a>, <a href="./figs/identification_matrix_fit.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
|
|
|
|
<div id="orgfafe5c8" class="figure">
|
|
<p><img src="figs/identification_matrix_fit_phase.png" alt="identification_matrix_fit_phase.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 22: </span>Transfer Function Extraction of the FRF matrix (<a href="./figs/identification_matrix_fit_phase.png">png</a>, <a href="./figs/identification_matrix_fit_phase.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
<p>
|
|
And finally, we create the identified \(G_c\) matrix by multiplying by \({G_i}^{-1}\).
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">G_Uch_Vph = tf<span class="org-rainbow-delimiters-depth-1">(</span>minreal<span class="org-rainbow-delimiters-depth-2">(</span>ss<span class="org-rainbow-delimiters-depth-3">(</span>full<span class="org-rainbow-delimiters-depth-4">(</span>SER_Uch_Vph.A<span class="org-rainbow-delimiters-depth-4">)</span>,SER_Uch_Vph.B,SER_Uch_Vph.C,SER_Uch_Vph.D<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
G_Ucv_Vph = tf<span class="org-rainbow-delimiters-depth-1">(</span>minreal<span class="org-rainbow-delimiters-depth-2">(</span>ss<span class="org-rainbow-delimiters-depth-3">(</span>full<span class="org-rainbow-delimiters-depth-4">(</span>SER_Ucv_Vph.A<span class="org-rainbow-delimiters-depth-4">)</span>,SER_Ucv_Vph.B,SER_Ucv_Vph.C,SER_Ucv_Vph.D<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
G_Uch_Vpv = tf<span class="org-rainbow-delimiters-depth-1">(</span>minreal<span class="org-rainbow-delimiters-depth-2">(</span>ss<span class="org-rainbow-delimiters-depth-3">(</span>full<span class="org-rainbow-delimiters-depth-4">(</span>SER_Uch_Vpv.A<span class="org-rainbow-delimiters-depth-4">)</span>,SER_Uch_Vpv.B,SER_Uch_Vpv.C,SER_Uch_Vpv.D<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
G_Ucv_Vpv = tf<span class="org-rainbow-delimiters-depth-1">(</span>minreal<span class="org-rainbow-delimiters-depth-2">(</span>ss<span class="org-rainbow-delimiters-depth-3">(</span>full<span class="org-rainbow-delimiters-depth-4">(</span>SER_Ucv_Vpv.A<span class="org-rainbow-delimiters-depth-4">)</span>,SER_Ucv_Vpv.B,SER_Ucv_Vpv.C,SER_Ucv_Vpv.D<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
|
|
Gc = <span class="org-rainbow-delimiters-depth-1">[</span>G_Uch_Vph, G_Ucv_Vph;
|
|
G_Uch_Vpv, G_Ucv_Vpv<span class="org-rainbow-delimiters-depth-1">]</span><span class="org-type">*</span>inv<span class="org-rainbow-delimiters-depth-1">(</span>Gi<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org29f709e" class="outline-3">
|
|
<h3 id="org29f709e"><span class="section-number-3">2.4</span> Identification of the Newport Dynamics</h3>
|
|
<div class="outline-text-3" id="text-2-4">
|
|
<p>
|
|
We here identify the transfer function from a reference sent to the Newport \([U_{n,h},\ U_{n,v}]\) to the measurement made by the 4QD \([V_{p,h},\ V_{p,v}]\).
|
|
</p>
|
|
|
|
<p>
|
|
To do so, we inject noise to the Newport \([U_{n,h},\ U_{n,v}]\) and we record the 4QD measurement \([V_{p,h},\ V_{p,v}]\).
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org18a03ed" class="outline-4">
|
|
<h4 id="org18a03ed"><span class="section-number-4">2.4.1</span> Input / Output data</h4>
|
|
<div class="outline-text-4" id="text-2-4-1">
|
|
<p>
|
|
The identification data is loaded
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">uh = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_unh.mat', 't', 'Unh', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
uv = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_unv.mat', 't', 'Unv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We remove the first seconds where the Cercalo is turned on.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">t0 = <span class="org-highlight-numbers-number">3</span>;
|
|
|
|
uh.Unh<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.t<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uh.t = uh.t <span class="org-type">-</span> uh.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
|
|
|
|
t0 = <span class="org-highlight-numbers-number">1</span>.<span class="org-highlight-numbers-number">5</span>;
|
|
|
|
uv.Unv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
uv.t<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
|
|
uv.t = uv.t <span class="org-type">-</span> uv.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org906edc3" class="figure">
|
|
<p><img src="figs/identification_unh.png" alt="identification_unh.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 23: </span>Identification signals when exciting the horizontal direction (<a href="./figs/identification_unh.png">png</a>, <a href="./figs/identification_unh.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
|
|
<div id="org32607b6" class="figure">
|
|
<p><img src="figs/identification_unv.png" alt="identification_unv.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 24: </span>Identification signals when exciting in the vertical direction (<a href="./figs/identification_unv.png">png</a>, <a href="./figs/identification_unv.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org978a0c9" class="outline-4">
|
|
<h4 id="org978a0c9"><span class="section-number-4">2.4.2</span> Coherence</h4>
|
|
<div class="outline-text-4" id="text-2-4-2">
|
|
<p>
|
|
The window used for the spectral analysis is an <code>hanning</code> windows with temporal size equal to 1 second.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>ceil<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>coh_Unh_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uh.Unh, uh.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Unh_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uh.Unh, uh.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Unv_Vph, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uv.Unv, uv.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Unv_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uv.Unv, uv.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org69a538e" class="figure">
|
|
<p><img src="figs/id_newport_coherence.png" alt="id_newport_coherence.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 25: </span>Coherence (<a href="./figs/id_newport_coherence.png">png</a>, <a href="./figs/id_newport_coherence.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc0c5d02" class="outline-4">
|
|
<h4 id="orgc0c5d02"><span class="section-number-4">2.4.3</span> Estimation of the Frequency Response Function Matrix</h4>
|
|
<div class="outline-text-4" id="text-2-4-3">
|
|
<p>
|
|
We compute an estimate of the transfer functions.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>tf_Unh_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Unh, uh.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Unh_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Unh, uh.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Unv_Vph, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Unv, uv.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Unv_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Unv, uv.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org2cdb3e3" class="figure">
|
|
<p><img src="figs/frf_newport_gain.png" alt="frf_newport_gain.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 26: </span>Frequency Response Matrix (<a href="./figs/frf_newport_gain.png">png</a>, <a href="./figs/frf_newport_gain.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
|
|
<div id="org02a1305" class="figure">
|
|
<p><img src="figs/frf_newport_phase.png" alt="frf_newport_phase.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 27: </span>Frequency Response Matrix Phase (<a href="./figs/frf_newport_phase.png">png</a>, <a href="./figs/frf_newport_phase.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgdfcee7e" class="outline-4">
|
|
<h4 id="orgdfcee7e"><span class="section-number-4">2.4.4</span> Time Delay</h4>
|
|
<div class="outline-text-4" id="text-2-4-4">
|
|
<p>
|
|
Now, we would like to remove the time delay included in the FRF prior to the model extraction.
|
|
</p>
|
|
|
|
<p>
|
|
Estimation of the time delay:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts_delay = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">0005</span>; <span class="org-comment">% [s]</span>
|
|
|
|
G_delay = tf<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1</span>, <span class="org-string">'InputDelay'</span>, Ts_delay<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
|
|
G_delay_resp = squeeze<span class="org-rainbow-delimiters-depth-1">(</span>freqresp<span class="org-rainbow-delimiters-depth-2">(</span>G_delay, f, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We then remove the time delay from the frequency response function.
|
|
</p>
|
|
|
|
<div id="org28407ed" class="figure">
|
|
<p><img src="figs/time_delay_newport.png" alt="time_delay_newport.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 28: </span>Phase change due to time-delay in the Newport dynamics (<a href="./figs/time_delay_newport.png">png</a>, <a href="./figs/time_delay_newport.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org314a223" class="outline-4">
|
|
<h4 id="org314a223"><span class="section-number-4">2.4.5</span> Extraction of a transfer function matrix</h4>
|
|
<div class="outline-text-4" id="text-2-4-5">
|
|
<p>
|
|
From Fig. <a href="#org2cdb3e3">26</a>, it seems reasonable to model the Newport dynamics as diagonal and constant.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Gn = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span>tf<span class="org-rainbow-delimiters-depth-2">(</span>mean<span class="org-rainbow-delimiters-depth-3">(</span>abs<span class="org-rainbow-delimiters-depth-4">(</span>tf_Unh_Vph<span class="org-rainbow-delimiters-depth-5">(</span>f<span class="org-type">></span><span class="org-highlight-numbers-number">10</span> <span class="org-type">&</span> f<span class="org-type"><</span><span class="org-highlight-numbers-number">100</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, tf<span class="org-rainbow-delimiters-depth-2">(</span>mean<span class="org-rainbow-delimiters-depth-3">(</span>abs<span class="org-rainbow-delimiters-depth-4">(</span>tf_Unv_Vpv<span class="org-rainbow-delimiters-depth-5">(</span>f<span class="org-type">></span><span class="org-highlight-numbers-number">10</span> <span class="org-type">&</span> f<span class="org-type"><</span><span class="org-highlight-numbers-number">100</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org8fe71fd" class="outline-3">
|
|
<h3 id="org8fe71fd"><span class="section-number-3">2.5</span> Full System</h3>
|
|
<div class="outline-text-3" id="text-2-5">
|
|
<p>
|
|
We now have identified:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(G_i\)</li>
|
|
<li>\(G_a\)</li>
|
|
<li>\(G_c\)</li>
|
|
<li>\(G_n\)</li>
|
|
<li>\(G_d\)</li>
|
|
</ul>
|
|
|
|
<p>
|
|
We name the input and output of each transfer function:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Gi.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
Gi.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Ich', 'Icv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
|
|
Zc.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Ich', 'Icv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
Zc.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vtch', 'Vtcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
|
|
Ga.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vtch', 'Vtcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
Ga.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vch', 'Vcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
|
|
Gc.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Ich', 'Icv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
Gc.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vpch', 'Vpcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
|
|
Gn.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Unh', 'Unv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
Gn.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vpnh', 'Vpnv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
|
|
Gd.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Rh', 'Rv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
Gd.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Sh = sumblk<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Vph = Vpch + Vpnh'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
Sv = sumblk<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Vpv = Vpcv + Vpnv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">inputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv', 'Unh', 'Unv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
outputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vch', 'Vcv', 'Ich', 'Icv', 'Rh', 'Rv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
|
|
sys = connect<span class="org-rainbow-delimiters-depth-1">(</span>Gi, Zc, Ga, Gc, Gn, inv<span class="org-rainbow-delimiters-depth-2">(</span>Gd<span class="org-rainbow-delimiters-depth-2">)</span>, Sh, Sv, inputs, outputs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The file <code>mat/plant.mat</code> is accessible <a href="./mat/plant.mat">here</a>.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">save<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/plant.mat', 'sys', 'Gi', 'Zc', 'Ga', 'Gc', 'Gn', 'Gd'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org07fb936" class="outline-2">
|
|
<h2 id="org07fb936"><span class="section-number-2">3</span> Active Damping</h2>
|
|
<div class="outline-text-2" id="text-3">
|
|
</div>
|
|
<div id="outline-container-org07da045" class="outline-3">
|
|
<h3 id="org07da045"><span class="section-number-3">3.1</span> Load Plant</h3>
|
|
<div class="outline-text-3" id="text-3-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/plant.mat', 'sys', 'Gi', 'Zc', 'Ga', 'Gc', 'Gn', 'Gd'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orge1669f2" class="outline-3">
|
|
<h3 id="orge1669f2"><span class="section-number-3">3.2</span> Test</h3>
|
|
<div class="outline-text-3" id="text-3-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">bode<span class="org-rainbow-delimiters-depth-1">(</span>sys<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">{</span><span class="org-string">'Vch', 'Vcv'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string">, </span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-3">}</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Kppf = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">-</span><span class="org-highlight-numbers-number">10000</span><span class="org-type">/</span>s, tf<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">0</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
|
|
Kppf.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vch', 'Vcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
Kppf.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">inputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv', 'Unh', 'Unv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
outputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Ich', 'Icv', 'Rh', 'Rv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
|
|
sys_cl = connect<span class="org-rainbow-delimiters-depth-1">(</span>sys, Kppf, inputs, outputs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
|
|
<span class="org-type">figure</span>; bode<span class="org-rainbow-delimiters-depth-1">(</span>sys_cl<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">{</span><span class="org-string">'Vph', 'Vpv'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string">, </span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">'Uch', 'Ucv'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">)</span></span><span class="org-string">, sys</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">(</span></span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">'Vph', 'Vpv'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string">, </span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-3">}</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf4f85b9" class="outline-2">
|
|
<h2 id="orgf4f85b9"><span class="section-number-2">4</span> <span class="todo TODO">TODO</span> Huddle Test</h2>
|
|
<div class="outline-text-2" id="text-4">
|
|
<p>
|
|
We load the data taken during the Huddle Test.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_huddle_test.mat'</span>, <span class="org-underline">...</span>
|
|
<span class="org-string">'t', 'Uch', 'Ucv'</span>, <span class="org-underline">...</span>
|
|
<span class="org-string">'Unh', 'Unv'</span>, <span class="org-underline">...</span>
|
|
<span class="org-string">'Vph', 'Vpv'</span>, <span class="org-underline">...</span>
|
|
<span class="org-string">'Vch', 'Vcv'</span>, <span class="org-underline">...</span>
|
|
<span class="org-string">'Vnh', 'Vnv'</span>, <span class="org-underline">...</span>
|
|
<span class="org-string">'Va'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We remove the first second of data where everything is settling down.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">t0 = <span class="org-highlight-numbers-number">1</span>;
|
|
|
|
Uch<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Ucv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Unh<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Unv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Vph<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Vpv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Vch<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Vcv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Vnh<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Vnv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
Va<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
t<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type"><</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
|
|
|
|
t = t <span class="org-type">-</span> t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We compute the Power Spectral Density of the horizontal and vertical positions of the beam as measured by the 4 quadrant diode.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>psd_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>Vph, hanning<span class="org-rainbow-delimiters-depth-2">(</span>ceil<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>psd_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>Vpv, hanning<span class="org-rainbow-delimiters-depth-2">(</span>ceil<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-type">figure</span>;
|
|
hold on;
|
|
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>psd_Vph<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'DisplayName', '</span>$<span class="org-type">\</span>Gamma_<span class="org-rainbow-delimiters-depth-2">{</span>Vp_h<span class="org-rainbow-delimiters-depth-2">}</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>psd_Vpv<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'DisplayName', '</span>$<span class="org-type">\</span>Gamma_<span class="org-rainbow-delimiters-depth-2">{</span>Vp_v<span class="org-rainbow-delimiters-depth-2">}</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
hold off;
|
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'xscale', 'log'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; set</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">gca, 'yscale', 'log'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
xlabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Frequency </span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">[</span></span><span class="org-string">Hz</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">]</span></span><span class="org-string">'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; ylabel</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">'</span>ASD $<span class="org-type">\</span>left<span class="org-rainbow-delimiters-depth-2">[</span><span class="org-type">\</span>frac<span class="org-rainbow-delimiters-depth-3">{</span>V<span class="org-rainbow-delimiters-depth-3">}{</span><span class="org-type">\</span>sqrt<span class="org-rainbow-delimiters-depth-4">{</span>Hz<span class="org-rainbow-delimiters-depth-4">}</span><span class="org-rainbow-delimiters-depth-3">}</span><span class="org-type">\</span>right<span class="org-rainbow-delimiters-depth-2">]</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>
|
|
legend<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Location', 'southwest'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
xlim<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">[</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-2">]</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
We compute the Power Spectral Density of the voltage across the inductance used for horizontal and vertical positioning of the Cercalo.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>psd_Vch, f<span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>Vch, hanning<span class="org-rainbow-delimiters-depth-2">(</span>ceil<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>psd_Vcv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>Vcv, hanning<span class="org-rainbow-delimiters-depth-2">(</span>ceil<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-type">figure</span>;
|
|
hold on;
|
|
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>psd_Vch<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'DisplayName', '</span>$<span class="org-type">\</span>Gamma_<span class="org-rainbow-delimiters-depth-2">{</span>Vc_h<span class="org-rainbow-delimiters-depth-2">}</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>psd_Vcv<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'DisplayName', '</span>$<span class="org-type">\</span>Gamma_<span class="org-rainbow-delimiters-depth-2">{</span>Vc_v<span class="org-rainbow-delimiters-depth-2">}</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
hold off;
|
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'xscale', 'log'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; set</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">gca, 'yscale', 'log'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
xlabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Frequency </span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">[</span></span><span class="org-string">Hz</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">]</span></span><span class="org-string">'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; ylabel</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">'</span>ASD $<span class="org-type">\</span>left<span class="org-rainbow-delimiters-depth-2">[</span><span class="org-type">\</span>frac<span class="org-rainbow-delimiters-depth-3">{</span>V<span class="org-rainbow-delimiters-depth-3">}{</span><span class="org-type">\</span>sqrt<span class="org-rainbow-delimiters-depth-4">{</span>Hz<span class="org-rainbow-delimiters-depth-4">}</span><span class="org-rainbow-delimiters-depth-3">}</span><span class="org-type">\</span>right<span class="org-rainbow-delimiters-depth-2">]</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>
|
|
legend<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Location', 'southwest'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
xlim<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">[</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-2">]</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org03828c5" class="outline-2">
|
|
<h2 id="org03828c5"><span class="section-number-2">5</span> Plant Scaling</h2>
|
|
<div class="outline-text-2" id="text-5">
|
|
<ul class="org-ul">
|
|
<li>measured noise</li>
|
|
<li>expected perturbations</li>
|
|
<li>maximum input usage</li>
|
|
<li>maximum wanted error</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org8254d1a" class="outline-2">
|
|
<h2 id="org8254d1a"><span class="section-number-2">6</span> Plant Analysis</h2>
|
|
<div class="outline-text-2" id="text-6">
|
|
</div>
|
|
<div id="outline-container-org592969b" class="outline-3">
|
|
<h3 id="org592969b"><span class="section-number-3">6.1</span> Load Plant</h3>
|
|
<div class="outline-text-3" id="text-6-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/plant.mat', 'G'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org966d85b" class="outline-3">
|
|
<h3 id="org966d85b"><span class="section-number-3">6.2</span> RGA-Number</h3>
|
|
<div class="outline-text-3" id="text-6-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">freqs = logspace<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">4</span>, <span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
G_resp = freqresp<span class="org-rainbow-delimiters-depth-1">(</span>G, freqs, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
A = zeros<span class="org-rainbow-delimiters-depth-1">(</span>size<span class="org-rainbow-delimiters-depth-2">(</span>G_resp<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
RGAnum = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span>, length<span class="org-rainbow-delimiters-depth-2">(</span>freqs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">freqs</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
|
|
A<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = G_resp<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">.*</span>inv<span class="org-rainbow-delimiters-depth-1">(</span>G_resp<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>';
|
|
RGAnum<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = sum<span class="org-rainbow-delimiters-depth-1">(</span>sum<span class="org-rainbow-delimiters-depth-2">(</span>abs<span class="org-rainbow-delimiters-depth-3">(</span>A<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">-</span>eye<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-keyword">end</span>
|
|
<span class="org-comment">% </span><span class="org-comment"><span class="org-constant">RGA </span></span><span class="org-comment">= G0.*inv(G0)';</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-type">figure</span>;
|
|
plot<span class="org-rainbow-delimiters-depth-1">(</span>freqs, RGAnum<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'xscale', 'log'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">U = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">2</span>, length<span class="org-rainbow-delimiters-depth-2">(</span>freqs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
S = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">2</span>, length<span class="org-rainbow-delimiters-depth-2">(</span>freqs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
|
|
V = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">2</span>, length<span class="org-rainbow-delimiters-depth-2">(</span>freqs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">freqs</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
|
|
<span class="org-rainbow-delimiters-depth-1">[</span>Ui, Si, Vi<span class="org-rainbow-delimiters-depth-1">]</span> = svd<span class="org-rainbow-delimiters-depth-1">(</span>G_resp<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
U<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = Ui;
|
|
S<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = Si;
|
|
V<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = Vi;
|
|
<span class="org-keyword">end</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org7063733" class="outline-3">
|
|
<h3 id="org7063733"><span class="section-number-3">6.3</span> Rotation Matrix</h3>
|
|
<div class="outline-text-3" id="text-6-3">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">G0 = freqresp<span class="org-rainbow-delimiters-depth-1">(</span>G, <span class="org-highlight-numbers-number">0</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org759298e" class="outline-2">
|
|
<h2 id="org759298e"><span class="section-number-2">7</span> Control Objective</h2>
|
|
<div class="outline-text-2" id="text-7">
|
|
<p>
|
|
The maximum expected stroke is \(y_\text{max} = 3mm \approx 5e^{-2} rad\) at \(1Hz\).
|
|
The maximum wanted error is \(e_\text{max} = 10 \mu rad\).
|
|
</p>
|
|
|
|
<p>
|
|
Thus, we require the sensitivity function at \(\omega_0 = 1\text{ Hz}\):
|
|
</p>
|
|
\begin{align*}
|
|
|S(j\omega_0)| &< \left| \frac{e_\text{max}}{y_\text{max}} \right| \\
|
|
&< 2 \cdot 10^{-4}
|
|
\end{align*}
|
|
|
|
<p>
|
|
In terms of loop gain, this is equivalent to:
|
|
\[ |L(j\omega_0)| > 5 \cdot 10^{3} \]
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org96df63d" class="outline-2">
|
|
<h2 id="org96df63d"><span class="section-number-2">8</span> Decentralized Control</h2>
|
|
<div class="outline-text-2" id="text-8">
|
|
<p>
|
|
<a id="org4e742a7"></a>
|
|
</p>
|
|
<p>
|
|
In this section, we try to implement a simple decentralized controller.
|
|
</p>
|
|
<div class="note">
|
|
<p>
|
|
All the files (data and Matlab scripts) are accessible <a href="data/decentralized_control.zip">here</a>.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgde6febc" class="outline-3">
|
|
<h3 id="orgde6febc"><span class="section-number-3">8.1</span> Load Plant</h3>
|
|
<div class="outline-text-3" id="text-8-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/plant.mat', 'sys', 'Gi', 'Zc', 'Ga', 'Gc', 'Gn', 'Gd'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf815918" class="outline-3">
|
|
<h3 id="orgf815918"><span class="section-number-3">8.2</span> Diagonal Controller</h3>
|
|
<div class="outline-text-3" id="text-8-2">
|
|
<p>
|
|
Using <code>SISOTOOL</code>, a diagonal controller is designed.
|
|
The two SISO loop gains are shown in Fig. <a href="#org8ca046f">29</a>.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Kh = <span class="org-type">-</span><span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">25598</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">112</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span> <span class="org-type">+</span> <span class="org-highlight-numbers-number">15</span>.<span class="org-highlight-numbers-number">93</span><span class="org-type">*</span>s <span class="org-type">+</span> <span class="org-highlight-numbers-number">6</span>.<span class="org-highlight-numbers-number">686e06</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">(</span>s<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-3">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">352</span>.<span class="org-highlight-numbers-number">5</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">+</span>s<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span><span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span><span class="org-highlight-numbers-number">2000</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
Kv = <span class="org-highlight-numbers-number">10207</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">55</span>.<span class="org-highlight-numbers-number">15</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span> <span class="org-type">+</span> <span class="org-highlight-numbers-number">17</span>.<span class="org-highlight-numbers-number">45</span><span class="org-type">*</span>s <span class="org-type">+</span> <span class="org-highlight-numbers-number">2</span>.<span class="org-highlight-numbers-number">491e06</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">491</span>.<span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">7695</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
|
|
K = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span>Kh, Kv<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
K.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Rh', 'Rv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
K.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org8ca046f" class="figure">
|
|
<p><img src="figs/diag_contr_loop_gain.png" alt="diag_contr_loop_gain.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 29: </span>Loop Gain using the Decentralized Diagonal Controller (<a href="./figs/diag_contr_loop_gain.png">png</a>, <a href="./figs/diag_contr_loop_gain.pdf">pdf</a>)</p>
|
|
</div>
|
|
|
|
<p>
|
|
We then close the loop and we look at the transfer function from the Newport rotation signal to the beam angle (Fig. <a href="#org1a57ffe">30</a>).
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">inputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv', 'Unh', 'Unv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
outputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vch', 'Vcv', 'Ich', 'Icv', 'Rh', 'Rv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
|
|
|
|
sys_cl = connect<span class="org-rainbow-delimiters-depth-1">(</span>sys, <span class="org-type">-</span>K, inputs, outputs<span class="org-rainbow-delimiters-depth-1">)</span>;
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org1a57ffe" class="figure">
|
|
<p><img src="figs/diag_contr_effect_newport.png" alt="diag_contr_effect_newport.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 30: </span>Effect of the Newport rotation on the beam position when the loop is closed using the Decentralized Diagonal Controller (<a href="./figs/diag_contr_effect_newport.png">png</a>, <a href="./figs/diag_contr_effect_newport.pdf">pdf</a>)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orge641704" class="outline-2">
|
|
<h2 id="orge641704"><span class="section-number-2">9</span> Measurement of the non-repeatability</h2>
|
|
</div>
|
|
</div>
|
|
<div id="postamble" class="status">
|
|
<p class="author">Author: Dehaeze Thomas</p>
|
|
<p class="date">Created: 2019-09-17 mar. 15:53</p>
|
|
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
|
|
</div>
|
|
</body>
|
|
</html>
|