Initial Commit
49
css/custom.css
Normal file
@ -0,0 +1,49 @@
|
||||
.figure p{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.figure img{
|
||||
max-width:100%;
|
||||
display: block;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
table {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.org-src-container > pre.src:before {
|
||||
display: inline;
|
||||
position: absolute;
|
||||
color: #808080;
|
||||
background-color: white;
|
||||
top: -10px;
|
||||
left: 10px;
|
||||
padding: 0px 4px;
|
||||
border: 1px solid #d0d0d0;
|
||||
font-size: 80%;
|
||||
}
|
||||
.org-src-container > pre {
|
||||
margin-top: 1.5em;
|
||||
position: relative;
|
||||
overflow: visible;
|
||||
}
|
||||
.org-src-container > pre > code.src:before {
|
||||
display: inline;
|
||||
position: absolute;
|
||||
color: #808080;
|
||||
background-color: white;
|
||||
top: -10px;
|
||||
left: 10px;
|
||||
padding: 0px 4px;
|
||||
border: 1px solid #d0d0d0;
|
||||
font-size: 80%;
|
||||
}
|
||||
.org-src-container > pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
|
||||
.org-src-container > pre.src-elisp:before { content: 'Emacs Lisp'; }
|
||||
.org-src-container > pre.src-sh:before { content: 'shell'; }
|
||||
.org-src-container > pre.src-bash:before { content: 'bash'; }
|
||||
.org-src-container > pre.src-org:before { content: 'Org mode'; }
|
||||
.org-src-container > pre.src-python:before { content: 'Python'; }
|
||||
.org-src-container > pre.src-matlab:before { content: 'Matlab'; }
|
145
css/htmlize.css
Normal file
@ -0,0 +1,145 @@
|
||||
.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; }
|
1108
css/readtheorg.css
Normal file
BIN
figs/IMG_20201023_153905.jpg
Normal file
After Width: | Height: | Size: 2.7 MiB |
BIN
figs/IMG_20201023_153914.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
figs/exp_setup_schematic.pdf
Normal file
BIN
figs/exp_setup_schematic.png
Normal file
After Width: | Height: | Size: 76 KiB |
3969
figs/exp_setup_schematic.svg
Normal file
After Width: | Height: | Size: 225 KiB |
BIN
figs/force_sen_steps_time_domain.pdf
Normal file
BIN
figs/force_sen_steps_time_domain.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
figs/force_sen_steps_time_domain_par_R.pdf
Normal file
BIN
figs/force_sen_steps_time_domain_par_R.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
figs/force_sensor_linear_relation.pdf
Normal file
BIN
figs/force_sensor_linear_relation.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
figs/force_sensor_model_electronics.png
Normal file
After Width: | Height: | Size: 12 KiB |
1400
figs/force_sensor_model_electronics.svg
Normal file
After Width: | Height: | Size: 132 KiB |
BIN
figs/force_sensor_model_electronics_without_R.png
Normal file
After Width: | Height: | Size: 16 KiB |
1353
figs/force_sensor_model_electronics_without_R.svg
Normal file
After Width: | Height: | Size: 130 KiB |
BIN
figs/force_sensor_setup.pdf
Normal file
BIN
figs/force_sensor_setup.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
figs/force_sensor_sin_charge.pdf
Normal file
BIN
figs/force_sensor_sin_charge.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
figs/force_sensor_sin_encoder.pdf
Normal file
BIN
figs/force_sensor_sin_encoder.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
figs/force_sensor_sin_stack.pdf
Normal file
BIN
figs/force_sensor_sin_stack.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
figs/force_sensor_sin_u.pdf
Normal file
BIN
figs/force_sensor_sin_u.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
figs/stiffness_force_sensor_bode.pdf
Normal file
BIN
figs/stiffness_force_sensor_bode.png
Normal file
After Width: | Height: | Size: 134 KiB |
BIN
figs/stiffness_force_sensor_bode_zoom.pdf
Normal file
BIN
figs/stiffness_force_sensor_bode_zoom.png
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
figs/stiffness_force_sensor_coherence.pdf
Normal file
BIN
figs/stiffness_force_sensor_coherence.png
Normal file
After Width: | Height: | Size: 56 KiB |
637
index.html
Normal file
@ -0,0 +1,637 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<!-- 2020-11-10 mar. 12:55 -->
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
<title>Piezoelectric Force Sensor - 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/custom.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/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="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">Piezoelectric Force Sensor - Test Bench</h1>
|
||||
<div id="table-of-contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<div id="text-table-of-contents">
|
||||
<ul>
|
||||
<li><a href="#orga1465ad">1. Change of Stiffness due to Sensors stack being open/closed circuit</a>
|
||||
<ul>
|
||||
<li><a href="#orgd924c73">1.1. Load Data</a></li>
|
||||
<li><a href="#org59cc20a">1.2. Transfer Functions</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#org76a1832">2. Generated Number of Charge / Voltage</a>
|
||||
<ul>
|
||||
<li><a href="#org1fa991d">2.1. Steps</a></li>
|
||||
<li><a href="#org5e9eb44">2.2. Add Parallel Resistor</a></li>
|
||||
<li><a href="#org15676e1">2.3. Sinus</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
In this document is studied how a piezoelectric stack can be used to measured the force.
|
||||
</p>
|
||||
|
||||
<ul class="org-ul">
|
||||
<li>Section <a href="#org887b61a">1</a>: the effect of the input impedance of the electronics connected to the force sensor stack on the stiffness of the stack is studied</li>
|
||||
<li>Section <a href="#org2b5f630">2</a>:</li>
|
||||
</ul>
|
||||
|
||||
<div id="outline-container-orga1465ad" class="outline-2">
|
||||
<h2 id="orga1465ad"><span class="section-number-2">1</span> Change of Stiffness due to Sensors stack being open/closed circuit</h2>
|
||||
<div class="outline-text-2" id="text-1">
|
||||
<p>
|
||||
<a id="org887b61a"></a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-orgd924c73" class="outline-3">
|
||||
<h3 id="orgd924c73"><span class="section-number-3">1.1</span> Load Data</h3>
|
||||
<div class="outline-text-3" id="text-1-1">
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">oc = load(<span class="org-string">'identification_open_circuit.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>);
|
||||
sc = load(<span class="org-string">'identification_short_circuit.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org59cc20a" class="outline-3">
|
||||
<h3 id="org59cc20a"><span class="section-number-3">1.2</span> Transfer Functions</h3>
|
||||
<div class="outline-text-3" id="text-1-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_oc_est, f] = tfestimate(oc.u, oc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
[co_oc_est, <span class="org-type">~</span>] = mscohere( oc.u, oc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
|
||||
[tf_sc_est, <span class="org-type">~</span>] = tfestimate(sc.u, sc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
[co_sc_est, <span class="org-type">~</span>] = mscohere( sc.u, sc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org3c75143" class="figure">
|
||||
<p><img src="figs/stiffness_force_sensor_coherence.png" alt="stiffness_force_sensor_coherence.png" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="org4424b1c" class="figure">
|
||||
<p><img src="figs/stiffness_force_sensor_bode.png" alt="stiffness_force_sensor_bode.png" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org216fcc3" class="figure">
|
||||
<p><img src="figs/stiffness_force_sensor_bode_zoom.png" alt="stiffness_force_sensor_bode_zoom.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 3: </span>Zoom on the change of resonance</p>
|
||||
</div>
|
||||
|
||||
<div class="important" id="org9ea3712">
|
||||
<p>
|
||||
The change of resonance frequency / stiffness is very small and is not important here.
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org76a1832" class="outline-2">
|
||||
<h2 id="org76a1832"><span class="section-number-2">2</span> Generated Number of Charge / Voltage</h2>
|
||||
<div class="outline-text-2" id="text-2">
|
||||
<p>
|
||||
<a id="org2b5f630"></a>
|
||||
</p>
|
||||
<p>
|
||||
Two stacks are used as actuator (in parallel) and one stack is used as sensor.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The amplifier gain is 20V/V (Cedrat LA75B).
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org1fa991d" class="outline-3">
|
||||
<h3 id="org1fa991d"><span class="section-number-3">2.1</span> Steps</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">'force_sensor_steps.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"><span class="org-type">figure</span>;
|
||||
tiledlayout(2, 1, <span class="org-string">'TileSpacing'</span>, <span class="org-string">'None'</span>, <span class="org-string">'Padding'</span>, <span class="org-string">'None'</span>);
|
||||
nexttile;
|
||||
plot(t, v);
|
||||
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Measured voltage [V]'</span>);
|
||||
nexttile;
|
||||
plot(t, u);
|
||||
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Actuator Voltage [V]'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="orgf889803" class="figure">
|
||||
<p><img src="figs/force_sen_steps_time_domain.png" alt="force_sen_steps_time_domain.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 4: </span>Time domain signal during the 3 actuator voltage steps</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Three steps are performed at the following time intervals:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">t_s = [ 2.5, 23;
|
||||
23.8, 35;
|
||||
35.8, 50];
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Fit function:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">f = @(b,x) b(1)<span class="org-type">.*</span>exp(b(2)<span class="org-type">.*</span>x) <span class="org-type">+</span> b(3);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
We are interested by the <code>b(2)</code> term, which is the time constant of the exponential.
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">tau = zeros(size(t_s, 1),1);
|
||||
V0 = zeros(size(t_s, 1),1);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">t_i</span> = <span class="org-constant">1:size(t_s, 1)</span>
|
||||
t_cur = t(t_s(t_i, 1) <span class="org-type"><</span> t <span class="org-type">&</span> t <span class="org-type"><</span> t_s(t_i, 2));
|
||||
t_cur = t_cur <span class="org-type">-</span> t_cur(1);
|
||||
y_cur = v(t_s(t_i, 1) <span class="org-type"><</span> t <span class="org-type">&</span> t <span class="org-type"><</span> t_s(t_i, 2));
|
||||
|
||||
nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
|
||||
B0 = [0.5, <span class="org-type">-</span>0.15, 2.2]; <span class="org-comment">% Choose Appropriate Initial Estimates</span>
|
||||
[B,rnrm] = fminsearch(nrmrsd, B0); <span class="org-comment">% Estimate Parameters ‘B’</span>
|
||||
|
||||
tau(t_i) = 1<span class="org-type">/</span>B(2);
|
||||
V0(t_i) = B(3);
|
||||
<span class="org-keyword">end</span>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
||||
|
||||
|
||||
<colgroup>
|
||||
<col class="org-right" />
|
||||
|
||||
<col class="org-right" />
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="org-right">\(tau\) [s]</th>
|
||||
<th scope="col" class="org-right">\(V_0\) [V]</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="org-right">6.47</td>
|
||||
<td class="org-right">2.26</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-right">6.76</td>
|
||||
<td class="org-right">2.26</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-right">6.49</td>
|
||||
<td class="org-right">2.25</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p>
|
||||
With the capacitance being \(C = 4.4 \mu F\), the internal impedance of the Speedgoat ADC can be computed as follows:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">Cp = 4.4e<span class="org-type">-</span>6; <span class="org-comment">% [F]</span>
|
||||
Rin = abs(mean(tau))<span class="org-type">/</span>Cp;
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="example">
|
||||
1494100.0
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
The input impedance of the Speedgoat’s ADC should then be close to \(1.5\,M\Omega\) (specified at \(1\,M\Omega\)).
|
||||
</p>
|
||||
|
||||
<div class="important" id="org572654b">
|
||||
<p>
|
||||
How can we explain the voltage offset?
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<p>
|
||||
As shown in Figure <a href="#org7c2c57f">5</a> (taken from (<a href="#citeproc_bib_item_1">Reza and Andrew 2006</a>)), an input voltage offset is due to the input bias current \(i_n\).
|
||||
</p>
|
||||
|
||||
|
||||
<div id="org7c2c57f" class="figure">
|
||||
<p><img src="figs/force_sensor_model_electronics.png" alt="force_sensor_model_electronics.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 5: </span>Model of a piezoelectric transducer (left) and instrumentation amplifier (right)</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The estimated input bias current is then:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">in = mean(V0)<span class="org-type">/</span>Rin;
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="example">
|
||||
1.5119e-06
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
An additional resistor in parallel with \(R_{in}\) would have two effects:
|
||||
</p>
|
||||
<ul class="org-ul">
|
||||
<li>reduce the input voltage offset
|
||||
\[ V_{off} = \frac{R_a R_{in}}{R_a + R_{in}} i_n \]</li>
|
||||
<li>increase the high pass corner frequency \(f_c\)
|
||||
\[ C_p \frac{R_{in}R_a}{R_{in} + R_a} = \tau_c = \frac{1}{f_c} \]
|
||||
\[ R_a = \frac{R_i}{f_c C_p R_i - 1} \]</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p>
|
||||
If we allow the high pass corner frequency to be equals to 3Hz:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">fc = 3;
|
||||
Ra = Rin<span class="org-type">/</span>(fc<span class="org-type">*</span>Cp<span class="org-type">*</span>Rin <span class="org-type">-</span> 1);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="example">
|
||||
79804
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
With this parallel resistance value, the voltage offset would be:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">V_offset = Ra<span class="org-type">*</span>Rin<span class="org-type">/</span>(Ra <span class="org-type">+</span> Rin) <span class="org-type">*</span> in;
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="example">
|
||||
0.11454
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
Which is much more acceptable.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org5e9eb44" class="outline-3">
|
||||
<h3 id="org5e9eb44"><span class="section-number-3">2.2</span> Add Parallel Resistor</h3>
|
||||
<div class="outline-text-3" id="text-2-2">
|
||||
<p>
|
||||
A resistor \(R_p \approx 100\,k\Omega\) is added in parallel with the force sensor as shown in Figure <a href="#org1fac5a7">6</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<div id="org1fac5a7" class="figure">
|
||||
<p><img src="figs/force_sensor_model_electronics_without_R.png" alt="force_sensor_model_electronics_without_R.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 6: </span>Model of a piezoelectric transducer (left) and instrumentation amplifier (right) with added resistor \(R_p\)</p>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">load(<span class="org-string">'force_sensor_steps_R_82k7.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"><span class="org-type">figure</span>;
|
||||
tiledlayout(2, 1, <span class="org-string">'TileSpacing'</span>, <span class="org-string">'None'</span>, <span class="org-string">'Padding'</span>, <span class="org-string">'None'</span>);
|
||||
nexttile;
|
||||
plot(t, v);
|
||||
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Measured voltage [V]'</span>);
|
||||
nexttile;
|
||||
plot(t, u);
|
||||
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Actuator Voltage [V]'</span>);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org29964b5" class="figure">
|
||||
<p><img src="figs/force_sen_steps_time_domain_par_R.png" alt="force_sen_steps_time_domain_par_R.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 7: </span>Time domain signal during the actuator voltage steps</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Three steps are performed at the following time intervals:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">t_s = [1.9, 6;
|
||||
8.5, 13;
|
||||
15.5, 21;
|
||||
22.6, 26;
|
||||
30.0, 36;
|
||||
37.5, 41;
|
||||
46.2, 49.5]
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Fit function:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">f = @(b,x) b(1)<span class="org-type">.*</span>exp(b(2)<span class="org-type">.*</span>x) <span class="org-type">+</span> b(3);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
We are interested by the <code>b(2)</code> term, which is the time constant of the exponential.
|
||||
</p>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">tau = zeros(size(t_s, 1),1);
|
||||
V0 = zeros(size(t_s, 1),1);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">t_i</span> = <span class="org-constant">1:size(t_s, 1)</span>
|
||||
t_cur = t(t_s(t_i, 1) <span class="org-type"><</span> t <span class="org-type">&</span> t <span class="org-type"><</span> t_s(t_i, 2));
|
||||
t_cur = t_cur <span class="org-type">-</span> t_cur(1);
|
||||
y_cur = v(t_s(t_i, 1) <span class="org-type"><</span> t <span class="org-type">&</span> t <span class="org-type"><</span> t_s(t_i, 2));
|
||||
|
||||
nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
|
||||
B0 = [0.5, <span class="org-type">-</span>0.2, 0.2]; <span class="org-comment">% Choose Appropriate Initial Estimates</span>
|
||||
[B,rnrm] = fminsearch(nrmrsd, B0); <span class="org-comment">% Estimate Parameters ‘B’</span>
|
||||
|
||||
tau(t_i) = 1<span class="org-type">/</span>B(2);
|
||||
V0(t_i) = B(3);
|
||||
<span class="org-keyword">end</span>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
And indeed, we obtain a much smaller offset voltage and a much faster time constant.
|
||||
</p>
|
||||
|
||||
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
||||
|
||||
|
||||
<colgroup>
|
||||
<col class="org-right" />
|
||||
|
||||
<col class="org-right" />
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="org-right">\(tau\) [s]</th>
|
||||
<th scope="col" class="org-right">\(V_0\) [V]</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="org-right">0.43</td>
|
||||
<td class="org-right">0.15</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-right">0.45</td>
|
||||
<td class="org-right">0.16</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-right">0.43</td>
|
||||
<td class="org-right">0.15</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-right">0.43</td>
|
||||
<td class="org-right">0.15</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-right">0.45</td>
|
||||
<td class="org-right">0.15</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-right">0.46</td>
|
||||
<td class="org-right">0.16</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="org-right">0.48</td>
|
||||
<td class="org-right">0.16</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p>
|
||||
Knowing the capacitance value, we can estimate the value of the added resistor (neglecting the input impedance of \(\approx 1\,M\Omega\)):
|
||||
</p>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">Cp = 4.4e<span class="org-type">-</span>6; <span class="org-comment">% [F]</span>
|
||||
Rin = abs(mean(tau))<span class="org-type">/</span>Cp;
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="example">
|
||||
101200.0
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
And we can verify that the bias current estimation stays the same:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">in = mean(V0)<span class="org-type">/</span>Rin;
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="example">
|
||||
1.5305e-06
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
This validates the model of the ADC and the effectiveness of the added resistor.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outline-container-org15676e1" class="outline-3">
|
||||
<h3 id="org15676e1"><span class="section-number-3">2.3</span> Sinus</h3>
|
||||
<div class="outline-text-3" id="text-2-3">
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">load(<span class="org-string">'force_sensor_sin.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
|
||||
|
||||
u = u(t<span class="org-type">></span>25);
|
||||
v = v(t<span class="org-type">></span>25);
|
||||
encoder = encoder(t<span class="org-type">></span>25) <span class="org-type">-</span> mean(encoder(t<span class="org-type">></span>25));
|
||||
t = t(t<span class="org-type">></span>25);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The driving voltage is a sinus at 0.5Hz centered on 3V and with an amplitude of 3V (Figure <a href="#org1fbf89d">8</a>).
|
||||
</p>
|
||||
|
||||
|
||||
<div id="org1fbf89d" class="figure">
|
||||
<p><img src="figs/force_sensor_sin_u.png" alt="force_sensor_sin_u.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 8: </span>Driving Voltage</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The full stroke as measured by the encoder is:
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">max(encoder)<span class="org-type">-</span>min(encoder)
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="example">
|
||||
5.005e-05
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
Its signal is shown in Figure <a href="#org1d74efa">9</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<div id="org1d74efa" class="figure">
|
||||
<p><img src="figs/force_sensor_sin_encoder.png" alt="force_sensor_sin_encoder.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 9: </span>Encoder measurement</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The generated voltage by the stack is shown in Figure
|
||||
</p>
|
||||
|
||||
|
||||
<div id="org077a6d7" class="figure">
|
||||
<p><img src="figs/force_sensor_sin_stack.png" alt="force_sensor_sin_stack.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 10: </span>Voltage measured on the stack used as a sensor</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The capacitance of the stack is
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">Cp = 4.4e<span class="org-type">-</span>6; <span class="org-comment">% [F]</span>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
The corresponding generated charge is then shown in Figure <a href="#org4baf062">11</a>.
|
||||
</p>
|
||||
|
||||
<div id="org4baf062" class="figure">
|
||||
<p><img src="figs/force_sensor_sin_charge.png" alt="force_sensor_sin_charge.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 11: </span>Generated Charge</p>
|
||||
</div>
|
||||
|
||||
|
||||
<p>
|
||||
The relation between the generated voltage and the measured displacement is almost linear as shown in Figure <a href="#org8b9df34">12</a>.
|
||||
</p>
|
||||
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">b1 = encoder<span class="org-type">\</span>(v<span class="org-type">-</span>mean(v));
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="org8b9df34" class="figure">
|
||||
<p><img src="figs/force_sensor_linear_relation.png" alt="force_sensor_linear_relation.png" />
|
||||
</p>
|
||||
<p><span class="figure-number">Figure 12: </span>Almost linear relation between the relative displacement and the generated voltage</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
With a 16bits ADC, the resolution will then be equals to (in [nm]):
|
||||
</p>
|
||||
<div class="org-src-container">
|
||||
<pre class="src src-matlab">abs((20<span class="org-type">/</span>2<span class="org-type">^</span>16)<span class="org-type">/</span>(b1<span class="org-type">/</span>1e9))
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="example">
|
||||
3.9838
|
||||
</pre>
|
||||
|
||||
|
||||
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><h2 class='citeproc-org-bib-h2'>Bibliography</h2>
|
||||
<div class="csl-bib-body">
|
||||
<div class="csl-entry"><a name="citeproc_bib_item_1"></a>Reza, Moheimani, and Fleming Andrew. 2006. <i>Piezoelectric Transducers for Vibration Control and Damping</i>. London: Springer.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="postamble" class="status">
|
||||
<p class="author">Author: Dehaeze Thomas</p>
|
||||
<p class="date">Created: 2020-11-10 mar. 12:55</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
568
index.org
Normal file
@ -0,0 +1,568 @@
|
||||
#+TITLE: Piezoelectric Force Sensor - Test Bench
|
||||
:DRAWER:
|
||||
#+LANGUAGE: en
|
||||
#+EMAIL: dehaeze.thomas@gmail.com
|
||||
#+AUTHOR: Dehaeze Thomas
|
||||
|
||||
#+HTML_LINK_HOME: ../index.html
|
||||
#+HTML_LINK_UP: ../index.html
|
||||
|
||||
#+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/custom.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/readtheorg.js"></script>
|
||||
|
||||
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
|
||||
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
|
||||
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
|
||||
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
|
||||
#+PROPERTY: header-args:latex+ :results raw replace :buffer no
|
||||
#+PROPERTY: header-args:latex+ :eval no-export
|
||||
#+PROPERTY: header-args:latex+ :exports both
|
||||
#+PROPERTY: header-args:latex+ :mkdirp yes
|
||||
#+PROPERTY: header-args:latex+ :output-dir figs
|
||||
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
|
||||
|
||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||
#+PROPERTY: header-args:matlab+ :comments org
|
||||
#+PROPERTY: header-args:matlab+ :exports both
|
||||
#+PROPERTY: header-args:matlab+ :results none
|
||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||
#+PROPERTY: header-args:matlab+ :noweb yes
|
||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||
:END:
|
||||
|
||||
* Introduction :ignore:
|
||||
In this document is studied how a piezoelectric stack can be used to measured the force.
|
||||
|
||||
- Section [[sec:open_closed_circuit]]: the effect of the input impedance of the electronics connected to the force sensor stack on the stiffness of the stack is studied
|
||||
- Section [[sec:charge_voltage_estimation]]:
|
||||
|
||||
* Change of Stiffness due to Sensors stack being open/closed circuit
|
||||
:PROPERTIES:
|
||||
:header-args:matlab+: :tangle matlab/open_closed_circuit.m
|
||||
:END:
|
||||
<<sec:open_closed_circuit>>
|
||||
|
||||
** Introduction :ignore:
|
||||
|
||||
** 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
|
||||
|
||||
#+begin_src matlab :tangle no
|
||||
addpath('./matlab/mat/');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :eval no
|
||||
addpath('./mat/');
|
||||
#+end_src
|
||||
|
||||
** Load Data
|
||||
#+begin_src matlab
|
||||
oc = load('identification_open_circuit.mat', 't', 'encoder', 'u');
|
||||
sc = load('identification_short_circuit.mat', 't', 'encoder', 'u');
|
||||
#+end_src
|
||||
|
||||
** Transfer Functions
|
||||
#+begin_src matlab
|
||||
Ts = 1e-4; % Sampling Time [s]
|
||||
win = hann(ceil(10/Ts));
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
[tf_oc_est, f] = tfestimate(oc.u, oc.encoder, win, [], [], 1/Ts);
|
||||
[co_oc_est, ~] = mscohere( oc.u, oc.encoder, win, [], [], 1/Ts);
|
||||
|
||||
[tf_sc_est, ~] = tfestimate(sc.u, sc.encoder, win, [], [], 1/Ts);
|
||||
[co_sc_est, ~] = mscohere( sc.u, sc.encoder, win, [], [], 1/Ts);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, co_oc_est, '-')
|
||||
plot(f, co_sc_est, '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Coherence'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
xlim([0.5, 5e3]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/stiffness_force_sensor_coherence.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:stiffness_force_sensor_coherence
|
||||
#+caption:
|
||||
#+RESULTS:
|
||||
[[file:figs/stiffness_force_sensor_coherence.png]]
|
||||
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile;
|
||||
hold on;
|
||||
plot(f, abs(tf_oc_est), '-', 'DisplayName', 'Open-Circuit')
|
||||
plot(f, abs(tf_sc_est), '-', 'DisplayName', 'Short-Circuit')
|
||||
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_oc_est), '-')
|
||||
plot(f, 180/pi*angle(tf_sc_est), '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
yticks(-360:90:360);
|
||||
axis padded 'auto x'
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([0.5, 5e3]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/stiffness_force_sensor_bode.pdf', 'width', 'wide', 'height', 'tall');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:stiffness_force_sensor_bode
|
||||
#+caption:
|
||||
#+RESULTS:
|
||||
[[file:figs/stiffness_force_sensor_bode.png]]
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
xlim([180, 280]);
|
||||
exportFig('figs/stiffness_force_sensor_bode_zoom.pdf', 'width', 'small', 'height', 'tall');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:stiffness_force_sensor_bode_zoom
|
||||
#+caption: Zoom on the change of resonance
|
||||
#+RESULTS:
|
||||
[[file:figs/stiffness_force_sensor_bode_zoom.png]]
|
||||
|
||||
#+begin_important
|
||||
The change of resonance frequency / stiffness is very small and is not important here.
|
||||
#+end_important
|
||||
|
||||
* Generated Number of Charge / Voltage
|
||||
:PROPERTIES:
|
||||
:header-args:matlab+: :tangle matlab/charge_voltage_estimation.m
|
||||
:END:
|
||||
<<sec:charge_voltage_estimation>>
|
||||
|
||||
** Introduction :ignore:
|
||||
|
||||
|
||||
Two stacks are used as actuator (in parallel) and one stack is used as sensor.
|
||||
|
||||
The amplifier gain is 20V/V (Cedrat LA75B).
|
||||
|
||||
** 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
|
||||
|
||||
#+begin_src matlab :tangle no
|
||||
addpath('./matlab/mat/');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :eval no
|
||||
addpath('./mat/');
|
||||
#+end_src
|
||||
|
||||
** Steps
|
||||
#+begin_src matlab
|
||||
load('force_sensor_steps.mat', 't', 'encoder', 'u', 'v');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
nexttile;
|
||||
plot(t, v);
|
||||
xlabel('Time [s]'); ylabel('Measured voltage [V]');
|
||||
nexttile;
|
||||
plot(t, u);
|
||||
xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/force_sen_steps_time_domain.pdf', 'width', 'wide', 'height', 'tall');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:force_sen_steps_time_domain
|
||||
#+caption: Time domain signal during the 3 actuator voltage steps
|
||||
#+RESULTS:
|
||||
[[file:figs/force_sen_steps_time_domain.png]]
|
||||
|
||||
Three steps are performed at the following time intervals:
|
||||
#+begin_src matlab
|
||||
t_s = [ 2.5, 23;
|
||||
23.8, 35;
|
||||
35.8, 50];
|
||||
#+end_src
|
||||
|
||||
Fit function:
|
||||
#+begin_src matlab
|
||||
f = @(b,x) b(1).*exp(b(2).*x) + b(3);
|
||||
#+end_src
|
||||
|
||||
We are interested by the =b(2)= term, which is the time constant of the exponential.
|
||||
#+begin_src matlab
|
||||
tau = zeros(size(t_s, 1),1);
|
||||
V0 = zeros(size(t_s, 1),1);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
for t_i = 1:size(t_s, 1)
|
||||
t_cur = t(t_s(t_i, 1) < t & t < t_s(t_i, 2));
|
||||
t_cur = t_cur - t_cur(1);
|
||||
y_cur = v(t_s(t_i, 1) < t & t < t_s(t_i, 2));
|
||||
|
||||
nrmrsd = @(b) norm(y_cur - f(b,t_cur)); % Residual Norm Cost Function
|
||||
B0 = [0.5, -0.15, 2.2]; % Choose Appropriate Initial Estimates
|
||||
[B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters ‘B’
|
||||
|
||||
tau(t_i) = 1/B(2);
|
||||
V0(t_i) = B(3);
|
||||
end
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
||||
data2orgtable([abs(tau), V0], {}, {'$tau$ [s]', '$V_0$ [V]'}, ' %.2f ');
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
| $tau$ [s] | $V_0$ [V] |
|
||||
|-----------+-----------|
|
||||
| 6.47 | 2.26 |
|
||||
| 6.76 | 2.26 |
|
||||
| 6.49 | 2.25 |
|
||||
|
||||
With the capacitance being $C = 4.4 \mu F$, the internal impedance of the Speedgoat ADC can be computed as follows:
|
||||
#+begin_src matlab
|
||||
Cp = 4.4e-6; % [F]
|
||||
Rin = abs(mean(tau))/Cp;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results value replace :exports results
|
||||
ans = Rin
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
: 1494100.0
|
||||
|
||||
The input impedance of the Speedgoat's ADC should then be close to $1.5\,M\Omega$ (specified at $1\,M\Omega$).
|
||||
|
||||
#+begin_important
|
||||
How can we explain the voltage offset?
|
||||
#+end_important
|
||||
|
||||
As shown in Figure [[fig:force_sensor_model_electronics]] (taken from cite:reza06_piezoel_trans_vibrat_contr_dampin), an input voltage offset is due to the input bias current $i_n$.
|
||||
|
||||
#+name: fig:force_sensor_model_electronics
|
||||
#+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right)
|
||||
[[file:figs/force_sensor_model_electronics.png]]
|
||||
|
||||
The estimated input bias current is then:
|
||||
#+begin_src matlab
|
||||
in = mean(V0)/Rin;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results value replace :exports results
|
||||
ans = in
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
: 1.5119e-06
|
||||
|
||||
An additional resistor in parallel with $R_{in}$ would have two effects:
|
||||
- reduce the input voltage offset
|
||||
\[ V_{off} = \frac{R_a R_{in}}{R_a + R_{in}} i_n \]
|
||||
- increase the high pass corner frequency $f_c$
|
||||
\[ C_p \frac{R_{in}R_a}{R_{in} + R_a} = \tau_c = \frac{1}{f_c} \]
|
||||
\[ R_a = \frac{R_i}{f_c C_p R_i - 1} \]
|
||||
|
||||
|
||||
If we allow the high pass corner frequency to be equals to 3Hz:
|
||||
#+begin_src matlab
|
||||
fc = 3;
|
||||
Ra = Rin/(fc*Cp*Rin - 1);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results value replace :exports results
|
||||
ans = Ra
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
: 79804
|
||||
|
||||
With this parallel resistance value, the voltage offset would be:
|
||||
#+begin_src matlab
|
||||
V_offset = Ra*Rin/(Ra + Rin) * in;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results value replace :exports results
|
||||
ans = V_offset
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
: 0.11454
|
||||
|
||||
Which is much more acceptable.
|
||||
|
||||
** Add Parallel Resistor
|
||||
A resistor $R_p \approx 100\,k\Omega$ is added in parallel with the force sensor as shown in Figure [[fig:force_sensor_model_electronics_without_R]].
|
||||
|
||||
#+name: fig:force_sensor_model_electronics_without_R
|
||||
#+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right) with added resistor $R_p$
|
||||
[[file:figs/force_sensor_model_electronics_without_R.png]]
|
||||
|
||||
#+begin_src matlab
|
||||
load('force_sensor_steps_R_82k7.mat', 't', 'encoder', 'u', 'v');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
nexttile;
|
||||
plot(t, v);
|
||||
xlabel('Time [s]'); ylabel('Measured voltage [V]');
|
||||
nexttile;
|
||||
plot(t, u);
|
||||
xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/force_sen_steps_time_domain_par_R.pdf', 'width', 'wide', 'height', 'tall');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:force_sen_steps_time_domain_par_R
|
||||
#+caption: Time domain signal during the actuator voltage steps
|
||||
#+RESULTS:
|
||||
[[file:figs/force_sen_steps_time_domain_par_R.png]]
|
||||
|
||||
Three steps are performed at the following time intervals:
|
||||
#+begin_src matlab
|
||||
t_s = [1.9, 6;
|
||||
8.5, 13;
|
||||
15.5, 21;
|
||||
22.6, 26;
|
||||
30.0, 36;
|
||||
37.5, 41;
|
||||
46.2, 49.5]
|
||||
#+end_src
|
||||
|
||||
Fit function:
|
||||
#+begin_src matlab
|
||||
f = @(b,x) b(1).*exp(b(2).*x) + b(3);
|
||||
#+end_src
|
||||
|
||||
We are interested by the =b(2)= term, which is the time constant of the exponential.
|
||||
|
||||
#+begin_src matlab
|
||||
tau = zeros(size(t_s, 1),1);
|
||||
V0 = zeros(size(t_s, 1),1);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
for t_i = 1:size(t_s, 1)
|
||||
t_cur = t(t_s(t_i, 1) < t & t < t_s(t_i, 2));
|
||||
t_cur = t_cur - t_cur(1);
|
||||
y_cur = v(t_s(t_i, 1) < t & t < t_s(t_i, 2));
|
||||
|
||||
nrmrsd = @(b) norm(y_cur - f(b,t_cur)); % Residual Norm Cost Function
|
||||
B0 = [0.5, -0.2, 0.2]; % Choose Appropriate Initial Estimates
|
||||
[B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters ‘B’
|
||||
|
||||
tau(t_i) = 1/B(2);
|
||||
V0(t_i) = B(3);
|
||||
end
|
||||
#+end_src
|
||||
|
||||
And indeed, we obtain a much smaller offset voltage and a much faster time constant.
|
||||
|
||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
||||
data2orgtable([abs(tau), V0], {}, {'$tau$ [s]', '$V_0$ [V]'}, ' %.2f ');
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
| $tau$ [s] | $V_0$ [V] |
|
||||
|-----------+-----------|
|
||||
| 0.43 | 0.15 |
|
||||
| 0.45 | 0.16 |
|
||||
| 0.43 | 0.15 |
|
||||
| 0.43 | 0.15 |
|
||||
| 0.45 | 0.15 |
|
||||
| 0.46 | 0.16 |
|
||||
| 0.48 | 0.16 |
|
||||
|
||||
Knowing the capacitance value, we can estimate the value of the added resistor (neglecting the input impedance of $\approx 1\,M\Omega$):
|
||||
|
||||
#+begin_src matlab
|
||||
Cp = 4.4e-6; % [F]
|
||||
Rin = abs(mean(tau))/Cp;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results value replace :exports results
|
||||
ans = Rin
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
: 101200.0
|
||||
|
||||
And we can verify that the bias current estimation stays the same:
|
||||
#+begin_src matlab
|
||||
in = mean(V0)/Rin;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results value replace :exports results
|
||||
ans = in
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
: 1.5305e-06
|
||||
|
||||
This validates the model of the ADC and the effectiveness of the added resistor.
|
||||
|
||||
** Sinus
|
||||
#+begin_src matlab
|
||||
load('force_sensor_sin.mat', 't', 'encoder', 'u', 'v');
|
||||
|
||||
u = u(t>25);
|
||||
v = v(t>25);
|
||||
encoder = encoder(t>25) - mean(encoder(t>25));
|
||||
t = t(t>25);
|
||||
#+end_src
|
||||
|
||||
The driving voltage is a sinus at 0.5Hz centered on 3V and with an amplitude of 3V (Figure [[fig:force_sensor_sin_u]]).
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
plot(t, u)
|
||||
xlabel('Time [s]'); ylabel('Control Voltage [V]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/force_sensor_sin_u.pdf', 'width', 'normal', 'height', 'small');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:force_sensor_sin_u
|
||||
#+caption: Driving Voltage
|
||||
#+RESULTS:
|
||||
[[file:figs/force_sensor_sin_u.png]]
|
||||
|
||||
The full stroke as measured by the encoder is:
|
||||
#+begin_src matlab :results value replace
|
||||
max(encoder)-min(encoder)
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
: 5.005e-05
|
||||
|
||||
Its signal is shown in Figure [[fig:force_sensor_sin_encoder]].
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
plot(t, encoder)
|
||||
xlabel('Time [s]'); ylabel('Encoder [m]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/force_sensor_sin_encoder.pdf', 'width', 'normal', 'height', 'small');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:force_sensor_sin_encoder
|
||||
#+caption: Encoder measurement
|
||||
#+RESULTS:
|
||||
[[file:figs/force_sensor_sin_encoder.png]]
|
||||
|
||||
The generated voltage by the stack is shown in Figure
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
plot(t, v)
|
||||
xlabel('Time [s]'); ylabel('Force Sensor Output [V]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/force_sensor_sin_stack.pdf', 'width', 'normal', 'height', 'small');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:force_sensor_sin_stack
|
||||
#+caption: Voltage measured on the stack used as a sensor
|
||||
#+RESULTS:
|
||||
[[file:figs/force_sensor_sin_stack.png]]
|
||||
|
||||
The capacitance of the stack is
|
||||
#+begin_src matlab
|
||||
Cp = 4.4e-6; % [F]
|
||||
#+end_src
|
||||
|
||||
The corresponding generated charge is then shown in Figure [[fig:force_sensor_sin_charge]].
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
plot(t, 1e6*Cp*(v-mean(v)))
|
||||
xlabel('Time [s]'); ylabel('Generated Charge [$\mu C$]');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/force_sensor_sin_charge.pdf', 'width', 'normal', 'height', 'small');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:force_sensor_sin_charge
|
||||
#+caption: Generated Charge
|
||||
#+RESULTS:
|
||||
[[file:figs/force_sensor_sin_charge.png]]
|
||||
|
||||
|
||||
The relation between the generated voltage and the measured displacement is almost linear as shown in Figure [[fig:force_sensor_linear_relation]].
|
||||
|
||||
#+begin_src matlab
|
||||
b1 = encoder\(v-mean(v));
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(encoder, v-mean(v), 'DisplayName', 'Measured Voltage');
|
||||
plot(encoder, encoder*b1, 'DisplayName', sprintf('Linear Fit: $U_s \\approx %.3f [V/\\mu m] \\cdot d$', 1e-6*abs(b1)));
|
||||
hold off;
|
||||
xlabel('Measured Displacement [m]'); ylabel('Generated Voltage [V]');
|
||||
legend();
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/force_sensor_linear_relation.pdf', 'width', 'normal', 'height', 'small');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:force_sensor_linear_relation
|
||||
#+caption: Almost linear relation between the relative displacement and the generated voltage
|
||||
#+RESULTS:
|
||||
[[file:figs/force_sensor_linear_relation.png]]
|
||||
|
||||
With a 16bits ADC, the resolution will then be equals to (in [nm]):
|
||||
#+begin_src matlab :results value replace
|
||||
abs((20/2^16)/(b1/1e9))
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
: 3.9838
|
7
js/bootstrap.min.js
vendored
Normal file
4
js/jquery.min.js
vendored
Normal file
87
js/readtheorg.js
Normal file
@ -0,0 +1,87 @@
|
||||
$(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>");
|
||||
$('.question').before("<p class='admonition-title question'>Question</p>");
|
||||
$('.summary').before("<p class='admonition-title hint'>Summary</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
|
||||
};
|
||||
}($));
|
330
matlab/charge_voltage_estimation.m
Normal file
@ -0,0 +1,330 @@
|
||||
%% Clear Workspace and Close figures
|
||||
clear; close all; clc;
|
||||
|
||||
%% Intialize Laplace variable
|
||||
s = zpk('s');
|
||||
|
||||
addpath('./mat/');
|
||||
|
||||
% Steps
|
||||
|
||||
load('force_sensor_steps.mat', 't', 'encoder', 'u', 'v');
|
||||
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
nexttile;
|
||||
plot(t, v);
|
||||
xlabel('Time [s]'); ylabel('Measured voltage [V]');
|
||||
nexttile;
|
||||
plot(t, u);
|
||||
xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:force_sen_steps_time_domain
|
||||
% #+caption: Time domain signal during the 3 actuator voltage steps
|
||||
% #+RESULTS:
|
||||
% [[file:figs/force_sen_steps_time_domain.png]]
|
||||
|
||||
% Three steps are performed at the following time intervals:
|
||||
|
||||
t_s = [ 2.5, 23;
|
||||
23.8, 35;
|
||||
35.8, 50];
|
||||
|
||||
|
||||
|
||||
% Fit function:
|
||||
|
||||
f = @(b,x) b(1).*exp(b(2).*x) + b(3);
|
||||
|
||||
|
||||
|
||||
% We are interested by the =b(2)= term, which is the time constant of the exponential.
|
||||
|
||||
tau = zeros(size(t_s, 1),1);
|
||||
V0 = zeros(size(t_s, 1),1);
|
||||
|
||||
for t_i = 1:size(t_s, 1)
|
||||
t_cur = t(t_s(t_i, 1) < t & t < t_s(t_i, 2));
|
||||
t_cur = t_cur - t_cur(1);
|
||||
y_cur = v(t_s(t_i, 1) < t & t < t_s(t_i, 2));
|
||||
|
||||
nrmrsd = @(b) norm(y_cur - f(b,t_cur)); % Residual Norm Cost Function
|
||||
B0 = [0.5, -0.15, 2.2]; % Choose Appropriate Initial Estimates
|
||||
[B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters ‘B’
|
||||
|
||||
tau(t_i) = 1/B(2);
|
||||
V0(t_i) = B(3);
|
||||
end
|
||||
|
||||
|
||||
|
||||
% #+RESULTS:
|
||||
% | $tau$ [s] | $V_0$ [V] |
|
||||
% |-----------+-----------|
|
||||
% | 6.47 | 2.26 |
|
||||
% | 6.76 | 2.26 |
|
||||
% | 6.49 | 2.25 |
|
||||
|
||||
% With the capacitance being $C = 4.4 \mu F$, the internal impedance of the Speedgoat ADC can be computed as follows:
|
||||
|
||||
Cp = 4.4e-6; % [F]
|
||||
Rin = abs(mean(tau))/Cp;
|
||||
|
||||
ans = Rin
|
||||
|
||||
|
||||
|
||||
% #+RESULTS:
|
||||
% : 1494100.0
|
||||
|
||||
% The input impedance of the Speedgoat's ADC should then be close to $1.5\,M\Omega$ (specified at $1\,M\Omega$).
|
||||
|
||||
% #+begin_important
|
||||
% How can we explain the voltage offset?
|
||||
% #+end_important
|
||||
|
||||
% As shown in Figure [[fig:force_sensor_model_electronics]] (taken from cite:reza06_piezoel_trans_vibrat_contr_dampin), an input voltage offset is due to the input bias current $i_n$.
|
||||
|
||||
% #+name: fig:force_sensor_model_electronics
|
||||
% #+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right)
|
||||
% [[file:figs/force_sensor_model_electronics.png]]
|
||||
|
||||
% The estimated input bias current is then:
|
||||
|
||||
in = mean(V0)/Rin;
|
||||
|
||||
ans = in
|
||||
|
||||
|
||||
|
||||
% #+RESULTS:
|
||||
% : 1.5119e-06
|
||||
|
||||
% An additional resistor in parallel with $R_{in}$ would have two effects:
|
||||
% - reduce the input voltage offset
|
||||
% \[ V_{off} = \frac{R_a R_{in}}{R_a + R_{in}} i_n \]
|
||||
% - increase the high pass corner frequency $f_c$
|
||||
% \[ C_p \frac{R_{in}R_a}{R_{in} + R_a} = \tau_c = \frac{1}{f_c} \]
|
||||
% \[ R_a = \frac{R_i}{f_c C_p R_i - 1} \]
|
||||
|
||||
|
||||
% If we allow the high pass corner frequency to be equals to 3Hz:
|
||||
|
||||
fc = 3;
|
||||
Ra = Rin/(fc*Cp*Rin - 1);
|
||||
|
||||
ans = Ra
|
||||
|
||||
|
||||
|
||||
% #+RESULTS:
|
||||
% : 79804
|
||||
|
||||
% With this parallel resistance value, the voltage offset would be:
|
||||
|
||||
V_offset = Ra*Rin/(Ra + Rin) * in;
|
||||
|
||||
ans = V_offset
|
||||
|
||||
% Add Parallel Resistor
|
||||
% A resistor $R_p \approx 100\,k\Omega$ is added in parallel with the force sensor as shown in Figure [[fig:force_sensor_model_electronics_without_R]].
|
||||
|
||||
% #+name: fig:force_sensor_model_electronics_without_R
|
||||
% #+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right) with added resistor $R_p$
|
||||
% [[file:figs/force_sensor_model_electronics_without_R.png]]
|
||||
|
||||
|
||||
load('force_sensor_steps_R_82k7.mat', 't', 'encoder', 'u', 'v');
|
||||
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
nexttile;
|
||||
plot(t, v);
|
||||
xlabel('Time [s]'); ylabel('Measured voltage [V]');
|
||||
nexttile;
|
||||
plot(t, u);
|
||||
xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:force_sen_steps_time_domain_par_R
|
||||
% #+caption: Time domain signal during the actuator voltage steps
|
||||
% #+RESULTS:
|
||||
% [[file:figs/force_sen_steps_time_domain_par_R.png]]
|
||||
|
||||
% Three steps are performed at the following time intervals:
|
||||
|
||||
t_s = [1.9, 6;
|
||||
8.5, 13;
|
||||
15.5, 21;
|
||||
22.6, 26;
|
||||
30.0, 36;
|
||||
37.5, 41;
|
||||
46.2, 49.5]
|
||||
|
||||
|
||||
|
||||
% Fit function:
|
||||
|
||||
f = @(b,x) b(1).*exp(b(2).*x) + b(3);
|
||||
|
||||
|
||||
|
||||
% We are interested by the =b(2)= term, which is the time constant of the exponential.
|
||||
|
||||
|
||||
tau = zeros(size(t_s, 1),1);
|
||||
V0 = zeros(size(t_s, 1),1);
|
||||
|
||||
for t_i = 1:size(t_s, 1)
|
||||
t_cur = t(t_s(t_i, 1) < t & t < t_s(t_i, 2));
|
||||
t_cur = t_cur - t_cur(1);
|
||||
y_cur = v(t_s(t_i, 1) < t & t < t_s(t_i, 2));
|
||||
|
||||
nrmrsd = @(b) norm(y_cur - f(b,t_cur)); % Residual Norm Cost Function
|
||||
B0 = [0.5, -0.2, 0.2]; % Choose Appropriate Initial Estimates
|
||||
[B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters ‘B’
|
||||
|
||||
tau(t_i) = 1/B(2);
|
||||
V0(t_i) = B(3);
|
||||
end
|
||||
|
||||
|
||||
|
||||
% #+RESULTS:
|
||||
% | $tau$ [s] | $V_0$ [V] |
|
||||
% |-----------+-----------|
|
||||
% | 0.43 | 0.15 |
|
||||
% | 0.45 | 0.16 |
|
||||
% | 0.43 | 0.15 |
|
||||
% | 0.43 | 0.15 |
|
||||
% | 0.45 | 0.15 |
|
||||
% | 0.46 | 0.16 |
|
||||
% | 0.48 | 0.16 |
|
||||
|
||||
% Knowing the capacitance value, we can estimate the value of the added resistor (neglecting the input impedance of $\approx 1\,M\Omega$):
|
||||
|
||||
|
||||
Cp = 4.4e-6; % [F]
|
||||
Rin = abs(mean(tau))/Cp;
|
||||
|
||||
ans = Rin
|
||||
|
||||
|
||||
|
||||
% #+RESULTS:
|
||||
% : 101200.0
|
||||
|
||||
% And we can verify that the bias current estimation stays the same:
|
||||
|
||||
in = mean(V0)/Rin;
|
||||
|
||||
ans = in
|
||||
|
||||
% Sinus
|
||||
|
||||
load('force_sensor_sin.mat', 't', 'encoder', 'u', 'v');
|
||||
|
||||
u = u(t>25);
|
||||
v = v(t>25);
|
||||
encoder = encoder(t>25) - mean(encoder(t>25));
|
||||
t = t(t>25);
|
||||
|
||||
|
||||
|
||||
% The driving voltage is a sinus at 0.5Hz centered on 3V and with an amplitude of 3V (Figure [[fig:force_sensor_sin_u]]).
|
||||
|
||||
|
||||
figure;
|
||||
plot(t, u)
|
||||
xlabel('Time [s]'); ylabel('Control Voltage [V]');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:force_sensor_sin_u
|
||||
% #+caption: Driving Voltage
|
||||
% #+RESULTS:
|
||||
% [[file:figs/force_sensor_sin_u.png]]
|
||||
|
||||
% The full stroke as measured by the encoder is:
|
||||
|
||||
max(encoder)-min(encoder)
|
||||
|
||||
|
||||
|
||||
% #+RESULTS:
|
||||
% : 5.005e-05
|
||||
|
||||
% Its signal is shown in Figure [[fig:force_sensor_sin_encoder]].
|
||||
|
||||
|
||||
figure;
|
||||
plot(t, encoder)
|
||||
xlabel('Time [s]'); ylabel('Encoder [m]');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:force_sensor_sin_encoder
|
||||
% #+caption: Encoder measurement
|
||||
% #+RESULTS:
|
||||
% [[file:figs/force_sensor_sin_encoder.png]]
|
||||
|
||||
% The generated voltage by the stack is shown in Figure
|
||||
|
||||
|
||||
figure;
|
||||
plot(t, v)
|
||||
xlabel('Time [s]'); ylabel('Force Sensor Output [V]');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:force_sensor_sin_stack
|
||||
% #+caption: Voltage measured on the stack used as a sensor
|
||||
% #+RESULTS:
|
||||
% [[file:figs/force_sensor_sin_stack.png]]
|
||||
|
||||
% The capacitance of the stack is
|
||||
|
||||
Cp = 4.4e-6; % [F]
|
||||
|
||||
|
||||
|
||||
% The corresponding generated charge is then shown in Figure [[fig:force_sensor_sin_charge]].
|
||||
|
||||
figure;
|
||||
plot(t, 1e6*Cp*(v-mean(v)))
|
||||
xlabel('Time [s]'); ylabel('Generated Charge [$\mu C$]');
|
||||
|
||||
|
||||
|
||||
% #+name: fig:force_sensor_sin_charge
|
||||
% #+caption: Generated Charge
|
||||
% #+RESULTS:
|
||||
% [[file:figs/force_sensor_sin_charge.png]]
|
||||
|
||||
|
||||
% The relation between the generated voltage and the measured displacement is almost linear as shown in Figure [[fig:force_sensor_linear_relation]].
|
||||
|
||||
|
||||
b1 = encoder\(v-mean(v));
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(encoder, v-mean(v), 'DisplayName', 'Measured Voltage');
|
||||
plot(encoder, encoder*b1, 'DisplayName', sprintf('Linear Fit: $U_s \\approx %.3f [V/\\mu m] \\cdot d$', 1e-6*abs(b1)));
|
||||
hold off;
|
||||
xlabel('Measured Displacement [m]'); ylabel('Generated Voltage [V]');
|
||||
legend();
|
||||
|
||||
|
||||
|
||||
% #+name: fig:force_sensor_linear_relation
|
||||
% #+caption: Almost linear relation between the relative displacement and the generated voltage
|
||||
% #+RESULTS:
|
||||
% [[file:figs/force_sensor_linear_relation.png]]
|
||||
|
||||
% With a 16bits ADC, the resolution will then be equals to (in [nm]):
|
||||
|
||||
abs((20/2^16)/(b1/1e9))
|
BIN
matlab/mat/force_sensor_sin.mat
Normal file
BIN
matlab/mat/force_sensor_steps.mat
Normal file
BIN
matlab/mat/force_sensor_steps_R_82k7.mat
Normal file
BIN
matlab/mat/identification_R_82k7.mat
Normal file
BIN
matlab/mat/identification_open_circuit.mat
Normal file
BIN
matlab/mat/identification_short_circuit.mat
Normal file
67
matlab/open_closed_circuit.m
Normal file
@ -0,0 +1,67 @@
|
||||
%% Clear Workspace and Close figures
|
||||
clear; close all; clc;
|
||||
|
||||
%% Intialize Laplace variable
|
||||
s = zpk('s');
|
||||
|
||||
addpath('./mat/');
|
||||
|
||||
% Load Data
|
||||
|
||||
oc = load('identification_open_circuit.mat', 't', 'encoder', 'u');
|
||||
sc = load('identification_short_circuit.mat', 't', 'encoder', 'u');
|
||||
|
||||
% Transfer Functions
|
||||
|
||||
Ts = 1e-4; % Sampling Time [s]
|
||||
win = hann(ceil(10/Ts));
|
||||
|
||||
[tf_oc_est, f] = tfestimate(oc.u, oc.encoder, win, [], [], 1/Ts);
|
||||
[co_oc_est, ~] = mscohere( oc.u, oc.encoder, win, [], [], 1/Ts);
|
||||
|
||||
[tf_sc_est, ~] = tfestimate(sc.u, sc.encoder, win, [], [], 1/Ts);
|
||||
[co_sc_est, ~] = mscohere( sc.u, sc.encoder, win, [], [], 1/Ts);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, co_oc_est, '-')
|
||||
plot(f, co_sc_est, '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Coherence'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
xlim([0.5, 5e3]);
|
||||
|
||||
|
||||
|
||||
% #+name: fig:stiffness_force_sensor_coherence
|
||||
% #+caption:
|
||||
% #+RESULTS:
|
||||
% [[file:figs/stiffness_force_sensor_coherence.png]]
|
||||
|
||||
|
||||
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile;
|
||||
hold on;
|
||||
plot(f, abs(tf_oc_est), '-', 'DisplayName', 'Open-Circuit')
|
||||
plot(f, abs(tf_sc_est), '-', 'DisplayName', 'Short-Circuit')
|
||||
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_oc_est), '-')
|
||||
plot(f, 180/pi*angle(tf_sc_est), '-')
|
||||
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
|
||||
ylabel('Phase'); xlabel('Frequency [Hz]');
|
||||
hold off;
|
||||
yticks(-360:90:360);
|
||||
axis padded 'auto x'
|
||||
|
||||
linkaxes([ax1,ax2], 'x');
|
||||
xlim([0.5, 5e3]);
|
17
matlab/runtest.m
Normal file
@ -0,0 +1,17 @@
|
||||
tg = slrt;
|
||||
|
||||
%%
|
||||
f = SimulinkRealTime.openFTP(tg);
|
||||
mget(f, 'int_enc.dat', 'data');
|
||||
close(f);
|
||||
|
||||
%% Convert the Data
|
||||
data = SimulinkRealTime.utils.getFileScopeData('data/int_enc.dat').data;
|
||||
|
||||
interferometer = data(:, 1);
|
||||
encoder = data(:, 2);
|
||||
u = data(:, 3);
|
||||
t = data(:, 4);
|
||||
|
||||
save('./mat/int_enc_id_noise_bis.mat', 'interferometer', 'encoder', 'u' , 't');
|
||||
|
23
matlab/setup.m
Normal file
@ -0,0 +1,23 @@
|
||||
%%
|
||||
s = tf('s');
|
||||
Ts = 1e-4; % [s]
|
||||
|
||||
%% Pre-Filter
|
||||
G_pf = 1/(1 + s/2/pi/20);
|
||||
G_pf = c2d(G_pf, Ts, 'tustin');
|
||||
|
||||
% %% Force Sensor Filter (HPF)
|
||||
% Gf_hpf = s/(s + 2*pi*2);
|
||||
% Gf_hpf = tf(1);
|
||||
% Gf_hpf = c2d(Gf_hpf, Ts, 'tustin');
|
||||
%
|
||||
% %% IFF Controller
|
||||
% Kiff = 1/(s + 2*pi*2);
|
||||
% Kiff = c2d(Kiff, Ts, 'tustin');
|
||||
%
|
||||
% %% Excitation Signal
|
||||
Tsim = 100; % Excitation time + Measurement time [s]
|
||||
|
||||
t = 0:Ts:Tsim;
|
||||
u_exc = timeseries(chirp(t, 10, Tsim, 40, 'logarithmic'), t);
|
||||
% u_exc = timeseries(y_v, t);
|