Compare commits
15 Commits
f69ecdcae5
...
master
Author | SHA1 | Date | |
---|---|---|---|
4e35580cc2 | |||
43083a5c7b | |||
a0ee8de1d5 | |||
e4f5e82281 | |||
1956132d55 | |||
73d6d4b132 | |||
093e4fd1e9 | |||
![]() |
9bcd324b00 | ||
![]() |
bd4fbd64e7 | ||
d128fb5a87 | |||
2d6a2953cf | |||
![]() |
0f1c082b66 | ||
![]() |
f02fd4b629 | ||
63d404ef22 | |||
4e653358d8 |
7
.gitignore
vendored
@@ -1,3 +1,10 @@
|
||||
auto/
|
||||
*.tex
|
||||
*.bbl
|
||||
*.synctex.gz
|
||||
.auctex-auto/
|
||||
_minted*
|
||||
|
||||
# Windows default autosave extension
|
||||
*.asv
|
||||
*rtw/
|
||||
|
145
css/htmlize.css
@@ -1,145 +0,0 @@
|
||||
.org-bold { /* bold */ font-weight: bold; }
|
||||
.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; }
|
||||
.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; }
|
||||
.org-builtin { /* font-lock-builtin-face */ color: #7a378b; }
|
||||
.org-button { /* button */ text-decoration: underline; }
|
||||
.org-calendar-today { /* calendar-today */ text-decoration: underline; }
|
||||
.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; }
|
||||
.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; }
|
||||
.org-change-log-date { /* change-log-date */ color: #8b2252; }
|
||||
.org-change-log-email { /* change-log-email */ color: #a0522d; }
|
||||
.org-change-log-file { /* change-log-file */ color: #0000ff; }
|
||||
.org-change-log-function { /* change-log-function */ color: #a0522d; }
|
||||
.org-change-log-list { /* change-log-list */ color: #a020f0; }
|
||||
.org-change-log-name { /* change-log-name */ color: #008b8b; }
|
||||
.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; }
|
||||
.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; }
|
||||
.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; }
|
||||
.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; }
|
||||
.org-completions-annotations { /* completions-annotations */ font-style: italic; }
|
||||
.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; }
|
||||
.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; }
|
||||
.org-constant { /* font-lock-constant-face */ color: #008b8b; }
|
||||
.org-diary { /* diary */ color: #ff0000; }
|
||||
.org-diff-context { /* diff-context */ color: #7f7f7f; }
|
||||
.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; }
|
||||
.org-diff-function { /* diff-function */ background-color: #cccccc; }
|
||||
.org-diff-header { /* diff-header */ background-color: #cccccc; }
|
||||
.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; }
|
||||
.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; }
|
||||
.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; }
|
||||
.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; }
|
||||
.org-dired-directory { /* dired-directory */ color: #0000ff; }
|
||||
.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; }
|
||||
.org-dired-header { /* dired-header */ color: #228b22; }
|
||||
.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; }
|
||||
.org-dired-mark { /* dired-mark */ color: #008b8b; }
|
||||
.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; }
|
||||
.org-dired-perm-write { /* dired-perm-write */ color: #b22222; }
|
||||
.org-dired-symlink { /* dired-symlink */ color: #a020f0; }
|
||||
.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; }
|
||||
.org-doc { /* font-lock-doc-face */ color: #8b2252; }
|
||||
.org-escape-glyph { /* escape-glyph */ color: #a52a2a; }
|
||||
.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; }
|
||||
.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; }
|
||||
.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; }
|
||||
.org-fringe { /* fringe */ background-color: #f2f2f2; }
|
||||
.org-function-name { /* font-lock-function-name-face */ color: teal; }
|
||||
.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; }
|
||||
.org-help-argument-name { /* help-argument-name */ font-style: italic; }
|
||||
.org-highlight { /* highlight */ background-color: #b4eeb4; }
|
||||
.org-holiday { /* holiday */ background-color: #ffc0cb; }
|
||||
.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; }
|
||||
.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; }
|
||||
.org-italic { /* italic */ font-style: italic; }
|
||||
.org-keyword { /* font-lock-keyword-face */ color: #0086b3; }
|
||||
.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; }
|
||||
.org-link { /* link */ color: #0000ff; text-decoration: underline; }
|
||||
.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; }
|
||||
.org-log-edit-header { /* log-edit-header */ color: #a020f0; }
|
||||
.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; }
|
||||
.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; }
|
||||
.org-match { /* match */ background-color: #ffff00; }
|
||||
.org-next-error { /* next-error */ background-color: #eedc82; }
|
||||
.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; }
|
||||
.org-org-archived { /* org-archived */ color: #7f7f7f; }
|
||||
.org-org-block { /* org-block */ color: #7f7f7f; }
|
||||
.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; }
|
||||
.org-org-block-end-line { /* org-block-end-line */ color: #b22222; }
|
||||
.org-org-checkbox { /* org-checkbox */ font-weight: bold; }
|
||||
.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; }
|
||||
.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; }
|
||||
.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; }
|
||||
.org-org-code { /* org-code */ color: #7f7f7f; }
|
||||
.org-org-column { /* org-column */ background-color: #e5e5e5; }
|
||||
.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; }
|
||||
.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; }
|
||||
.org-org-document-info { /* org-document-info */ color: #191970; }
|
||||
.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; }
|
||||
.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; }
|
||||
.org-org-done { /* org-done */ color: #228b22; font-weight: bold; }
|
||||
.org-org-drawer { /* org-drawer */ color: #0000ff; }
|
||||
.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; }
|
||||
.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; }
|
||||
.org-org-formula { /* org-formula */ color: #b22222; }
|
||||
.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; }
|
||||
.org-org-hide { /* org-hide */ color: #ffffff; }
|
||||
.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; }
|
||||
.org-org-level-1 { /* org-level-1 */ color: #0000ff; }
|
||||
.org-org-level-2 { /* org-level-2 */ color: #a0522d; }
|
||||
.org-org-level-3 { /* org-level-3 */ color: #a020f0; }
|
||||
.org-org-level-4 { /* org-level-4 */ color: #b22222; }
|
||||
.org-org-level-5 { /* org-level-5 */ color: #228b22; }
|
||||
.org-org-level-6 { /* org-level-6 */ color: #008b8b; }
|
||||
.org-org-level-7 { /* org-level-7 */ color: #7a378b; }
|
||||
.org-org-level-8 { /* org-level-8 */ color: #8b2252; }
|
||||
.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; }
|
||||
.org-org-meta-line { /* org-meta-line */ color: #b22222; }
|
||||
.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; }
|
||||
.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; }
|
||||
.org-org-quote { /* org-quote */ color: #7f7f7f; }
|
||||
.org-org-scheduled { /* org-scheduled */ color: #006400; }
|
||||
.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; }
|
||||
.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; }
|
||||
.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; }
|
||||
.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; }
|
||||
.org-org-table { /* org-table */ color: #0000ff; }
|
||||
.org-org-tag { /* org-tag */ font-weight: bold; }
|
||||
.org-org-target { /* org-target */ text-decoration: underline; }
|
||||
.org-org-time-grid { /* org-time-grid */ color: #b8860b; }
|
||||
.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; }
|
||||
.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; }
|
||||
.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; }
|
||||
.org-org-verse { /* org-verse */ color: #7f7f7f; }
|
||||
.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; }
|
||||
.org-outline-1 { /* outline-1 */ color: #0000ff; }
|
||||
.org-outline-2 { /* outline-2 */ color: #a0522d; }
|
||||
.org-outline-3 { /* outline-3 */ color: #a020f0; }
|
||||
.org-outline-4 { /* outline-4 */ color: #b22222; }
|
||||
.org-outline-5 { /* outline-5 */ color: #228b22; }
|
||||
.org-outline-6 { /* outline-6 */ color: #008b8b; }
|
||||
.org-outline-7 { /* outline-7 */ color: #7a378b; }
|
||||
.org-outline-8 { /* outline-8 */ color: #8b2252; }
|
||||
.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; }
|
||||
.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; }
|
||||
.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; }
|
||||
.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; }
|
||||
.org-region { /* region */ background-color: #eedc82; }
|
||||
.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; }
|
||||
.org-shadow { /* shadow */ color: #7f7f7f; }
|
||||
.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; }
|
||||
.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; }
|
||||
.org-string { /* font-lock-string-face */ color: #dd1144; }
|
||||
.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; }
|
||||
.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; }
|
||||
.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; }
|
||||
.org-type { /* font-lock-type-face */ color: #228b22; }
|
||||
.org-underline { /* underline */ text-decoration: underline; }
|
||||
.org-variable-name { /* font-lock-variable-name-face */ color: teal; }
|
||||
.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; }
|
||||
.org-widget-button { /* widget-button */ font-weight: bold; }
|
||||
.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; }
|
||||
.org-widget-documentation { /* widget-documentation */ color: #006400; }
|
||||
.org-widget-field { /* widget-field */ background-color: #d9d9d9; }
|
||||
.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; }
|
||||
.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; }
|
1095
css/readtheorg.css
BIN
doc/APA95ML.pdf
Normal file
BIN
doc/IDS3010.pdf
Normal file
BIN
doc/IO130 IO131 OEM Datasheet.pdf
Normal file
BIN
doc/L-9517-9448-05-B_Data_sheet_RESOLUTE_BiSS_en.pdf
Normal file
BIN
doc/LA75B.pdf
Normal file
BIN
figs/encoder_identification_excitation_time.pdf
Normal file
BIN
figs/encoder_identification_excitation_time.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
figs/encoder_identification_motion.pdf
Normal file
BIN
figs/encoder_identification_motion.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
figs/exp_setup_schematic.pdf
Normal file
@@ -14,7 +14,10 @@
|
||||
height="309.88138"
|
||||
viewBox="0 0 445.25269 309.88137"
|
||||
sodipodi:docname="exp_setup_schematic.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
|
||||
inkscape:export-filename="/home/thomas/Cloud/thesis/matlab/encoder-test-bench/figs/exp_setup_schematic.png"
|
||||
inkscape:export-xdpi="252"
|
||||
inkscape:export-ydpi="252">
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
|
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 225 KiB |
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 136 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 47 KiB |
345
index.html
@@ -1,345 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<!-- 2020-10-23 ven. 23:04 -->
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
<title>Encoder - Test Bench</title>
|
||||
<meta name="generator" content="Org mode" />
|
||||
<meta name="author" content="Dehaeze Thomas" />
|
||||
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
||||
<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>MathJax = {
|
||||
tex: {
|
||||
tags: 'ams',
|
||||
macros: {bm: ["\\boldsymbol{#1}",1],}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<h1 class="title">Encoder - Test Bench</h1>
|
||||
<div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#org0d09252">1. Experimental Setup</a></li>
|
||||
<li><a href="#org4c1706c">2. Huddle Test</a>
|
||||
<ul>
|
||||
<li><a href="#org169c9b3">2.1. Load Data</a></li>
|
||||
<li><a href="#org71d6eed">2.2. Time Domain Results</a></li>
|
||||
<li><a href="#org526b687">2.3. Frequency Domain Noise</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org25a61fe">3. Comparison Interferometer / Encoder</a>
|
||||
<ul>
|
||||
<li><a href="#orgb31234a">3.1. Load Data</a></li>
|
||||
<li><a href="#org4fa5441">3.2. Time Domain Results</a></li>
|
||||
<li><a href="#orge79e200">3.3. Difference between Encoder and Interferometer as a function of time</a></li>
|
||||
<li><a href="#org625a811">3.4. Difference between Encoder and Interferometer as a function of position</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org2e4bf3b">4. Identification</a>
|
||||
<ul>
|
||||
<li><a href="#org8a892bd">4.1. Load Data</a></li>
|
||||
<li><a href="#org7e3c2ba">4.2. Identification</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org0d09252" class="outline-2">
|
||||
<h2 id="org0d09252"><span class="section-number-2">1</span> Experimental Setup</h2>
|
||||
<div class="outline-text-2" id="text-1">
|
||||
<p>
|
||||
The experimental Setup is schematically represented in Figure <a href="#org5bc9553">1</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<div id="org5bc9553" class="figure">
|
||||
<p><img src="figs/exp_setup_schematic.png" alt="exp_setup_schematic.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 1: </span>Schematic of the Experiment</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org7f3df10" class="figure">
|
||||
<p><img src="figs/IMG_20201023_153905.jpg" alt="IMG_20201023_153905.jpg" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 2: </span>Side View of the encoder</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org71727ed" class="figure">
|
||||
<p><img src="figs/IMG_20201023_153914.jpg" alt="IMG_20201023_153914.jpg" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 3: </span>Front View of the encoder</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org4c1706c" class="outline-2">
|
||||
<h2 id="org4c1706c"><span class="section-number-2">2</span> Huddle Test</h2>
|
||||
<div class="outline-text-2" id="text-2">
|
||||
<p>
|
||||
The goal in this section is the estimate the noise of both the encoder and the intereferometer.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org169c9b3" class="outline-3">
|
||||
<h3 id="org169c9b3"><span class="section-number-3">2.1</span> Load Data</h3>
|
||||
<div class="outline-text-3" id="text-2-1">
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">load(<span class="org-string">'mat/int_enc_huddle_test.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'t'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org71d6eed" class="outline-3">
|
||||
<h3 id="org71d6eed"><span class="section-number-3">2.2</span> Time Domain Results</h3>
|
||||
<div class="outline-text-3" id="text-2-2">
|
||||
|
||||
<div id="org06a0d1c" class="figure">
|
||||
<p><img src="figs/huddle_test_time_domain.png" alt="huddle_test_time_domain.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 4: </span>Huddle test - Time domain signals</p>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>10);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="orgee9ad22" class="figure">
|
||||
<p><img src="figs/huddle_test_time_domain_filtered.png" alt="huddle_test_time_domain_filtered.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 5: </span>Huddle test - Time domain signals filtered with a LPF at 10Hz</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org526b687" class="outline-3">
|
||||
<h3 id="org526b687"><span class="section-number-3">2.3</span> Frequency Domain Noise</h3>
|
||||
<div class="outline-text-3" id="text-2-3">
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4;
|
||||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||||
|
||||
[p_i, f] = pwelch(interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
[p_e, <span class="org-type">~</span>] = pwelch(encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org7e02bb2" class="figure">
|
||||
<p><img src="figs/huddle_test_asd.png" alt="huddle_test_asd.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 6: </span>Amplitude Spectral Density of the signals during the Huddle test</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org25a61fe" class="outline-2">
|
||||
<h2 id="org25a61fe"><span class="section-number-2">3</span> Comparison Interferometer / Encoder</h2>
|
||||
<div class="outline-text-2" id="text-3">
|
||||
<p>
|
||||
The goal here is to make sure that the interferometer and encoder measurements are coherent.
|
||||
We may see non-linearity in the interferometric measurement.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-orgb31234a" class="outline-3">
|
||||
<h3 id="orgb31234a"><span class="section-number-3">3.1</span> Load Data</h3>
|
||||
<div class="outline-text-3" id="text-3-1">
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">load(<span class="org-string">'mat/int_enc_comp.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
u = detrend(u, 0);
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org4fa5441" class="outline-3">
|
||||
<h3 id="org4fa5441"><span class="section-number-3">3.2</span> Time Domain Results</h3>
|
||||
<div class="outline-text-3" id="text-3-2">
|
||||
|
||||
<div id="org486d613" class="figure">
|
||||
<p><img src="figs/int_enc_one_cycle.png" alt="int_enc_one_cycle.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 7: </span>One cycle measurement</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org2bb119e" class="figure">
|
||||
<p><img src="figs/int_enc_one_cycle_error.png" alt="int_enc_one_cycle_error.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 8: </span>Difference between the Encoder and the interferometer during one cycle</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-orge79e200" class="outline-3">
|
||||
<h3 id="orge79e200"><span class="section-number-3">3.3</span> Difference between Encoder and Interferometer as a function of time</h3>
|
||||
<div class="outline-text-3" id="text-3-3">
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4;
|
||||
d_i_mean = reshape(interferometer, [2<span class="org-type">/</span>Ts floor(Ts<span class="org-type">/</span>2<span class="org-type">*</span>length(interferometer))]);
|
||||
d_e_mean = reshape(encoder, [2<span class="org-type">/</span>Ts floor(Ts<span class="org-type">/</span>2<span class="org-type">*</span>length(encoder))]);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">w0 = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>5; <span class="org-comment">% [rad/s]</span>
|
||||
xi = 0.7;
|
||||
|
||||
G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> 2<span class="org-type">*</span>xi<span class="org-type">/</span>w0<span class="org-type">*</span>s <span class="org-type">+</span> s<span class="org-type">^</span>2<span class="org-type">/</span>w0<span class="org-type">^</span>2);
|
||||
|
||||
d_err_mean = reshape(lsim(G_lpf, encoder <span class="org-type">-</span> interferometer, t), [2<span class="org-type">/</span>Ts floor(Ts<span class="org-type">/</span>2<span class="org-type">*</span>length(encoder))]);
|
||||
d_err_mean = d_err_mean <span class="org-type">-</span> mean(d_err_mean);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="orgf0015d1" class="figure">
|
||||
<p><img src="figs/int_enc_error_mean_time.png" alt="int_enc_error_mean_time.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 9: </span>Difference between the two measurement in the time domain, averaged for all the cycles</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org625a811" class="outline-3">
|
||||
<h3 id="org625a811"><span class="section-number-3">3.4</span> Difference between Encoder and Interferometer as a function of position</h3>
|
||||
<div class="outline-text-3" id="text-3-4">
|
||||
<p>
|
||||
Compute the mean of the interferometer measurement corresponding to each of the encoder measurement.
|
||||
</p>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">[e_sorted, <span class="org-type">~</span>, e_ind] = unique(encoder);
|
||||
|
||||
i_mean = zeros(length(e_sorted), 1);
|
||||
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(e_sorted)</span>
|
||||
i_mean(<span class="org-constant">i</span>) = mean(interferometer(e_ind <span class="org-type">==</span> <span class="org-constant">i</span>));
|
||||
<span class="org-keyword">end</span>
|
||||
|
||||
i_mean_error = (i_mean <span class="org-type">-</span> e_sorted);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="orgd4f6d77" class="figure">
|
||||
<p><img src="figs/int_enc_error_mean_position.png" alt="int_enc_error_mean_position.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 10: </span>Difference between the two measurement as a function of the measured position by the encoder, averaged for all the cycles</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The period of the non-linearity seems to be \(1.53 \mu m\) which corresponds to the wavelength of the Laser.
|
||||
</p>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">win_length = 1530; <span class="org-comment">% length of the windows (corresponds to 1.53 um)</span>
|
||||
num_avg = floor(length(e_sorted)<span class="org-type">/</span>win_length); <span class="org-comment">% number of averaging</span>
|
||||
|
||||
i_init = ceil((length(e_sorted) <span class="org-type">-</span> win_length<span class="org-type">*</span>num_avg)<span class="org-type">/</span>2); <span class="org-comment">% does not start at the extremity</span>
|
||||
|
||||
e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init<span class="org-type">:</span>i_init<span class="org-type">+</span>win_length<span class="org-type">*</span>num_avg<span class="org-type">-</span>1), [win_length num_avg]), 2);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="orgb5a621e" class="figure">
|
||||
<p><img src="figs/int_non_linearity_period_wavelength.png" alt="int_non_linearity_period_wavelength.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 11: </span>Non-Linearity of the Interferometer over the period of the wavelength</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org2e4bf3b" class="outline-2">
|
||||
<h2 id="org2e4bf3b"><span class="section-number-2">4</span> Identification</h2>
|
||||
<div class="outline-text-2" id="text-4">
|
||||
</div>
|
||||
<div id="outline-container-org8a892bd" class="outline-3">
|
||||
<h3 id="org8a892bd"><span class="section-number-3">4.1</span> Load Data</h3>
|
||||
<div class="outline-text-3" id="text-4-1">
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">load(<span class="org-string">'mat/int_enc_id_noise_bis.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
u = detrend(u, 0);
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org7e3c2ba" class="outline-3">
|
||||
<h3 id="org7e3c2ba"><span class="section-number-3">4.2</span> Identification</h3>
|
||||
<div class="outline-text-3" id="text-4-2">
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% Sampling Time [s]</span>
|
||||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">[tf_i_est, f] = tfestimate(u, interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
[co_i_est, <span class="org-type">~</span>] = mscohere(u, interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
|
||||
[tf_e_est, <span class="org-type">~</span>] = tfestimate(u, encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
[co_e_est, <span class="org-type">~</span>] = mscohere(u, encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org801d42d" class="figure">
|
||||
<p><img src="figs/identification_dynamics_coherence.png" alt="identification_dynamics_coherence.png" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="org7f77bc5" class="figure">
|
||||
<p><img src="figs/identification_dynamics_bode.png" alt="identification_dynamics_bode.png" />
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="postamble" class="status">
|
||||
<p class="author">Author: Dehaeze Thomas</p>
|
||||
<p class="date">Created: 2020-10-23 ven. 23:04</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
7
js/bootstrap.min.js
vendored
4
js/jquery.min.js
vendored
1
js/jquery.stickytableheaders.min.js
vendored
@@ -1 +0,0 @@
|
||||
!function(a,b){"use strict";function c(c,g){var h=this;h.$el=a(c),h.el=c,h.id=e++,h.$window=a(b),h.$document=a(document),h.$el.bind("destroyed",a.proxy(h.teardown,h)),h.$clonedHeader=null,h.$originalHeader=null,h.isSticky=!1,h.hasBeenSticky=!1,h.leftOffset=null,h.topOffset=null,h.init=function(){h.$el.each(function(){var b=a(this);b.css("padding",0),h.$originalHeader=a("thead:first",this),h.$clonedHeader=h.$originalHeader.clone(),b.trigger("clonedHeader."+d,[h.$clonedHeader]),h.$clonedHeader.addClass("tableFloatingHeader"),h.$clonedHeader.css("display","none"),h.$originalHeader.addClass("tableFloatingHeaderOriginal"),h.$originalHeader.after(h.$clonedHeader),h.$printStyle=a('<style type="text/css" media="print">.tableFloatingHeader{display:none !important;}.tableFloatingHeaderOriginal{position:static !important;}</style>'),a("head").append(h.$printStyle)}),h.setOptions(g),h.updateWidth(),h.toggleHeaders(),h.bind()},h.destroy=function(){h.$el.unbind("destroyed",h.teardown),h.teardown()},h.teardown=function(){h.isSticky&&h.$originalHeader.css("position","static"),a.removeData(h.el,"plugin_"+d),h.unbind(),h.$clonedHeader.remove(),h.$originalHeader.removeClass("tableFloatingHeaderOriginal"),h.$originalHeader.css("visibility","visible"),h.$printStyle.remove(),h.el=null,h.$el=null},h.bind=function(){h.$scrollableArea.on("scroll."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.on("scroll."+d+h.id,h.setPositionValues),h.$window.on("resize."+d+h.id,h.toggleHeaders)),h.$scrollableArea.on("resize."+d,h.toggleHeaders),h.$scrollableArea.on("resize."+d,h.updateWidth)},h.unbind=function(){h.$scrollableArea.off("."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.off("."+d+h.id,h.setPositionValues),h.$window.off("."+d+h.id,h.toggleHeaders)),h.$scrollableArea.off("."+d,h.updateWidth)},h.toggleHeaders=function(){h.$el&&h.$el.each(function(){var b,c=a(this),d=h.isWindowScrolling?isNaN(h.options.fixedOffset)?h.options.fixedOffset.outerHeight():h.options.fixedOffset:h.$scrollableArea.offset().top+(isNaN(h.options.fixedOffset)?0:h.options.fixedOffset),e=c.offset(),f=h.$scrollableArea.scrollTop()+d,g=h.$scrollableArea.scrollLeft(),i=h.isWindowScrolling?f>e.top:d>e.top,j=(h.isWindowScrolling?f:0)<e.top+c.height()-h.$clonedHeader.height()-(h.isWindowScrolling?0:d);i&&j?(b=e.left-g+h.options.leftOffset,h.$originalHeader.css({position:"fixed","margin-top":h.options.marginTop,left:b,"z-index":3}),h.leftOffset=b,h.topOffset=d,h.$clonedHeader.css("display",""),h.isSticky||(h.isSticky=!0,h.updateWidth()),h.setPositionValues()):h.isSticky&&(h.$originalHeader.css("position","static"),h.$clonedHeader.css("display","none"),h.isSticky=!1,h.resetWidth(a("td,th",h.$clonedHeader),a("td,th",h.$originalHeader)))})},h.setPositionValues=function(){var a=h.$window.scrollTop(),b=h.$window.scrollLeft();!h.isSticky||0>a||a+h.$window.height()>h.$document.height()||0>b||b+h.$window.width()>h.$document.width()||h.$originalHeader.css({top:h.topOffset-(h.isWindowScrolling?0:a),left:h.leftOffset-(h.isWindowScrolling?0:b)})},h.updateWidth=function(){if(h.isSticky){h.$originalHeaderCells||(h.$originalHeaderCells=a("th,td",h.$originalHeader)),h.$clonedHeaderCells||(h.$clonedHeaderCells=a("th,td",h.$clonedHeader));var b=h.getWidth(h.$clonedHeaderCells);h.setWidth(b,h.$clonedHeaderCells,h.$originalHeaderCells),h.$originalHeader.css("width",h.$clonedHeader.width())}},h.getWidth=function(c){var d=[];return c.each(function(c){var e,f=a(this);if("border-box"===f.css("box-sizing"))e=f[0].getBoundingClientRect().width;else{var g=a("th",h.$originalHeader);if("collapse"===g.css("border-collapse"))if(b.getComputedStyle)e=parseFloat(b.getComputedStyle(this,null).width);else{var i=parseFloat(f.css("padding-left")),j=parseFloat(f.css("padding-right")),k=parseFloat(f.css("border-width"));e=f.outerWidth()-i-j-k}else e=f.width()}d[c]=e}),d},h.setWidth=function(a,b,c){b.each(function(b){var d=a[b];c.eq(b).css({"min-width":d,"max-width":d})})},h.resetWidth=function(b,c){b.each(function(b){var d=a(this);c.eq(b).css({"min-width":d.css("min-width"),"max-width":d.css("max-width")})})},h.setOptions=function(c){h.options=a.extend({},f,c),h.$scrollableArea=a(h.options.scrollableArea),h.isWindowScrolling=h.$scrollableArea[0]===b},h.updateOptions=function(a){h.setOptions(a),h.unbind(),h.bind(),h.updateWidth(),h.toggleHeaders()},h.init()}var d="stickyTableHeaders",e=0,f={fixedOffset:0,leftOffset:0,marginTop:0,scrollableArea:b};a.fn[d]=function(b){return this.each(function(){var e=a.data(this,"plugin_"+d);e?"string"==typeof b?e[b].apply(e):e.updateOptions(b):"destroy"!==b&&a.data(this,"plugin_"+d,new c(this,b))})}}(jQuery,window);
|
@@ -1,85 +0,0 @@
|
||||
$(function() {
|
||||
$('.note').before("<p class='admonition-title note'>Note</p>");
|
||||
$('.seealso').before("<p class='admonition-title seealso'>See also</p>");
|
||||
$('.warning').before("<p class='admonition-title warning'>Warning</p>");
|
||||
$('.caution').before("<p class='admonition-title caution'>Caution</p>");
|
||||
$('.attention').before("<p class='admonition-title attention'>Attention</p>");
|
||||
$('.tip').before("<p class='admonition-title tip'>Tip</p>");
|
||||
$('.important').before("<p class='admonition-title important'>Important</p>");
|
||||
$('.hint').before("<p class='admonition-title hint'>Hint</p>");
|
||||
$('.error').before("<p class='admonition-title error'>Error</p>");
|
||||
$('.danger').before("<p class='admonition-title danger'>Danger</p>");
|
||||
});
|
||||
|
||||
$( document ).ready(function() {
|
||||
|
||||
// Shift nav in mobile when clicking the menu.
|
||||
$(document).on('click', "[data-toggle='wy-nav-top']", function() {
|
||||
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
|
||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
||||
});
|
||||
// Close menu when you click a link.
|
||||
$(document).on('click', ".wy-menu-vertical .current ul li a", function() {
|
||||
$("[data-toggle='wy-nav-shift']").removeClass("shift");
|
||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
||||
});
|
||||
$(document).on('click', "[data-toggle='rst-current-version']", function() {
|
||||
$("[data-toggle='rst-versions']").toggleClass("shift-up");
|
||||
});
|
||||
// Make tables responsive
|
||||
$("table.docutils:not(.field-list)").wrap("<div class='wy-table-responsive'></div>");
|
||||
});
|
||||
|
||||
$( document ).ready(function() {
|
||||
$('#text-table-of-contents ul').first().addClass('nav');
|
||||
// ScrollSpy also requires that we use
|
||||
// a Bootstrap nav component.
|
||||
$('body').scrollspy({target: '#text-table-of-contents'});
|
||||
|
||||
// add sticky table headers
|
||||
$('table').stickyTableHeaders();
|
||||
|
||||
// set the height of tableOfContents
|
||||
var $postamble = $('#postamble');
|
||||
var $tableOfContents = $('#table-of-contents');
|
||||
$tableOfContents.css({paddingBottom: $postamble.outerHeight()});
|
||||
|
||||
// add TOC button
|
||||
var toggleSidebar = $('<div id="toggle-sidebar"><a href="#table-of-contents"><h2>Table of Contents</h2></a></div>');
|
||||
$('#content').prepend(toggleSidebar);
|
||||
|
||||
// add close button when sidebar showed in mobile screen
|
||||
var closeBtn = $('<a class="close-sidebar" href="#">Close</a>');
|
||||
var tocTitle = $('#table-of-contents').find('h2');
|
||||
tocTitle.append(closeBtn);
|
||||
});
|
||||
|
||||
window.SphinxRtdTheme = (function (jquery) {
|
||||
var stickyNav = (function () {
|
||||
var navBar,
|
||||
win,
|
||||
stickyNavCssClass = 'stickynav',
|
||||
applyStickNav = function () {
|
||||
if (navBar.height() <= win.height()) {
|
||||
navBar.addClass(stickyNavCssClass);
|
||||
} else {
|
||||
navBar.removeClass(stickyNavCssClass);
|
||||
}
|
||||
},
|
||||
enable = function () {
|
||||
applyStickNav();
|
||||
win.on('resize', applyStickNav);
|
||||
},
|
||||
init = function () {
|
||||
navBar = jquery('nav.wy-nav-side:first');
|
||||
win = jquery(window);
|
||||
};
|
||||
jquery(init);
|
||||
return {
|
||||
enable : enable
|
||||
};
|
||||
}());
|
||||
return {
|
||||
StickyNav : stickyNav
|
||||
};
|
||||
}($));
|
118
matlab/dynamics_encoder.m
Normal file
@@ -0,0 +1,118 @@
|
||||
%% Clear Workspace and Close figures
|
||||
clear; close all; clc;
|
||||
|
||||
%% Intialize Laplace variable
|
||||
s = zpk('s');
|
||||
|
||||
% Load Data
|
||||
% As usual, the measurement data are loaded.
|
||||
|
||||
load('int_enc_id_noise_bis.mat', 'interferometer', 'encoder', 'u', 't');
|
||||
|
||||
|
||||
|
||||
% The first 0.1 seconds are removed as it corresponds to transient behavior.
|
||||
|
||||
interferometer = interferometer(t>0.1);
|
||||
encoder = encoder(t>0.1);
|
||||
u = u(t>0.1);
|
||||
t = t(t>0.1);
|
||||
|
||||
|
||||
|
||||
% Finally the offset are removed using the =detrend= command.
|
||||
|
||||
interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
u = detrend(u, 0);
|
||||
|
||||
% Excitation and Measured Signals
|
||||
% The excitation signal is a white noise filtered by a low pass filter to not excite too much the high frequency modes.
|
||||
|
||||
% The excitation signal is shown in Figure [[fig:encoder_identification_excitation_time]].
|
||||
|
||||
figure;
|
||||
plot(t, u);
|
||||
xlabel('Time [s]'); ylabel('Voltage [V]');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:encoder_identification_excitation_time
|
||||
% #+caption:
|
||||
% #+RESULTS:
|
||||
% [[file:figs/encoder_identification_excitation_time.png]]
|
||||
|
||||
% The measured motion by the interferometer and encoder is shown in Figure
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(t, interferometer, 'DisplayName', 'Interferometer');
|
||||
plot(t, encoder, 'DisplayName', 'Encoder');
|
||||
hold off;
|
||||
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||
legend('location', 'southeast');
|
||||
|
||||
% Identification
|
||||
% Now the dynamics from the voltage sent to the voltage amplitude driving the APA95ML to the measured displacement by both the encoder and interferometer are computed.
|
||||
|
||||
|
||||
Ts = 1e-4; % Sampling Time [s]
|
||||
win = hann(ceil(10/Ts));
|
||||
|
||||
[tf_i_est, f] = tfestimate(u, interferometer, win, [], [], 1/Ts);
|
||||
[co_i_est, ~] = mscohere(u, interferometer, win, [], [], 1/Ts);
|
||||
|
||||
[tf_e_est, ~] = tfestimate(u, encoder, win, [], [], 1/Ts);
|
||||
[co_e_est, ~] = mscohere(u, encoder, win, [], [], 1/Ts);
|
||||
|
||||
|
||||
|
||||
% The obtained coherence is shown in Figure [[fig:identification_dynamics_coherence]].
|
||||
% It is shown that the identification is good until 500Hz for the interferometer and until 1kHz for the encoder.
|
||||
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, co_i_est, '-', 'DisplayName', 'Interferometer')
|
||||
plot(f, co_e_est, '-', 'DisplayName', 'Encoder')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Coherence'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
xlim([0.5, 5e3]);
|
||||
legend('location', 'southwest');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:identification_dynamics_coherence
|
||||
% #+caption:
|
||||
% #+RESULTS:
|
||||
% [[file:figs/identification_dynamics_coherence.png]]
|
||||
|
||||
% The compared dynamics as measured by the intereferometer and encoder are shown in Figure [[fig:identification_dynamics_bode]].
|
||||
|
||||
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2, 1]);
|
||||
hold on;
|
||||
plot(f, abs(tf_i_est), '-', 'DisplayName', 'Interferometer')
|
||||
plot(f, abs(tf_e_est), '-', 'DisplayName', 'Encoder')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
|
||||
hold off;
|
||||
ylim([1e-7, 3e-4]);
|
||||
legend('location', 'southwest');
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
plot(f, 180/pi*angle(tf_i_est), '-')
|
||||
plot(f, 180/pi*angle(tf_e_est), '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
yticks(-360:90:360);
|
||||
axis padded 'auto x'
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([0.5, 5e3]);
|
72
matlab/encoder_noise.m
Normal file
@@ -0,0 +1,72 @@
|
||||
%% Clear Workspace and Close figures
|
||||
clear; close all; clc;
|
||||
|
||||
%% Intialize Laplace variable
|
||||
s = zpk('s');
|
||||
|
||||
% Load Data
|
||||
% The measurement data are loaded and the offset are removed using the =detrend= command.
|
||||
|
||||
|
||||
load('int_enc_huddle_test.mat', 'interferometer', 'encoder', 't');
|
||||
|
||||
interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
|
||||
% Time Domain Results
|
||||
% The measurement of both the encoder and interferometer are shown in Figure [[fig:huddle_test_time_domain]].
|
||||
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(t, encoder, 'DisplayName', 'Encoder')
|
||||
plot(t, interferometer, 'DisplayName', 'Interferometer')
|
||||
hold off;
|
||||
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||
legend('location', 'northeast');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:huddle_test_time_domain
|
||||
% #+caption: Huddle test - Time domain signals
|
||||
% #+RESULTS:
|
||||
% [[file:figs/huddle_test_time_domain.png]]
|
||||
|
||||
% The raw signals are filtered with a Low Pass filter (defined below) such that we can see the low frequency motion (Figure [[fig:huddle_test_time_domain_filtered]]).
|
||||
|
||||
G_lpf = 1/(1 + s/2/pi/10);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(t, lsim(G_lpf, encoder, t), 'DisplayName', 'Encoder')
|
||||
plot(t, lsim(G_lpf, interferometer, t), 'DisplayName', 'Interferometer')
|
||||
hold off;
|
||||
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||
legend('location', 'northeast');
|
||||
|
||||
% Frequency Domain Noise
|
||||
% The noise of the measurement (supposing there is no motion) is now translated in the frequency domain by computed the Amplitude Spectral Density.
|
||||
|
||||
|
||||
Ts = 1e-4;
|
||||
win = hann(ceil(10/Ts));
|
||||
|
||||
[p_i, f] = pwelch(interferometer, win, [], [], 1/Ts);
|
||||
[p_e, ~] = pwelch(encoder, win, [], [], 1/Ts);
|
||||
|
||||
|
||||
|
||||
% The comparison of the ASD of the encoder and interferometer are shown in Figure [[fig:huddle_test_asd]].
|
||||
|
||||
% It is clear that although the encoder exhibit higher frequency noise, is it more stable at low frequency as the length of the beam path in the air is much smaller and thus changed of temperature/pressure/humity of the air has much smaller effect on the measured displacement.
|
||||
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, sqrt(p_i), 'DisplayName', 'Interferometer');
|
||||
plot(f, sqrt(p_e), 'DisplayName', 'Encoder');
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('ASD [$m/\sqrt{Hz}$]'); xlabel('Frequency [Hz]');
|
||||
legend();
|
||||
xlim([1e-1, 5e3]);
|
@@ -1,616 +0,0 @@
|
||||
|
||||
%% Huddle Test
|
||||
ht = load('./mat/huddle_test.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
|
||||
% Detrend Data
|
||||
ht.d = detrend(ht.d, 0);
|
||||
ht.acc_1 = detrend(ht.acc_1, 0);
|
||||
ht.acc_2 = detrend(ht.acc_2, 0);
|
||||
ht.geo_1 = detrend(ht.geo_1, 0);
|
||||
ht.geo_2 = detrend(ht.geo_2, 0);
|
||||
ht.f_meas = detrend(ht.f_meas, 0);
|
||||
|
||||
% Compute PSD
|
||||
run setup;
|
||||
|
||||
win = hann(ceil(10/Ts));
|
||||
|
||||
[p_d, f] = pwelch(ht.d, win, [], [], 1/Ts);
|
||||
[p_acc1, ~] = pwelch(ht.acc_1, win, [], [], 1/Ts);
|
||||
[p_acc2, ~] = pwelch(ht.acc_2, win, [], [], 1/Ts);
|
||||
[p_geo1, ~] = pwelch(ht.geo_1, win, [], [], 1/Ts);
|
||||
[p_geo2, ~] = pwelch(ht.geo_2, win, [], [], 1/Ts);
|
||||
[p_fmeas, ~] = pwelch(ht.f_meas, win, [], [], 1/Ts);
|
||||
|
||||
% Plot PSD
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, p_acc1);
|
||||
plot(f, p_acc2);
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('PSD [$V^2/Hz$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test - Accelerometers')
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, p_geo1);
|
||||
plot(f, p_geo2);
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('PSD [$V^2/Hz$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test - Geophones')
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, p_d);
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('PSD [$m^2/Hz$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test - Interferometers')
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, p_fmeas);
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('PSD [$V^2/Hz$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test - Force Sensor')
|
||||
|
||||
%% Accelerometer and Geophone Models
|
||||
% Accelerometer used: https://www.pcb.com/products?model=393B05
|
||||
% Geophone used: L22 https://www.sercel.com/products/Lists/ProductSpecification/Geophones_brochure_Sercel_EN.pdf
|
||||
|
||||
G_acc = 1/(1 + s/2/pi/2500); % [V/(m/s2)]
|
||||
G_geo = 120*s^2/(s^2 + 2*0.7*2*pi*2*s + (2*pi*2)^2); % [[V/(m/s)]
|
||||
|
||||
% PSD of intertial sensors in [m^2/Hz]
|
||||
figure;
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, sqrt(p_acc1)./abs(squeeze(freqresp(G_acc*s^2, f, 'Hz'))), ...
|
||||
'DisplayName', 'Accelerometer');
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, sqrt(p_acc2)./abs(squeeze(freqresp(G_acc*s^2, f, 'Hz'))), ...
|
||||
'HandleVisibility', 'off');
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, sqrt(p_geo1)./abs(squeeze(freqresp(G_geo*s, f, 'Hz'))), ...
|
||||
'DisplayName', 'Geophone');
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, sqrt(p_geo2)./abs(squeeze(freqresp(G_geo*s, f, 'Hz'))), ...
|
||||
'HandleVisibility', 'off');
|
||||
set(gca, 'ColorOrderIndex', 3);
|
||||
plot(f, sqrt(p_d), 'DisplayName', 'Interferometer');
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('ASD [$m/\sqrt{Hz}$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test')
|
||||
legend();
|
||||
|
||||
%% Compare Theoretical model with identified one
|
||||
id_ol = load('./mat/identification_noise_bis.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
|
||||
% Detrend Data
|
||||
id_ol.d = detrend(id_ol.d, 0);
|
||||
id_ol.acc_1 = detrend(id_ol.acc_1, 0);
|
||||
id_ol.acc_2 = detrend(id_ol.acc_2, 0);
|
||||
id_ol.geo_1 = detrend(id_ol.geo_1, 0);
|
||||
id_ol.geo_2 = detrend(id_ol.geo_2, 0);
|
||||
id_ol.f_meas = detrend(id_ol.f_meas, 0);
|
||||
id_ol.u = detrend(id_ol.u, 0);
|
||||
|
||||
% Identification Parameters
|
||||
run setup;
|
||||
win = hann(ceil(10/Ts));
|
||||
|
||||
% IFF Plant
|
||||
[tf_fmeas_est, f] = tfestimate(id_ol.u, id_ol.f_meas, win, [], [], 1/Ts); % [V/m]
|
||||
[co_fmeas_est, ~] = mscohere(id_ol.u, id_ol.f_meas, win, [], [], 1/Ts);
|
||||
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
plot(f, abs(tf_fmeas_est), '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
plot(f, 180/pi*angle(tf_fmeas_est), '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([40, 400]);
|
||||
|
||||
% Geophones
|
||||
[tf_geo1_est, ~] = tfestimate(id_ol.d, id_ol.geo_1, win, [], [], 1/Ts); % [V/m]
|
||||
[co_geo1_est, ~] = mscohere(id_ol.d, id_ol.geo_1, win, [], [], 1/Ts);
|
||||
|
||||
[tf_geo2_est, ~] = tfestimate(id_ol.d, id_ol.geo_2, win, [], [], 1/Ts); % [V/m]
|
||||
[co_geo2_est, ~] = mscohere(id_ol.d, id_ol.geo_2, win, [], [], 1/Ts);
|
||||
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, abs(tf_geo1_est), '.')
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, abs(tf_geo2_est), '.')
|
||||
plot(f, abs(squeeze(freqresp(G_geo, f, 'Hz')).*(1i*2*pi*f)), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, 180/pi*angle(tf_geo1_est), '.')
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, 180/pi*angle(tf_geo2_est), '.')
|
||||
plot(f, 180/pi*angle(-squeeze(freqresp(G_geo, f, 'Hz')).*(1i*2*pi*f)), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([40, 400]);
|
||||
|
||||
% Accelerometers
|
||||
[tf_acc1_est, ~] = tfestimate(id_ol.d, id_ol.acc_1, win, [], [], 1/Ts); % [V/m]
|
||||
[co_acc1_est, ~] = mscohere(id_ol.d, id_ol.acc_1, win, [], [], 1/Ts);
|
||||
|
||||
[tf_acc2_est, ~] = tfestimate(id_ol.d, id_ol.acc_2, win, [], [], 1/Ts); % [V/m]
|
||||
[co_acc2_est, ~] = mscohere(id_ol.d, id_ol.acc_2, win, [], [], 1/Ts);
|
||||
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, abs(tf_acc1_est), '.')
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, abs(tf_acc2_est), '.')
|
||||
plot(f, abs(squeeze(freqresp(G_acc, f, 'Hz')).*(1i*2*pi*f).^2), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, 180/pi*angle(tf_acc1_est), '.')
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, 180/pi*angle(tf_acc2_est), '.')
|
||||
plot(f, 180/pi*angle(squeeze(freqresp(G_acc, f, 'Hz')).*(1i*2*pi*f).^2), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([40, 400]);
|
||||
|
||||
|
||||
|
||||
%% IFF development
|
||||
[tf_fmeas_est, f] = tfestimate(id_ol.u, id_ol.f_meas, win, [], [], 1/Ts); % [V/m]
|
||||
[co_fmeas_est, ~] = mscohere(id_ol.u, id_ol.f_meas, win, [], [], 1/Ts);
|
||||
|
||||
% Model
|
||||
wz = 2*pi*103;
|
||||
xi_z = 0.01;
|
||||
wp = 2*pi*238;
|
||||
xi_p = 0.015;
|
||||
|
||||
Giff = 20*(s^2 + 2*xi_z*s*wz + wz^2)/(s^2 + 2*xi_p*s*wp + wp^2)*(s/3/pi/(1 + s/3/pi));
|
||||
|
||||
% Comparison model and identification
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
plot(f, abs(tf_fmeas_est), '.')
|
||||
plot(f, abs(squeeze(freqresp(Giff, f, 'Hz'))), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
plot(f, 180/pi*angle(tf_fmeas_est), '.')
|
||||
plot(f, 180/pi*angle(squeeze(freqresp(Giff, f, 'Hz'))), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([40, 400]);
|
||||
|
||||
% Root Locus
|
||||
gains = logspace(0, 5, 1000);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(real(pole(Giff)), imag(pole(Giff)), 'kx');
|
||||
plot(real(tzero(Giff)), imag(tzero(Giff)), 'ko');
|
||||
for i = 1:length(gains)
|
||||
cl_poles = pole(feedback(Giff, gains(i)/(s + 2*pi*2)));
|
||||
plot(real(cl_poles), imag(cl_poles), 'k.');
|
||||
end
|
||||
ylim([0, 1800]);
|
||||
xlim([-1600,200]);
|
||||
xlabel('Real Part')
|
||||
ylabel('Imaginary Part')
|
||||
axis square
|
||||
|
||||
% Optimal Controller
|
||||
Kiff_opt = 110/(s + 2*pi*2);
|
||||
|
||||
%% New identification
|
||||
id_ol = load('./mat/identification_chirp_40_400.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
id_cl = load('./mat/identification_chirp_40_400_iff.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
|
||||
% Used controller
|
||||
Kiff = -110/(s + 2*pi*2);
|
||||
|
||||
[tf_G_ol_est, f] = tfestimate(id_ol.u, id_ol.d, win, [], [], 1/Ts);
|
||||
[co_G_ol_est, ~] = mscohere(id_ol.u, id_ol.d, win, [], [], 1/Ts);
|
||||
[tf_G_cl_est, ~] = tfestimate(id_cl.u, id_cl.d, win, [], [], 1/Ts);
|
||||
[co_G_cl_est, ~] = mscohere(id_cl.u, id_cl.d, win, [], [], 1/Ts);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, co_G_ol_est, '-')
|
||||
plot(f, co_G_cl_est, '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Coherence'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
xlim([40, 400]); ylim([0, 1])
|
||||
|
||||
% Comparison model and identification
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
plot(f, abs(tf_G_ol_est), '-')
|
||||
plot(f, abs(tf_G_cl_est), '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
plot(f, 180/pi*angle(tf_G_ol_est), '-')
|
||||
plot(f, 180/pi*angle(tf_G_cl_est), '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([40, 400]);
|
||||
|
||||
|
||||
%% Excitation Signal
|
||||
run setup;
|
||||
|
||||
% Get trasnfer function from input [V] to output displacement [m]
|
||||
id_cl = load('./mat/identification_noise_iff_bis.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
|
||||
win = hann(ceil(10/Ts));
|
||||
|
||||
[tf_G_cl_est, f] = tfestimate(id_cl.u, id_cl.d, win, [], [], 1/Ts);
|
||||
[co_G_cl_est, ~] = mscohere(id_cl.u, id_cl.d, win, [], [], 1/Ts);
|
||||
|
||||
G_d_est = -5e-6*(2*pi*230)^2/(s^2 + 2*0.3*2*pi*240*s + (2*pi*240)^2);
|
||||
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
plot(f, abs(tf_G_cl_est), '-')
|
||||
plot(f, abs(squeeze(freqresp(G_d_est, f, 'Hz'))), '--')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude [m/V]'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
plot(f, 180/pi*angle(tf_G_cl_est), '-')
|
||||
plot(f, 180/pi*angle(squeeze(freqresp(G_d_est, f, 'Hz'))), '--')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([10, 1000]);
|
||||
|
||||
%
|
||||
ht = load('./mat/huddle_test.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
|
||||
ht.d = detrend(ht.d, 0);
|
||||
ht.acc_1 = detrend(ht.acc_1, 0);
|
||||
ht.acc_2 = detrend(ht.acc_2, 0);
|
||||
ht.geo_1 = detrend(ht.geo_1, 0);
|
||||
ht.geo_2 = detrend(ht.geo_2, 0);
|
||||
|
||||
win = hann(ceil(10/Ts));
|
||||
|
||||
[p_d, f] = pwelch(ht.d, win, [], [], 1/Ts);
|
||||
[p_acc1, ~] = pwelch(ht.acc_1, win, [], [], 1/Ts);
|
||||
[p_acc2, ~] = pwelch(ht.acc_2, win, [], [], 1/Ts);
|
||||
[p_geo1, ~] = pwelch(ht.geo_1, win, [], [], 1/Ts);
|
||||
[p_geo2, ~] = pwelch(ht.geo_2, win, [], [], 1/Ts);
|
||||
|
||||
% Generate Time domain signal with wanted PSD
|
||||
Fs = 1/Ts; % Sampling Frequency [Hz]
|
||||
|
||||
t = 0:Ts:180; % Time Vector [s]
|
||||
u = sqrt(Fs/2)*randn(length(t), 1); % Signal with an ASD equal to one
|
||||
|
||||
G_exc = 0.2e-6/(1 + s/2/pi/2)/(1 + s/2/pi/50);
|
||||
|
||||
y_d = lsim(G_exc, u, t);
|
||||
|
||||
[pxx, ~] = pwelch(y_d, win, 0, [], Fs);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, sqrt(p_acc1)./abs(squeeze(freqresp(G_acc*s^2, f, 'Hz'))), ...
|
||||
'DisplayName', 'Accelerometer');
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, sqrt(p_acc2)./abs(squeeze(freqresp(G_acc*s^2, f, 'Hz'))), ...
|
||||
'HandleVisibility', 'off');
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, sqrt(p_geo1)./abs(squeeze(freqresp(G_geo*s, f, 'Hz'))), ...
|
||||
'DisplayName', 'Geophone');
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, sqrt(p_geo2)./abs(squeeze(freqresp(G_geo*s, f, 'Hz'))), ...
|
||||
'HandleVisibility', 'off');
|
||||
plot(f, sqrt(pxx), 'k-', ...
|
||||
'DisplayName', 'Excitation');
|
||||
set(gca, 'ColorOrderIndex', 3);
|
||||
plot(f, sqrt(p_d), 'DisplayName', 'Interferometer');
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('ASD [$m/\sqrt{Hz}$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test')
|
||||
legend();
|
||||
|
||||
% From displacement to Voltage
|
||||
y_v = lsim(G_exc*(1 + s/2/pi/50)/G_d_est/(1 + s/2/pi/5e3), u, t);
|
||||
figure; plot(t, y_v)
|
||||
figure; plot(t, lsim(G_pf, y_v, t))
|
||||
|
||||
%% Transfer function of inertial sensors
|
||||
load('./mat/identification_noise_opt_iff.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
%% Estimation of the inertial sensor transfer functions
|
||||
id = load('./mat/identification_noise_opt_iff.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
ht = load('./mat/huddle_test.mat', 'd', 'acc_1', 'acc_2', 'geo_1', 'geo_2', 'f_meas', 'u', 't');
|
||||
|
||||
ht.d = detrend(ht.d, 0);
|
||||
ht.acc_1 = detrend(ht.acc_1, 0);
|
||||
ht.acc_2 = detrend(ht.acc_2, 0);
|
||||
ht.geo_1 = detrend(ht.geo_1, 0);
|
||||
ht.geo_2 = detrend(ht.geo_2, 0);
|
||||
ht.f_meas = detrend(ht.f_meas, 0);
|
||||
|
||||
id.d = detrend(id.d, 0);
|
||||
id.acc_1 = detrend(id.acc_1, 0);
|
||||
id.acc_2 = detrend(id.acc_2, 0);
|
||||
id.geo_1 = detrend(id.geo_1, 0);
|
||||
id.geo_2 = detrend(id.geo_2, 0);
|
||||
id.f_meas = detrend(id.f_meas, 0);
|
||||
|
||||
% Compare PSD
|
||||
run setup;
|
||||
win = hann(ceil(10/Ts));
|
||||
|
||||
[p_id_d, f] = pwelch(id.d, win, [], [], 1/Ts);
|
||||
[p_id_acc1, ~] = pwelch(id.acc_1, win, [], [], 1/Ts);
|
||||
[p_id_acc2, ~] = pwelch(id.acc_2, win, [], [], 1/Ts);
|
||||
[p_id_geo1, ~] = pwelch(id.geo_1, win, [], [], 1/Ts);
|
||||
[p_id_geo2, ~] = pwelch(id.geo_2, win, [], [], 1/Ts);
|
||||
[p_id_fmeas, ~] = pwelch(id.f_meas, win, [], [], 1/Ts);
|
||||
|
||||
[p_ht_d, ~] = pwelch(ht.d, win, [], [], 1/Ts);
|
||||
[p_ht_acc1, ~] = pwelch(ht.acc_1, win, [], [], 1/Ts);
|
||||
[p_ht_acc2, ~] = pwelch(ht.acc_2, win, [], [], 1/Ts);
|
||||
[p_ht_geo1, ~] = pwelch(ht.geo_1, win, [], [], 1/Ts);
|
||||
[p_ht_geo2, ~] = pwelch(ht.geo_2, win, [], [], 1/Ts);
|
||||
[p_ht_fmeas, ~] = pwelch(ht.f_meas, win, [], [], 1/Ts);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, p_ht_acc1, 'DisplayName', 'Huddle Test');
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, p_ht_acc2, 'HandleVisibility', 'off');
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, p_id_acc1, 'DisplayName', 'Identification Test');
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, p_id_acc2, 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('PSD [$V^2/Hz$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test - Accelerometers')
|
||||
legend();
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, p_ht_geo1, 'DisplayName', 'Huddle Test');
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, p_ht_geo2, 'HandleVisibility', 'off');
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, p_id_geo1, 'DisplayName', 'Identification Test');
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, p_id_geo2, 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('PSD [$V^2/Hz$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test - Geophones')
|
||||
legend();
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, p_ht_d, 'DisplayName', 'Huddle Test');
|
||||
plot(f, p_id_d, 'DisplayName', 'Identification Test');
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('PSD [$m^2/Hz$]'); xlabel('Frequency [Hz]');
|
||||
title('Huddle Test - Interferometers')
|
||||
legend();
|
||||
|
||||
% tf and coh computation
|
||||
[tf_acc1_est, f] = tfestimate(id.d, id.acc_1, win, [], [], 1/Ts);
|
||||
[co_acc1_est, ~] = mscohere(id.d, id.acc_1, win, [], [], 1/Ts);
|
||||
[tf_acc2_est, ~] = tfestimate(id.d, id.acc_2, win, [], [], 1/Ts);
|
||||
[co_acc2_est, ~] = mscohere(id.d, id.acc_2, win, [], [], 1/Ts);
|
||||
|
||||
[tf_geo1_est, ~] = tfestimate(id.d, id.geo_1, win, [], [], 1/Ts);
|
||||
[co_geo1_est, ~] = mscohere(id.d, id.geo_1, win, [], [], 1/Ts);
|
||||
[tf_geo2_est, ~] = tfestimate(id.d, id.geo_2, win, [], [], 1/Ts);
|
||||
[co_geo2_est, ~] = mscohere(id.d, id.geo_2, win, [], [], 1/Ts);
|
||||
|
||||
% Coherence
|
||||
figure;
|
||||
hold on;
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, co_acc1_est, '-', 'DisplayName', 'Accelerometer')
|
||||
set(gca, 'ColorOrderIndex', 1);
|
||||
plot(f, co_acc2_est, '-', 'HandleVisibility', 'off')
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, co_geo1_est, '-', 'DisplayName', 'Geophone')
|
||||
set(gca, 'ColorOrderIndex', 2);
|
||||
plot(f, co_geo2_est, '-', 'HandleVisibility', 'off')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Coherence'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
xlim([2, 2e3]); ylim([0, 1])
|
||||
legend();
|
||||
|
||||
% Models
|
||||
G_acc = 1/(1 + s/2/pi/2500); % [V/(m/s2)]
|
||||
G_geo = -1200*s^2/(s^2 + 2*0.7*2*pi*2*s + (2*pi*2)^2); % [[V/(m/s)]
|
||||
|
||||
|
||||
% Transfer Functions
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
plot(f, abs(tf_acc1_est./(1i*2*pi*f).^2), '-')
|
||||
plot(f, abs(tf_acc2_est./(1i*2*pi*f).^2), '-')
|
||||
plot(f, abs(squeeze(freqresp(G_acc, f, 'Hz'))), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude [V/(m/s^2)]'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
plot(f, 180/pi*angle(tf_acc1_est./(1i*2*pi*f).^2), '-')
|
||||
plot(f, 180/pi*angle(tf_acc2_est./(1i*2*pi*f).^2), '-')
|
||||
plot(f, 180/pi*angle(squeeze(freqresp(G_acc, f, 'Hz'))), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([2, 2e3]);
|
||||
|
||||
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
hold on;
|
||||
plot(f, abs(tf_geo1_est./(1i*2*pi*f)), '-')
|
||||
plot(f, abs(tf_geo2_est./(1i*2*pi*f)), '-')
|
||||
plot(f, abs(squeeze(freqresp(G_geo, f, 'Hz'))), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude[V/(m/s)]'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
hold on;
|
||||
plot(f, 180/pi*angle(tf_geo1_est./(1i*2*pi*f)), '-')
|
||||
plot(f, 180/pi*angle(tf_geo2_est./(1i*2*pi*f)), '-')
|
||||
plot(f, 180/pi*angle(squeeze(freqresp(G_geo, f, 'Hz'))), 'k-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([0.5, 2e3]);
|
||||
|
||||
|
||||
%% Compare signal
|
||||
|
||||
id.acc_1 = detrend(id.acc_1, 0);
|
||||
id.acc_2 = detrend(id.acc_2, 0);
|
||||
id.geo_1 = detrend(id.geo_1, 0);
|
||||
id.geo_2 = detrend(id.geo_2, 0);
|
||||
id.d = detrend(id.d, 0);
|
||||
|
||||
G_acc = 1/(1 + s/2/pi/2500); % [V/(m/s2)]
|
||||
G_geo = -1200*s^2/(s^2 + 2*0.7*2*pi*2*s + (2*pi*2)^2); % [V/(m/s)]
|
||||
|
||||
G_hpf = (s/2/pi/2)/(1 + s/2/pi/2);
|
||||
|
||||
acc1_d = lsim(G_hpf*1/G_acc/(s + 2*pi)^2, id.acc_1, id.t);
|
||||
acc2_d = lsim(G_hpf*1/G_acc/(s + 2*pi)^2, id.acc_2, id.t);
|
||||
geo1_d = lsim(G_hpf*1/G_geo/(s + 2*pi), id.geo_1, id.t);
|
||||
geo2_d = lsim(G_hpf*1/G_geo/(s + 2*pi), id.geo_2, id.t);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(id.t, id.d);
|
||||
plot(id.t, acc1_d);
|
||||
plot(id.t, acc2_d);
|
||||
plot(id.t, geo1_d);
|
||||
plot(id.t, geo2_d);
|
||||
hold off;
|
||||
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||
|
||||
% Fusion
|
||||
wc = 2*pi*200;
|
||||
G_hpf = (s/wc)/(1 + s/wc);
|
||||
G_lpf = 1/(1 + s/wc);
|
||||
|
||||
ss_d = lsim(G_hpf, acc1_d, id.t) + lsim(G_lpf, geo1_d, id.t);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(id.t, id.d);
|
||||
plot(id.t, ss_d);
|
||||
hold off;
|
||||
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||
|
||||
|
||||
|
||||
|
343
test-bench-encoder.html
Normal file
@@ -0,0 +1,343 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<!-- 2021-02-02 mar. 19:16 -->
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
<title>Encoder - Test Bench</title>
|
||||
<meta name="generator" content="Org mode" />
|
||||
<meta name="author" content="Dehaeze Thomas" />
|
||||
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="org-div-home-and-up">
|
||||
<a accesskey="h" href="../index.html"> UP </a>
|
||||
|
|
||||
<a accesskey="H" href="../index.html"> HOME </a>
|
||||
</div><div id="content">
|
||||
<h1 class="title">Encoder - Test Bench</h1>
|
||||
<div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#org4f09976">1. Experimental Setup</a></li>
|
||||
<li><a href="#org5bbb12a">2. Noise Spectral Density of the Encoder</a>
|
||||
<ul>
|
||||
<li><a href="#org91e2f9a">2.1. Load Data</a></li>
|
||||
<li><a href="#org9392d29">2.2. Time Domain Results</a></li>
|
||||
<li><a href="#org998b458">2.3. Frequency Domain Noise</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org3ede191">3. Dynamics from Actuator to Encoder</a>
|
||||
<ul>
|
||||
<li><a href="#org0c30c61">3.1. Load Data</a></li>
|
||||
<li><a href="#org0975d17">3.2. Excitation and Measured Signals</a></li>
|
||||
<li><a href="#org516cfff">3.3. Identification</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<p>This report is also available as a <a href="./test-bench-encoder.pdf">pdf</a>.</p>
|
||||
<hr>
|
||||
|
||||
<p>
|
||||
In this document, we wish to study the use of an encoder in parallel with an Amplified Piezoelectric Actuator.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The document is divided into the following Sections:
|
||||
</p>
|
||||
<ul class="org-ul">
|
||||
<li>Section <a href="#org3940fb3">1</a>: the test-bench used is described</li>
|
||||
<li>Section <a href="#orgdef31f1">2</a>: the noise spectral density of the encoder is estimated</li>
|
||||
<li>Section <a href="#orgb7d0942">3</a>: the dynamics from the amplified piezoelectric actuator to the encoder measured displacement is identified</li>
|
||||
</ul>
|
||||
|
||||
<div id="outline-container-org4f09976" class="outline-2">
|
||||
<h2 id="org4f09976"><span class="section-number-2">1</span> Experimental Setup</h2>
|
||||
<div class="outline-text-2" id="text-1">
|
||||
<p>
|
||||
<a id="org3940fb3"></a>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The experimental Setup is schematically represented in Figure <a href="#org124732f">1</a>.
|
||||
</p>
|
||||
|
||||
<div class="note" id="org5402283">
|
||||
<p>
|
||||
Here are the equipment used in the test bench:
|
||||
</p>
|
||||
<ul class="org-ul">
|
||||
<li>Renishaw Resolution Encoder with 1nm resolution (<a href="doc/L-9517-9448-05-B_Data_sheet_RESOLUTE_BiSS_en.pdf">doc</a>)</li>
|
||||
<li>Attocube interferometer (<a href="doc/IDS3010.pdf">doc</a>)</li>
|
||||
<li>Cedrat Amplified Piezoelectric Actuator APA95ML (<a href="doc/APA95ML.pdf">doc</a>)</li>
|
||||
<li>Voltage Amplifier LA75B (<a href="doc/LA75B.pdf">doc</a>)</li>
|
||||
<li>Speedgoat IO131 with 16bits ADC and DAC (<a href="doc/IO130 IO131 OEM Datasheet.pdf">doc</a>)</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The mass can be vertically moved using the amplified piezoelectric actuator.
|
||||
The displacement of the mass (relative to the mechanical frame) is measured both by the interferometer and by the encoder.
|
||||
</p>
|
||||
|
||||
|
||||
<div id="org124732f" class="figure">
|
||||
<p><img src="figs/exp_setup_schematic.png" alt="exp_setup_schematic.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 1: </span>Schematic of the Experiment</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org88b06b0" class="figure">
|
||||
<p><img src="figs/IMG_20201023_153905.jpg" alt="IMG_20201023_153905.jpg" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 2: </span>Side View of the encoder</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="orga02fdc7" class="figure">
|
||||
<p><img src="figs/IMG_20201023_153914.jpg" alt="IMG_20201023_153914.jpg" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 3: </span>Front View of the encoder</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org5bbb12a" class="outline-2">
|
||||
<h2 id="org5bbb12a"><span class="section-number-2">2</span> Noise Spectral Density of the Encoder</h2>
|
||||
<div class="outline-text-2" id="text-2">
|
||||
<p>
|
||||
<a id="orgdef31f1"></a>
|
||||
</p>
|
||||
<p>
|
||||
The goal in this section is the estimate the noise of both the encoder and the intereferometer.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The actuator is not excited, thus the relative motion between the mass and the frame is as small as possible.
|
||||
Ideally, a mechanical part would clamp the two together, we here suppose that the APA is still enough to clamp the two together.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org91e2f9a" class="outline-3">
|
||||
<h3 id="org91e2f9a"><span class="section-number-3">2.1</span> Load Data</h3>
|
||||
<div class="outline-text-3" id="text-2-1">
|
||||
<p>
|
||||
The measurement data are loaded and the offset are removed using the <code>detrend</code> command.
|
||||
</p>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"> load(<span class="org-string">'int_enc_huddle_test.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'t'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"> interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org9392d29" class="outline-3">
|
||||
<h3 id="org9392d29"><span class="section-number-3">2.2</span> Time Domain Results</h3>
|
||||
<div class="outline-text-3" id="text-2-2">
|
||||
<p>
|
||||
The measurement of both the encoder and interferometer are shown in Figure <a href="#orgcdebd06">4</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<div id="orgcdebd06" class="figure">
|
||||
<p><img src="figs/huddle_test_time_domain.png" alt="huddle_test_time_domain.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 4: </span>Huddle test - Time domain signals</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The raw signals are filtered with a Low Pass filter (defined below) such that we can see the low frequency motion (Figure <a href="#org53d6d3d">5</a>).
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"> G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>10);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org53d6d3d" class="figure">
|
||||
<p><img src="figs/huddle_test_time_domain_filtered.png" alt="huddle_test_time_domain_filtered.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 5: </span>Huddle test - Time domain signals filtered with a LPF at 10Hz</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org998b458" class="outline-3">
|
||||
<h3 id="org998b458"><span class="section-number-3">2.3</span> Frequency Domain Noise</h3>
|
||||
<div class="outline-text-3" id="text-2-3">
|
||||
<p>
|
||||
The noise of the measurement (supposing there is no motion) is now translated in the frequency domain by computed the Amplitude Spectral Density.
|
||||
</p>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"> Ts = 1e<span class="org-type">-</span>4;
|
||||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||||
|
||||
[p_i, f] = pwelch(interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
[p_e, <span class="org-type">~</span>] = pwelch(encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The comparison of the ASD of the encoder and interferometer are shown in Figure <a href="#orgcb0713e">6</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
It is clear that although the encoder exhibit higher frequency noise, is it more stable at low frequency as the length of the beam path in the air is much smaller and thus changed of temperature/pressure/humity of the air has much smaller effect on the measured displacement.
|
||||
</p>
|
||||
|
||||
|
||||
<div id="orgcb0713e" class="figure">
|
||||
<p><img src="figs/huddle_test_asd.png" alt="huddle_test_asd.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 6: </span>Amplitude Spectral Density of the signals during the Huddle test</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org3ede191" class="outline-2">
|
||||
<h2 id="org3ede191"><span class="section-number-2">3</span> Dynamics from Actuator to Encoder</h2>
|
||||
<div class="outline-text-2" id="text-3">
|
||||
<p>
|
||||
<a id="orgb7d0942"></a>
|
||||
</p>
|
||||
<p>
|
||||
Now the dynamics from the force actuator to the measurement by the encoder is identified.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org0c30c61" class="outline-3">
|
||||
<h3 id="org0c30c61"><span class="section-number-3">3.1</span> Load Data</h3>
|
||||
<div class="outline-text-3" id="text-3-1">
|
||||
<p>
|
||||
As usual, the measurement data are loaded.
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"> load(<span class="org-string">'int_enc_id_noise_bis.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The first 0.1 seconds are removed as it corresponds to transient behavior.
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"> interferometer = interferometer(t<span class="org-type">></span>0.1);
|
||||
encoder = encoder(t<span class="org-type">></span>0.1);
|
||||
u = u(t<span class="org-type">></span>0.1);
|
||||
t = t(t<span class="org-type">></span>0.1);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Finally the offset are removed using the <code>detrend</code> command.
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"> interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
u = detrend(u, 0);
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org0975d17" class="outline-3">
|
||||
<h3 id="org0975d17"><span class="section-number-3">3.2</span> Excitation and Measured Signals</h3>
|
||||
<div class="outline-text-3" id="text-3-2">
|
||||
<p>
|
||||
The excitation signal is a white noise filtered by a low pass filter to not excite too much the high frequency modes.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The excitation signal is shown in Figure <a href="#org2a39907">7</a>.
|
||||
</p>
|
||||
|
||||
<div id="org2a39907" class="figure">
|
||||
<p><img src="figs/encoder_identification_excitation_time.png" alt="encoder_identification_excitation_time.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 7: </span>Excitation Voltage</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The measured motion by the interferometer and encoder is shown in Figure
|
||||
</p>
|
||||
|
||||
<div id="org928216c" class="figure">
|
||||
<p><img src="figs/encoder_identification_motion.png" alt="encoder_identification_motion.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 8: </span>Measured displacement by the encoder and interferometer</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org516cfff" class="outline-3">
|
||||
<h3 id="org516cfff"><span class="section-number-3">3.3</span> Identification</h3>
|
||||
<div class="outline-text-3" id="text-3-3">
|
||||
<p>
|
||||
Now the dynamics from the voltage sent to the voltage amplitude driving the APA95ML to the measured displacement by both the encoder and interferometer are computed.
|
||||
</p>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"> Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% Sampling Time [s]</span>
|
||||
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
||||
|
||||
[tf_i_est, f] = tfestimate(u, interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
[co_i_est, <span class="org-type">~</span>] = mscohere(u, interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
|
||||
[tf_e_est, <span class="org-type">~</span>] = tfestimate(u, encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
[co_e_est, <span class="org-type">~</span>] = mscohere(u, encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The obtained coherence is shown in Figure <a href="#org5941eaf">9</a>.
|
||||
It is shown that the identification is good until 500Hz for the interferometer and until 1kHz for the encoder.
|
||||
</p>
|
||||
|
||||
|
||||
<div id="org5941eaf" class="figure">
|
||||
<p><img src="figs/identification_dynamics_coherence.png" alt="identification_dynamics_coherence.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 9: </span>Obtained coherence for both the encoder and interferometer</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The compared dynamics as measured by the intereferometer and encoder are shown in Figure <a href="#orgae9e5a6">10</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<div id="orgae9e5a6" class="figure">
|
||||
<p><img src="figs/identification_dynamics_bode.png" alt="identification_dynamics_bode.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 10: </span>Obtained dynamics from actuator voltage to displacement as measured by the interferometer and by the encoder</p>
|
||||
</div>
|
||||
|
||||
|
||||
<p>
|
||||
The second resonance at around 900Hz most likely corresponds to the resonance of either the ruler support or the head support.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="postamble" class="status">
|
||||
<p class="author">Author: Dehaeze Thomas</p>
|
||||
<p class="date">Created: 2021-02-02 mar. 19:16</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@@ -4,13 +4,18 @@
|
||||
#+EMAIL: dehaeze.thomas@gmail.com
|
||||
#+AUTHOR: Dehaeze Thomas
|
||||
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/zenburn.css"/>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.min.js"></script>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="./js/bootstrap.min.js"></script>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.stickytableheaders.min.js"></script>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="./js/readtheorg.js"></script>
|
||||
#+HTML_LINK_HOME: ../index.html
|
||||
#+HTML_LINK_UP: ../index.html
|
||||
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||
|
||||
#+BIND: org-latex-image-default-option "scale=1"
|
||||
#+BIND: org-latex-image-default-width ""
|
||||
|
||||
#+LaTeX_CLASS: scrreprt
|
||||
#+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full]
|
||||
#+LaTeX_HEADER_EXTRA: \input{preamble.tex}
|
||||
|
||||
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
|
||||
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
|
||||
@@ -24,7 +29,7 @@
|
||||
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
|
||||
|
||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||
#+PROPERTY: header-args:matlab+ :tangle script.m
|
||||
#+PROPERTY: header-args:matlab+ :tangle matlab/script.m
|
||||
#+PROPERTY: header-args:matlab+ :comments org
|
||||
#+PROPERTY: header-args:matlab+ :exports both
|
||||
#+PROPERTY: header-args:matlab+ :results none
|
||||
@@ -34,9 +39,34 @@
|
||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||
:END:
|
||||
|
||||
#+begin_export html
|
||||
<hr>
|
||||
<p>This report is also available as a <a href="./test-bench-encoder.pdf">pdf</a>.</p>
|
||||
<hr>
|
||||
#+end_export
|
||||
|
||||
* Introduction :ignore:
|
||||
In this document, we wish to study the use of an encoder in parallel with an Amplified Piezoelectric Actuator.
|
||||
|
||||
The document is divided into the following Sections:
|
||||
- Section [[sec:experimental_setup]]: the test-bench used is described
|
||||
- Section [[sec:encoder_noise]]: the noise spectral density of the encoder is estimated
|
||||
- Section [[sec:dynamics_encoder]]: the dynamics from the amplified piezoelectric actuator to the encoder measured displacement is identified
|
||||
|
||||
* Experimental Setup
|
||||
<<sec:experimental_setup>>
|
||||
|
||||
The experimental Setup is schematically represented in Figure [[fig:exp_setup_schematic]].
|
||||
|
||||
#+begin_note
|
||||
Here are the equipment used in the test bench:
|
||||
- Renishaw Resolution Encoder with 1nm resolution ([[file:doc/L-9517-9448-05-B_Data_sheet_RESOLUTE_BiSS_en.pdf][doc]])
|
||||
- Attocube interferometer ([[file:doc/IDS3010.pdf][doc]])
|
||||
- Cedrat Amplified Piezoelectric Actuator APA95ML ([[file:doc/APA95ML.pdf][doc]])
|
||||
- Voltage Amplifier LA75B ([[file:doc/LA75B.pdf][doc]])
|
||||
- Speedgoat IO131 with 16bits ADC and DAC ([[file:doc/IO130 IO131 OEM Datasheet.pdf][doc]])
|
||||
#+end_note
|
||||
|
||||
The mass can be vertically moved using the amplified piezoelectric actuator.
|
||||
The displacement of the mass (relative to the mechanical frame) is measured both by the interferometer and by the encoder.
|
||||
|
||||
@@ -45,17 +75,28 @@ The displacement of the mass (relative to the mechanical frame) is measured both
|
||||
[[file:figs/exp_setup_schematic.png]]
|
||||
|
||||
#+name: fig:encoder_side_view
|
||||
#+ATTR_ORG: :width 300
|
||||
#+ATTR_LATEX: :width \linewidth
|
||||
#+caption: Side View of the encoder
|
||||
[[file:figs/IMG_20201023_153905.jpg]]
|
||||
|
||||
#+name: fig:encoder_front_view
|
||||
#+caption: Front View of the encoder
|
||||
#+ATTR_LATEX: :width \linewidth
|
||||
[[file:figs/IMG_20201023_153914.jpg]]
|
||||
|
||||
* Huddle Test
|
||||
* Noise Spectral Density of the Encoder
|
||||
:PROPERTIES:
|
||||
:header-args:matlab+: :tangle matlab/encoder_noise.m
|
||||
:END:
|
||||
<<sec:encoder_noise>>
|
||||
|
||||
** Introduction :ignore:
|
||||
The goal in this section is the estimate the noise of both the encoder and the intereferometer.
|
||||
|
||||
The actuator is not excited, thus the relative motion between the mass and the frame is as small as possible.
|
||||
Ideally, a mechanical part would clamp the two together, we here suppose that the APA is still enough to clamp the two together.
|
||||
|
||||
** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
<<matlab-dir>>
|
||||
@@ -66,8 +107,10 @@ The goal in this section is the estimate the noise of both the encoder and the i
|
||||
#+end_src
|
||||
|
||||
** Load Data
|
||||
The measurement data are loaded and the offset are removed using the =detrend= command.
|
||||
|
||||
#+begin_src matlab
|
||||
load('mat/int_enc_huddle_test.mat', 'interferometer', 'encoder', 't');
|
||||
load('int_enc_huddle_test.mat', 'interferometer', 'encoder', 't');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
@@ -76,6 +119,8 @@ The goal in this section is the estimate the noise of both the encoder and the i
|
||||
#+end_src
|
||||
|
||||
** Time Domain Results
|
||||
The measurement of both the encoder and interferometer are shown in Figure [[fig:huddle_test_time_domain]].
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
@@ -95,6 +140,7 @@ The goal in this section is the estimate the noise of both the encoder and the i
|
||||
#+RESULTS:
|
||||
[[file:figs/huddle_test_time_domain.png]]
|
||||
|
||||
The raw signals are filtered with a Low Pass filter (defined below) such that we can see the low frequency motion (Figure [[fig:huddle_test_time_domain_filtered]]).
|
||||
#+begin_src matlab
|
||||
G_lpf = 1/(1 + s/2/pi/10);
|
||||
#+end_src
|
||||
@@ -119,6 +165,8 @@ The goal in this section is the estimate the noise of both the encoder and the i
|
||||
[[file:figs/huddle_test_time_domain_filtered.png]]
|
||||
|
||||
** Frequency Domain Noise
|
||||
The noise of the measurement (supposing there is no motion) is now translated in the frequency domain by computed the Amplitude Spectral Density.
|
||||
|
||||
#+begin_src matlab
|
||||
Ts = 1e-4;
|
||||
win = hann(ceil(10/Ts));
|
||||
@@ -127,6 +175,10 @@ The goal in this section is the estimate the noise of both the encoder and the i
|
||||
[p_e, ~] = pwelch(encoder, win, [], [], 1/Ts);
|
||||
#+end_src
|
||||
|
||||
The comparison of the ASD of the encoder and interferometer are shown in Figure [[fig:huddle_test_asd]].
|
||||
|
||||
It is clear that although the encoder exhibit higher frequency noise, is it more stable at low frequency as the length of the beam path in the air is much smaller and thus changed of temperature/pressure/humity of the air has much smaller effect on the measured displacement.
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
@@ -148,10 +200,14 @@ The goal in this section is the estimate the noise of both the encoder and the i
|
||||
#+RESULTS:
|
||||
[[file:figs/huddle_test_asd.png]]
|
||||
|
||||
* Comparison Interferometer / Encoder
|
||||
* Dynamics from Actuator to Encoder
|
||||
:PROPERTIES:
|
||||
:header-args:matlab+: :tangle matlab/dynamics_encoder.m
|
||||
:END:
|
||||
<<sec:dynamics_encoder>>
|
||||
|
||||
** Introduction :ignore:
|
||||
The goal here is to make sure that the interferometer and encoder measurements are coherent.
|
||||
We may see non-linearity in the interferometric measurement.
|
||||
Now the dynamics from the force actuator to the measurement by the encoder is identified.
|
||||
|
||||
** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
@@ -163,181 +219,72 @@ We may see non-linearity in the interferometric measurement.
|
||||
#+end_src
|
||||
|
||||
** Load Data
|
||||
As usual, the measurement data are loaded.
|
||||
#+begin_src matlab
|
||||
load('mat/int_enc_comp.mat', 'interferometer', 'encoder', 'u', 't');
|
||||
load('int_enc_id_noise_bis.mat', 'interferometer', 'encoder', 'u', 't');
|
||||
#+end_src
|
||||
|
||||
The first 0.1 seconds are removed as it corresponds to transient behavior.
|
||||
#+begin_src matlab
|
||||
interferometer = interferometer(t>0.1);
|
||||
encoder = encoder(t>0.1);
|
||||
u = u(t>0.1);
|
||||
t = t(t>0.1);
|
||||
#+end_src
|
||||
|
||||
Finally the offset are removed using the =detrend= command.
|
||||
#+begin_src matlab
|
||||
interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
u = detrend(u, 0);
|
||||
#+end_src
|
||||
|
||||
** Time Domain Results
|
||||
** Excitation and Measured Signals
|
||||
The excitation signal is a white noise filtered by a low pass filter to not excite too much the high frequency modes.
|
||||
|
||||
The excitation signal is shown in Figure [[fig:encoder_identification_excitation_time]].
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
plot(t, u);
|
||||
xlabel('Time [s]'); ylabel('Voltage [V]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/encoder_identification_excitation_time.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:encoder_identification_excitation_time
|
||||
#+caption: Excitation Voltage
|
||||
#+RESULTS:
|
||||
[[file:figs/encoder_identification_excitation_time.png]]
|
||||
|
||||
The measured motion by the interferometer and encoder is shown in Figure
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(t, encoder, '-', 'DisplayName', 'Encoder')
|
||||
plot(t, interferometer, '--', 'DisplayName', 'Interferometer')
|
||||
plot(t, interferometer, 'DisplayName', 'Interferometer');
|
||||
plot(t, encoder, 'DisplayName', 'Encoder');
|
||||
hold off;
|
||||
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||
legend('location', 'northeast');
|
||||
xlim([50, 52])
|
||||
legend('location', 'southeast');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/int_enc_one_cycle.pdf', 'width', 'wide', 'height', 'normal');
|
||||
exportFig('figs/encoder_identification_motion.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:int_enc_one_cycle
|
||||
#+caption: One cycle measurement
|
||||
#+name: fig:encoder_identification_motion
|
||||
#+caption: Measured displacement by the encoder and interferometer
|
||||
#+RESULTS:
|
||||
[[file:figs/int_enc_one_cycle.png]]
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(t, encoder - interferometer, 'DisplayName', 'Difference')
|
||||
hold off;
|
||||
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||
legend('location', 'northeast');
|
||||
xlim([50, 52])
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/int_enc_one_cycle_error.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:int_enc_one_cycle_error
|
||||
#+caption: Difference between the Encoder and the interferometer during one cycle
|
||||
#+RESULTS:
|
||||
[[file:figs/int_enc_one_cycle_error.png]]
|
||||
|
||||
** Difference between Encoder and Interferometer as a function of time
|
||||
#+begin_src matlab
|
||||
Ts = 1e-4;
|
||||
d_i_mean = reshape(interferometer, [2/Ts floor(Ts/2*length(interferometer))]);
|
||||
d_e_mean = reshape(encoder, [2/Ts floor(Ts/2*length(encoder))]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
w0 = 2*pi*5; % [rad/s]
|
||||
xi = 0.7;
|
||||
|
||||
G_lpf = 1/(1 + 2*xi/w0*s + s^2/w0^2);
|
||||
|
||||
d_err_mean = reshape(lsim(G_lpf, encoder - interferometer, t), [2/Ts floor(Ts/2*length(encoder))]);
|
||||
d_err_mean = d_err_mean - mean(d_err_mean);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
for i_i = 1:size(d_err_mean, 2)
|
||||
plot(t(1:size(d_err_mean, 1)), d_err_mean(:, i_i), 'k-')
|
||||
end
|
||||
plot(t(1:size(d_err_mean, 1)), mean(d_err_mean, 2), 'r-')
|
||||
hold off;
|
||||
xlabel('Time [s]'); ylabel('Displacement [m]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/int_enc_error_mean_time.pdf', 'width', 'wide', 'height', 'normal', 'pdf', false);
|
||||
#+end_src
|
||||
|
||||
#+name: fig:int_enc_error_mean_time
|
||||
#+caption: Difference between the two measurement in the time domain, averaged for all the cycles
|
||||
#+RESULTS:
|
||||
[[file:figs/int_enc_error_mean_time.png]]
|
||||
|
||||
** Difference between Encoder and Interferometer as a function of position
|
||||
Compute the mean of the interferometer measurement corresponding to each of the encoder measurement.
|
||||
|
||||
#+begin_src matlab
|
||||
[e_sorted, ~, e_ind] = unique(encoder);
|
||||
|
||||
i_mean = zeros(length(e_sorted), 1);
|
||||
for i = 1:length(e_sorted)
|
||||
i_mean(i) = mean(interferometer(e_ind == i));
|
||||
end
|
||||
|
||||
i_mean_error = (i_mean - e_sorted);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
% plot(encoder, interferometer - encoder, 'k.', 'DisplayName', 'Difference')
|
||||
plot(1e6*(e_sorted), 1e9*(i_mean_error))
|
||||
hold off;
|
||||
xlabel('Encoder Measurement [$\mu m$]'); ylabel('Measrement Error [nm]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/int_enc_error_mean_position.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:int_enc_error_mean_position
|
||||
#+caption: Difference between the two measurement as a function of the measured position by the encoder, averaged for all the cycles
|
||||
#+RESULTS:
|
||||
[[file:figs/int_enc_error_mean_position.png]]
|
||||
|
||||
The period of the non-linearity seems to be $1.53 \mu m$ which corresponds to the wavelength of the Laser.
|
||||
|
||||
#+begin_src matlab
|
||||
win_length = 1530; % length of the windows (corresponds to 1.53 um)
|
||||
num_avg = floor(length(e_sorted)/win_length); % number of averaging
|
||||
|
||||
i_init = ceil((length(e_sorted) - win_length*num_avg)/2); % does not start at the extremity
|
||||
|
||||
e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init:i_init+win_length*num_avg-1), [win_length num_avg]), 2);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(1e-3*(0:win_length-1), e_sorted_mean_over_period)
|
||||
hold off;
|
||||
xlabel('Displacement [$\mu m$]'); ylabel('Measurement Non-Linearity [nm]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/int_non_linearity_period_wavelength.pdf', 'width', 'wide', 'height', 'tall');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:int_non_linearity_period_wavelength
|
||||
#+caption: Non-Linearity of the Interferometer over the period of the wavelength
|
||||
#+RESULTS:
|
||||
[[file:figs/int_non_linearity_period_wavelength.png]]
|
||||
|
||||
* Identification
|
||||
** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
<<matlab-dir>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results silent :noweb yes
|
||||
<<matlab-init>>
|
||||
#+end_src
|
||||
|
||||
** Load Data
|
||||
#+begin_src matlab
|
||||
load('mat/int_enc_id_noise_bis.mat', 'interferometer', 'encoder', 'u', 't');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
interferometer = detrend(interferometer, 0);
|
||||
encoder = detrend(encoder, 0);
|
||||
u = detrend(u, 0);
|
||||
#+end_src
|
||||
[[file:figs/encoder_identification_motion.png]]
|
||||
|
||||
** Identification
|
||||
Now the dynamics from the voltage sent to the voltage amplitude driving the APA95ML to the measured displacement by both the encoder and interferometer are computed.
|
||||
|
||||
#+begin_src matlab
|
||||
Ts = 1e-4; % Sampling Time [s]
|
||||
win = hann(ceil(10/Ts));
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
[tf_i_est, f] = tfestimate(u, interferometer, win, [], [], 1/Ts);
|
||||
[co_i_est, ~] = mscohere(u, interferometer, win, [], [], 1/Ts);
|
||||
|
||||
@@ -345,46 +292,52 @@ The period of the non-linearity seems to be $1.53 \mu m$ which corresponds to th
|
||||
[co_e_est, ~] = mscohere(u, encoder, win, [], [], 1/Ts);
|
||||
#+end_src
|
||||
|
||||
The obtained coherence is shown in Figure [[fig:identification_dynamics_coherence]].
|
||||
It is shown that the identification is good until 500Hz for the interferometer and until 1kHz for the encoder.
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, co_i_est, '-')
|
||||
plot(f, co_e_est, '-')
|
||||
plot(f, co_i_est, '-', 'DisplayName', 'Interferometer')
|
||||
plot(f, co_e_est, '-', 'DisplayName', 'Encoder')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Coherence'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
xlim([0.5, 5e3]);
|
||||
legend('location', 'southwest');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/identification_dynamics_coherence.pdf', 'width', 'normal', 'height', 'normal');
|
||||
exportFig('figs/identification_dynamics_coherence.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:identification_dynamics_coherence
|
||||
#+caption:
|
||||
#+caption: Obtained coherence for both the encoder and interferometer
|
||||
#+RESULTS:
|
||||
[[file:figs/identification_dynamics_coherence.png]]
|
||||
|
||||
The compared dynamics as measured by the intereferometer and encoder are shown in Figure [[fig:identification_dynamics_bode]].
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile;
|
||||
ax1 = nexttile([2, 1]);
|
||||
hold on;
|
||||
plot(f, abs(tf_i_est), '-', 'DisplayName', 'Int')
|
||||
plot(f, abs(tf_e_est), '-', 'DisplayName', 'Enc')
|
||||
plot(f, abs(tf_i_est), '-', 'DisplayName', 'Interferometer')
|
||||
plot(f, abs(tf_e_est), '-', 'DisplayName', 'Encoder')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
|
||||
ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
|
||||
hold off;
|
||||
ylim([1e-7, 3e-4]);
|
||||
legend('location', 'southwest');
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
plot(f, 180/pi*angle(tf_i_est), '-')
|
||||
plot(f, 180/pi*angle(tf_e_est), '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
yticks(-360:90:360);
|
||||
axis padded 'auto x'
|
||||
@@ -398,6 +351,9 @@ The period of the non-linearity seems to be $1.53 \mu m$ which corresponds to th
|
||||
#+end_src
|
||||
|
||||
#+name: fig:identification_dynamics_bode
|
||||
#+caption:
|
||||
#+caption: Obtained dynamics from actuator voltage to displacement as measured by the interferometer and by the encoder
|
||||
#+RESULTS:
|
||||
[[file:figs/identification_dynamics_bode.png]]
|
||||
|
||||
|
||||
The second resonance at around 900Hz most likely corresponds to the resonance of either the ruler support or the head support.
|