1710 lines
58 KiB
HTML
1710 lines
58 KiB
HTML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
|
<head>
|
|
<!-- 2020-11-24 mar. 18:24 -->
|
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
|
<title>Test Bench - Amplified Piezoelectric Actuator</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>
|
|
<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">Test Bench - Amplified Piezoelectric Actuator</h1>
|
|
<div id="table-of-contents">
|
|
<h2>Table of Contents</h2>
|
|
<div id="text-table-of-contents">
|
|
<ul>
|
|
<li><a href="#orgb908526">1. Experimental Setup</a></li>
|
|
<li><a href="#org58c6b68">2. Estimation of electrical/mechanical relationships</a>
|
|
<ul>
|
|
<li><a href="#org5a0dde5">2.1. Estimation from Data-sheet</a></li>
|
|
<li><a href="#org20f0327">2.2. Estimation from Piezoelectric parameters</a></li>
|
|
<li><a href="#org29014d6">2.3. Estimation from Experiment</a>
|
|
<ul>
|
|
<li><a href="#org3f63fed">2.3.1. From actuator voltage \(V_a\) to actuator force \(F_a\)</a></li>
|
|
<li><a href="#org0877a6d">2.3.2. From stack strain \(\Delta h\) to generated voltage \(V_s\)</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org5e8b78e">2.4. Conclusion</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgaded65a">3. Simscape model of the test-bench</a>
|
|
<ul>
|
|
<li><a href="#orgbd18d02">3.1. Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates</a></li>
|
|
<li><a href="#org6df0376">3.2. Simscape Model</a></li>
|
|
<li><a href="#org1d92e82">3.3. Dynamics from Actuator Voltage to Vertical Mass Displacement</a></li>
|
|
<li><a href="#org18d1e8d">3.4. Dynamics from Actuator Voltage to Force Sensor Voltage</a></li>
|
|
<li><a href="#org74335e3">3.5. Save Data for further use</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org98bd921">4. Measurement of the ambient noise in the system</a>
|
|
<ul>
|
|
<li><a href="#orge831f73">4.1. Time Domain Data</a></li>
|
|
<li><a href="#org38d16b4">4.2. PSD of Measurement Noise</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org90553e0">5. Identification of the dynamics from actuator Voltage to displacement</a>
|
|
<ul>
|
|
<li><a href="#orgbdf7a7b">5.1. Load Data</a></li>
|
|
<li><a href="#org5513479">5.2. Comparison of the PSD with Huddle Test</a></li>
|
|
<li><a href="#org4d4bebc">5.3. Compute TF estimate and Coherence</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org12553c5">6. Identification of the dynamics from actuator Voltage to force sensor Voltage</a></li>
|
|
<li><a href="#org6f69286">7. Integral Force Feedback</a>
|
|
<ul>
|
|
<li><a href="#orgbc62cba">7.1. IFF Plant</a></li>
|
|
<li><a href="#org4d62e16">7.2. First tests with few gains</a></li>
|
|
<li><a href="#org4304a4e">7.3. Second test with many Gains</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<p>
|
|
This document is divided in the following sections:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>Section <a href="#orgac1a70e">1</a>: the experimental setup is described</li>
|
|
<li>Section <a href="#org0db4f21">2</a>: the parameters which are important for the Simscape model of the piezoelectric stack actuator and sensors are estimated</li>
|
|
<li>Section <a href="#org9d27452">3</a>: the Simscape model of the test bench is presented</li>
|
|
<li>Section <a href="#orga049d7f">4</a>: as usual, a first measurement of the noise/disturbances present in the system is performed</li>
|
|
<li>Section <a href="#org72688d3">5</a>: the transfer function from the actuator voltage to the displacement of the mass is identified and compared with the model</li>
|
|
<li>Section <a href="#orgdd284b9">6</a>: the tranfer function from the actuator voltage to the sensor stack voltage is identified and compare with the model</li>
|
|
<li>Section <a href="#org13dae17">7</a>: the Integral Force Feedback control architecture is applied on the system using the force sensor stack in order to add damping to the suspension resonance</li>
|
|
</ul>
|
|
|
|
<div id="outline-container-orgb908526" class="outline-2">
|
|
<h2 id="orgb908526"><span class="section-number-2">1</span> Experimental Setup</h2>
|
|
<div class="outline-text-2" id="text-1">
|
|
<p>
|
|
<a id="orgac1a70e"></a>
|
|
</p>
|
|
|
|
<p>
|
|
A schematic of the test-bench is shown in Figure <a href="#org42f14fa">1</a>.
|
|
</p>
|
|
|
|
<p>
|
|
A mass can be vertically moved using the amplified piezoelectric actuator (APA95ML).
|
|
The displacement of the mass (relative to the mechanical frame) is measured by the interferometer.
|
|
</p>
|
|
|
|
<p>
|
|
The APA95ML has three stacks that can be used as actuator or as sensors.
|
|
</p>
|
|
|
|
<p>
|
|
Pictures of the test bench are shown in Figure <a href="#org934d0a3">2</a> and <a href="#orgf6513b0">3</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org42f14fa" class="figure">
|
|
<p><img src="figs/test_bench_apa_schematic.png" alt="test_bench_apa_schematic.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 1: </span>Schematic of the Setup</p>
|
|
</div>
|
|
|
|
|
|
<div id="org934d0a3" class="figure">
|
|
<p><img src="figs/setup_picture.png" alt="setup_picture.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 2: </span>Picture of the Setup</p>
|
|
</div>
|
|
|
|
|
|
<div id="orgf6513b0" class="figure">
|
|
<p><img src="figs/setup_zoom.png" alt="setup_zoom.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 3: </span>Zoom on the APA</p>
|
|
</div>
|
|
|
|
<div class="note" id="orgb97925c">
|
|
<p>
|
|
Here are the equipment used in the test bench:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<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>
|
|
<li>Low Noise Voltage Preamplifier from Ametek (<a href="doc/model_5113.pdf">doc</a>)</li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org58c6b68" class="outline-2">
|
|
<h2 id="org58c6b68"><span class="section-number-2">2</span> Estimation of electrical/mechanical relationships</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
<p>
|
|
<a id="org0db4f21"></a>
|
|
</p>
|
|
<p>
|
|
In order to correctly model the piezoelectric actuator with Simscape, we need to determine:
|
|
</p>
|
|
<ol class="org-ol">
|
|
<li>\(g_a\): the ratio of the generated force \(F_a\) to the supply voltage \(V_a\) across the piezoelectric stack</li>
|
|
<li>\(g_s\): the ratio of the generated voltage \(V_s\) across the piezoelectric stack when subject to a strain \(\Delta h\)</li>
|
|
</ol>
|
|
|
|
<p>
|
|
We estimate \(g_a\) and \(g_s\) using different approaches:
|
|
</p>
|
|
<ol class="org-ol">
|
|
<li>Section <a href="#orgcfc54fa">2.1</a>: \(g_a\) is estimated from the datasheet of the piezoelectric stack</li>
|
|
<li>Section <a href="#org0db4f21">2</a>: \(g_a\) and \(g_s\) are estimated using the piezoelectric constants</li>
|
|
<li>Section <a href="#orgcdcd11f">2.3</a>: \(g_a\) and \(g_s\) are estimated experimentally</li>
|
|
</ol>
|
|
</div>
|
|
<div id="outline-container-org5a0dde5" class="outline-3">
|
|
<h3 id="org5a0dde5"><span class="section-number-3">2.1</span> Estimation from Data-sheet</h3>
|
|
<div class="outline-text-3" id="text-2-1">
|
|
<p>
|
|
<a id="orgcfc54fa"></a>
|
|
</p>
|
|
|
|
<p>
|
|
The stack parameters taken from the data-sheet are shown in Table <a href="#org82c2f0a">1</a>.
|
|
</p>
|
|
|
|
<table id="org82c2f0a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 1:</span> Stack Parameters</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Parameter</th>
|
|
<th scope="col" class="org-left">Unit</th>
|
|
<th scope="col" class="org-right">Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">Nominal Stroke</td>
|
|
<td class="org-left">\(\mu m\)</td>
|
|
<td class="org-right">20</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Blocked force</td>
|
|
<td class="org-left">\(N\)</td>
|
|
<td class="org-right">4700</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Stiffness</td>
|
|
<td class="org-left">\(N/\mu m\)</td>
|
|
<td class="org-right">235</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Voltage Range</td>
|
|
<td class="org-left">\(V\)</td>
|
|
<td class="org-right">-20..150</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Capacitance</td>
|
|
<td class="org-left">\(\mu F\)</td>
|
|
<td class="org-right">4.4</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Length</td>
|
|
<td class="org-left">\(mm\)</td>
|
|
<td class="org-right">20</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Stack Area</td>
|
|
<td class="org-left">\(mm^2\)</td>
|
|
<td class="org-right">10x10</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>
|
|
Let’s compute the generated force
|
|
</p>
|
|
|
|
<p>
|
|
The stroke is \(L_{\max} = 20\mu m\) for a voltage range of \(V_{\max} = 170 V\).
|
|
Furthermore, the stiffness is \(k_a = 235 \cdot 10^6 N/m\).
|
|
</p>
|
|
|
|
<p>
|
|
The relation between the applied voltage and the generated force can be estimated as follows:
|
|
</p>
|
|
\begin{equation}
|
|
g_a = k_a \frac{L_{\max}}{V_{\max}}
|
|
\end{equation}
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">ka = 235e6; <span class="org-comment">% [N/m]</span>
|
|
Lmax = 20e<span class="org-type">-</span>6; <span class="org-comment">% [m]</span>
|
|
Vmax = 170; <span class="org-comment">% [V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">ga = ka<span class="org-type">*</span>Lmax<span class="org-type">/</span>Vmax; <span class="org-comment">% [N/V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
ga = 27.6 [N/V]
|
|
</pre>
|
|
|
|
|
|
<p>
|
|
From the parameters of the stack, it seems not possible to estimate the relation between the strain and the generated voltage.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org20f0327" class="outline-3">
|
|
<h3 id="org20f0327"><span class="section-number-3">2.2</span> Estimation from Piezoelectric parameters</h3>
|
|
<div class="outline-text-3" id="text-2-2">
|
|
<p>
|
|
<a id="orgc2edf63"></a>
|
|
</p>
|
|
|
|
<p>
|
|
In order to make the conversion from applied voltage to generated force or from the strain to the generated voltage, we need to defined some parameters corresponding to the piezoelectric material:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">d33 = 300e<span class="org-type">-</span>12; <span class="org-comment">% Strain constant [m/V]</span>
|
|
n = 80; <span class="org-comment">% Number of layers per stack</span>
|
|
ka = 235e6; <span class="org-comment">% Stack stiffness [N/m]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The ratio of the developed force to applied voltage is:
|
|
</p>
|
|
\begin{equation}
|
|
\label{org6f1476c}
|
|
F_a = g_a V_a, \quad g_a = d_{33} n k_a
|
|
\end{equation}
|
|
<p>
|
|
where:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(F_a\): developed force in [N]</li>
|
|
<li>\(n\): number of layers of the actuator stack</li>
|
|
<li>\(d_{33}\): strain constant in [m/V]</li>
|
|
<li>\(k_a\): actuator stack stiffness in [N/m]</li>
|
|
<li>\(V_a\): applied voltage in [V]</li>
|
|
</ul>
|
|
|
|
<p>
|
|
If we take the numerical values, we obtain:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">ga = d33<span class="org-type">*</span>n<span class="org-type">*</span>ka; <span class="org-comment">% [N/V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
ga = 5.6 [N/V]
|
|
</pre>
|
|
|
|
|
|
|
|
<p>
|
|
From (<a href="#citeproc_bib_item_1">Fleming and Leang 2014</a>) (page 123), the relation between relative displacement of the sensor stack and generated voltage is:
|
|
</p>
|
|
\begin{equation}
|
|
\label{org43f15ff}
|
|
V_s = \frac{d_{33}}{\epsilon^T s^D n} \Delta h
|
|
\end{equation}
|
|
<p>
|
|
where:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>\(V_s\): measured voltage in [V]</li>
|
|
<li>\(d_{33}\): strain constant in [m/V]</li>
|
|
<li>\(\epsilon^T\): permittivity under constant stress in [F/m]</li>
|
|
<li>\(s^D\): elastic compliance under constant electric displacement in [m^2/N]</li>
|
|
<li>\(n\): number of layers of the sensor stack</li>
|
|
<li>\(\Delta h\): relative displacement in [m]</li>
|
|
</ul>
|
|
|
|
<p>
|
|
If we take the numerical values, we obtain:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">d33 = 300e<span class="org-type">-</span>12; <span class="org-comment">% Strain constant [m/V]</span>
|
|
n = 80; <span class="org-comment">% Number of layers per stack</span>
|
|
eT = 5.3e<span class="org-type">-</span>9; <span class="org-comment">% Permittivity under constant stress [F/m]</span>
|
|
sD = 2e<span class="org-type">-</span>11; <span class="org-comment">% Compliance under constant electric displacement [m2/N]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">gs = d33<span class="org-type">/</span>(eT<span class="org-type">*</span>sD<span class="org-type">*</span>n); <span class="org-comment">% [V/m]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
gs = 35.4 [V/um]
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org29014d6" class="outline-3">
|
|
<h3 id="org29014d6"><span class="section-number-3">2.3</span> Estimation from Experiment</h3>
|
|
<div class="outline-text-3" id="text-2-3">
|
|
<p>
|
|
<a id="orgcdcd11f"></a>
|
|
</p>
|
|
<p>
|
|
The idea here is to obtain the parameters \(g_a\) and \(g_s\) from the comparison of an experimental identification and the identification using Simscape.
|
|
</p>
|
|
|
|
<p>
|
|
Using the experimental identification, we can easily obtain the gain from the applied voltage to the generated displacement, but not to the generated force.
|
|
However, from the Simscape model, we can easily have the link from the generated force to the displacement, them we can computed \(g_a\).
|
|
</p>
|
|
|
|
<p>
|
|
Similarly, it is fairly easy to experimentally obtain the gain from the stack displacement to the generated voltage across the stack.
|
|
To link that to the strain of the sensor stack, the simscape model is used.
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-org3f63fed" class="outline-4">
|
|
<h4 id="org3f63fed"><span class="section-number-4">2.3.1</span> From actuator voltage \(V_a\) to actuator force \(F_a\)</h4>
|
|
<div class="outline-text-4" id="text-2-3-1">
|
|
<p>
|
|
The data from the identification test is loaded.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load(<span class="org-string">'apa95ml_5kg_Amp_E505.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'um'</span>, <span class="org-string">'y'</span>);
|
|
|
|
<span class="org-comment">% Any offset value is removed:</span>
|
|
um = detrend(um, 0); <span class="org-comment">% Amplifier Input Voltage [V]</span>
|
|
y = detrend(y , 0); <span class="org-comment">% Mass displacement [m]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Now we add a factor 10 to take into account the gain of the voltage amplifier and thus obtain the voltage across the piezoelectric stack.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">um = 10<span class="org-type">*</span>um; <span class="org-comment">% Stack Actuator Input Voltage [V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Then, the transfer function from the stack voltage to the vertical displacement is computed.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = t(end)<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1);
|
|
Fs = 1<span class="org-type">/</span>Ts;
|
|
|
|
win = hanning(ceil(1<span class="org-type">*</span>Fs));
|
|
|
|
[tf_est, f] = tfestimate(um, y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The gain from input voltage of the stack to the vertical displacement is determined:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">g_d_Va = 4e<span class="org-type">-</span>7; <span class="org-comment">% [m/V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org85d884f" class="figure">
|
|
<p><img src="figs/gain_Va_to_d.png" alt="gain_Va_to_d.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 4: </span>Transfer function from actuator stack voltage \(V_a\) to vertical displacement of the mass \(d\)</p>
|
|
</div>
|
|
|
|
<p>
|
|
Then, the transfer function from forces applied by the stack actuator to the vertical displacement of the mass is identified from the Simscape model.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">m = 5.5;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'piezo_amplified_3d'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/Fa'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force [N]</span>
|
|
io(io_i) = linio([mdl, <span class="org-string">'/y'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Vertical Displacement [m]</span>
|
|
|
|
Gd = linearize(mdl, io);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The DC gain the the identified dynamics
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">g_d_Fa = abs(dcgain(Gd)); <span class="org-comment">% [m/N]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
G_d_Fa = 1.2e-08 [m/N]
|
|
</pre>
|
|
|
|
|
|
|
|
<p>
|
|
And finally, the gain \(g_a\) from the the actuator voltage \(V_a\) to the generated force \(F_a\) can be computed:
|
|
</p>
|
|
\begin{equation}
|
|
g_a = \frac{F_a}{V_a} = \frac{F_a}{d} \frac{d}{V_a}
|
|
\end{equation}
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">ga = g_d_Va<span class="org-type">/</span>g_d_Fa;
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
ga = 33.7 [N/V]
|
|
</pre>
|
|
|
|
|
|
<p>
|
|
The obtained comparison between the Simscape model and the identified dynamics is shown in Figure <a href="#orgc82fdbe">5</a>.
|
|
</p>
|
|
|
|
|
|
<div id="orgc82fdbe" class="figure">
|
|
<p><img src="figs/compare_Gd_id_simscape.png" alt="compare_Gd_id_simscape.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 5: </span>Comparison of the identified transfer function between actuator voltage \(V_a\) and vertical mass displacement \(d\)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0877a6d" class="outline-4">
|
|
<h4 id="org0877a6d"><span class="section-number-4">2.3.2</span> From stack strain \(\Delta h\) to generated voltage \(V_s\)</h4>
|
|
<div class="outline-text-4" id="text-2-3-2">
|
|
<p>
|
|
Now, the gain from the stack strain \(\Delta h\) to the generated voltage \(V_s\) is estimated.
|
|
</p>
|
|
|
|
<p>
|
|
We can determine the gain from actuator voltage \(V_a\) to sensor voltage \(V_s\) thanks to the identification.
|
|
Using the simscape model, we can have the transfer function from the actuator voltage \(V_a\) (using the previously estimated gain \(g_a\)) to the sensor stack strain \(\Delta h\).
|
|
</p>
|
|
|
|
<p>
|
|
Finally, using these two values, we can compute the gain \(g_s\) from the stack strain \(\Delta h\) to the generated Voltage \(V_s\).
|
|
</p>
|
|
|
|
<p>
|
|
Identification data is loaded.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load(<span class="org-string">'apa95ml_5kg_2a_1s.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
|
|
|
|
u = detrend(u, 0); <span class="org-comment">% Input Voltage of the Amplifier [V]</span>
|
|
v = detrend(v, 0); <span class="org-comment">% Voltage accross the stack sensor [V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Here, an amplifier with a gain of 20 is used.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">u = 20<span class="org-type">*</span>u; <span class="org-comment">% Input Voltage of the Amplifier [V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Then, the transfer function from \(V_a\) to \(V_s\) is identified and its DC gain is estimated (Figure <a href="#orgf3891ce">6</a>).
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = t(end)<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1);
|
|
Fs = 1<span class="org-type">/</span>Ts;
|
|
|
|
win = hann(ceil(10<span class="org-type">/</span>Ts));
|
|
|
|
[tf_est, f] = tfestimate(u, v, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">g_Vs_Va = 0.022; <span class="org-comment">% [V/V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="orgf3891ce" class="figure">
|
|
<p><img src="figs/gain_Va_to_Vs.png" alt="gain_Va_to_Vs.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 6: </span>Transfer function from actuator stack voltage \(V_a\) to sensor stack voltage \(V_s\)</p>
|
|
</div>
|
|
|
|
|
|
<p>
|
|
Now the transfer function from the actuator stack voltage to the sensor stack strain is estimated using the Simscape model.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">m = 5.5;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'piezo_amplified_3d'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/Va'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Voltage [V]</span>
|
|
io(io_i) = linio([mdl, <span class="org-string">'/dL'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Sensor Stack displacement [m]</span>
|
|
|
|
Gf = linearize(mdl, io);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The gain from the actuator stack voltage to the sensor stack strain is estimated below.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">G_dh_Va = abs(dcgain(Gf));
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
G_dh_Va = 6.2e-09 [m/V]
|
|
</pre>
|
|
|
|
|
|
<p>
|
|
And finally, the gain \(g_s\) from the sensor stack strain to the generated voltage can be estimated:
|
|
</p>
|
|
\begin{equation}
|
|
g_s = \frac{V_s}{\Delta h} = \frac{V_s}{V_a} \frac{V_a}{\Delta h}
|
|
\end{equation}
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">gs = g_Vs_Va<span class="org-type">/</span>G_dh_Va; <span class="org-comment">% [V/m]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<pre class="example">
|
|
gs = 3.5 [V/um]
|
|
</pre>
|
|
|
|
|
|
|
|
<div id="org5abdbfd" class="figure">
|
|
<p><img src="figs/compare_Gf_id_simscape.png" alt="compare_Gf_id_simscape.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 7: </span>Comparison of the identified transfer function between actuator voltage \(V_a\) and sensor stack voltage</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org5e8b78e" class="outline-3">
|
|
<h3 id="org5e8b78e"><span class="section-number-3">2.4</span> Conclusion</h3>
|
|
<div class="outline-text-3" id="text-2-4">
|
|
<p>
|
|
The obtained parameters \(g_a\) and \(g_s\) are not consistent between the different methods.
|
|
</p>
|
|
|
|
<p>
|
|
The one using the experimental data are saved and further used.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">save(<span class="org-string">'./matlab/mat/apa95ml_params.mat'</span>, <span class="org-string">'ga'</span>, <span class="org-string">'gs'</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgaded65a" class="outline-2">
|
|
<h2 id="orgaded65a"><span class="section-number-2">3</span> Simscape model of the test-bench</h2>
|
|
<div class="outline-text-2" id="text-3">
|
|
<p>
|
|
<a id="org9d27452"></a>
|
|
</p>
|
|
<p>
|
|
The idea here is to model the test-bench using Simscape.
|
|
</p>
|
|
|
|
<p>
|
|
Whereas the suspended mass and metrology frame can be considered as rigid bodies in the frequency range of interest, the Amplified Piezoelectric Actuator (APA) is flexible.
|
|
</p>
|
|
|
|
<p>
|
|
To model the APA, a Finite Element Model (FEM) is used (Figure <a href="#orgf4bc6a9">8</a>) and imported into Simscape.
|
|
</p>
|
|
|
|
|
|
<div id="orgf4bc6a9" class="figure">
|
|
<p><img src="figs/APA95ML_FEM.png" alt="APA95ML_FEM.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 8: </span>Finite Element Model of the APA95ML</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgbd18d02" class="outline-3">
|
|
<h3 id="orgbd18d02"><span class="section-number-3">3.1</span> Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates</h3>
|
|
<div class="outline-text-3" id="text-3-1">
|
|
<p>
|
|
We first extract the stiffness and mass matrices.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">K = readmatrix(<span class="org-string">'APA95ML_K.CSV'</span>);
|
|
M = readmatrix(<span class="org-string">'APA95ML_M.CSV'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 2:</span> First 10x10 elements of the Stiffness matrix</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-right">300000000.0</td>
|
|
<td class="org-right">-1000.0</td>
|
|
<td class="org-right">-30000.0</td>
|
|
<td class="org-right">-40.0</td>
|
|
<td class="org-right">70000.0</td>
|
|
<td class="org-right">300.0</td>
|
|
<td class="org-right">20000000.0</td>
|
|
<td class="org-right">-30.0</td>
|
|
<td class="org-right">-5000.0</td>
|
|
<td class="org-right">5</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-1000.0</td>
|
|
<td class="org-right">50000000.0</td>
|
|
<td class="org-right">-7000.0</td>
|
|
<td class="org-right">800000.0</td>
|
|
<td class="org-right">-20.0</td>
|
|
<td class="org-right">300.0</td>
|
|
<td class="org-right">3000.0</td>
|
|
<td class="org-right">5000000.0</td>
|
|
<td class="org-right">400.0</td>
|
|
<td class="org-right">-40000.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-30000.0</td>
|
|
<td class="org-right">-7000.0</td>
|
|
<td class="org-right">100000000.0</td>
|
|
<td class="org-right">-200.0</td>
|
|
<td class="org-right">-60.0</td>
|
|
<td class="org-right">70.0</td>
|
|
<td class="org-right">3000.0</td>
|
|
<td class="org-right">3000.0</td>
|
|
<td class="org-right">-8000000.0</td>
|
|
<td class="org-right">-30.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-40.0</td>
|
|
<td class="org-right">800000.0</td>
|
|
<td class="org-right">-200.0</td>
|
|
<td class="org-right">20000.0</td>
|
|
<td class="org-right">-0.4</td>
|
|
<td class="org-right">4</td>
|
|
<td class="org-right">30.0</td>
|
|
<td class="org-right">40000.0</td>
|
|
<td class="org-right">7</td>
|
|
<td class="org-right">-300.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">70000.0</td>
|
|
<td class="org-right">-20.0</td>
|
|
<td class="org-right">-60.0</td>
|
|
<td class="org-right">-0.4</td>
|
|
<td class="org-right">3000.0</td>
|
|
<td class="org-right">1</td>
|
|
<td class="org-right">-6000.0</td>
|
|
<td class="org-right">10.0</td>
|
|
<td class="org-right">8</td>
|
|
<td class="org-right">-0.1</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">300.0</td>
|
|
<td class="org-right">300.0</td>
|
|
<td class="org-right">70.0</td>
|
|
<td class="org-right">4</td>
|
|
<td class="org-right">1</td>
|
|
<td class="org-right">40000.0</td>
|
|
<td class="org-right">-10.0</td>
|
|
<td class="org-right">-10.0</td>
|
|
<td class="org-right">30.0</td>
|
|
<td class="org-right">0.1</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">20000000.0</td>
|
|
<td class="org-right">3000.0</td>
|
|
<td class="org-right">3000.0</td>
|
|
<td class="org-right">30.0</td>
|
|
<td class="org-right">-6000.0</td>
|
|
<td class="org-right">-10.0</td>
|
|
<td class="org-right">300000000.0</td>
|
|
<td class="org-right">2000.0</td>
|
|
<td class="org-right">9000.0</td>
|
|
<td class="org-right">-100.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-30.0</td>
|
|
<td class="org-right">5000000.0</td>
|
|
<td class="org-right">3000.0</td>
|
|
<td class="org-right">40000.0</td>
|
|
<td class="org-right">10.0</td>
|
|
<td class="org-right">-10.0</td>
|
|
<td class="org-right">2000.0</td>
|
|
<td class="org-right">50000000.0</td>
|
|
<td class="org-right">-3000.0</td>
|
|
<td class="org-right">-800000.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-5000.0</td>
|
|
<td class="org-right">400.0</td>
|
|
<td class="org-right">-8000000.0</td>
|
|
<td class="org-right">7</td>
|
|
<td class="org-right">8</td>
|
|
<td class="org-right">30.0</td>
|
|
<td class="org-right">9000.0</td>
|
|
<td class="org-right">-3000.0</td>
|
|
<td class="org-right">100000000.0</td>
|
|
<td class="org-right">100.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">5</td>
|
|
<td class="org-right">-40000.0</td>
|
|
<td class="org-right">-30.0</td>
|
|
<td class="org-right">-300.0</td>
|
|
<td class="org-right">-0.1</td>
|
|
<td class="org-right">0.1</td>
|
|
<td class="org-right">-100.0</td>
|
|
<td class="org-right">-800000.0</td>
|
|
<td class="org-right">100.0</td>
|
|
<td class="org-right">20000.0</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 3:</span> First 10x10 elements of the Mass matrix</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-right">0.03</td>
|
|
<td class="org-right">7e-08</td>
|
|
<td class="org-right">2e-06</td>
|
|
<td class="org-right">-3e-09</td>
|
|
<td class="org-right">-0.0002</td>
|
|
<td class="org-right">-6e-08</td>
|
|
<td class="org-right">-0.001</td>
|
|
<td class="org-right">8e-07</td>
|
|
<td class="org-right">6e-07</td>
|
|
<td class="org-right">-8e-09</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">7e-08</td>
|
|
<td class="org-right">0.02</td>
|
|
<td class="org-right">-1e-06</td>
|
|
<td class="org-right">9e-05</td>
|
|
<td class="org-right">-3e-09</td>
|
|
<td class="org-right">-4e-09</td>
|
|
<td class="org-right">-1e-06</td>
|
|
<td class="org-right">-0.0006</td>
|
|
<td class="org-right">-4e-08</td>
|
|
<td class="org-right">5e-06</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">2e-06</td>
|
|
<td class="org-right">-1e-06</td>
|
|
<td class="org-right">0.02</td>
|
|
<td class="org-right">-3e-08</td>
|
|
<td class="org-right">-4e-08</td>
|
|
<td class="org-right">1e-08</td>
|
|
<td class="org-right">1e-07</td>
|
|
<td class="org-right">-2e-07</td>
|
|
<td class="org-right">0.0003</td>
|
|
<td class="org-right">1e-09</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-3e-09</td>
|
|
<td class="org-right">9e-05</td>
|
|
<td class="org-right">-3e-08</td>
|
|
<td class="org-right">1e-06</td>
|
|
<td class="org-right">-3e-11</td>
|
|
<td class="org-right">-3e-13</td>
|
|
<td class="org-right">-7e-09</td>
|
|
<td class="org-right">-5e-06</td>
|
|
<td class="org-right">-3e-10</td>
|
|
<td class="org-right">3e-08</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-0.0002</td>
|
|
<td class="org-right">-3e-09</td>
|
|
<td class="org-right">-4e-08</td>
|
|
<td class="org-right">-3e-11</td>
|
|
<td class="org-right">2e-06</td>
|
|
<td class="org-right">6e-10</td>
|
|
<td class="org-right">2e-06</td>
|
|
<td class="org-right">-7e-09</td>
|
|
<td class="org-right">-2e-09</td>
|
|
<td class="org-right">7e-11</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-6e-08</td>
|
|
<td class="org-right">-4e-09</td>
|
|
<td class="org-right">1e-08</td>
|
|
<td class="org-right">-3e-13</td>
|
|
<td class="org-right">6e-10</td>
|
|
<td class="org-right">1e-06</td>
|
|
<td class="org-right">1e-08</td>
|
|
<td class="org-right">3e-09</td>
|
|
<td class="org-right">-2e-09</td>
|
|
<td class="org-right">2e-13</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-0.001</td>
|
|
<td class="org-right">-1e-06</td>
|
|
<td class="org-right">1e-07</td>
|
|
<td class="org-right">-7e-09</td>
|
|
<td class="org-right">2e-06</td>
|
|
<td class="org-right">1e-08</td>
|
|
<td class="org-right">0.03</td>
|
|
<td class="org-right">4e-08</td>
|
|
<td class="org-right">-2e-06</td>
|
|
<td class="org-right">8e-09</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">8e-07</td>
|
|
<td class="org-right">-0.0006</td>
|
|
<td class="org-right">-2e-07</td>
|
|
<td class="org-right">-5e-06</td>
|
|
<td class="org-right">-7e-09</td>
|
|
<td class="org-right">3e-09</td>
|
|
<td class="org-right">4e-08</td>
|
|
<td class="org-right">0.02</td>
|
|
<td class="org-right">-9e-07</td>
|
|
<td class="org-right">-9e-05</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">6e-07</td>
|
|
<td class="org-right">-4e-08</td>
|
|
<td class="org-right">0.0003</td>
|
|
<td class="org-right">-3e-10</td>
|
|
<td class="org-right">-2e-09</td>
|
|
<td class="org-right">-2e-09</td>
|
|
<td class="org-right">-2e-06</td>
|
|
<td class="org-right">-9e-07</td>
|
|
<td class="org-right">0.02</td>
|
|
<td class="org-right">2e-08</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">-8e-09</td>
|
|
<td class="org-right">5e-06</td>
|
|
<td class="org-right">1e-09</td>
|
|
<td class="org-right">3e-08</td>
|
|
<td class="org-right">7e-11</td>
|
|
<td class="org-right">2e-13</td>
|
|
<td class="org-right">8e-09</td>
|
|
<td class="org-right">-9e-05</td>
|
|
<td class="org-right">2e-08</td>
|
|
<td class="org-right">1e-06</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>
|
|
Then, we extract the coordinates of the interface nodes.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes(<span class="org-string">'APA95ML_out_nodes_3D.txt'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The interface nodes are shown in Figure <a href="#org25039e2">9</a> and their coordinates are listed in Table <a href="#orga84d9cf">4</a>.
|
|
</p>
|
|
|
|
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left">Total number of Nodes</td>
|
|
<td class="org-right">7</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Number of interface Nodes</td>
|
|
<td class="org-right">7</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Number of Modes</td>
|
|
<td class="org-right">6</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">Size of M and K matrices</td>
|
|
<td class="org-right">48</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<table id="orga84d9cf" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
<caption class="t-above"><span class="table-number">Table 4:</span> Coordinates of the interface nodes</caption>
|
|
|
|
<colgroup>
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
|
|
<col class="org-right" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-right">Node i</th>
|
|
<th scope="col" class="org-right">Node Number</th>
|
|
<th scope="col" class="org-right">x [m]</th>
|
|
<th scope="col" class="org-right">y [m]</th>
|
|
<th scope="col" class="org-right">z [m]</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-right">1.0</td>
|
|
<td class="org-right">40467.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.029997</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">2.0</td>
|
|
<td class="org-right">40469.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">-0.029997</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">3.0</td>
|
|
<td class="org-right">40470.0</td>
|
|
<td class="org-right">-0.035</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">4.0</td>
|
|
<td class="org-right">40475.0</td>
|
|
<td class="org-right">-0.015</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">5.0</td>
|
|
<td class="org-right">40476.0</td>
|
|
<td class="org-right">-0.005</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">6.0</td>
|
|
<td class="org-right">40477.0</td>
|
|
<td class="org-right">0.015</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-right">7.0</td>
|
|
<td class="org-right">40478.0</td>
|
|
<td class="org-right">0.035</td>
|
|
<td class="org-right">0.0</td>
|
|
<td class="org-right">0.0</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<div id="org25039e2" class="figure">
|
|
<p><img src="figs/APA95ML_nodes_1.png" alt="APA95ML_nodes_1.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 9: </span>Interface Nodes chosen for the APA95ML</p>
|
|
</div>
|
|
|
|
<p>
|
|
Using <code>K</code>, <code>M</code> and <code>int_xyz</code>, we can use the <code>Reduced Order Flexible Solid</code> simscape block.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org6df0376" class="outline-3">
|
|
<h3 id="org6df0376"><span class="section-number-3">3.2</span> Simscape Model</h3>
|
|
<div class="outline-text-3" id="text-3-2">
|
|
<p>
|
|
The flexible element is imported using the <code>Reduced Order Flexible Solid</code> Simscape block.
|
|
</p>
|
|
|
|
<p>
|
|
To model the actuator, an <code>Internal Force</code> block is added between the nodes 3 and 12.
|
|
A <code>Relative Motion Sensor</code> block is added between the nodes 1 and 2 to measure the displacement and the amplified piezo.
|
|
</p>
|
|
|
|
<p>
|
|
One mass is fixed at one end of the piezo-electric stack actuator, the other end is fixed to the world frame.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">m = 5.5;
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load(<span class="org-string">'apa95ml_params.mat'</span>, <span class="org-string">'ga'</span>, <span class="org-string">'gs'</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1d92e82" class="outline-3">
|
|
<h3 id="org1d92e82"><span class="section-number-3">3.3</span> Dynamics from Actuator Voltage to Vertical Mass Displacement</h3>
|
|
<div class="outline-text-3" id="text-3-3">
|
|
<p>
|
|
The identified dynamics is shown in Figure <a href="#org162e335">10</a>.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'piezo_amplified_3d'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/Va'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Voltage [V]</span>
|
|
io(io_i) = linio([mdl, <span class="org-string">'/y'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Vertical Displacement [m]</span>
|
|
|
|
Ghm = linearize(mdl, io);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org162e335" class="figure">
|
|
<p><img src="figs/dynamics_act_disp_comp_mass.png" alt="dynamics_act_disp_comp_mass.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 10: </span>Dynamics from \(F\) to \(d\) without a payload and with a 5kg payload</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org18d1e8d" class="outline-3">
|
|
<h3 id="org18d1e8d"><span class="section-number-3">3.4</span> Dynamics from Actuator Voltage to Force Sensor Voltage</h3>
|
|
<div class="outline-text-3" id="text-3-4">
|
|
<p>
|
|
The obtained dynamics is shown in Figure <a href="#org2258d23">11</a>.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'piezo_amplified_3d'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, <span class="org-string">'/Va'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Voltage Actuator [V]</span>
|
|
io(io_i) = linio([mdl, <span class="org-string">'/Vs'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Sensor Voltage [V]</span>
|
|
|
|
Gfm = linearize(mdl, io);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org2258d23" class="figure">
|
|
<p><img src="figs/dynamics_force_force_sensor_comp_mass.png" alt="dynamics_force_force_sensor_comp_mass.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 11: </span>Dynamics from \(F\) to \(F_m\) for \(m=0\) and \(m = 10kg\)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org74335e3" class="outline-3">
|
|
<h3 id="org74335e3"><span class="section-number-3">3.5</span> Save Data for further use</h3>
|
|
<div class="outline-text-3" id="text-3-5">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">save(<span class="org-string">'matlab/mat/fem_simscape_models.mat'</span>, <span class="org-string">'Ghm'</span>, <span class="org-string">'Gfm'</span>)
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org98bd921" class="outline-2">
|
|
<h2 id="org98bd921"><span class="section-number-2">4</span> Measurement of the ambient noise in the system</h2>
|
|
<div class="outline-text-2" id="text-4">
|
|
<p>
|
|
<a id="orga049d7f"></a>
|
|
</p>
|
|
<p>
|
|
This first measurement consist of measuring the displacement of the mass using the interferometer when no voltage is applied to the actuator.
|
|
</p>
|
|
|
|
<p>
|
|
This can help determining the actuator voltage necessary to generate a motion way above the measured noise and disturbances, and thus obtain a good identification.
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-orge831f73" class="outline-3">
|
|
<h3 id="orge831f73"><span class="section-number-3">4.1</span> Time Domain Data</h3>
|
|
<div class="outline-text-3" id="text-4-1">
|
|
|
|
<div id="org21f1e60" class="figure">
|
|
<p><img src="figs/huddle_test_time_domain.png" alt="huddle_test_time_domain.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 12: </span>Measurement of the Mass displacement during Huddle Test</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org38d16b4" class="outline-3">
|
|
<h3 id="org38d16b4"><span class="section-number-3">4.2</span> PSD of Measurement Noise</h3>
|
|
<div class="outline-text-3" id="text-4-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = t(end)<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1);
|
|
Fs = 1<span class="org-type">/</span>Ts;
|
|
|
|
win = hanning(ceil(1<span class="org-type">*</span>Fs));
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[pxx, f] = pwelch(y(1000<span class="org-type">:</span>end), win, [], [], Fs);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org5264502" class="figure">
|
|
<p><img src="figs/huddle_test_pdf.png" alt="huddle_test_pdf.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 13: </span>Amplitude Spectral Density of the Displacement during Huddle Test</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org90553e0" class="outline-2">
|
|
<h2 id="org90553e0"><span class="section-number-2">5</span> Identification of the dynamics from actuator Voltage to displacement</h2>
|
|
<div class="outline-text-2" id="text-5">
|
|
<p>
|
|
<a id="org72688d3"></a>
|
|
</p>
|
|
<p>
|
|
The setup used for the identification of the dynamics from \(V_a\) to \(d\) is shown in Figure <a href="#org43a6d6f">14</a>.
|
|
</p>
|
|
|
|
<p>
|
|
A Voltage amplifier with a gain of \(10\) is used.
|
|
Two stacks are used as actuators while one stack is used as a force sensor.
|
|
</p>
|
|
|
|
|
|
<div id="org43a6d6f" class="figure">
|
|
<p><img src="figs/test_bench_apa_identification.png" alt="test_bench_apa_identification.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 14: </span>Test Bench used for the identification of the dynaimcs from \(V_a\) to \(d\)</p>
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-orgbdf7a7b" class="outline-3">
|
|
<h3 id="orgbdf7a7b"><span class="section-number-3">5.1</span> Load Data</h3>
|
|
<div class="outline-text-3" id="text-5-1">
|
|
<p>
|
|
The data from the “noise test” and the identification test are loaded.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">ht = load(<span class="org-string">'huddle_test.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'u'</span>, <span class="org-string">'y'</span>);
|
|
load(<span class="org-string">'apa95ml_5kg_Amp_E505.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'um'</span>, <span class="org-string">'y'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Any offset value is removed:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">um = detrend(um, 0); <span class="org-comment">% Input Voltage [V]</span>
|
|
y = detrend(y , 0); <span class="org-comment">% Mass displacement [m]</span>
|
|
|
|
ht.u = detrend(ht.u, 0);
|
|
ht.y = detrend(ht.y, 0);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Now we add a factor 10 to take into account the gain of the voltage amplifier.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">um = 10<span class="org-type">*</span>um;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org5513479" class="outline-3">
|
|
<h3 id="org5513479"><span class="section-number-3">5.2</span> Comparison of the PSD with Huddle Test</h3>
|
|
<div class="outline-text-3" id="text-5-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = t(end)<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1);
|
|
Fs = 1<span class="org-type">/</span>Ts;
|
|
|
|
win = hanning(ceil(1<span class="org-type">*</span>Fs));
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[pxx, f] = pwelch(y, win, [], [], Fs);
|
|
[pht, <span class="org-type">~</span>] = pwelch(ht.y, win, [], [], Fs);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="orgf5a2201" class="figure">
|
|
<p><img src="figs/apa95ml_5kg_PI_pdf_comp_huddle.png" alt="apa95ml_5kg_PI_pdf_comp_huddle.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 15: </span>Comparison of the ASD for the identification test and the huddle test</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org4d4bebc" class="outline-3">
|
|
<h3 id="org4d4bebc"><span class="section-number-3">5.3</span> Compute TF estimate and Coherence</h3>
|
|
<div class="outline-text-3" id="text-5-3">
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">[tf_est, f] = tfestimate(um, <span class="org-type">-</span>y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
[co_est, <span class="org-type">~</span>] = mscohere( um, <span class="org-type">-</span>y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org23ac087" class="figure">
|
|
<p><img src="figs/apa95ml_5kg_PI_coh.png" alt="apa95ml_5kg_PI_coh.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 16: </span>Coherence</p>
|
|
</div>
|
|
|
|
<p>
|
|
Comparison with the FEM model
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load(<span class="org-string">'mat/fem_simscape_models.mat'</span>, <span class="org-string">'Ghm'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="orged73e47" class="figure">
|
|
<p><img src="figs/apa95ml_5kg_pi_comp_fem.png" alt="apa95ml_5kg_pi_comp_fem.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 17: </span>Comparison of the identified transfer function and the one estimated from the FE model</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org12553c5" class="outline-2">
|
|
<h2 id="org12553c5"><span class="section-number-2">6</span> Identification of the dynamics from actuator Voltage to force sensor Voltage</h2>
|
|
<div class="outline-text-2" id="text-6">
|
|
<p>
|
|
<a id="orgdd284b9"></a>
|
|
</p>
|
|
<p>
|
|
The same setup shown in Figure <a href="#org43a6d6f">14</a> is used.
|
|
</p>
|
|
<p>
|
|
The data are loaded:
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load(<span class="org-string">'apa95ml_5kg_2a_1s.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Any offset is removed.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">u = detrend(u, 0); <span class="org-comment">% Speedgoat DAC output Voltage [V]</span>
|
|
v = detrend(v, 0); <span class="org-comment">% Speedgoat ADC input Voltage (sensor stack) [V]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Here, the amplifier gain is 20.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">u = 20<span class="org-type">*</span>u; <span class="org-comment">% Actuator Stack Voltage [V]</span>
|
|
</pre>
|
|
</div>
|
|
<p>
|
|
The transfer function from the actuator voltage \(V_a\) to the force sensor stack voltage \(V_s\) is computed.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">Ts = t(end)<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1);
|
|
Fs = 1<span class="org-type">/</span>Ts;
|
|
|
|
win = hann(ceil(5<span class="org-type">/</span>Ts));
|
|
|
|
[tf_est, f] = tfestimate(u, v, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
[coh, <span class="org-type">~</span>] = mscohere( u, v, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The coherence is shown in Figure <a href="#org0c44552">18</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org0c44552" class="figure">
|
|
<p><img src="figs/apa95ml_5kg_cedrat_coh.png" alt="apa95ml_5kg_cedrat_coh.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 18: </span>Coherence</p>
|
|
</div>
|
|
|
|
<p>
|
|
The Simscape model is loaded and compared with the identified dynamics in Figure <a href="#org5ad15cc">19</a>.
|
|
The non-minimum phase zero is just a side effect of the not so great identification.
|
|
Taking longer measurements would results in a minimum phase zero.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load(<span class="org-string">'mat/fem_simscape_models.mat'</span>, <span class="org-string">'Gfm'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org5ad15cc" class="figure">
|
|
<p><img src="figs/bode_plot_force_sensor_voltage_comp_fem.png" alt="bode_plot_force_sensor_voltage_comp_fem.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 19: </span>Comparison of the identified dynamics from voltage output to voltage input and the FEM</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org6f69286" class="outline-2">
|
|
<h2 id="org6f69286"><span class="section-number-2">7</span> Integral Force Feedback</h2>
|
|
<div class="outline-text-2" id="text-7">
|
|
<p>
|
|
<a id="org13dae17"></a>
|
|
</p>
|
|
|
|
<div id="org5ae9700" class="figure">
|
|
<p><img src="figs/test_bench_apa_schematic_iff.png" alt="test_bench_apa_schematic_iff.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 20: </span>Schematic of the test bench using IFF</p>
|
|
</div>
|
|
</div>
|
|
<div id="outline-container-orgbc62cba" class="outline-3">
|
|
<h3 id="orgbc62cba"><span class="section-number-3">7.1</span> IFF Plant</h3>
|
|
<div class="outline-text-3" id="text-7-1">
|
|
<p>
|
|
From the identified plant, a model of the transfer function from the actuator stack voltage to the force sensor generated voltage is developed.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">w_z = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>111; <span class="org-comment">% Zeros frequency [rad/s]</span>
|
|
w_p = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>255; <span class="org-comment">% Pole frequency [rad/s]</span>
|
|
xi_z = 0.05;
|
|
xi_p = 0.015;
|
|
G_inf = 0.1;
|
|
|
|
Gi = G_inf<span class="org-type">*</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>xi_z<span class="org-type">*</span>w_z<span class="org-type">*</span>s <span class="org-type">+</span> w_z<span class="org-type">^</span>2)<span class="org-type">/</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>xi_p<span class="org-type">*</span>w_p<span class="org-type">*</span>s <span class="org-type">+</span> w_p<span class="org-type">^</span>2);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Its bode plot is shown in Figure <a href="#org255cfc1">21</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org255cfc1" class="figure">
|
|
<p><img src="figs/iff_plant_identification_apa95ml.png" alt="iff_plant_identification_apa95ml.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 21: </span>Bode plot of the IFF plant</p>
|
|
</div>
|
|
|
|
<p>
|
|
The controller used in the Integral Force Feedback Architecture is:
|
|
</p>
|
|
\begin{equation}
|
|
K_{\text{IFF}}(s) = \frac{g}{s + 2\cdot 2\pi} \cdot \frac{s}{s + 0.5 \cdot 2\pi}
|
|
\end{equation}
|
|
<p>
|
|
where \(g\) is a gain that can be tuned.
|
|
</p>
|
|
|
|
<p>
|
|
Above 2 Hz the controller is basically an integrator, whereas an high pass filter is added at 0.5Hz to further reduce the low frequency gain.
|
|
</p>
|
|
|
|
<p>
|
|
In the frequency band of interest, this controller should mostly act as a pure integrator.
|
|
</p>
|
|
|
|
<p>
|
|
The Root Locus corresponding to this controller is shown in Figure <a href="#org70704b4">22</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org70704b4" class="figure">
|
|
<p><img src="figs/root_locus_iff_apa95ml_identification.png" alt="root_locus_iff_apa95ml_identification.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 22: </span>Root Locus for IFF</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-org4d62e16" class="outline-3">
|
|
<h3 id="org4d62e16"><span class="section-number-3">7.2</span> First tests with few gains</h3>
|
|
<div class="outline-text-3" id="text-7-2">
|
|
<p>
|
|
The controller is now implemented in practice, and few controller gains are tested: \(g = 0\), \(g = 10\) and \(g = 100\).
|
|
</p>
|
|
|
|
<p>
|
|
For each controller gain, the identification shown in Figure <a href="#org5ae9700">20</a> is performed.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">iff_g10 = load(<span class="org-string">'apa95ml_iff_g10_res.mat'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>, <span class="org-string">'y'</span>, <span class="org-string">'v'</span>);
|
|
iff_g100 = load(<span class="org-string">'apa95ml_iff_g100_res.mat'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>, <span class="org-string">'y'</span>, <span class="org-string">'v'</span>);
|
|
iff_of = load(<span class="org-string">'apa95ml_iff_off_res.mat'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>, <span class="org-string">'y'</span>, <span class="org-string">'v'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<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));
|
|
|
|
[tf_iff_g10, f] = tfestimate(iff_g10.u, iff_g10.y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
[co_iff_g10, <span class="org-type">~</span>] = mscohere(iff_g10.u, iff_g10.y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
|
|
[tf_iff_g100, <span class="org-type">~</span>] = tfestimate(iff_g100.u, iff_g100.y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
[co_iff_g100, <span class="org-type">~</span>] = mscohere(iff_g100.u, iff_g100.y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
|
|
[tf_iff_of, <span class="org-type">~</span>] = tfestimate(iff_of.u, iff_of.y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
[co_iff_of, <span class="org-type">~</span>] = mscohere(iff_of.u, iff_of.y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The coherence between the excitation signal and the mass displacement as measured by the interferometer is shown in Figure <a href="#orga102681">23</a>.
|
|
</p>
|
|
|
|
|
|
<div id="orga102681" class="figure">
|
|
<p><img src="figs/iff_first_test_coherence.png" alt="iff_first_test_coherence.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 23: </span>Coherence</p>
|
|
</div>
|
|
|
|
<p>
|
|
The obtained transfer functions are shown in Figure <a href="#org64a82bf">24</a>.
|
|
It is clear that the IFF architecture can actively damp the main resonance of the system.
|
|
</p>
|
|
|
|
|
|
<div id="org64a82bf" class="figure">
|
|
<p><img src="figs/iff_first_test_bode_plot.png" alt="iff_first_test_bode_plot.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 24: </span>Bode plot for different values of IFF gain</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org4304a4e" class="outline-3">
|
|
<h3 id="org4304a4e"><span class="section-number-3">7.3</span> Second test with many Gains</h3>
|
|
<div class="outline-text-3" id="text-7-3">
|
|
<p>
|
|
Then, the same identification test is performed for many more gains.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">load(<span class="org-string">'apa95ml_iff_test.mat'</span>, <span class="org-string">'results'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<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));
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">tf_iff = {zeros(1, length(results))};
|
|
co_iff = {zeros(1, length(results))};
|
|
g_iff = [0, 1, 5, 10, 50, 100];
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span>=<span class="org-constant">1:length(results)</span>
|
|
[tf_est, f] = tfestimate(results{<span class="org-constant">i</span>}.u, results{<span class="org-constant">i</span>}.y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
[co_est, <span class="org-type">~</span>] = mscohere(results{<span class="org-constant">i</span>}.u, results{<span class="org-constant">i</span>}.y, win, [], [], 1<span class="org-type">/</span>Ts);
|
|
|
|
tf_iff(<span class="org-constant">i</span>) = {tf_est};
|
|
co_iff(<span class="org-constant">i</span>) = {co_est};
|
|
<span class="org-keyword">end</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The obtained dynamics are shown in Figure <a href="#org04c2472">25</a>.
|
|
</p>
|
|
|
|
|
|
<div id="org04c2472" class="figure">
|
|
<p><img src="figs/iff_results_bode_plots.png" alt="iff_results_bode_plots.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 25: </span>Identified dynamics from excitation voltage to the mass displacement</p>
|
|
</div>
|
|
|
|
<p>
|
|
For each gain, the parameters of a second order resonant system that best fits the data are estimated and are compared with the data in Figure <a href="#org21dc325">26</a>.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">G_id = {zeros(1,length(results))};
|
|
|
|
f_start = 70; <span class="org-comment">% [Hz]</span>
|
|
f_end = 500; <span class="org-comment">% [Hz]</span>
|
|
|
|
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(results)</span>
|
|
tf_id = tf_iff{<span class="org-constant">i</span>}(sum(f<span class="org-type"><</span>f_start)<span class="org-type">:</span>length(f)<span class="org-type">-</span>sum(f<span class="org-type">></span>f_end));
|
|
f_id = f(sum(f<span class="org-type"><</span>f_start)<span class="org-type">:</span>length(f)<span class="org-type">-</span>sum(f<span class="org-type">></span>f_end));
|
|
|
|
gfr = idfrd(tf_id, 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f_id, Ts);
|
|
G_id(<span class="org-constant">i</span>) = {procest(gfr,<span class="org-string">'P2UDZ'</span>)};
|
|
<span class="org-keyword">end</span>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div id="org21dc325" class="figure">
|
|
<p><img src="figs/iff_results_bode_plots_identification.png" alt="iff_results_bode_plots_identification.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 26: </span>Comparison of the measured dynamic and the identified 2nd order resonant systems that best fits the data</p>
|
|
</div>
|
|
|
|
<p>
|
|
Finally, we can represent the position of the poles of the 2nd order systems on the Root Locus plot (Figure <a href="#orgd96aad3">27</a>).
|
|
</p>
|
|
|
|
|
|
<div id="orgd96aad3" class="figure">
|
|
<p><img src="figs/iff_results_root_locus.png" alt="iff_results_root_locus.png" />
|
|
</p>
|
|
<p><span class="figure-number">Figure 27: </span>Root Locus plot of the identified IFF plant as well as the identified poles of the damped system</p>
|
|
</div>
|
|
|
|
<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>Fleming, Andrew J., and Kam K. Leang. 2014. <i>Design, Modeling and Control of Nanopositioning Systems</i>. Advances in Industrial Control. Springer International Publishing. <a href="https://doi.org/10.1007/978-3-319-06617-2">https://doi.org/10.1007/978-3-319-06617-2</a>.</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="postamble" class="status">
|
|
<p class="author">Author: Dehaeze Thomas</p>
|
|
<p class="date">Created: 2020-11-24 mar. 18:24</p>
|
|
</div>
|
|
</body>
|
|
</html>
|