test-bench-apa300ml/test-bench-apa300ml.html
2021-06-09 19:03:07 +02:00

4466 lines
195 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2021-06-09 mer. 19:01 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Amplifier Piezoelectric Actuator APA300ML - Test Bench</title>
<meta name="author" content="Dehaeze Thomas" />
<meta name="generator" content="Org Mode" />
<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 = {
svg: {
scale: 1,
fontCache: "global"
},
tex: {
tags: "ams",
multlineWidth: "%MULTLINEWIDTH",
tagSide: "right",
macros: {bm: ["\\boldsymbol{#1}",1],},
tagIndent: ".8em"
}
};
</script>
<script id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.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">Amplifier Piezoelectric Actuator APA300ML - Test Bench</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org4bb4abb">1. Model of an Amplified Piezoelectric Actuator and Sensor</a></li>
<li><a href="#org3cda5e6">2. First Basic Measurements</a>
<ul>
<li><a href="#org01cce7d">2.1. Geometrical Measurements</a>
<ul>
<li><a href="#org7051010">2.1.1. Measurement Setup</a></li>
<li><a href="#org3378d62">2.1.2. Measurement Results</a></li>
</ul>
</li>
<li><a href="#orge5e6d07">2.2. Electrical Measurements</a></li>
<li><a href="#orgc0b164d">2.3. Stroke measurement</a>
<ul>
<li><a href="#org72cef74">2.3.1. Voltage applied on one stack</a></li>
<li><a href="#orgedd8b54">2.3.2. Voltage applied on two stacks</a></li>
<li><a href="#org21fe09c">2.3.3. Voltage applied on all three stacks</a></li>
</ul>
</li>
<li><a href="#org9017a4d">2.4. Spurious resonances</a>
<ul>
<li><a href="#org471f1fd">2.4.1. Introduction</a></li>
<li><a href="#orgc9ac0dd">2.4.2. Setup</a></li>
<li><a href="#org814855d">2.4.3. Bending - X</a></li>
<li><a href="#org261cde7">2.4.4. Bending - Y</a></li>
<li><a href="#org4f5c88d">2.4.5. Torsion - Z</a></li>
<li><a href="#org76ae8d0">2.4.6. Compare</a></li>
<li><a href="#orge8afc47">2.4.7. Conclusion</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org3d284c9">3. Dynamical measurements - APA</a>
<ul>
<li><a href="#orga3d3857">3.1. Speedgoat Setup</a>
<ul>
<li><a href="#org69156d0">3.1.1. <code>frf_setup.m</code> - Measurement Setup</a></li>
<li><a href="#orgde5fcc0">3.1.2. <code>frf_save.m</code> - Save Data</a></li>
</ul>
</li>
<li><a href="#org166d825">3.2. Measurements on APA 1</a>
<ul>
<li><a href="#org384b544">3.2.1. Excitation Signal</a></li>
<li><a href="#org518a94a">3.2.2. FRF Identification - Setup</a></li>
<li><a href="#orgc5ede61">3.2.3. FRF Identification - Displacement</a></li>
<li><a href="#orgd0e0306">3.2.4. FRF Identification - Force Sensor</a></li>
<li><a href="#org644a07b">3.2.5. Hysteresis</a></li>
<li><a href="#orga546aea">3.2.6. Estimation of the APA axial stiffness</a></li>
<li><a href="#org512f70e">3.2.7. Stiffness change due to electrical connections</a></li>
<li><a href="#org7aac27c">3.2.8. Effect of the resistor on the IFF Plant</a></li>
</ul>
</li>
<li><a href="#org20df261">3.3. Comparison of all the APA</a>
<ul>
<li><a href="#orgdb73eb0">3.3.1. Axial Stiffnesses - Comparison</a></li>
<li><a href="#org526932e">3.3.2. FRF Identification - Setup</a></li>
<li><a href="#orga710d70">3.3.3. FRF Identification - DVF</a></li>
<li><a href="#orgf160d6e">3.3.4. FRF Identification - IFF</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org585297f">4. Dynamical measurements - Struts</a>
<ul>
<li><a href="#org4b7728d">4.1. Measurement on Strut 1</a>
<ul>
<li><a href="#org9a207b3">4.1.1. Without Encoder</a>
<ul>
<li><a href="#orgec9c46c">4.1.1.1. FRF Identification - Setup</a></li>
<li><a href="#orge11d516">4.1.1.2. FRF Identification - Displacement</a></li>
<li><a href="#org62bf3f5">4.1.1.3. FRF Identification - IFF</a></li>
</ul>
</li>
<li><a href="#orgbf66b4f">4.1.2. With Encoder</a>
<ul>
<li><a href="#org5ba2d6c">4.1.2.1. Measurement Data</a></li>
<li><a href="#orgb740ddb">4.1.2.2. FRF Identification - DVF</a></li>
<li><a href="#orga7f7c45">4.1.2.3. Comparison of the Encoder and Interferometer</a></li>
<li><a href="#orge2da99d">4.1.2.4. APA Resonances Frequency</a></li>
<li><a href="#org002bddc">4.1.2.5. Estimated Flexible Joint axial stiffness</a></li>
<li><a href="#orgb8a11ba">4.1.2.6. FRF Identification - IFF</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org9fad4b4">4.2. Comparison of all the Struts</a>
<ul>
<li><a href="#org49346d3">4.2.1. FRF Identification - Setup</a></li>
<li><a href="#orgabceeab">4.2.2. FRF Identification - DVF</a></li>
<li><a href="#org8cfc7f6">4.2.3. FRF Identification - DVF with interferometer</a></li>
<li><a href="#org59120b1">4.2.4. FRF Identification - IFF</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org5e8cd6b">5. Test Bench APA300ML - Simscape Model</a>
<ul>
<li><a href="#org987d2cc">5.1. Introduction</a></li>
<li><a href="#org821abe7">5.2. First Identification</a></li>
<li><a href="#orgd4e5638">5.3. Identify Sensor/Actuator constants and compare with measured FRF</a>
<ul>
<li><a href="#org0719507">5.3.1. How to identify these constants?</a>
<ul>
<li><a href="#orgff68963">5.3.1.1. Piezoelectric Actuator Constant</a></li>
<li><a href="#orgd78a421">5.3.1.2. Piezoelectric Sensor Constant</a></li>
</ul>
</li>
<li><a href="#orge4b3638">5.3.2. Identification Data</a></li>
<li><a href="#orgfb42195">5.3.3. 2DoF APA</a>
<ul>
<li><a href="#orgaf97374">5.3.3.1. 2DoF APA</a></li>
<li><a href="#orga1ad011">5.3.3.2. Identification without actuator or sensor constants</a></li>
<li><a href="#org779ac83">5.3.3.3. Actuator Constant</a></li>
<li><a href="#org62717da">5.3.3.4. Sensor Constant</a></li>
<li><a href="#org5cbf2d4">5.3.3.5. Comparison</a></li>
</ul>
</li>
<li><a href="#org6921e6f">5.3.4. Flexible APA</a>
<ul>
<li><a href="#org438549b">5.3.4.1. Flexible APA</a></li>
<li><a href="#org5d0f01f">5.3.4.2. Identification without actuator or sensor constants</a></li>
<li><a href="#org13e1bb9">5.3.4.3. Actuator Constant</a></li>
<li><a href="#orgf3eff0f">5.3.4.4. Sensor Constant</a></li>
<li><a href="#orgf449dc8">5.3.4.5. Comparison</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org0f741d4">5.4. Optimize 2-DoF model to fit the experimental Data</a></li>
</ul>
</li>
<li><a href="#orgac93bd2">6. Test Bench Struts - Simscape Model</a>
<ul>
<li><a href="#orgfd316f9">6.1. Introduction</a></li>
<li><a href="#orgdbac1a3">6.2. First Identification</a></li>
<li><a href="#org0e2423b">6.3. Effect of flexible joints</a></li>
<li><a href="#orgcb59549">6.4. Integral Force Feedback</a>
<ul>
<li><a href="#org5f7cf11">6.4.1. Initialize the system</a></li>
<li><a href="#org3597bbe">6.4.2. Plant Identification</a></li>
<li><a href="#org77009ac">6.4.3. Root Locus</a></li>
</ul>
</li>
<li><a href="#orgf6b7dd9">6.5. Comparison with the experimental Data</a></li>
</ul>
</li>
<li><a href="#org1f66afd">7. Function</a>
<ul>
<li><a href="#org730257f">7.1. <code>initializeBotFlexibleJoint</code> - Initialize Flexible Joint</a>
<ul>
<li><a href="#org64c034e">Function description</a></li>
<li><a href="#org942e6c2">Optional Parameters</a></li>
<li><a href="#org58455ca">Initialize the structure</a></li>
<li><a href="#orgf261788">Set the Joint&rsquo;s type</a></li>
<li><a href="#orgede603f">Set parameters</a></li>
</ul>
</li>
<li><a href="#orgef70627">7.2. <code>initializeTopFlexibleJoint</code> - Initialize Flexible Joint</a>
<ul>
<li><a href="#org091fbd8">Function description</a></li>
<li><a href="#org1d37383">Optional Parameters</a></li>
<li><a href="#orgc52ebc0">Initialize the structure</a></li>
<li><a href="#org0fa0554">Set the Joint&rsquo;s type</a></li>
<li><a href="#org5590e46">Set parameters</a></li>
</ul>
</li>
<li><a href="#orgacd4906">7.3. <code>initializeAPA</code> - Initialize APA</a>
<ul>
<li><a href="#orga698c5e">Function description</a></li>
<li><a href="#org29dad87">Optional Parameters</a></li>
<li><a href="#org6eeae8c">Initialize Structure</a></li>
<li><a href="#org9b8fb4b">Type</a></li>
<li><a href="#org62c5ed8">Actuator/Sensor Constants</a></li>
<li><a href="#org0fd8dea">2DoF parameters</a></li>
<li><a href="#org1d5fd8f">Flexible frame and fully flexible</a></li>
</ul>
</li>
<li><a href="#orgbbd63f4">7.4. <code>generateSweepExc</code>: Generate sweep sinus excitation</a>
<ul>
<li><a href="#org4047364">Function description</a></li>
<li><a href="#orgdb7f1e4">Optional Parameters</a></li>
<li><a href="#org46430d0">Sweep Sine part</a></li>
<li><a href="#org3d78f6c">Smooth Ends</a></li>
<li><a href="#org63f6cb4">Combine Excitation signals</a></li>
</ul>
</li>
<li><a href="#org9628aeb">7.5. <code>generateShapedNoise</code>: Generate Shaped Noise excitation</a>
<ul>
<li><a href="#org526c60c">Function description</a></li>
<li><a href="#org61cf959">Optional Parameters</a></li>
<li><a href="#org8ecc3f8">Shaped Noise</a></li>
<li><a href="#orgebfd6a4">Smooth Ends</a></li>
<li><a href="#orge82c676">Combine Excitation signals</a></li>
</ul>
</li>
<li><a href="#org5066270">7.6. <code>generateSinIncreasingAmpl</code>: Generate Sinus with increasing amplitude</a>
<ul>
<li><a href="#org6e1c161">Function description</a></li>
<li><a href="#orga64324d">Optional Parameters</a></li>
<li><a href="#orge158235">Sinus excitation</a></li>
<li><a href="#org2afc938">Smooth Ends</a></li>
<li><a href="#org1f109d0">Combine Excitation signals</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<hr>
<p>This report is also available as a <a href="./test-bench-apa300ml.pdf">pdf</a>.</p>
<hr>
<p>
The goal of this test bench is to extract all the important parameters of the Amplified Piezoelectric Actuator APA300ML.
</p>
<p>
This include:
</p>
<ul class="org-ul">
<li>Stroke</li>
<li>Stiffness</li>
<li>Hysteresis</li>
<li>Gain from the applied voltage \(V_a\) to the generated Force \(F_a\)</li>
<li>Gain from the sensor stack strain \(\delta L\) to the generated voltage \(V_s\)</li>
<li>Dynamical behavior</li>
</ul>
<div id="orgf295795" class="figure">
<p><img src="figs/apa300ML.png" alt="apa300ML.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Picture of the APA300ML</p>
</div>
<div id="outline-container-org4bb4abb" class="outline-2">
<h2 id="org4bb4abb"><span class="section-number-2">1</span> Model of an Amplified Piezoelectric Actuator and Sensor</h2>
<div class="outline-text-2" id="text-1">
<p>
Consider a schematic of the Amplified Piezoelectric Actuator in Figure <a href="#org111f00b">2</a>.
</p>
<div id="org111f00b" class="figure">
<p><img src="figs/apa_model_schematic.png" alt="apa_model_schematic.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Amplified Piezoelectric Actuator Schematic</p>
</div>
<p>
A voltage \(V_a\) applied to the actuator stacks will induce an actuator force \(F_a\):
</p>
\begin{equation}
F_a = g_a \cdot V_a
\end{equation}
<p>
A change of length \(dl\) of the sensor stack will induce a voltage \(V_s\):
</p>
\begin{equation}
V_s = g_s \cdot dl
\end{equation}
<p>
We wish here to experimental measure \(g_a\) and \(g_s\).
</p>
<p>
The block-diagram model of the piezoelectric actuator is then as shown in Figure <a href="#org33c3146">3</a>.
</p>
<div id="org33c3146" class="figure">
<p><img src="figs/apa-model-simscape-schematic.png" alt="apa-model-simscape-schematic.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Model of the APA with Simscape/Simulink</p>
</div>
</div>
</div>
<div id="outline-container-org3cda5e6" class="outline-2">
<h2 id="org3cda5e6"><span class="section-number-2">2</span> First Basic Measurements</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="org0d66c55"></a>
</p>
<ul class="org-ul">
<li>Section <a href="#org272280f">2.1</a>:</li>
<li>Section <a href="#orgf1a53d7">2.2</a>:</li>
<li>Section <a href="#orgeeea6f9">2.3</a>:</li>
<li>Section <a href="#orgdae0410">2.4</a>:</li>
</ul>
</div>
<div id="outline-container-org01cce7d" class="outline-3">
<h3 id="org01cce7d"><span class="section-number-3">2.1</span> Geometrical Measurements</h3>
<div class="outline-text-3" id="text-2-1">
<p>
<a id="org272280f"></a>
</p>
<p>
The received APA are shown in Figure <a href="#orgfd3bdf7">4</a>.
</p>
<div id="orgfd3bdf7" class="figure">
<p><img src="figs/IMG_20210224_143500.jpg" alt="IMG_20210224_143500.jpg" />
</p>
<p><span class="figure-number">Figure 4: </span>Received APA</p>
</div>
</div>
<div id="outline-container-org7051010" class="outline-4">
<h4 id="org7051010"><span class="section-number-4">2.1.1</span> Measurement Setup</h4>
<div class="outline-text-4" id="text-2-1-1">
<p>
The flatness corresponding to the two interface planes are measured as shown in Figure <a href="#org077b85e">5</a>.
</p>
<div id="org077b85e" class="figure">
<p><img src="figs/IMG_20210224_143809.jpg" alt="IMG_20210224_143809.jpg" />
</p>
<p><span class="figure-number">Figure 5: </span>Measurement Setup</p>
</div>
</div>
</div>
<div id="outline-container-org3378d62" class="outline-4">
<h4 id="org3378d62"><span class="section-number-4">2.1.2</span> Measurement Results</h4>
<div class="outline-text-4" id="text-2-1-2">
<p>
The height (Z) measurements at the 8 locations (4 points by plane) are defined below.
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa1 = 1e<span class="org-type">-</span>6<span class="org-type">*</span>[0, <span class="org-type">-</span>0.5 , 3.5 , 3.5 , 42 , 45.5, 52.5 , 46];
apa2 = 1e<span class="org-type">-</span>6<span class="org-type">*</span>[0, <span class="org-type">-</span>2.5 , <span class="org-type">-</span>3 , 0 , <span class="org-type">-</span>1.5 , 1 , <span class="org-type">-</span>2 , <span class="org-type">-</span>4];
apa3 = 1e<span class="org-type">-</span>6<span class="org-type">*</span>[0, <span class="org-type">-</span>1.5 , 15 , 17.5 , 6.5 , 6.5 , 21 , 23];
apa4 = 1e<span class="org-type">-</span>6<span class="org-type">*</span>[0, 6.5 , 14.5 , 9 , 16 , 22 , 29.5 , 21];
apa5 = 1e<span class="org-type">-</span>6<span class="org-type">*</span>[0, <span class="org-type">-</span>12.5, 16.5 , 28.5 , <span class="org-type">-</span>43 , <span class="org-type">-</span>52 , <span class="org-type">-</span>22.5, <span class="org-type">-</span>13.5];
apa6 = 1e<span class="org-type">-</span>6<span class="org-type">*</span>[0, <span class="org-type">-</span>8 , <span class="org-type">-</span>2 , 5 , <span class="org-type">-</span>57.5, <span class="org-type">-</span>62 , <span class="org-type">-</span>55.5, <span class="org-type">-</span>52.5];
apa7 = 1e<span class="org-type">-</span>6<span class="org-type">*</span>[0, 19.5 , <span class="org-type">-</span>8 , <span class="org-type">-</span>29.5, 75 , 97.5, 70 , 48];
apa7b = 1e<span class="org-type">-</span>6<span class="org-type">*</span>[0, 9 , <span class="org-type">-</span>18.5, <span class="org-type">-</span>30 , 31 , 46.5, 16.5 , 7.5];
apa = {apa1, apa2, apa3, apa4, apa5, apa6, apa7b};
</pre>
</div>
<p>
The X/Y Positions of the 8 measurement points are defined below.
</p>
<div class="org-src-container">
<pre class="src src-matlab">W = 20e<span class="org-type">-</span>3; <span class="org-comment">% Width [m]</span>
L = 61e<span class="org-type">-</span>3; <span class="org-comment">% Length [m]</span>
d = 1e<span class="org-type">-</span>3; <span class="org-comment">% Distance from border [m]</span>
l = 15.5e<span class="org-type">-</span>3; <span class="org-comment">% [m]</span>
pos = [[<span class="org-type">-</span>L<span class="org-type">/</span>2 <span class="org-type">+</span> d; W<span class="org-type">/</span>2 <span class="org-type">-</span> d], [<span class="org-type">-</span>L<span class="org-type">/</span>2 <span class="org-type">+</span> l <span class="org-type">-</span> d; W<span class="org-type">/</span>2 <span class="org-type">-</span> d], [<span class="org-type">-</span>L<span class="org-type">/</span>2 <span class="org-type">+</span> l <span class="org-type">-</span> d; <span class="org-type">-</span>W<span class="org-type">/</span>2 <span class="org-type">+</span> d], [<span class="org-type">-</span>L<span class="org-type">/</span>2 <span class="org-type">+</span> d; <span class="org-type">-</span>W<span class="org-type">/</span>2 <span class="org-type">+</span> d], [L<span class="org-type">/</span>2 <span class="org-type">-</span> l <span class="org-type">+</span> d; W<span class="org-type">/</span>2 <span class="org-type">-</span> d], [L<span class="org-type">/</span>2 <span class="org-type">-</span> d; W<span class="org-type">/</span>2 <span class="org-type">-</span> d], [L<span class="org-type">/</span>2 <span class="org-type">-</span> d; <span class="org-type">-</span>W<span class="org-type">/</span>2 <span class="org-type">+</span> d], [L<span class="org-type">/</span>2 <span class="org-type">-</span> l <span class="org-type">+</span> d; <span class="org-type">-</span>W<span class="org-type">/</span>2 <span class="org-type">+</span> d]];
</pre>
</div>
<p>
Finally, the flatness is estimated by fitting a plane through the 8 points using the <code>fminsearch</code> command.
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_d = zeros(1, 7);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:7</span>
fun = @(x)max(abs(([pos; apa{<span class="org-constant">i</span>}]<span class="org-type">-</span>[0;0;x(1)])<span class="org-type">'*</span>([x(2<span class="org-type">:</span>3);1]<span class="org-type">/</span>norm([x(2<span class="org-type">:</span>3);1]))));
x0 = [0;0;0];
[x, min_d] = fminsearch(fun,x0);
apa_d(<span class="org-constant">i</span>) = min_d;
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained flatness are shown in Table <a href="#org9b19a2f">1</a>.
</p>
<table id="org9b19a2f" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 1:</span> Estimated flatness</caption>
<colgroup>
<col class="org-left" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-right"><b>Flatness</b> \([\mu m]\)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">APA 1</td>
<td class="org-right">8.9</td>
</tr>
<tr>
<td class="org-left">APA 2</td>
<td class="org-right">3.1</td>
</tr>
<tr>
<td class="org-left">APA 3</td>
<td class="org-right">9.1</td>
</tr>
<tr>
<td class="org-left">APA 4</td>
<td class="org-right">3.0</td>
</tr>
<tr>
<td class="org-left">APA 5</td>
<td class="org-right">1.9</td>
</tr>
<tr>
<td class="org-left">APA 6</td>
<td class="org-right">7.1</td>
</tr>
<tr>
<td class="org-left">APA 7</td>
<td class="org-right">18.7</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div id="outline-container-orge5e6d07" class="outline-3">
<h3 id="orge5e6d07"><span class="section-number-3">2.2</span> Electrical Measurements</h3>
<div class="outline-text-3" id="text-2-2">
<p>
<a id="orgf1a53d7"></a>
</p>
<div class="note" id="org1a23c60">
<p>
The capacitance of the stacks is measure with the <a href="https://www.gwinstek.com/en-global/products/detail/LCR-800">LCR-800 Meter</a> (<a href="doc/DS_LCR-800_Series_V2_E.pdf">doc</a>)
</p>
</div>
<div id="orgdcf55ca" class="figure">
<p><img src="figs/IMG_20210312_120337.jpg" alt="IMG_20210312_120337.jpg" />
</p>
<p><span class="figure-number">Figure 6: </span>LCR Meter used for the measurements</p>
</div>
<p>
The excitation frequency is set to be 1kHz.
</p>
<table id="org88fc0b5" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 2:</span> Capacitance measured with the LCR meter. The excitation signal is a sinus at 1kHz</caption>
<colgroup>
<col class="org-left" />
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-right"><b>Sensor Stack</b></th>
<th scope="col" class="org-right"><b>Actuator Stacks</b></th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">APA 1</td>
<td class="org-right">5.10</td>
<td class="org-right">10.03</td>
</tr>
<tr>
<td class="org-left">APA 2</td>
<td class="org-right">4.99</td>
<td class="org-right">9.85</td>
</tr>
<tr>
<td class="org-left">APA 3</td>
<td class="org-right">1.72</td>
<td class="org-right">5.18</td>
</tr>
<tr>
<td class="org-left">APA 4</td>
<td class="org-right">4.94</td>
<td class="org-right">9.82</td>
</tr>
<tr>
<td class="org-left">APA 5</td>
<td class="org-right">4.90</td>
<td class="org-right">9.66</td>
</tr>
<tr>
<td class="org-left">APA 6</td>
<td class="org-right">4.99</td>
<td class="org-right">9.91</td>
</tr>
<tr>
<td class="org-left">APA 7</td>
<td class="org-right">4.85</td>
<td class="org-right">9.85</td>
</tr>
</tbody>
</table>
<div class="warning" id="org43ea88f">
<p>
There is clearly a problem with APA300ML number 3
</p>
</div>
<p>
The APA number 3 has ben sent back to Cedrat, and a new APA300ML has been shipped back.
</p>
</div>
</div>
<div id="outline-container-orgc0b164d" class="outline-3">
<h3 id="orgc0b164d"><span class="section-number-3">2.3</span> Stroke measurement</h3>
<div class="outline-text-3" id="text-2-3">
<p>
<a id="orgeeea6f9"></a>
</p>
<p>
We here wish to estimate the stroke of the APA.
</p>
<p>
To do so, one side of the APA is fixed, and a displacement probe is located on the other side as shown in Figure <a href="#org7f256d0">7</a>.
</p>
<p>
Then, a voltage is applied on either one or two stacks using a DAC and a voltage amplifier.
</p>
<div class="note" id="org974dfc6">
<p>
Here are the documentation of the equipment used for this test bench:
</p>
<ul class="org-ul">
<li><b>Voltage Amplifier</b>: <a href="doc/PD200-V7-R1.pdf">PD200</a> with a gain of 20</li>
<li><b>16bits DAC</b>: <a href="doc/IO131-OEM-Datasheet.pdf">IO313 Speedgoat card</a></li>
<li><b>Displacement Probe</b>: <a href="doc/Millimar--3723046--BA--C1208-C1216-C1240--FR--2016-11-08.pdf">Millimar C1216 electronics</a> and <a href="doc/tmp3m0cvmue_7888038c-cdc8-48d8-a837-35de02760685.pdf">Millimar 1318 probe</a></li>
</ul>
</div>
<div id="org7f256d0" class="figure">
<p><img src="figs/CE0EF55E-07B7-461B-8CDB-98590F68D15B.jpeg" alt="CE0EF55E-07B7-461B-8CDB-98590F68D15B.jpeg" />
</p>
<p><span class="figure-number">Figure 7: </span>Bench to measured the APA stroke</p>
</div>
</div>
<div id="outline-container-org72cef74" class="outline-4">
<h4 id="org72cef74"><span class="section-number-4">2.3.1</span> Voltage applied on one stack</h4>
<div class="outline-text-4" id="text-2-3-1">
<p>
Let&rsquo;s first look at the relation between the voltage applied to <b>one</b> stack to the displacement of the APA as measured by the displacement probe.
</p>
<p>
The applied voltage is shown in Figure <a href="#org30d2aa8">8</a>.
</p>
<div id="org30d2aa8" class="figure">
<p><img src="figs/apa_stroke_voltage_time.png" alt="apa_stroke_voltage_time.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Applied voltage as a function of time</p>
</div>
<p>
The obtained displacement is shown in Figure <a href="#org27c526b">9</a>.
The displacement is set to zero at initial time when the voltage applied is -20V.
</p>
<div id="org27c526b" class="figure">
<p><img src="figs/apa_stroke_time_1s.png" alt="apa_stroke_time_1s.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Displacement as a function of time for all the APA300ML</p>
</div>
<p>
Finally, the displacement is shown as a function of the applied voltage in Figure <a href="#orgf5a28c9">10</a>.
We can clearly see that there is a problem with the APA 3.
Also, there is a large hysteresis.
</p>
<div id="orgf5a28c9" class="figure">
<p><img src="figs/apa_d_vs_V_1s.png" alt="apa_d_vs_V_1s.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Displacement as a function of the applied voltage</p>
</div>
<div class="important" id="org7435c41">
<p>
We can clearly see from Figure <a href="#orgf5a28c9">10</a> that there is a problem with the APA number 3.
</p>
</div>
</div>
</div>
<div id="outline-container-orgedd8b54" class="outline-4">
<h4 id="orgedd8b54"><span class="section-number-4">2.3.2</span> Voltage applied on two stacks</h4>
<div class="outline-text-4" id="text-2-3-2">
<p>
Now look at the relation between the voltage applied to the <b>two</b> other stacks to the displacement of the APA as measured by the displacement probe.
</p>
<p>
The obtained displacement is shown in Figure <a href="#orgedd9abb">11</a>.
The displacement is set to zero at initial time when the voltage applied is -20V.
</p>
<div id="orgedd9abb" class="figure">
<p><img src="figs/apa_stroke_time_2s.png" alt="apa_stroke_time_2s.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Displacement as a function of time for all the APA300ML</p>
</div>
<p>
Finally, the displacement is shown as a function of the applied voltage in Figure <a href="#orgb20b2b4">12</a>.
We can clearly see that there is a problem with the APA 3.
Also, there is a large hysteresis.
</p>
<div id="orgb20b2b4" class="figure">
<p><img src="figs/apa_d_vs_V_2s.png" alt="apa_d_vs_V_2s.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Displacement as a function of the applied voltage</p>
</div>
</div>
</div>
<div id="outline-container-org21fe09c" class="outline-4">
<h4 id="org21fe09c"><span class="section-number-4">2.3.3</span> Voltage applied on all three stacks</h4>
<div class="outline-text-4" id="text-2-3-3">
<p>
Finally, we can combine the two measurements to estimate the relation between the displacement and the voltage applied to the <b>three</b> stacks (Figure <a href="#org5eca50d">13</a>).
</p>
<div id="org5eca50d" class="figure">
<p><img src="figs/apa_d_vs_V_3s.png" alt="apa_d_vs_V_3s.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Displacement as a function of the applied voltage</p>
</div>
<p>
The obtained maximum stroke for all the APA are summarized in Table <a href="#orgc0373d9">3</a>.
</p>
<table id="orgc0373d9" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 3:</span> Measured maximum stroke</caption>
<colgroup>
<col class="org-left" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-right"><b>Stroke</b> \([\mu m]\)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">APA 1</td>
<td class="org-right">373.2</td>
</tr>
<tr>
<td class="org-left">APA 2</td>
<td class="org-right">365.5</td>
</tr>
<tr>
<td class="org-left">APA 3</td>
<td class="org-right">181.7</td>
</tr>
<tr>
<td class="org-left">APA 4</td>
<td class="org-right">359.7</td>
</tr>
<tr>
<td class="org-left">APA 5</td>
<td class="org-right">361.5</td>
</tr>
<tr>
<td class="org-left">APA 6</td>
<td class="org-right">363.9</td>
</tr>
<tr>
<td class="org-left">APA 7</td>
<td class="org-right">358.4</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div id="outline-container-org9017a4d" class="outline-3">
<h3 id="org9017a4d"><span class="section-number-3">2.4</span> Spurious resonances</h3>
<div class="outline-text-3" id="text-2-4">
<p>
<a id="orgdae0410"></a>
</p>
</div>
<div id="outline-container-org471f1fd" class="outline-4">
<h4 id="org471f1fd"><span class="section-number-4">2.4.1</span> Introduction</h4>
<div class="outline-text-4" id="text-2-4-1">
<p>
Three main resonances are foreseen to be problematic for the control of the APA300ML:
</p>
<ul class="org-ul">
<li>Mode in X-bending at 189Hz (Figure <a href="#org8ecff8f">14</a>)</li>
<li>Mode in Y-bending at 285Hz (Figure <a href="#org6068f55">15</a>)</li>
<li>Mode in Z-torsion at 400Hz (Figure <a href="#orge96dccd">16</a>)</li>
</ul>
<div id="org8ecff8f" class="figure">
<p><img src="figs/mode_bending_x.gif" alt="mode_bending_x.gif" />
</p>
<p><span class="figure-number">Figure 14: </span>X-bending mode (189Hz)</p>
</div>
<div id="org6068f55" class="figure">
<p><img src="figs/mode_bending_y.gif" alt="mode_bending_y.gif" />
</p>
<p><span class="figure-number">Figure 15: </span>Y-bending mode (285Hz)</p>
</div>
<div id="orge96dccd" class="figure">
<p><img src="figs/mode_torsion_z.gif" alt="mode_torsion_z.gif" />
</p>
<p><span class="figure-number">Figure 16: </span>Z-torsion mode (400Hz)</p>
</div>
<p>
These modes are present when flexible joints are fixed to the ends of the APA300ML.
</p>
<p>
In this section, we try to find the resonance frequency of these modes when one end of the APA is fixed and the other is free.
</p>
</div>
</div>
<div id="outline-container-orgc9ac0dd" class="outline-4">
<h4 id="orgc9ac0dd"><span class="section-number-4">2.4.2</span> Setup</h4>
<div class="outline-text-4" id="text-2-4-2">
<p>
The measurement setup is shown in Figure <a href="#org3e8b5e2">17</a>.
A Laser vibrometer is measuring the difference of motion of two points.
The APA is excited with an instrumented hammer and the transfer function from the hammer to the measured rotation is computed.
</p>
<div class="note" id="orgc028d27">
<ul class="org-ul">
<li>Laser Doppler Vibrometer Polytec OFV512</li>
<li>Instrumented hammer</li>
</ul>
</div>
<div id="org3e8b5e2" class="figure">
<p><img src="figs/measurement_setup_torsion.jpg" alt="measurement_setup_torsion.jpg" />
</p>
<p><span class="figure-number">Figure 17: </span>Measurement setup with a Laser Doppler Vibrometer and one instrumental hammer</p>
</div>
</div>
</div>
<div id="outline-container-org814855d" class="outline-4">
<h4 id="org814855d"><span class="section-number-4">2.4.3</span> Bending - X</h4>
<div class="outline-text-4" id="text-2-4-3">
<p>
The setup to measure the X-bending motion is shown in Figure <a href="#orgf98ad6e">18</a>.
The APA is excited with an instrumented hammer having a solid metallic tip.
The impact point is on the back-side of the APA aligned with the top measurement point.
</p>
<div id="orgf98ad6e" class="figure">
<p><img src="figs/measurement_setup_X_bending.jpg" alt="measurement_setup_X_bending.jpg" />
</p>
<p><span class="figure-number">Figure 18: </span>X-Bending measurement setup</p>
</div>
<p>
The data is loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab">bending_X = load(<span class="org-string">'apa300ml_bending_X_top.mat'</span>);
</pre>
</div>
<p>
The config for <code>tfestimate</code> is performed:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Ts = bending_X.Track1_X_Resolution; <span class="org-comment">% Sampling frequency [Hz]</span>
win = hann(ceil(1<span class="org-type">/</span>Ts));
</pre>
</div>
<p>
The transfer function from the input force to the output &ldquo;rotation&rdquo; (difference between the two measured distances).
</p>
<div class="org-src-container">
<pre class="src src-matlab">[G_bending_X, f] = tfestimate(bending_X.Track1, bending_X.Track2, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
The result is shown in Figure <a href="#org983c576">19</a>.
</p>
<p>
The can clearly observe a nice peak at 280Hz, and then peaks at the odd &ldquo;harmonics&rdquo; (third &ldquo;harmonic&rdquo; at 840Hz, and fifth &ldquo;harmonic&rdquo; at 1400Hz).
</p>
<div id="org983c576" class="figure">
<p><img src="figs/apa300ml_meas_freq_bending_x.png" alt="apa300ml_meas_freq_bending_x.png" />
</p>
<p><span class="figure-number">Figure 19: </span>Obtained FRF for the X-bending</p>
</div>
</div>
</div>
<div id="outline-container-org261cde7" class="outline-4">
<h4 id="org261cde7"><span class="section-number-4">2.4.4</span> Bending - Y</h4>
<div class="outline-text-4" id="text-2-4-4">
<p>
The setup to measure the Y-bending is shown in Figure <a href="#org9224576">20</a>.
</p>
<p>
The impact point of the instrumented hammer is located on the back surface of the top interface (on the back of the 2 measurements points).
</p>
<div id="org9224576" class="figure">
<p><img src="figs/measurement_setup_Y_bending.jpg" alt="measurement_setup_Y_bending.jpg" />
</p>
<p><span class="figure-number">Figure 20: </span>Y-Bending measurement setup</p>
</div>
<p>
The data is loaded, and the transfer function from the force to the measured rotation is computed.
</p>
<div class="org-src-container">
<pre class="src src-matlab">bending_Y = load(<span class="org-string">'apa300ml_bending_Y_top.mat'</span>);
[G_bending_Y, <span class="org-type">~</span>] = tfestimate(bending_Y.Track1, bending_Y.Track2, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
The results are shown in Figure <a href="#org7c4da10">21</a>.
The main resonance is at 412Hz, and we also see the third &ldquo;harmonic&rdquo; at 1220Hz.
</p>
<div id="org7c4da10" class="figure">
<p><img src="figs/apa300ml_meas_freq_bending_y.png" alt="apa300ml_meas_freq_bending_y.png" />
</p>
<p><span class="figure-number">Figure 21: </span>Obtained FRF for the Y-bending</p>
</div>
</div>
</div>
<div id="outline-container-org4f5c88d" class="outline-4">
<h4 id="org4f5c88d"><span class="section-number-4">2.4.5</span> Torsion - Z</h4>
<div class="outline-text-4" id="text-2-4-5">
<p>
Finally, we measure the Z-torsion resonance as shown in Figure <a href="#orgf38b02c">22</a>.
</p>
<p>
The excitation is shown on the other side of the APA, on the side to excite the torsion motion.
</p>
<div id="orgf38b02c" class="figure">
<p><img src="figs/measurement_setup_torsion_bis.jpg" alt="measurement_setup_torsion_bis.jpg" />
</p>
<p><span class="figure-number">Figure 22: </span>Z-Torsion measurement setup</p>
</div>
<p>
The data is loaded, and the transfer function computed.
</p>
<div class="org-src-container">
<pre class="src src-matlab">torsion = load(<span class="org-string">'apa300ml_torsion_left.mat'</span>);
[G_torsion, <span class="org-type">~</span>] = tfestimate(torsion.Track1, torsion.Track2, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
The results are shown in Figure <a href="#orgc424712">23</a>.
We observe a first peak at 267Hz, which corresponds to the X-bending mode that was measured at 280Hz.
And then a second peak at 415Hz, which corresponds to the X-bending mode that was measured at 412Hz.
The mode in pure torsion is probably at higher frequency (peak around 1kHz?).
</p>
<div id="orgc424712" class="figure">
<p><img src="figs/apa300ml_meas_freq_torsion_z.png" alt="apa300ml_meas_freq_torsion_z.png" />
</p>
<p><span class="figure-number">Figure 23: </span>Obtained FRF for the Z-torsion</p>
</div>
<p>
In order to verify that, the APA is excited on the top part such that the torsion mode should not be excited.
</p>
<div class="org-src-container">
<pre class="src src-matlab">torsion = load(<span class="org-string">'apa300ml_torsion_top.mat'</span>);
[G_torsion_top, <span class="org-type">~</span>] = tfestimate(torsion.Track1, torsion.Track2, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
The two FRF are compared in Figure <a href="#org60b6c50">24</a>.
It is clear that the first two modes does not correspond to the torsional mode.
Maybe the resonance at 800Hz, or even higher resonances. It is difficult to conclude here.
</p>
<div id="org60b6c50" class="figure">
<p><img src="figs/apa300ml_meas_freq_torsion_z_comp.png" alt="apa300ml_meas_freq_torsion_z_comp.png" />
</p>
<p><span class="figure-number">Figure 24: </span>Obtained FRF for the Z-torsion</p>
</div>
</div>
</div>
<div id="outline-container-org76ae8d0" class="outline-4">
<h4 id="org76ae8d0"><span class="section-number-4">2.4.6</span> Compare</h4>
<div class="outline-text-4" id="text-2-4-6">
<p>
The three measurements are shown in Figure <a href="#org85ca1d4">25</a>.
</p>
<div id="org85ca1d4" class="figure">
<p><img src="figs/apa300ml_meas_freq_compare.png" alt="apa300ml_meas_freq_compare.png" />
</p>
<p><span class="figure-number">Figure 25: </span>Obtained FRF - Comparison</p>
</div>
</div>
</div>
<div id="outline-container-orge8afc47" class="outline-4">
<h4 id="orge8afc47"><span class="section-number-4">2.4.7</span> Conclusion</h4>
<div class="outline-text-4" id="text-2-4-7">
<p>
When two flexible joints are fixed at each ends of the APA, the APA is mostly in a free/free condition in terms of bending/torsion (the bending/torsional stiffness of the joints being very small).
</p>
<p>
In the current tests, the APA are in a fixed/free condition.
Therefore, it is quite obvious that we measured higher resonance frequencies than what is foreseen for the struts.
It is however quite interesting that there is a factor \(\approx \sqrt{2}\) between the two (increased of the stiffness by a factor 2?).
</p>
<table id="org88a9ff6" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 4:</span> Measured frequency of the modes</caption>
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Mode</th>
<th scope="col" class="org-left">Strut Mode</th>
<th scope="col" class="org-left">Measured Frequency</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">X-Bending</td>
<td class="org-left">189Hz</td>
<td class="org-left">280Hz</td>
</tr>
<tr>
<td class="org-left">Y-Bending</td>
<td class="org-left">285Hz</td>
<td class="org-left">410Hz</td>
</tr>
<tr>
<td class="org-left">Z-Torsion</td>
<td class="org-left">400Hz</td>
<td class="org-left">?</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="outline-container-org3d284c9" class="outline-2">
<h2 id="org3d284c9"><span class="section-number-2">3</span> Dynamical measurements - APA</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="org8962678"></a>
</p>
<p>
In this section, a measurement test bench is used to identify the dynamics of the APA.
</p>
<p>
The bench is shown in Figure <a href="#orge2dba51">26</a>, and a zoom picture on the APA and encoder is shown in Figure <a href="#org4e38bb3">27</a>.
</p>
<div id="orge2dba51" class="figure">
<p><img src="figs/picture_apa_bench.png" alt="picture_apa_bench.png" />
</p>
<p><span class="figure-number">Figure 26: </span>Picture of the test bench</p>
</div>
<div id="org4e38bb3" class="figure">
<p><img src="figs/picture_apa_bench_encoder.png" alt="picture_apa_bench_encoder.png" />
</p>
<p><span class="figure-number">Figure 27: </span>Zoom on the APA with the encoder</p>
</div>
<div class="note" id="org7ee7114">
<p>
Here are the documentation of the equipment used for this test bench:
</p>
<ul class="org-ul">
<li>Voltage Amplifier: <a href="doc/PD200-V7-R1.pdf">PD200</a></li>
<li>Amplified Piezoelectric Actuator: <a href="doc/APA300ML.pdf">APA300ML</a></li>
<li>DAC/ADC: Speedgoat <a href="doc/IO131-OEM-Datasheet.pdf">IO313</a></li>
<li>Encoder: <a href="doc/L-9517-9678-05-A_Data_sheet_VIONiC_series_en.pdf">Renishaw Vionic</a> and used <a href="doc/L-9517-9862-01-C_Data_sheet_RKLC_EN.pdf">Ruler</a></li>
<li>Interferometer: <a href="https://www.attocube.com/en/products/laser-displacement-sensor/displacement-measuring-interferometer">Attocube IDS3010</a></li>
</ul>
</div>
<p>
The bench is schematically shown in Figure <a href="#org8574ae0">28</a> and the signal used are summarized in Table <a href="#org3e9c6ba">5</a>.
</p>
<div id="org8574ae0" class="figure">
<p><img src="figs/test_bench_apa_alone.png" alt="test_bench_apa_alone.png" />
</p>
<p><span class="figure-number">Figure 28: </span>Schematic of the Test Bench</p>
</div>
<table id="org3e9c6ba" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 5:</span> Variables used during the measurements</caption>
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Description</th>
<th scope="col" class="org-left">Unit</th>
<th scope="col" class="org-left">Hardware</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>Va</code></td>
<td class="org-left">Output DAC voltage</td>
<td class="org-left">[V]</td>
<td class="org-left">DAC - Ch. 1 =&gt; PD200 =&gt; APA</td>
</tr>
<tr>
<td class="org-left"><code>Vs</code></td>
<td class="org-left">Measured stack voltage (ADC)</td>
<td class="org-left">[V]</td>
<td class="org-left">APA =&gt; ADC - Ch. 1</td>
</tr>
<tr>
<td class="org-left"><code>de</code></td>
<td class="org-left">Encoder Measurement</td>
<td class="org-left">[m]</td>
<td class="org-left">PEPU Ch. 1 - IO318(1) - Ch. 1</td>
</tr>
<tr>
<td class="org-left"><code>da</code></td>
<td class="org-left">Attocube Measurement</td>
<td class="org-left">[m]</td>
<td class="org-left">PEPU Ch. 2 - IO318(1) - Ch. 2</td>
</tr>
<tr>
<td class="org-left"><code>t</code></td>
<td class="org-left">Time</td>
<td class="org-left">[s]</td>
<td class="org-left">&#xa0;</td>
</tr>
</tbody>
</table>
<p>
This section is structured as follows:
</p>
<ul class="org-ul">
<li>Section <a href="#orgd658976">3.1</a>: the Speedgoat setup is described (excitation signals, saved signals, etc.)</li>
<li>Section <a href="#orgae0bb15">3.2</a>: the measurements are first performed on one APA.</li>
<li>Section <a href="#org1718809">3.3</a>: the same measurements are performed on all the APA and are compared.</li>
</ul>
</div>
<div id="outline-container-orga3d3857" class="outline-3">
<h3 id="orga3d3857"><span class="section-number-3">3.1</span> Speedgoat Setup</h3>
<div class="outline-text-3" id="text-3-1">
<p>
<a id="orgd658976"></a>
</p>
</div>
<div id="outline-container-org69156d0" class="outline-4">
<h4 id="org69156d0"><span class="section-number-4">3.1.1</span> <code>frf_setup.m</code> - Measurement Setup</h4>
<div class="outline-text-4" id="text-3-1-1">
<p>
First is defined the sampling frequency:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Simulation configuration</span></span>
Fs = 10e3; <span class="org-comment">% Sampling Frequency [Hz]</span>
Ts = 1<span class="org-type">/</span>Fs; <span class="org-comment">% Sampling Time [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Data record configuration</span></span>
Trec_start = 5; <span class="org-comment">% Start time for Recording [s]</span>
Trec_dur = 100; <span class="org-comment">% Recording Duration [s]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Tsim = 2<span class="org-type">*</span>Trec_start <span class="org-type">+</span> Trec_dur; <span class="org-comment">% Simulation Time [s]</span>
</pre>
</div>
<p>
A white noise excitation signal can be very useful in order to obtain a first idea of the plant FRF.
The gain can be gradually increased until satisfactory output is obtained.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Shaped Noise</span></span>
V_noise = generateShapedNoise(<span class="org-string">'Ts'</span>, 1<span class="org-type">/</span>Fs, ...
<span class="org-string">'V_mean'</span>, 3.25, ...
<span class="org-string">'t_start'</span>, Trec_start, ...
<span class="org-string">'exc_duration'</span>, Trec_dur, ...
<span class="org-string">'smooth_ends'</span>, <span class="org-constant">true</span>, ...
<span class="org-string">'V_exc'</span>, 0.05<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>10));
</pre>
</div>
<div id="org379d568" class="figure">
<p><img src="figs/frf_meas_noise_excitation.png" alt="frf_meas_noise_excitation.png" />
</p>
<p><span class="figure-number">Figure 29: </span>Example of Shaped noise excitation signal</p>
</div>
<p>
The maximum excitation voltage at resonance is 9Vrms, therefore corresponding to 0.6V of output DAC voltage.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Sweep Sine</span></span>
gc = 0.1;
xi = 0.5;
wn = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>94.3;
<span class="org-comment">% Notch filter at the resonance of the APA</span>
G_sweep = 0.2<span class="org-type">*</span>(s<span class="org-type">^</span>2 <span class="org-type">+</span> 2<span class="org-type">*</span>gc<span class="org-type">*</span>xi<span class="org-type">*</span>wn<span class="org-type">*</span>s <span class="org-type">+</span> wn<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<span class="org-type">*</span>wn<span class="org-type">*</span>s <span class="org-type">+</span> wn<span class="org-type">^</span>2);
V_sweep = generateSweepExc(<span class="org-string">'Ts'</span>, Ts, ...
<span class="org-string">'f_start'</span>, 10, ...
<span class="org-string">'f_end'</span>, 400, ...
<span class="org-string">'V_mean'</span>, 3.25, ...
<span class="org-string">'t_start'</span>, Trec_start, ...
<span class="org-string">'exc_duration'</span>, Trec_dur, ...
<span class="org-string">'sweep_type'</span>, <span class="org-string">'log'</span>, ...
<span class="org-string">'V_exc'</span>, G_sweep<span class="org-type">*</span>1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>500));
</pre>
</div>
<div id="org18470a1" class="figure">
<p><img src="figs/frf_meas_sweep_excitation.png" alt="frf_meas_sweep_excitation.png" />
</p>
<p><span class="figure-number">Figure 30: </span>Example of Sweep Sin excitation signal</p>
</div>
<p>
In order to better estimate the high frequency dynamics, a band-limited noise can be used (Figure <a href="#orgc390d1d">31</a>).
The frequency content of the noise can be precisely controlled.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% High Frequency Shaped Noise</span></span>
[b,a] = cheby1(10, 2, 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>[300 2e3], <span class="org-string">'bandpass'</span>, <span class="org-string">'s'</span>);
wL = 0.005<span class="org-type">*</span>tf(b, a);
V_noise_hf = generateShapedNoise(<span class="org-string">'Ts'</span>, 1<span class="org-type">/</span>Fs, ...
<span class="org-string">'V_mean'</span>, 3.25, ...
<span class="org-string">'t_start'</span>, Trec_start, ...
<span class="org-string">'exc_duration'</span>, Trec_dur, ...
<span class="org-string">'smooth_ends'</span>, <span class="org-constant">true</span>, ...
<span class="org-string">'V_exc'</span>, wL);
</pre>
</div>
<div id="orgc390d1d" class="figure">
<p><img src="figs/frf_meas_noise_hf_exc.png" alt="frf_meas_noise_hf_exc.png" />
</p>
<p><span class="figure-number">Figure 31: </span>Example of band-limited noise excitation signal</p>
</div>
<p>
Then a sinus excitation can be used to estimate the hysteresis.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Sinus excitation with increasing amplitude</span></span>
V_sin = generateSinIncreasingAmpl(<span class="org-string">'Ts'</span>, 1<span class="org-type">/</span>Fs, ...
<span class="org-string">'V_mean'</span>, 3.25, ...
<span class="org-string">'sin_ampls'</span>, [0.1, 0.2, 0.4, 1, 2, 4], ...
<span class="org-string">'sin_period'</span>, 1, ...
<span class="org-string">'sin_num'</span>, 5, ...
<span class="org-string">'t_start'</span>, Trec_start, ...
<span class="org-string">'smooth_ends'</span>, <span class="org-constant">true</span>);
</pre>
</div>
<div id="org16790e4" class="figure">
<p><img src="figs/frf_meas_sin_excitation.png" alt="frf_meas_sin_excitation.png" />
</p>
<p><span class="figure-number">Figure 32: </span>Example of Shaped noise excitation signal</p>
</div>
<p>
Then, we select the wanted excitation signal.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Select the excitation signal</span></span>
V_exc = timeseries(V_noise(2,<span class="org-type">:</span>), V_noise(1,<span class="org-type">:</span>));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Save data that will be loaded in the Simulink file</span></span>
save(<span class="org-string">'./frf_data.mat'</span>, <span class="org-string">'Fs'</span>, <span class="org-string">'Ts'</span>, <span class="org-string">'Tsim'</span>, <span class="org-string">'Trec_start'</span>, <span class="org-string">'Trec_dur'</span>, <span class="org-string">'V_exc'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgde5fcc0" class="outline-4">
<h4 id="orgde5fcc0"><span class="section-number-4">3.1.2</span> <code>frf_save.m</code> - Save Data</h4>
<div class="outline-text-4" id="text-3-1-2">
<p>
First, we get data from the Speedgoat:
</p>
<div class="org-src-container">
<pre class="src src-matlab">tg = slrt;
f = SimulinkRealTime.openFTP(tg);
mget(f, <span class="org-string">'data/data.dat'</span>);
close(f);
</pre>
</div>
<p>
And we load the data on the Workspace:
</p>
<div class="org-src-container">
<pre class="src src-matlab">data = SimulinkRealTime.utils.getFileScopeData(<span class="org-string">'data/data.dat'</span>).data;
da = data(<span class="org-type">:</span>, 1); <span class="org-comment">% Excitation Voltage (input of PD200) [V]</span>
de = data(<span class="org-type">:</span>, 2); <span class="org-comment">% Measured voltage (force sensor) [V]</span>
Vs = data(<span class="org-type">:</span>, 3); <span class="org-comment">% Measurment displacement (encoder) [m]</span>
Va = data(<span class="org-type">:</span>, 4); <span class="org-comment">% Measurement displacement (attocube) [m]</span>
t = data(<span class="org-type">:</span>, end); <span class="org-comment">% Time [s]</span>
</pre>
</div>
<p>
And we save this to a <code>mat</code> file:
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_number = 1;
save(sprintf(<span class="org-string">'mat/frf_data_%i_huddle.mat'</span>, apa_number), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org166d825" class="outline-3">
<h3 id="org166d825"><span class="section-number-3">3.2</span> Measurements on APA 1</h3>
<div class="outline-text-3" id="text-3-2">
<p>
<a id="orgae0bb15"></a>
</p>
<p>
Measurements are first performed on only <b>one</b> APA.
Once the measurement procedure is validated, it is performed on all the other APA.
</p>
</div>
<div id="outline-container-org384b544" class="outline-4">
<h4 id="org384b544"><span class="section-number-4">3.2.1</span> Excitation Signal</h4>
<div class="outline-text-4" id="text-3-2-1">
<p>
For this first measurement, a basic logarithmic sweep is used between 10Hz and 2kHz.
</p>
<p>
The data are loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_sweep = load(sprintf(<span class="org-string">'mat/frf_data_%i_sweep.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'da'</span>, <span class="org-string">'de'</span>);
</pre>
</div>
<p>
The initial time is set to zero.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Time vector</span></span>
t = apa_sweep.t <span class="org-type">-</span> apa_sweep.t(1) ; <span class="org-comment">% Time vector [s]</span>
</pre>
</div>
<p>
The excitation signal is shown in Figure <a href="#org6ae6845">33</a>.
It is a sweep sine from 10Hz up to 2kHz filtered with a notch centered with the main resonance of the system and a low pass filter.
</p>
<div id="org6ae6845" class="figure">
<p><img src="figs/apa_bench_exc_sweep.png" alt="apa_bench_exc_sweep.png" />
</p>
<p><span class="figure-number">Figure 33: </span>Excitation voltage</p>
</div>
</div>
</div>
<div id="outline-container-org518a94a" class="outline-4">
<h4 id="org518a94a"><span class="section-number-4">3.2.2</span> FRF Identification - Setup</h4>
<div class="outline-text-4" id="text-3-2-2">
<p>
Let&rsquo;s define the sampling time/frequency.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Sampling</span></span>
Ts = (t(end) <span class="org-type">-</span> t(1))<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1); <span class="org-comment">% Sampling Time [s]</span>
Fs = 1<span class="org-type">/</span>Ts; <span class="org-comment">% Sampling Frequency [Hz]</span>
</pre>
</div>
<p>
Then we defined a &ldquo;Hanning&rdquo; windows that will be used for the spectral analysis:
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(1<span class="org-type">*</span>Fs)); <span class="org-comment">% Hannning Windows</span>
</pre>
</div>
<p>
We get the frequency vector that will be the same for all the frequency domain analysis.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Only used to have the frequency vector "f"</span>
[<span class="org-type">~</span>, f] = tfestimate(apa_sweep.Va, apa_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc5ede61" class="outline-4">
<h4 id="orgc5ede61"><span class="section-number-4">3.2.3</span> FRF Identification - Displacement</h4>
<div class="outline-text-4" id="text-3-2-3">
<p>
In this section, the transfer function from the excitation voltage \(V_a\) to the encoder measured displacement \(d_e\) and interferometer measurement \(d_a\).
</p>
<p>
The coherence from \(V_a\) to \(d_e\) is computed and shown in Figure <a href="#orga7d946b">34</a>.
It is quite good from 10Hz up to 500Hz.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% TF - Encoder</span></span>
[coh_sweep, <span class="org-type">~</span>] = mscohere(apa_sweep.Va, apa_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="orga7d946b" class="figure">
<p><img src="figs/apa_1_coh_dvf.png" alt="apa_1_coh_dvf.png" />
</p>
<p><span class="figure-number">Figure 34: </span>Coherence for the identification from \(V_a\) to \(d_e\)</p>
</div>
<p>
The transfer functions are then estimated and shown in Figure <a href="#orgca76a8a">35</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% TF - Encoder</span></span>
[dvf_sweep, <span class="org-type">~</span>] = tfestimate(apa_sweep.Va, apa_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
<span class="org-matlab-cellbreak"><span class="org-comment">%% TF - Interferometer</span></span>
[int_sweep, <span class="org-type">~</span>] = tfestimate(apa_sweep.Va, apa_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="orgca76a8a" class="figure">
<p><img src="figs/apa_1_frf_dvf.png" alt="apa_1_frf_dvf.png" />
</p>
<p><span class="figure-number">Figure 35: </span>Obtained transfer functions from \(V_a\) to both \(d_e\) and \(d_a\)</p>
</div>
<div class="important" id="org66a4a2e">
<p>
It seems that using the interferometer, we have a lot more time delay than when using the encoder.
</p>
</div>
</div>
</div>
<div id="outline-container-orgd0e0306" class="outline-4">
<h4 id="orgd0e0306"><span class="section-number-4">3.2.4</span> FRF Identification - Force Sensor</h4>
<div class="outline-text-4" id="text-3-2-4">
<p>
Now the dynamics from excitation voltage \(V_a\) to the force sensor stack voltage \(V_s\) is identified.
</p>
<p>
The coherence is computed and shown in Figure <a href="#org1dc8c20">36</a> and found very good from 10Hz up to 2kHz.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% TF - Encoder</span></span>
[coh_sweep, <span class="org-type">~</span>] = mscohere(apa_sweep.Va, apa_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="org1dc8c20" class="figure">
<p><img src="figs/apa_1_coh_iff.png" alt="apa_1_coh_iff.png" />
</p>
<p><span class="figure-number">Figure 36: </span>Coherence for the identification from \(V_a\) to \(V_s\)</p>
</div>
<p>
The transfer function is estimated and shown in Figure <a href="#orgdb5b84c">37</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Transfer function estimation</span></span>
[iff_sweep, <span class="org-type">~</span>] = tfestimate(apa_sweep.Va, apa_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="orgdb5b84c" class="figure">
<p><img src="figs/apa_1_frf_iff.png" alt="apa_1_frf_iff.png" />
</p>
<p><span class="figure-number">Figure 37: </span>Obtained transfer functions from \(V_a\) to \(V_s\)</p>
</div>
</div>
</div>
<div id="outline-container-org644a07b" class="outline-4">
<h4 id="org644a07b"><span class="section-number-4">3.2.5</span> Hysteresis</h4>
<div class="outline-text-4" id="text-3-2-5">
<p>
We here wish to visually see the amount of hysteresis present in the APA.
</p>
<p>
To do so, a quasi static sinusoidal excitation \(V_a\) at different voltages is used.
</p>
<p>
The offset is 65V, and the sin amplitude is ranging from 1V up to 80V.
</p>
<p>
For each excitation amplitude, the vertical displacement \(d\) of the mass is measured.
</p>
<p>
Then, \(d\) is plotted as a function of \(V_a\) for all the amplitudes.
</p>
<p>
We expect to obtained something like the hysteresis shown in Figure <a href="#orgbc00382">38</a>.
</p>
<div id="orgbc00382" class="figure">
<p><img src="figs/expected_hysteresis.png" alt="expected_hysteresis.png" />
</p>
<p><span class="figure-number">Figure 38: </span>Expected Hysteresis <a class='org-ref-reference' href="#poel10_explor_activ_hard_mount_vibrat">poel10_explor_activ_hard_mount_vibrat</a></p>
</div>
<p>
The data is loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_hyst = load(<span class="org-string">'frf_data_1_hysteresis.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'de'</span>);
<span class="org-comment">% Initial time set to zero</span>
apa_hyst.t = apa_hyst.t <span class="org-type">-</span> apa_hyst.t(1);
</pre>
</div>
<p>
The excitation voltage amplitudes are:
</p>
<div class="org-src-container">
<pre class="src src-matlab">ampls = [0.1, 0.2, 0.4, 1, 2, 4]; <span class="org-comment">% Excitation voltage amplitudes</span>
</pre>
</div>
<p>
The excitation voltage and the measured displacement are shown in Figure <a href="#orgc67612a">39</a>.
</p>
<div id="orgc67612a" class="figure">
<p><img src="figs/hyst_exc_signal_time.png" alt="hyst_exc_signal_time.png" />
</p>
<p><span class="figure-number">Figure 39: </span>Excitation voltage and measured displacement</p>
</div>
<p>
For each amplitude, we only take the last sinus in order to reduce possible transients.
Also, it is centered on zero.
</p>
<p>
The measured displacement at a function of the output voltage are shown in Figure <a href="#orgb5679c6">40</a>.
</p>
<div id="orgb5679c6" class="figure">
<p><img src="figs/hyst_results_multi_ampl.png" alt="hyst_results_multi_ampl.png" />
</p>
<p><span class="figure-number">Figure 40: </span>Obtained hysteresis for multiple excitation amplitudes</p>
</div>
<div class="important" id="org0084c0d">
<p>
It is quite clear that hysteresis is increasing with the excitation amplitude.
</p>
<p>
Also, no hysteresis is found on the sensor stack voltage.
</p>
</div>
</div>
</div>
<div id="outline-container-orga546aea" class="outline-4">
<h4 id="orga546aea"><span class="section-number-4">3.2.6</span> Estimation of the APA axial stiffness</h4>
<div class="outline-text-4" id="text-3-2-6">
<p>
In order to estimate the stiffness of the APA, a weight with known mass \(m_a\) is added on top of the suspended granite and the deflection \(d_e\) is measured using the encoder.
The APA stiffness is then:
</p>
\begin{equation}
k_{\text{apa}} = \frac{m_a g}{d}
\end{equation}
<p>
Here, a mass of 6.4 kg is used:
</p>
<div class="org-src-container">
<pre class="src src-matlab">added_mass = 6.4; <span class="org-comment">% Added mass [kg]</span>
</pre>
</div>
<p>
The data is loaded, and the measured displacement is shown in Figure <a href="#orgf8bb36a">41</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_mass = load(sprintf(<span class="org-string">'frf_data_%i_add_mass_closed_circuit.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'de'</span>);
apa_mass.de = apa_mass.de <span class="org-type">-</span> mean(apa_mass.de(apa_mass.t<span class="org-type">&lt;</span>11));
</pre>
</div>
<div id="orgf8bb36a" class="figure">
<p><img src="figs/apa_1_meas_stiffness.png" alt="apa_1_meas_stiffness.png" />
</p>
<p><span class="figure-number">Figure 41: </span>Measured displacement when adding the mass and removing the mass</p>
</div>
<p>
There is some imprecision in the measurement as there are some drifts that are probably due to some creep.
</p>
<p>
The stiffness is then computed as follows:
</p>
<div class="org-src-container">
<pre class="src src-matlab">k = 9.8 <span class="org-type">*</span> added_mass <span class="org-type">/</span> (mean(apa_mass.de(apa_mass.t <span class="org-type">&gt;</span> 12 <span class="org-type">&amp;</span> apa_mass.t <span class="org-type">&lt;</span> 12.5)) <span class="org-type">-</span> mean(apa_mass.de(apa_mass.t <span class="org-type">&gt;</span> 20 <span class="org-type">&amp;</span> apa_mass.t <span class="org-type">&lt;</span> 20.5)));
</pre>
</div>
<p>
And the stiffness obtained is very close to the one specified in the documentation (\(k = 1.794\,[N/\mu m]\)).
</p>
<pre class="example">
k = 1.68 [N/um]
</pre>
</div>
</div>
<div id="outline-container-org512f70e" class="outline-4">
<h4 id="org512f70e"><span class="section-number-4">3.2.7</span> Stiffness change due to electrical connections</h4>
<div class="outline-text-4" id="text-3-2-7">
<p>
We wish here to see if the stiffness changes when the actuator stacks are not connected to the amplifier and the sensor stacks are not connected to the ADC.
</p>
<p>
Note here that the resistor in parallel to the sensor stack is present in both cases.
</p>
<p>
First, the data are loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab">add_mass_oc = load(sprintf(<span class="org-string">'frf_data_%i_add_mass_open_circuit.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'de'</span>);
add_mass_cc = load(sprintf(<span class="org-string">'frf_data_%i_add_mass_closed_circuit.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'de'</span>);
</pre>
</div>
<p>
And the initial displacement is set to zero.
</p>
<div class="org-src-container">
<pre class="src src-matlab">add_mass_oc.de = add_mass_oc.de <span class="org-type">-</span> mean(add_mass_oc.de(add_mass_oc.t<span class="org-type">&lt;</span>11));
add_mass_cc.de = add_mass_cc.de <span class="org-type">-</span> mean(add_mass_cc.de(add_mass_cc.t<span class="org-type">&lt;</span>11));
</pre>
</div>
<p>
The measured displacements are shown in Figure <a href="#orgff1f9c2">42</a>.
</p>
<div id="orgff1f9c2" class="figure">
<p><img src="figs/apa_meas_k_time_oc_cc.png" alt="apa_meas_k_time_oc_cc.png" />
</p>
<p><span class="figure-number">Figure 42: </span>Measured displacement</p>
</div>
<p>
And the stiffness is estimated in both case.
The results are shown in Table <a href="#org01bcadd">6</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_k_oc = 9.8 <span class="org-type">*</span> added_mass <span class="org-type">/</span> (mean(add_mass_oc.de(add_mass_oc.t <span class="org-type">&gt;</span> 12 <span class="org-type">&amp;</span> add_mass_oc.t <span class="org-type">&lt;</span> 12.5)) <span class="org-type">-</span> mean(add_mass_oc.de(add_mass_oc.t <span class="org-type">&gt;</span> 20 <span class="org-type">&amp;</span> add_mass_oc.t <span class="org-type">&lt;</span> 20.5)));
apa_k_cc = 9.8 <span class="org-type">*</span> added_mass <span class="org-type">/</span> (mean(add_mass_cc.de(add_mass_cc.t <span class="org-type">&gt;</span> 12 <span class="org-type">&amp;</span> add_mass_cc.t <span class="org-type">&lt;</span> 12.5)) <span class="org-type">-</span> mean(add_mass_cc.de(add_mass_cc.t <span class="org-type">&gt;</span> 20 <span class="org-type">&amp;</span> add_mass_cc.t <span class="org-type">&lt;</span> 20.5)));
</pre>
</div>
<table id="org01bcadd" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 6:</span> Measured stiffnesses on &ldquo;open&rdquo; and &ldquo;closed&rdquo; circuits</caption>
<colgroup>
<col class="org-left" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-right">\(k [N/\mu m]\)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Not connected</td>
<td class="org-right">2.3</td>
</tr>
<tr>
<td class="org-left">Connected</td>
<td class="org-right">1.7</td>
</tr>
</tbody>
</table>
<div class="important" id="orgcf9c2cb">
<p>
Clearly, connecting the actuator stacks to the amplified (basically equivalent as to short circuiting them) lowers the stiffness.
</p>
</div>
</div>
</div>
<div id="outline-container-org7aac27c" class="outline-4">
<h4 id="org7aac27c"><span class="section-number-4">3.2.8</span> Effect of the resistor on the IFF Plant</h4>
<div class="outline-text-4" id="text-3-2-8">
<p>
A resistor \(R \approx 80.6\,k\Omega\) is added in parallel with the sensor stack.
This has the effect to form a high pass filter with the capacitance of the stack.
</p>
<p>
We here measured the low frequency transfer function from \(V_a\) to \(V_s\) with and without this resistor.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% With the resistor</span>
wi_k = load(<span class="org-string">'frf_data_1_sweep_lf_with_R.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'Va'</span>);
<span class="org-comment">% Without the resistor</span>
wo_k = load(<span class="org-string">'frf_data_1_sweep_lf.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'Va'</span>);
</pre>
</div>
<p>
We use a very long &ldquo;Hanning&rdquo; window for the spectral analysis in order to estimate the low frequency behavior.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(50<span class="org-type">*</span>Fs)); <span class="org-comment">% Hannning Windows</span>
</pre>
</div>
<p>
And we estimate the transfer function from \(V_a\) to \(V_s\) in both cases:
</p>
<div class="org-src-container">
<pre class="src src-matlab">[frf_wo_k, f] = tfestimate(wo_k.Va, wo_k.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[frf_wi_k, <span class="org-type">~</span>] = tfestimate(wi_k.Va, wi_k.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
With the following values of the resistor and capacitance, we obtain a first order high pass filter with a crossover frequency equal to:
</p>
<div class="org-src-container">
<pre class="src src-matlab">C = 5.1e<span class="org-type">-</span>6; <span class="org-comment">% Sensor Stack capacitance [F]</span>
R = 80.6e3; <span class="org-comment">% Parallel Resistor [Ohm]</span>
f0 = 1<span class="org-type">/</span>(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>R<span class="org-type">*</span>C); <span class="org-comment">% Crossover frequency of RC HPF [Hz]</span>
</pre>
</div>
<pre class="example">
f0 = 0.39 [Hz]
</pre>
<p>
The transfer function of the corresponding high pass filter is:
</p>
<div class="org-src-container">
<pre class="src src-matlab">G_hpf = 0.6<span class="org-type">*</span>(s<span class="org-type">/</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f0)<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f0);
</pre>
</div>
<p>
Let&rsquo;s compare the transfer function from actuator stack to sensor stack with and without the added resistor in Figure <a href="#orgecd15bb">43</a>.
</p>
<div id="orgecd15bb" class="figure">
<p><img src="figs/frf_iff_effect_R.png" alt="frf_iff_effect_R.png" />
</p>
<p><span class="figure-number">Figure 43: </span>Transfer function from \(V_a\) to \(V_s\) with and without the resistor \(k\)</p>
</div>
<div class="important" id="org537c1bd">
<p>
The added resistor has indeed the expected effect.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org20df261" class="outline-3">
<h3 id="org20df261"><span class="section-number-3">3.3</span> Comparison of all the APA</h3>
<div class="outline-text-3" id="text-3-3">
<p>
<a id="org1718809"></a>
</p>
<p>
The same measurements that was performed in Section <a href="#orgae0bb15">3.2</a> are now performed on all the APA and then compared.
</p>
</div>
<div id="outline-container-orgdb73eb0" class="outline-4">
<h4 id="orgdb73eb0"><span class="section-number-4">3.3.1</span> Axial Stiffnesses - Comparison</h4>
<div class="outline-text-4" id="text-3-3-1">
<p>
Let&rsquo;s first compare the APA axial stiffnesses.
</p>
<p>
The added mass is:
</p>
<div class="org-src-container">
<pre class="src src-matlab">added_mass = 6.4; <span class="org-comment">% Added mass [kg]</span>
</pre>
</div>
<p>
Here are the number of the APA that have been measured:
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_nums = [1 2 4 5 6 7 8];
</pre>
</div>
<p>
The data are loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_mass = {};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
apa_mass(<span class="org-constant">i</span>) = {load(sprintf(<span class="org-string">'frf_data_%i_add_mass_closed_circuit.mat'</span>, apa_nums(<span class="org-constant">i</span>)), <span class="org-string">'t'</span>, <span class="org-string">'de'</span>)};
<span class="org-comment">% The initial displacement is set to zero</span>
apa_mass{<span class="org-constant">i</span>}.de = apa_mass{<span class="org-constant">i</span>}.de <span class="org-type">-</span> mean(apa_mass{<span class="org-constant">i</span>}.de(apa_mass{<span class="org-constant">i</span>}.t<span class="org-type">&lt;</span>11));
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The raw measurements are shown in Figure <a href="#orgf00e3d3">44</a>.
All the APA seems to have similar stiffness except the APA 7 which should have an higher stiffness.
</p>
<div class="question" id="org98acbd4">
<p>
It is however strange that the displacement \(d_e\) when the mass is removed is higher for the APA 7 than for the other APA.
What could cause that?
</p>
</div>
<div id="orgf00e3d3" class="figure">
<p><img src="figs/apa_meas_k_time.png" alt="apa_meas_k_time.png" />
</p>
<p><span class="figure-number">Figure 44: </span>Raw measurements for all the APA. A mass of 6.4kg is added at arround 15s and removed at arround 22s</p>
</div>
<p>
The stiffnesses are computed for all the APA and are summarized in Table <a href="#org54e6502">7</a>.
</p>
<table id="org54e6502" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 7:</span> Measured stiffnesses</caption>
<colgroup>
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">APA Num</th>
<th scope="col" class="org-right">\(k [N/\mu m]\)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">1</td>
<td class="org-right">1.68</td>
</tr>
<tr>
<td class="org-right">2</td>
<td class="org-right">1.69</td>
</tr>
<tr>
<td class="org-right">4</td>
<td class="org-right">1.7</td>
</tr>
<tr>
<td class="org-right">5</td>
<td class="org-right">1.7</td>
</tr>
<tr>
<td class="org-right">6</td>
<td class="org-right">1.7</td>
</tr>
<tr>
<td class="org-right">7</td>
<td class="org-right">1.93</td>
</tr>
<tr>
<td class="org-right">8</td>
<td class="org-right">1.73</td>
</tr>
</tbody>
</table>
<div class="important" id="orgad2d1ae">
<p>
The APA300ML manual specifies the nominal stiffness to be \(1.8\,[N/\mu m]\) which is very close to what have been measured.
Only the APA number 7 is a little bit off.
</p>
</div>
</div>
</div>
<div id="outline-container-org526932e" class="outline-4">
<h4 id="org526932e"><span class="section-number-4">3.3.2</span> FRF Identification - Setup</h4>
<div class="outline-text-4" id="text-3-3-2">
<p>
The identification is performed in three steps:
</p>
<ol class="org-ol">
<li>White noise excitation with small amplitude.
This is used to determine the main resonance of the system.</li>
<li>Sweep sine excitation with the amplitude lowered around the resonance.
The sweep sine is from 10Hz to 400Hz.</li>
<li>High frequency noise.
The noise is band-passed between 300Hz and 2kHz.</li>
</ol>
<p>
Then, the result of the second identification is used between 10Hz and 350Hz and the result of the third identification if used between 350Hz and 2kHz.
</p>
<p>
Here are the APA numbers that have been measured.
</p>
<div class="org-src-container">
<pre class="src src-matlab">apa_nums = [1 2 4 5 6 7 8];
</pre>
</div>
<p>
The data are loaded for both the second and third identification:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Second identification</span></span>
apa_sweep = {};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
apa_sweep(<span class="org-constant">i</span>) = {load(sprintf(<span class="org-string">'frf_data_%i_sweep.mat'</span>, apa_nums(<span class="org-constant">i</span>)), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>)};
<span class="org-keyword">end</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Third identification</span></span>
apa_noise_hf = {};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
apa_noise_hf(<span class="org-constant">i</span>) = {load(sprintf(<span class="org-string">'frf_data_%i_noise_hf.mat'</span>, apa_nums(<span class="org-constant">i</span>)), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>)};
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The time is the same for all measurements.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Time vector</span></span>
t = apa_sweep{1}.t <span class="org-type">-</span> apa_sweep{1}.t(1) ; <span class="org-comment">% Time vector [s]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Sampling</span></span>
Ts = (t(end) <span class="org-type">-</span> t(1))<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1); <span class="org-comment">% Sampling Time [s]</span>
Fs = 1<span class="org-type">/</span>Ts; <span class="org-comment">% Sampling Frequency [Hz]</span>
</pre>
</div>
<p>
Then we defined a &ldquo;Hanning&rdquo; windows that will be used for the spectral analysis:
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(0.5<span class="org-type">*</span>Fs)); <span class="org-comment">% Hannning Windows</span>
</pre>
</div>
<p>
We get the frequency vector that will be the same for all the frequency domain analysis.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Only used to have the frequency vector "f"</span>
[<span class="org-type">~</span>, f] = tfestimate(apa_sweep{1}.Va, apa_sweep{1}.de, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-orga710d70" class="outline-4">
<h4 id="orga710d70"><span class="section-number-4">3.3.3</span> FRF Identification - DVF</h4>
<div class="outline-text-4" id="text-3-3-3">
<p>
In this section, the dynamics from excitation voltage \(V_a\) to encoder measured displacement \(d_e\) is identified.
</p>
<p>
We compute the coherence for 2nd and 3rd identification:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Coherence computation</span></span>
coh_sweep = zeros(length(f), length(apa_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(apa_sweep{<span class="org-constant">i</span>}.Va, apa_sweep{<span class="org-constant">i</span>}.de, win, [], [], 1<span class="org-type">/</span>Ts);
coh_sweep(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
coh_noise_hf = zeros(length(f), length(apa_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(apa_noise_hf{<span class="org-constant">i</span>}.Va, apa_noise_hf{<span class="org-constant">i</span>}.de, win, [], [], 1<span class="org-type">/</span>Ts);
coh_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The coherence is shown in Figure <a href="#orgeb0f903">45</a>.
It is clear that the Sweep sine gives good coherence up to 400Hz and that the high frequency noise excitation signal helps increasing a little bit the coherence at high frequency.
</p>
<div id="orgeb0f903" class="figure">
<p><img src="figs/apa_frf_dvf_plant_coh.png" alt="apa_frf_dvf_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 45: </span>Obtained coherence for the plant from \(V_a\) to \(d_e\)</p>
</div>
<p>
Then, the transfer function from the DAC output voltage \(V_a\) to the measured displacement by the encoders is computed:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Transfer function estimation</span></span>
dvf_sweep = zeros(length(f), length(apa_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(apa_sweep{<span class="org-constant">i</span>}.Va, apa_sweep{<span class="org-constant">i</span>}.de, win, [], [], 1<span class="org-type">/</span>Ts);
dvf_sweep(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
dvf_noise_hf = zeros(length(f), length(apa_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(apa_noise_hf{<span class="org-constant">i</span>}.Va, apa_noise_hf{<span class="org-constant">i</span>}.de, win, [], [], 1<span class="org-type">/</span>Ts);
dvf_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained transfer functions are shown in Figure <a href="#org064f81f">46</a>.
They are all superimposed except for the APA7.
</p>
<div class="question" id="org3fcc26d">
<p>
Why is the APA7 off?
We could think that the APA7 is stiffer, but also the mass line is off.
</p>
<p>
It seems that there is a &ldquo;gain&rdquo; problem.
The encoder seems fine (it measured the same as the Interferometer).
Maybe it could be due to the amplifier?
</p>
</div>
<div id="org064f81f" class="figure">
<p><img src="figs/apa_frf_dvf_plant_tf.png" alt="apa_frf_dvf_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 46: </span>Estimated FRF for the DVF plant (transfer function from \(V_a\) to the encoder \(d_e\))</p>
</div>
<p>
A zoom on the main resonance is shown in Figure <a href="#org1df513c">47</a>.
It is clear that expect for the APA 7, the response around the resonances are well matching for all the APA.
</p>
<p>
It is also clear that there is not a single resonance but two resonances, a first one at 95Hz and a second one at 105Hz.
</p>
<div class="question" id="org47afc56">
<p>
Why is there a double resonance at around 94Hz?
</p>
</div>
<div id="org1df513c" class="figure">
<p><img src="figs/apa_frf_dvf_zoom_res_plant_tf.png" alt="apa_frf_dvf_zoom_res_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 47: </span>Estimated FRF for the DVF plant (transfer function from \(V_a\) to the encoder \(d_e\)) - Zoom on the main resonance</p>
</div>
</div>
</div>
<div id="outline-container-orgf160d6e" class="outline-4">
<h4 id="orgf160d6e"><span class="section-number-4">3.3.4</span> FRF Identification - IFF</h4>
<div class="outline-text-4" id="text-3-3-4">
<p>
In this section, the dynamics from \(V_a\) to \(V_s\) is identified.
</p>
<p>
First the coherence is computed and shown in Figure <a href="#orge7875f9">48</a>.
The coherence is very nice from 10Hz to 2kHz.
It is only dropping near a zeros at 40Hz, and near the resonance at 95Hz (the excitation amplitude being lowered).
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Coherence</span></span>
coh_sweep = zeros(length(f), length(apa_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(apa_sweep{<span class="org-constant">i</span>}.Va, apa_sweep{<span class="org-constant">i</span>}.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
coh_sweep(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
coh_noise_hf = zeros(length(f), length(apa_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(apa_noise_hf{<span class="org-constant">i</span>}.Va, apa_noise_hf{<span class="org-constant">i</span>}.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
coh_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
</pre>
</div>
<div id="orge7875f9" class="figure">
<p><img src="figs/apa_frf_iff_plant_coh.png" alt="apa_frf_iff_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 48: </span>Obtained coherence for the IFF plant</p>
</div>
<p>
Then the FRF are estimated and shown in Figure <a href="#orgabf3b03">49</a>
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% FRF estimation of the transfer function from Va to Vs</span></span>
iff_sweep = zeros(length(f), length(apa_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(apa_sweep{<span class="org-constant">i</span>}.Va, apa_sweep{<span class="org-constant">i</span>}.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
iff_sweep(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
iff_noise_hf = zeros(length(f), length(apa_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(apa_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(apa_noise_hf{<span class="org-constant">i</span>}.Va, apa_noise_hf{<span class="org-constant">i</span>}.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
iff_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
</pre>
</div>
<div id="orgabf3b03" class="figure">
<p><img src="figs/apa_frf_iff_plant_tf.png" alt="apa_frf_iff_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 49: </span>Identified IFF Plant</p>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org585297f" class="outline-2">
<h2 id="org585297f"><span class="section-number-2">4</span> Dynamical measurements - Struts</h2>
<div class="outline-text-2" id="text-4">
<p>
<a id="orgf722be9"></a>
</p>
<p>
The same bench used in Section <a href="#org8962678">3</a> is here used with the strut instead of only the APA.
</p>
<p>
The bench is shown in Figure <a href="#orgc59eac8">50</a>.
Measurements are performed either when no encoder is fixed to the strut (Figure <a href="#org67e87c0">51</a>) or when one encoder is fixed to the strut (Figure <a href="#orgc59eac8">50</a>).
</p>
<div id="orgc59eac8" class="figure">
<p><img src="figs/test_bench_leg_overview.png" alt="test_bench_leg_overview.png" />
</p>
<p><span class="figure-number">Figure 50: </span>Test Bench with Strut - Overview</p>
</div>
<div id="org67e87c0" class="figure">
<p><img src="figs/test_bench_leg_front.png" alt="test_bench_leg_front.png" />
</p>
<p><span class="figure-number">Figure 51: </span>Test Bench with Strut - Zoom on the strut</p>
</div>
<div id="org96d29f4" class="figure">
<p><img src="figs/test_bench_leg_coder.png" alt="test_bench_leg_coder.png" />
</p>
<p><span class="figure-number">Figure 52: </span>Test Bench with Strut - Zoom on the strut with the encoder</p>
</div>
</div>
<div id="outline-container-org4b7728d" class="outline-3">
<h3 id="org4b7728d"><span class="section-number-3">4.1</span> Measurement on Strut 1</h3>
<div class="outline-text-3" id="text-4-1">
<p>
<a id="org6f9d0f2"></a>
</p>
<p>
Measurements are first performed on the strut 1 that contains:
</p>
<ul class="org-ul">
<li>APA 1</li>
<li>flex 1 and flex 2</li>
</ul>
</div>
<div id="outline-container-org9a207b3" class="outline-4">
<h4 id="org9a207b3"><span class="section-number-4">4.1.1</span> Without Encoder</h4>
<div class="outline-text-4" id="text-4-1-1">
<p>
<a id="orgad44262"></a>
</p>
</div>
<div id="outline-container-orgec9c46c" class="outline-5">
<h5 id="orgec9c46c"><span class="section-number-5">4.1.1.1</span> FRF Identification - Setup</h5>
<div class="outline-text-5" id="text-4-1-1-1">
<p>
The identification is performed in three steps:
</p>
<ol class="org-ol">
<li>White noise excitation with small amplitude.
This is used to determine the main resonance of the system.</li>
<li>Sweep sine excitation with the amplitude lowered around the resonance.
The sweep sine is from 10Hz to 400Hz.</li>
<li>High frequency noise.
The noise is band-passed between 300Hz and 2kHz.</li>
</ol>
<p>
Then, the result of the second identification is used between 10Hz and 350Hz and the result of the third identification if used between 350Hz and 2kHz.
</p>
<div class="org-src-container">
<pre class="src src-matlab">leg_sweep = load(sprintf(<span class="org-string">'frf_data_leg_%i_sweep.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>);
leg_noise_hf = load(sprintf(<span class="org-string">'frf_data_leg_%i_noise_hf.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>);
</pre>
</div>
<p>
The time is the same for all measurements.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Time vector</span></span>
t = leg_sweep.t <span class="org-type">-</span> leg_sweep.t(1) ; <span class="org-comment">% Time vector [s]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Sampling</span></span>
Ts = (t(end) <span class="org-type">-</span> t(1))<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1); <span class="org-comment">% Sampling Time [s]</span>
Fs = 1<span class="org-type">/</span>Ts; <span class="org-comment">% Sampling Frequency [Hz]</span>
</pre>
</div>
<p>
Then we defined a &ldquo;Hanning&rdquo; windows that will be used for the spectral analysis:
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(0.5<span class="org-type">*</span>Fs)); <span class="org-comment">% Hannning Windows</span>
</pre>
</div>
<p>
We get the frequency vector that will be the same for all the frequency domain analysis.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Only used to have the frequency vector "f"</span>
[<span class="org-type">~</span>, f] = tfestimate(leg_sweep.Va, leg_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-orge11d516" class="outline-5">
<h5 id="orge11d516"><span class="section-number-5">4.1.1.2</span> FRF Identification - Displacement</h5>
<div class="outline-text-5" id="text-4-1-1-2">
<p>
In this section, the dynamics from the excitation voltage \(V_a\) to the interferometer \(d_a\) is identified.
</p>
<p>
We compute the coherence for 2nd and 3rd identification:
</p>
<div class="org-src-container">
<pre class="src src-matlab">[coh_sweep, <span class="org-type">~</span>] = mscohere(leg_sweep.Va, leg_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
[coh_noise_hf, <span class="org-type">~</span>] = mscohere(leg_noise_hf.Va, leg_noise_hf.da, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="orgd2bca9c" class="figure">
<p><img src="figs/strut_1_frf_dvf_plant_coh.png" alt="strut_1_frf_dvf_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 53: </span>Obtained coherence for the plant from \(V_a\) to \(d_a\)</p>
</div>
<p>
The transfer function from \(V_a\) to the interferometer measured displacement \(d_a\) is estimated and shown in Figure <a href="#org1de07bf">54</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">[dvf_sweep, <span class="org-type">~</span>] = tfestimate(leg_sweep.Va, leg_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
[dvf_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf.Va, leg_noise_hf.da, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="org1de07bf" class="figure">
<p><img src="figs/strut_1_frf_dvf_plant_tf.png" alt="strut_1_frf_dvf_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 54: </span>Estimated FRF for the DVF plant (transfer function from \(V_a\) to the interferometer \(d_a\))</p>
</div>
</div>
</div>
<div id="outline-container-org62bf3f5" class="outline-5">
<h5 id="org62bf3f5"><span class="section-number-5">4.1.1.3</span> FRF Identification - IFF</h5>
<div class="outline-text-5" id="text-4-1-1-3">
<p>
In this section, the dynamics from \(V_a\) to \(V_s\) is identified.
</p>
<p>
First the coherence is computed and shown in Figure <a href="#orgd931694">55</a>.
The coherence is very nice from 10Hz to 2kHz.
It is only dropping near a zeros at 40Hz, and near the resonance at 95Hz (the excitation amplitude being lowered).
</p>
<div class="org-src-container">
<pre class="src src-matlab">[coh_sweep, <span class="org-type">~</span>] = mscohere(leg_sweep.Va, leg_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[coh_noise_hf, <span class="org-type">~</span>] = mscohere(leg_noise_hf.Va, leg_noise_hf.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="orgd931694" class="figure">
<p><img src="figs/strut_1_frf_iff_plant_coh.png" alt="strut_1_frf_iff_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 55: </span>Obtained coherence for the IFF plant</p>
</div>
<p>
Then the FRF are estimated and shown in Figure <a href="#org7795584">56</a>
</p>
<div class="org-src-container">
<pre class="src src-matlab">[iff_sweep, <span class="org-type">~</span>] = tfestimate(leg_sweep.Va, leg_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[iff_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf.Va, leg_noise_hf.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="org7795584" class="figure">
<p><img src="figs/strut_1_frf_iff_plant_tf.png" alt="strut_1_frf_iff_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 56: </span>Identified IFF Plant for the Strut 1</p>
</div>
</div>
</div>
</div>
<div id="outline-container-orgbf66b4f" class="outline-4">
<h4 id="orgbf66b4f"><span class="section-number-4">4.1.2</span> With Encoder</h4>
<div class="outline-text-4" id="text-4-1-2">
<p>
<a id="org6a4e5ba"></a>
</p>
</div>
<div id="outline-container-org5ba2d6c" class="outline-5">
<h5 id="org5ba2d6c"><span class="section-number-5">4.1.2.1</span> Measurement Data</h5>
<div class="outline-text-5" id="text-4-1-2-1">
<div class="org-src-container">
<pre class="src src-matlab">leg_enc_sweep = load(sprintf(<span class="org-string">'frf_data_leg_coder_badly_align_%i_noise.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>);
leg_enc_noise_hf = load(sprintf(<span class="org-string">'frf_data_leg_coder_badly_align_%i_noise_hf.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb740ddb" class="outline-5">
<h5 id="orgb740ddb"><span class="section-number-5">4.1.2.2</span> FRF Identification - DVF</h5>
<div class="outline-text-5" id="text-4-1-2-2">
<p>
In this section, the dynamics from \(V_a\) to \(d_e\) is identified.
</p>
<p>
We compute the coherence for 2nd and 3rd identification:
</p>
<div class="org-src-container">
<pre class="src src-matlab">[coh_enc_sweep, <span class="org-type">~</span>] = mscohere(leg_enc_sweep.Va, leg_enc_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
[coh_enc_noise_hf, <span class="org-type">~</span>] = mscohere(leg_enc_noise_hf.Va, leg_enc_noise_hf.de, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="org8b37f45" class="figure">
<p><img src="figs/strut_1_enc_frf_dvf_plant_coh.png" alt="strut_1_enc_frf_dvf_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 57: </span>Obtained coherence for the plant from \(V_a\) to \(d_e\)</p>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[dvf_enc_sweep, <span class="org-type">~</span>] = tfestimate(leg_enc_sweep.Va, leg_enc_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
[dvf_enc_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_enc_noise_hf.Va, leg_enc_noise_hf.de, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[dvf_int_sweep, <span class="org-type">~</span>] = tfestimate(leg_enc_sweep.Va, leg_enc_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
[dvf_int_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_enc_noise_hf.Va, leg_enc_noise_hf.da, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
The obtained transfer functions are shown in Figure <a href="#orga926797">58</a>.
</p>
<p>
They are all superimposed except for the APA7.
</p>
<div class="question" id="orged0b724">
<p>
Why is the APA7 off?
We could think that the APA7 is stiffer, but also the mass line is off.
</p>
<p>
It seems that there is a &ldquo;gain&rdquo; problem.
The encoder seems fine (it measured the same as the Interferometer).
Maybe it could be due to the amplifier?
</p>
</div>
<div class="question" id="org110dae7">
<p>
Why is there a double resonance at around 94Hz?
</p>
</div>
<div id="orga926797" class="figure">
<p><img src="figs/strut_1_enc_frf_dvf_plant_tf.png" alt="strut_1_enc_frf_dvf_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 58: </span>Estimated FRF for the DVF plant (transfer function from \(V_a\) to the encoder \(d_e\))</p>
</div>
</div>
</div>
<div id="outline-container-orga7f7c45" class="outline-5">
<h5 id="orga7f7c45"><span class="section-number-5">4.1.2.3</span> Comparison of the Encoder and Interferometer</h5>
<div class="outline-text-5" id="text-4-1-2-3">
<p>
The interferometer could here represent the case where the encoders are fixed to the plates and not the APA.
</p>
<p>
The dynamics from \(V_a\) to \(d_e\) and from \(V_a\) to \(d_a\) are compared in Figure <a href="#orgd0e6bdf">59</a>.
</p>
<div id="orgd0e6bdf" class="figure">
<p><img src="figs/strut_1_comp_enc_int.png" alt="strut_1_comp_enc_int.png" />
</p>
<p><span class="figure-number">Figure 59: </span>Comparison of the transfer functions from excitation voltage \(V_a\) to either the encoder \(d_e\) or the interferometer \(d_a\)</p>
</div>
<div class="important" id="org23f91c4">
<p>
It will clearly be difficult to do something (except some low frequency positioning) with the encoders fixed to the APA.
</p>
</div>
</div>
</div>
<div id="outline-container-orge2da99d" class="outline-5">
<h5 id="orge2da99d"><span class="section-number-5">4.1.2.4</span> APA Resonances Frequency</h5>
<div class="outline-text-5" id="text-4-1-2-4">
<p>
As shown in Figure <a href="#orgccd81a5">60</a>, we can clearly see three spurious resonances at 197Hz, 290Hz and 376Hz.
</p>
<div id="orgccd81a5" class="figure">
<p><img src="figs/strut_1_spurious_resonances.png" alt="strut_1_spurious_resonances.png" />
</p>
<p><span class="figure-number">Figure 60: </span>Magnitude of the transfer function from excitation voltage \(V_a\) to encoder measurement \(d_e\). The frequency of the resonances are noted.</p>
</div>
<p>
These resonances correspond to parasitic resonances of the APA itself.
They are very close to what was estimated using the FEM:
</p>
<ul class="org-ul">
<li>X-bending mode at around 190Hz (Figure <a href="#org56987c2">61</a>)</li>
<li>Y-bending mode at around 290Hz (Figure <a href="#org9c2488f">62</a>)</li>
<li>Z-torsion mode at around 400Hz (Figure <a href="#orgb46438c">63</a>)</li>
</ul>
<div id="org56987c2" class="figure">
<p><img src="figs/mode_bending_x.gif" alt="mode_bending_x.gif" />
</p>
<p><span class="figure-number">Figure 61: </span>X-bending mode (189Hz)</p>
</div>
<div id="org9c2488f" class="figure">
<p><img src="figs/mode_bending_y.gif" alt="mode_bending_y.gif" />
</p>
<p><span class="figure-number">Figure 62: </span>Y-bending mode (285Hz)</p>
</div>
<div id="orgb46438c" class="figure">
<p><img src="figs/mode_torsion_z.gif" alt="mode_torsion_z.gif" />
</p>
<p><span class="figure-number">Figure 63: </span>Z-torsion mode (400Hz)</p>
</div>
<div class="important" id="org8781db1">
<p>
The resonances are indeed due to limited stiffness of the APA.
</p>
</div>
</div>
</div>
<div id="outline-container-org002bddc" class="outline-5">
<h5 id="org002bddc"><span class="section-number-5">4.1.2.5</span> Estimated Flexible Joint axial stiffness</h5>
<div class="outline-text-5" id="text-4-1-2-5">
<div class="org-src-container">
<pre class="src src-matlab">load(sprintf(<span class="org-string">'frf_data_leg_coder_%i_add_mass_closed_circuit.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>);
de = de <span class="org-type">-</span> de(1);
da = da <span class="org-type">-</span> da(1);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
hold on;
plot(t, de, <span class="org-string">'DisplayName'</span>, <span class="org-string">'Encoder'</span>)
plot(t, da, <span class="org-string">'DisplayName'</span>, <span class="org-string">'Interferometer'</span>)
hold off;
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Displacement [m]'</span>);
legend(<span class="org-string">'location'</span>, <span class="org-string">'northeast'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">de_steps = [mean(de(t <span class="org-type">&gt;</span> 13 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 14));
mean(de(t <span class="org-type">&gt;</span> 19 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 20));
mean(de(t <span class="org-type">&gt;</span> 24 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 25));
mean(de(t <span class="org-type">&gt;</span> 28.5 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 29.5));
mean(de(t <span class="org-type">&gt;</span> 49 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 50))] <span class="org-type">-</span> mean(de(t <span class="org-type">&gt;</span> 13 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 14));
da_steps = [mean(da(t <span class="org-type">&gt;</span> 13 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 14));
mean(da(t <span class="org-type">&gt;</span> 19 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 20));
mean(da(t <span class="org-type">&gt;</span> 24 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 25));
mean(da(t <span class="org-type">&gt;</span> 28.5 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 29.5));
mean(da(t <span class="org-type">&gt;</span> 49 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 50))] <span class="org-type">-</span> mean(da(t <span class="org-type">&gt;</span> 13 <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 14));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">added_mass = [0; 1; 2; 3; 4];
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">lin_fit = (added_mass<span class="org-type">\</span>abs(de_steps<span class="org-type">-</span>da_steps) <span class="org-type">-</span> abs(de_steps(1)<span class="org-type">-</span>da_steps(1)));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
hold on;
plot(added_mass, abs(de_steps<span class="org-type">-</span>da_steps) <span class="org-type">-</span> abs(de_steps(1)<span class="org-type">-</span>da_steps(1)), <span class="org-string">'ok'</span>)
plot(added_mass, added_mass<span class="org-type">*</span>lin_fit, <span class="org-string">'-r'</span>)
hold off;
</pre>
</div>
<div class="question" id="org4d0dcfa">
<p>
What is strange is that the encoder is measuring a larger displacement than the interferometer.
That should be the opposite.
Maybe is is caused by the fact that the APA is experiencing some bending and therefore a larger motion is measured on the encoder.
</p>
</div>
</div>
</div>
<div id="outline-container-orgb8a11ba" class="outline-5">
<h5 id="orgb8a11ba"><span class="section-number-5">4.1.2.6</span> FRF Identification - IFF</h5>
<div class="outline-text-5" id="text-4-1-2-6">
<p>
In this section, the dynamics from \(V_a\) to \(V_s\) is identified.
</p>
<p>
First the coherence is computed and shown in Figure <a href="#orgd931694">55</a>.
The coherence is very nice from 10Hz to 2kHz.
It is only dropping near a zeros at 40Hz, and near the resonance at 95Hz (the excitation amplitude being lowered).
</p>
<div class="org-src-container">
<pre class="src src-matlab">[coh_enc_sweep, <span class="org-type">~</span>] = mscohere(leg_enc_sweep.Va, leg_enc_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[coh_enc_noise_hf, <span class="org-type">~</span>] = mscohere(leg_enc_noise_hf.Va, leg_enc_noise_hf.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="orgd5159f7" class="figure">
<p><img src="figs/strut_1_frf_iff_plant_coh.png" alt="strut_1_frf_iff_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 64: </span>Obtained coherence for the IFF plant</p>
</div>
<p>
Then the FRF are estimated and shown in Figure <a href="#orga2d0bf7">65</a>
</p>
<div class="org-src-container">
<pre class="src src-matlab">[iff_enc_sweep, <span class="org-type">~</span>] = tfestimate(leg_enc_sweep.Va, leg_enc_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[iff_enc_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_enc_noise_hf.Va, leg_enc_noise_hf.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="orga2d0bf7" class="figure">
<p><img src="figs/strut_1_enc_frf_iff_plant_tf.png" alt="strut_1_enc_frf_iff_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 65: </span>Identified IFF Plant</p>
</div>
<p>
Let&rsquo;s now compare the IFF plants whether the encoders are fixed to the APA or not (Figure <a href="#orgb9b5b0a">66</a>).
</p>
<div id="orgb9b5b0a" class="figure">
<p><img src="figs/strut_1_frf_iff_effect_enc.png" alt="strut_1_frf_iff_effect_enc.png" />
</p>
<p><span class="figure-number">Figure 66: </span>Effect of the encoder on the IFF plant</p>
</div>
<div class="important" id="orgdf8aa6d">
<p>
We can see that the IFF does not change whether of not the encoder are fixed to the struts.
</p>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org9fad4b4" class="outline-3">
<h3 id="org9fad4b4"><span class="section-number-3">4.2</span> Comparison of all the Struts</h3>
<div class="outline-text-3" id="text-4-2">
<p>
<a id="orgfd53ceb"></a>
</p>
<p>
Now all struts are measured using the same procedure and test bench.
</p>
</div>
<div id="outline-container-org49346d3" class="outline-4">
<h4 id="org49346d3"><span class="section-number-4">4.2.1</span> FRF Identification - Setup</h4>
<div class="outline-text-4" id="text-4-2-1">
<p>
The identification is performed in two steps:
</p>
<ol class="org-ol">
<li>White noise excitation with small amplitude.
This is used to estimate the low frequency dynamics.</li>
<li>High frequency noise.
The noise is band-passed between 300Hz and 2kHz.</li>
</ol>
<p>
Then, the result of the first identification is used between 10Hz and 350Hz and the result of the second identification if used between 350Hz and 2kHz.
</p>
<p>
Here are the LEG numbers that have been measured.
</p>
<div class="org-src-container">
<pre class="src src-matlab">leg_nums = [1 2 3 4 5];
</pre>
</div>
<p>
The data are loaded for both the first and second identification:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Second identification</span></span>
leg_noise = {};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
leg_noise(<span class="org-constant">i</span>) = {load(sprintf(<span class="org-string">'frf_data_leg_coder_%i_noise.mat'</span>, leg_nums(<span class="org-constant">i</span>)), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>)};
<span class="org-keyword">end</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Third identification</span></span>
leg_noise_hf = {};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
leg_noise_hf(<span class="org-constant">i</span>) = {load(sprintf(<span class="org-string">'frf_data_leg_coder_%i_noise_hf.mat'</span>, leg_nums(<span class="org-constant">i</span>)), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>)};
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The time is the same for all measurements.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Time vector</span></span>
t = leg_noise{1}.t <span class="org-type">-</span> leg_noise{1}.t(1) ; <span class="org-comment">% Time vector [s]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Sampling</span></span>
Ts = (t(end) <span class="org-type">-</span> t(1))<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1); <span class="org-comment">% Sampling Time [s]</span>
Fs = 1<span class="org-type">/</span>Ts; <span class="org-comment">% Sampling Frequency [Hz]</span>
</pre>
</div>
<p>
Then we defined a &ldquo;Hanning&rdquo; windows that will be used for the spectral analysis:
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning(ceil(0.5<span class="org-type">*</span>Fs)); <span class="org-comment">% Hannning Windows</span>
</pre>
</div>
<p>
We get the frequency vector that will be the same for all the frequency domain analysis.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-comment">% Only used to have the frequency vector "f"</span>
[<span class="org-type">~</span>, f] = tfestimate(leg_noise{1}.Va, leg_noise{1}.de, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgabceeab" class="outline-4">
<h4 id="orgabceeab"><span class="section-number-4">4.2.2</span> FRF Identification - DVF</h4>
<div class="outline-text-4" id="text-4-2-2">
<p>
In this section, the dynamics from \(V_a\) to \(d_e\) is identified.
</p>
<p>
We compute the coherence for 2nd and 3rd identification:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Coherence computation</span></span>
coh_noise = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(leg_noise{<span class="org-constant">i</span>}.Va, leg_noise{<span class="org-constant">i</span>}.de, win, [], [], 1<span class="org-type">/</span>Ts);
coh_noise(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
coh_noise_hf = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(leg_noise_hf{<span class="org-constant">i</span>}.Va, leg_noise_hf{<span class="org-constant">i</span>}.de, win, [], [], 1<span class="org-type">/</span>Ts);
coh_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The coherence is shown in Figure <a href="#orgd8721f1">67</a>.
It is clear that the Noise sine gives good coherence up to 400Hz and that the high frequency noise excitation signal helps increasing a little bit the coherence at high frequency.
</p>
<div id="orgd8721f1" class="figure">
<p><img src="figs/struts_frf_dvf_plant_coh.png" alt="struts_frf_dvf_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 67: </span>Obtained coherence for the plant from \(V_a\) to \(d_e\)</p>
</div>
<p>
Then, the transfer function from the DAC output voltage \(V_a\) to the measured displacement by the encoders is computed:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Transfer function estimation</span></span>
dvf_noise = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(leg_noise{<span class="org-constant">i</span>}.Va, leg_noise{<span class="org-constant">i</span>}.de, win, [], [], 1<span class="org-type">/</span>Ts);
dvf_noise(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
dvf_noise_hf = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf{<span class="org-constant">i</span>}.Va, leg_noise_hf{<span class="org-constant">i</span>}.de, win, [], [], 1<span class="org-type">/</span>Ts);
dvf_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained transfer functions are shown in Figure <a href="#orgc7fc6eb">68</a>.
</p>
<p>
They are all superimposed except for the LEG7.
</p>
<div id="orgc7fc6eb" class="figure">
<p><img src="figs/struts_frf_dvf_plant_tf.png" alt="struts_frf_dvf_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 68: </span>Estimated FRF for the DVF plant (transfer function from \(V_a\) to the encoder \(d_e\))</p>
</div>
<div class="important" id="org71921be">
<p>
Depending on how the APA are mounted with the flexible joints, the dynamics can change a lot as shown in Figure <a href="#orgc7fc6eb">68</a>.
In the future, a &ldquo;pin&rdquo; will be used to better align the APA with the flexible joints.
We can expect the amplitude of the spurious resonances to decrease.
</p>
</div>
</div>
</div>
<div id="outline-container-org8cfc7f6" class="outline-4">
<h4 id="org8cfc7f6"><span class="section-number-4">4.2.3</span> FRF Identification - DVF with interferometer</h4>
<div class="outline-text-4" id="text-4-2-3">
<p>
In this section, the dynamics from \(V_a\) to \(d_a\) is identified.
</p>
<p>
We compute the coherence.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Coherence computation</span></span>
coh_noise = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(leg_noise{<span class="org-constant">i</span>}.Va, leg_noise{<span class="org-constant">i</span>}.da, win, [], [], 1<span class="org-type">/</span>Ts);
coh_noise(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
coh_noise_hf = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(leg_noise_hf{<span class="org-constant">i</span>}.Va, leg_noise_hf{<span class="org-constant">i</span>}.da, win, [], [], 1<span class="org-type">/</span>Ts);
coh_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The coherence is shown in Figure <a href="#org3c70e90">69</a>.
It is clear that the Noise sine gives good coherence up to 400Hz and that the high frequency noise excitation signal helps increasing a little bit the coherence at high frequency.
</p>
<div id="org3c70e90" class="figure">
<p><img src="figs/struts_frf_int_plant_coh.png" alt="struts_frf_int_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 69: </span>Obtained coherence for the plant from \(V_a\) to \(d_e\)</p>
</div>
<p>
Then, the transfer function from the DAC output voltage \(V_a\) to the measured displacement by the Attocube is computed:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Transfer function estimation</span></span>
dvf_a_noise = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(leg_noise{<span class="org-constant">i</span>}.Va, leg_noise{<span class="org-constant">i</span>}.da, win, [], [], 1<span class="org-type">/</span>Ts);
dvf_a_noise(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
dvf_a_noise_hf = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf{<span class="org-constant">i</span>}.Va, leg_noise_hf{<span class="org-constant">i</span>}.da, win, [], [], 1<span class="org-type">/</span>Ts);
dvf_a_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained transfer functions are shown in Figure <a href="#org5becb4c">70</a>.
</p>
<p>
They are all superimposed except for the LEG7.
</p>
<div id="org5becb4c" class="figure">
<p><img src="figs/struts_frf_int_plant_tf.png" alt="struts_frf_int_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 70: </span>Estimated FRF for the DVF plant (transfer function from \(V_a\) to the encoder \(d_e\))</p>
</div>
</div>
</div>
<div id="outline-container-org59120b1" class="outline-4">
<h4 id="org59120b1"><span class="section-number-4">4.2.4</span> FRF Identification - IFF</h4>
<div class="outline-text-4" id="text-4-2-4">
<p>
In this section, the dynamics from \(V_a\) to \(V_s\) is identified.
</p>
<p>
First the coherence is computed and shown in Figure <a href="#org951f8b9">71</a>.
The coherence is very nice from 10Hz to 2kHz.
It is only dropping near a zeros at 40Hz, and near the resonance at 95Hz (the excitation amplitude being lowered).
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Coherence</span></span>
coh_noise = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(leg_noise{<span class="org-constant">i</span>}.Va, leg_noise{<span class="org-constant">i</span>}.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
coh_noise(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
coh_noise_hf = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[coh, <span class="org-type">~</span>] = mscohere(leg_noise_hf{<span class="org-constant">i</span>}.Va, leg_noise_hf{<span class="org-constant">i</span>}.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
coh_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = coh;
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org951f8b9" class="figure">
<p><img src="figs/struts_frf_iff_plant_coh.png" alt="struts_frf_iff_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 71: </span>Obtained coherence for the IFF plant</p>
</div>
<p>
Then the FRF are estimated and shown in Figure <a href="#org23d673a">72</a>
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% FRF estimation of the transfer function from Va to Vs</span></span>
iff_noise = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(leg_noise{<span class="org-constant">i</span>}.Va, leg_noise{<span class="org-constant">i</span>}.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
iff_noise(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
iff_noise_hf = zeros(length(f), length(leg_nums));
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(leg_nums)</span>
[frf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf{<span class="org-constant">i</span>}.Va, leg_noise_hf{<span class="org-constant">i</span>}.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
iff_noise_hf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = frf;
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org23d673a" class="figure">
<p><img src="figs/struts_frf_iff_plant_tf.png" alt="struts_frf_iff_plant_tf.png" />
</p>
<p><span class="figure-number">Figure 72: </span>Identified IFF Plant</p>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org5e8cd6b" class="outline-2">
<h2 id="org5e8cd6b"><span class="section-number-2">5</span> Test Bench APA300ML - Simscape Model</h2>
<div class="outline-text-2" id="text-5">
</div>
<div id="outline-container-org987d2cc" class="outline-3">
<h3 id="org987d2cc"><span class="section-number-3">5.1</span> Introduction</h3>
<div class="outline-text-3" id="text-5-1">
<p>
A simscape model (Figure <a href="#orgeb9f27b">73</a>) of the measurement bench is used.
</p>
<div id="orgeb9f27b" class="figure">
<p><img src="figs/model_bench_apa.png" alt="model_bench_apa.png" />
</p>
<p><span class="figure-number">Figure 73: </span>Screenshot of the Simscape model</p>
</div>
</div>
</div>
<div id="outline-container-org821abe7" class="outline-3">
<h3 id="org821abe7"><span class="section-number-3">5.2</span> First Identification</h3>
<div class="outline-text-3" id="text-5-2">
<p>
The APA is first initialized with default parameters and the transfer function from excitation voltage \(V_a\) (before the amplification of 20 due to the PD200 amplifier) to the sensor stack voltage \(V_s\), encoder \(d_L\) and interferometer \(z\) is identified.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Initialize the structure containing the data used in the model</span></span>
n_hexapod = struct();
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><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</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</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">% Relative Motion Outputs</span>
io(io_i) = linio([mdl, <span class="org-string">'/z'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Vertical Motion</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
Ga = linearize(mdl, io, 0.0, options);
Ga.InputName = {<span class="org-string">'Va'</span>};
Ga.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<p>
The obtain dynamics are shown in Figure <a href="#org7b2bd95">74</a> and <a href="#orgbff346f">75</a>.
</p>
<div id="org7b2bd95" class="figure">
<p><img src="figs/apa_model_bench_bode_vs.png" alt="apa_model_bench_bode_vs.png" />
</p>
<p><span class="figure-number">Figure 74: </span>Bode plot of the transfer function from \(V_a\) to \(V_s\)</p>
</div>
<div id="orgbff346f" class="figure">
<p><img src="figs/apa_model_bench_bode_dl_z.png" alt="apa_model_bench_bode_dl_z.png" />
</p>
<p><span class="figure-number">Figure 75: </span>Bode plot of the transfer function from \(V_a\) to \(d_L\) and to \(z\)</p>
</div>
</div>
</div>
<div id="outline-container-orgd4e5638" class="outline-3">
<h3 id="orgd4e5638"><span class="section-number-3">5.3</span> Identify Sensor/Actuator constants and compare with measured FRF</h3>
<div class="outline-text-3" id="text-5-3">
</div>
<div id="outline-container-org0719507" class="outline-4">
<h4 id="org0719507"><span class="section-number-4">5.3.1</span> How to identify these constants?</h4>
<div class="outline-text-4" id="text-5-3-1">
</div>
<div id="outline-container-orgff68963" class="outline-5">
<h5 id="orgff68963"><span class="section-number-5">5.3.1.1</span> Piezoelectric Actuator Constant</h5>
<div class="outline-text-5" id="text-5-3-1-1">
<p>
Using the measurement test-bench, it is rather easy the determine the static gain between the applied voltage \(V_a\) to the induced displacement \(d\).
</p>
\begin{equation}
d = g_{d/V_a} \cdot V_a
\end{equation}
<p>
Using the Simscape model of the APA, it is possible to determine the static gain between the actuator force \(F_a\) to the induced displacement \(d\):
</p>
\begin{equation}
d = g_{d/F_a} \cdot F_a
\end{equation}
<p>
From the two gains, it is then easy to determine \(g_a\):
</p>
\begin{equation}
g_a = \frac{F_a}{V_a} = \frac{F_a}{d} \cdot \frac{d}{V_a} = \frac{g_{d/V_a}}{g_{d/F_a}}
\end{equation}
</div>
</div>
<div id="outline-container-orgd78a421" class="outline-5">
<h5 id="orgd78a421"><span class="section-number-5">5.3.1.2</span> Piezoelectric Sensor Constant</h5>
<div class="outline-text-5" id="text-5-3-1-2">
<p>
Similarly, it is easy to determine the gain from the excitation voltage \(V_a\) to the voltage generated by the sensor stack \(V_s\):
</p>
\begin{equation}
V_s = g_{V_s/V_a} V_a
\end{equation}
<p>
Note here that there is an high pass filter formed by the piezo capacitor and parallel resistor.
</p>
<p>
The gain can be computed from the dynamical identification and taking the gain at the wanted frequency (above the first resonance).
</p>
<p>
Using the simscape model, compute the gain at the same frequency from the actuator force \(F_a\) to the strain of the sensor stack \(dl\):
</p>
\begin{equation}
dl = g_{dl/F_a} F_a
\end{equation}
<p>
Then, the &ldquo;sensor&rdquo; constant is:
</p>
\begin{equation}
g_s = \frac{V_s}{dl} = \frac{V_s}{V_a} \cdot \frac{V_a}{F_a} \cdot \frac{F_a}{dl} = \frac{g_{V_s/V_a}}{g_a \cdot g_{dl/F_a}}
\end{equation}
</div>
</div>
</div>
<div id="outline-container-orge4b3638" class="outline-4">
<h4 id="orge4b3638"><span class="section-number-4">5.3.2</span> Identification Data</h4>
<div class="outline-text-4" id="text-5-3-2">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load the identification Data</span></span>
leg_sweep = load(sprintf(<span class="org-string">'frf_data_%i_sweep.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>);
leg_noise_hf = load(sprintf(<span class="org-string">'frf_data_%i_noise_hf.mat'</span>, 1), <span class="org-string">'t'</span>, <span class="org-string">'Va'</span>, <span class="org-string">'Vs'</span>, <span class="org-string">'de'</span>, <span class="org-string">'da'</span>);
</pre>
</div>
<p>
The time is the same for all measurements.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Time vector</span></span>
t = leg_sweep.t <span class="org-type">-</span> leg_sweep.t(1) ; <span class="org-comment">% Time vector [s]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Sampling Time / Frequency</span></span>
Ts = (t(end) <span class="org-type">-</span> t(1))<span class="org-type">/</span>(length(t)<span class="org-type">-</span>1); <span class="org-comment">% Sampling Time [s]</span>
Fs = 1<span class="org-type">/</span>Ts; <span class="org-comment">% Sampling Frequency [Hz]</span>
</pre>
</div>
<p>
Then we defined a &ldquo;Hanning&rdquo; windows that will be used for the spectral analysis:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Window used for spectral analysis</span></span>
win = hanning(ceil(0.5<span class="org-type">*</span>Fs)); <span class="org-comment">% Hannning Windows</span>
</pre>
</div>
<p>
We get the frequency vector that will be the same for all the frequency domain analysis.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Get the frequency vector "f" common to all further spectral data</span></span>
[<span class="org-type">~</span>, f] = tfestimate(leg_sweep.Va, leg_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Estimate the transfer function from u to dLm</span></span>
[dvf_sweep, <span class="org-type">~</span>] = tfestimate(leg_sweep.Va, leg_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
[dvf_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf.Va, leg_noise_hf.da, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Estimate the transfer function from u to taum</span></span>
[iff_sweep, <span class="org-type">~</span>] = tfestimate(leg_sweep.Va, leg_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[iff_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf.Va, leg_noise_hf.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgfb42195" class="outline-4">
<h4 id="orgfb42195"><span class="section-number-4">5.3.3</span> 2DoF APA</h4>
<div class="outline-text-4" id="text-5-3-3">
</div>
<div id="outline-container-orgaf97374" class="outline-5">
<h5 id="orgaf97374"><span class="section-number-5">5.3.3.1</span> 2DoF APA</h5>
<div class="outline-text-5" id="text-5-3-3-1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Initialize a 2DoF APA with Ga=Gs=1</span></span>
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>, <span class="org-string">'ga'</span>, 1, <span class="org-string">'gs'</span>, 1);
</pre>
</div>
</div>
</div>
<div id="outline-container-orga1ad011" class="outline-5">
<h5 id="orga1ad011"><span class="section-number-5">5.3.3.2</span> Identification without actuator or sensor constants</h5>
<div class="outline-text-5" id="text-5-3-3-2">
<div class="org-src-container">
<pre class="src src-matlab"><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</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</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">% Relative Motion Outputs</span>
io(io_i) = linio([mdl, <span class="org-string">'/z'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Vertical Motion</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Identification</span></span>
Gs = linearize(mdl, io, 0.0, options);
Gs.InputName = {<span class="org-string">'Va'</span>};
Gs.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
</div>
</div>
<div id="outline-container-org779ac83" class="outline-5">
<h5 id="org779ac83"><span class="section-number-5">5.3.3.3</span> Actuator Constant</h5>
<div class="outline-text-5" id="text-5-3-3-3">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Estimated Actuator Constant</span></span>
ga = <span class="org-type">-</span>mean(abs(dvf_sweep(f<span class="org-type">&gt;</span>10 <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>20)))<span class="org-type">./</span>dcgain(Gs(<span class="org-string">'dL'</span>, <span class="org-string">'Va'</span>)); <span class="org-comment">% [N/V]</span>
</pre>
</div>
<pre class="example">
ga = -32.1 [N/V]
</pre>
<div class="org-src-container">
<pre class="src src-matlab">n_hexapod.actuator.Ga = ones(6,1)<span class="org-type">*</span>ga; <span class="org-comment">% Actuator gain [N/V]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org62717da" class="outline-5">
<h5 id="org62717da"><span class="section-number-5">5.3.3.4</span> Sensor Constant</h5>
<div class="outline-text-5" id="text-5-3-3-4">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Estimated Sensor Constant</span></span>
gs = <span class="org-type">-</span>mean(abs(iff_sweep(f<span class="org-type">&gt;</span>400 <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>500)))<span class="org-type">./</span>(ga<span class="org-type">*</span>abs(squeeze(freqresp(Gs(<span class="org-string">'Vs'</span>, <span class="org-string">'Va'</span>), 1e3, <span class="org-string">'Hz'</span>)))); <span class="org-comment">% [V/m]</span>
</pre>
</div>
<pre class="example">
gs = 0.085 [V/m]
</pre>
<div class="org-src-container">
<pre class="src src-matlab">n_hexapod.actuator.Gs = ones(6,1)<span class="org-type">*</span>gs; <span class="org-comment">% Sensor gain [V/m]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org5cbf2d4" class="outline-5">
<h5 id="org5cbf2d4"><span class="section-number-5">5.3.3.5</span> Comparison</h5>
<div class="outline-text-5" id="text-5-3-3-5">
<p>
Identify the dynamics with included constants.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Identify again the dynamics with correct Ga,Gs</span></span>
Gs = linearize(mdl, io, 0.0, options);
Gs = Gs<span class="org-type">*</span>exp(<span class="org-type">-</span>Ts<span class="org-type">*</span>s);
Gs.InputName = {<span class="org-string">'Va'</span>};
Gs.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<div id="orgbdd0057" class="figure">
<p><img src="figs/apa_act_constant_comp.png" alt="apa_act_constant_comp.png" />
</p>
<p><span class="figure-number">Figure 76: </span>Comparison of the experimental data and Simscape model (\(u\) to \(d\mathcal{L}_m\))</p>
</div>
<div id="org694acfd" class="figure">
<p><img src="figs/apa_sens_constant_comp.png" alt="apa_sens_constant_comp.png" />
</p>
<p><span class="figure-number">Figure 77: </span>Comparison of the experimental data and Simscape model (\(V_a\) to \(V_s\))</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org6921e6f" class="outline-4">
<h4 id="org6921e6f"><span class="section-number-4">5.3.4</span> Flexible APA</h4>
<div class="outline-text-4" id="text-5-3-4">
</div>
<div id="outline-container-org438549b" class="outline-5">
<h5 id="org438549b"><span class="section-number-5">5.3.4.1</span> Flexible APA</h5>
<div class="outline-text-5" id="text-5-3-4-1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Initialize the APA as a flexible body</span></span>
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'ga'</span>, 1, <span class="org-string">'gs'</span>, 1);
</pre>
</div>
</div>
</div>
<div id="outline-container-org5d0f01f" class="outline-5">
<h5 id="org5d0f01f"><span class="section-number-5">5.3.4.2</span> Identification without actuator or sensor constants</h5>
<div class="outline-text-5" id="text-5-3-4-2">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Identify the dynamics</span></span>
Gs = linearize(mdl, io, 0.0, options);
Gs.InputName = {<span class="org-string">'Va'</span>};
Gs.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
</div>
</div>
<div id="outline-container-org13e1bb9" class="outline-5">
<h5 id="org13e1bb9"><span class="section-number-5">5.3.4.3</span> Actuator Constant</h5>
<div class="outline-text-5" id="text-5-3-4-3">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Actuator Constant</span></span>
ga = <span class="org-type">-</span>mean(abs(dvf_sweep(f<span class="org-type">&gt;</span>10 <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>20)))<span class="org-type">./</span>dcgain(Gs(<span class="org-string">'dL'</span>, <span class="org-string">'Va'</span>)); <span class="org-comment">% [N/V]</span>
</pre>
</div>
<pre class="example">
ga = 23.4 [N/V]
</pre>
<div class="org-src-container">
<pre class="src src-matlab">n_hexapod.actuator.Ga = ones(6,1)<span class="org-type">*</span>ga; <span class="org-comment">% Actuator gain [N/V]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf3eff0f" class="outline-5">
<h5 id="orgf3eff0f"><span class="section-number-5">5.3.4.4</span> Sensor Constant</h5>
<div class="outline-text-5" id="text-5-3-4-4">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Sensor Constant</span></span>
gs = <span class="org-type">-</span>mean(abs(iff_sweep(f<span class="org-type">&gt;</span>400 <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span>500)))<span class="org-type">./</span>(ga<span class="org-type">*</span>abs(squeeze(freqresp(Gs(<span class="org-string">'Vs'</span>, <span class="org-string">'Va'</span>), 1e3, <span class="org-string">'Hz'</span>)))); <span class="org-comment">% [V/m]</span>
</pre>
</div>
<pre class="example">
gs = -4674826.805 [V/m]
</pre>
<div class="org-src-container">
<pre class="src src-matlab">n_hexapod.actuator.Gs = ones(6,1)<span class="org-type">*</span>gs; <span class="org-comment">% Sensor gain [V/m]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf449dc8" class="outline-5">
<h5 id="orgf449dc8"><span class="section-number-5">5.3.4.5</span> Comparison</h5>
<div class="outline-text-5" id="text-5-3-4-5">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Identify with updated constants</span></span>
Gs = linearize(mdl, io, 0.0, options);
Gs = Gs<span class="org-type">*</span>exp(<span class="org-type">-</span>Ts<span class="org-type">*</span>s);
Gs.InputName = {<span class="org-string">'Va'</span>};
Gs.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<div id="org80d7dac" class="figure">
<p><img src="figs/apa_act_constant_comp_flex.png" alt="apa_act_constant_comp_flex.png" />
</p>
<p><span class="figure-number">Figure 78: </span>Comparison of the experimental data and Simscape model (\(u\) to \(d\mathcal{L}_m\))</p>
</div>
<div id="org7164f3c" class="figure">
<p><img src="figs/apa_sens_constant_comp_flex.png" alt="apa_sens_constant_comp_flex.png" />
</p>
<p><span class="figure-number">Figure 79: </span>Comparison of the experimental data and Simscape model (\(u\) to \(\tau_m\))</p>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org0f741d4" class="outline-3">
<h3 id="org0f741d4"><span class="section-number-3">5.4</span> Optimize 2-DoF model to fit the experimental Data</h3>
<div class="outline-text-3" id="text-5-4">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Optimized parameters</span></span>
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>, ...
<span class="org-string">'Ga'</span>, <span class="org-type">-</span>30.0, ...
<span class="org-string">'Gs'</span>, 0.098, ...
<span class="org-string">'k'</span>, ones(6,1)<span class="org-type">*</span>0.38e6, ...
<span class="org-string">'ke'</span>, ones(6,1)<span class="org-type">*</span>1.75e6, ...
<span class="org-string">'ka'</span>, ones(6,1)<span class="org-type">*</span>3e7, ...
<span class="org-string">'c'</span>, ones(6,1)<span class="org-type">*</span>1.3e2, ...
<span class="org-string">'ce'</span>, ones(6,1)<span class="org-type">*</span>1e1, ...
<span class="org-string">'ca'</span>, ones(6,1)<span class="org-type">*</span>1e1 ...
);
</pre>
</div>
<div id="org16a6208" class="figure">
<p><img src="figs/comp_apa_plant_after_opt.png" alt="comp_apa_plant_after_opt.png" />
</p>
<p><span class="figure-number">Figure 80: </span>Comparison of the measured FRF and the optimized model</p>
</div>
</div>
</div>
</div>
<div id="outline-container-orgac93bd2" class="outline-2">
<h2 id="orgac93bd2"><span class="section-number-2">6</span> Test Bench Struts - Simscape Model</h2>
<div class="outline-text-2" id="text-6">
</div>
<div id="outline-container-orgfd316f9" class="outline-3">
<h3 id="orgfd316f9"><span class="section-number-3">6.1</span> Introduction</h3>
</div>
<div id="outline-container-orgdbac1a3" class="outline-3">
<h3 id="orgdbac1a3"><span class="section-number-3">6.2</span> First Identification</h3>
<div class="outline-text-3" id="text-6-2">
<p>
The object containing all the data is created.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Initialize structure containing data for the Simscape model</span></span>
n_hexapod = struct();
n_hexapod.flex_bot = initializeBotFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
n_hexapod.flex_top = initializeTopFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><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</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</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">% Relative Motion Outputs</span>
io(io_i) = linio([mdl, <span class="org-string">'/z'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Vertical Motion</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
Gs = linearize(mdl, io, 0.0, options);
Gs.InputName = {<span class="org-string">'Va'</span>};
Gs.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<div id="orgdb26805" class="figure">
<p><img src="figs/strut_bench_model_iff_bode.png" alt="strut_bench_model_iff_bode.png" />
</p>
<p><span class="figure-number">Figure 81: </span>Identified transfer function from \(V_a\) to \(V_s\)</p>
</div>
<div id="org87fb3ea" class="figure">
<p><img src="figs/strut_bench_model_dvf_bode.png" alt="strut_bench_model_dvf_bode.png" />
</p>
<p><span class="figure-number">Figure 82: </span>Identified transfer function from \(V_a\) to \(d_L\)</p>
</div>
</div>
</div>
<div id="outline-container-org0e2423b" class="outline-3">
<h3 id="org0e2423b"><span class="section-number-3">6.3</span> Effect of flexible joints</h3>
<div class="outline-text-3" id="text-6-3">
<p>
Perfect
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Perfect Joints</span></span>
n_hexapod.flex_bot = initializeBotFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
n_hexapod.flex_top = initializeTopFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'3dof'</span>);
Gp = linearize(mdl, io, 0.0, options);
Gp.InputName = {<span class="org-string">'Va'</span>};
Gp.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<p>
Top Flexible
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Top joint with Axial stiffness</span></span>
n_hexapod.flex_bot = initializeBotFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
n_hexapod.flex_top = initializeTopFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>);
Gt = linearize(mdl, io, 0.0, options);
Gt.InputName = {<span class="org-string">'Va'</span>};
Gt.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<p>
Bottom Flexible
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Bottom joint with Axial stiffness</span></span>
n_hexapod.flex_bot = initializeBotFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>);
n_hexapod.flex_top = initializeTopFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'3dof'</span>);
Gb = linearize(mdl, io, 0.0, options);
Gb.InputName = {<span class="org-string">'Va'</span>};
Gb.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<p>
Both Flexible
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Both joints with Axial stiffness</span></span>
n_hexapod.flex_bot = initializeBotFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>);
n_hexapod.flex_top = initializeTopFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>);
Gf = linearize(mdl, io, 0.0, options);
Gf.InputName = {<span class="org-string">'Va'</span>};
Gf.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<p>
Comparison in Figures <a href="#org60d3eda">83</a>, <a href="#orgef3b4bc">84</a> and <a href="#org33a89eb">85</a>.
</p>
<div id="org60d3eda" class="figure">
<p><img src="figs/strut_effect_joint_comp_vs.png" alt="strut_effect_joint_comp_vs.png" />
</p>
<p><span class="figure-number">Figure 83: </span>Effect of the joint&rsquo;s flexibility on the transfer function from \(V_a\) to \(V_s\)</p>
</div>
<div id="orgef3b4bc" class="figure">
<p><img src="figs/strut_effect_joint_comp_dl.png" alt="strut_effect_joint_comp_dl.png" />
</p>
<p><span class="figure-number">Figure 84: </span>Effect of the joint&rsquo;s flexibility on the transfer function from \(V_a\) to \(d_L\) (encoder)</p>
</div>
<div id="org33a89eb" class="figure">
<p><img src="figs/strut_effect_joint_comp_z.png" alt="strut_effect_joint_comp_z.png" />
</p>
<p><span class="figure-number">Figure 85: </span>Effect of the joint&rsquo;s flexibility on the transfer function from \(V_a\) to \(z\) (interferometer)</p>
</div>
<div class="important" id="orgd64eacd">
<p>
Imperfection of the flexible joints has the largest impact on the transfer function from \(V_a\) to \(d_L\).
However, it has relatively small impact on the transfer functions from \(V_a\) to \(V_s\) and to \(z\).
</p>
</div>
</div>
</div>
<div id="outline-container-orgcb59549" class="outline-3">
<h3 id="orgcb59549"><span class="section-number-3">6.4</span> Integral Force Feedback</h3>
<div class="outline-text-3" id="text-6-4">
</div>
<div id="outline-container-org5f7cf11" class="outline-4">
<h4 id="org5f7cf11"><span class="section-number-4">6.4.1</span> Initialize the system</h4>
<div class="outline-text-4" id="text-6-4-1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Initialize typical system</span></span>
n_hexapod = struct();
n_hexapod.flex_bot = initializeBotFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
n_hexapod.flex_top = initializeTopFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'3dof'</span>);
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org3597bbe" class="outline-4">
<h4 id="org3597bbe"><span class="section-number-4">6.4.2</span> Plant Identification</h4>
<div class="outline-text-4" id="text-6-4-2">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Identify th edynamics</span></span>
G = linearize(mdl, io, 0.0, options);
G.InputName = {<span class="org-string">'Va'</span>};
G.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'dL'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% IFF Plant (transfer function from u to taum)</span></span>
Giff = G(<span class="org-string">'Vs'</span>, <span class="org-string">'Va'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org77009ac" class="outline-4">
<h4 id="org77009ac"><span class="section-number-4">6.4.3</span> Root Locus</h4>
<div class="outline-text-4" id="text-6-4-3">
\begin{equation}
K_{\text{IFF}} = \frac{g}{s + \omega_c}
\end{equation}
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Cut-off frequency of the LPF</span></span>
wc = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>20;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf6b7dd9" class="outline-3">
<h3 id="orgf6b7dd9"><span class="section-number-3">6.5</span> Comparison with the experimental Data</h3>
<div class="outline-text-3" id="text-6-5">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Initialize Simscape data</span></span>
n_hexapod.flex_bot = initializeBotFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>);
n_hexapod.flex_top = initializeTopFlexibleJoint(<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>);
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><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</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</span>
io(io_i) = linio([mdl, <span class="org-string">'/z'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Relative Motion Outputs</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Identification</span></span>
Gs = exp(<span class="org-type">-</span>s<span class="org-type">*</span>Ts)<span class="org-type">*</span>linearize(mdl, io, 0.0, options);
Gs.InputName = {<span class="org-string">'Va'</span>};
Gs.OutputName = {<span class="org-string">'Vs'</span>, <span class="org-string">'z'</span>};
</pre>
</div>
<div id="org27cc567" class="figure">
<p><img src="figs/comp_strut_plant_after_opt.png" alt="comp_strut_plant_after_opt.png" />
</p>
<p><span class="figure-number">Figure 86: </span>Comparison of the measured FRF and the optimized model</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org1f66afd" class="outline-2">
<h2 id="org1f66afd"><span class="section-number-2">7</span> Function</h2>
<div class="outline-text-2" id="text-7">
</div>
<div id="outline-container-org730257f" class="outline-3">
<h3 id="org730257f"><span class="section-number-3">7.1</span> <code>initializeBotFlexibleJoint</code> - Initialize Flexible Joint</h3>
<div class="outline-text-3" id="text-7-1">
<p>
<a id="orgfb366ac"></a>
</p>
</div>
<div id="outline-container-org64c034e" class="outline-4">
<h4 id="org64c034e">Function description</h4>
<div class="outline-text-4" id="text-org64c034e">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[flex_bot]</span> = <span class="org-function-name">initializeBotFlexibleJoint</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% initializeBotFlexibleJoint -</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [flex_bot] = initializeBotFlexibleJoint(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args -</span>
<span class="org-comment">%</span>
<span class="org-comment">% Outputs:</span>
<span class="org-comment">% - flex_bot -</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org942e6c2" class="outline-4">
<h4 id="org942e6c2">Optional Parameters</h4>
<div class="outline-text-4" id="text-org942e6c2">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
<span class="org-variable-name">args</span>.type char {mustBeMember(args.type,{<span class="org-string">'2dof'</span>, <span class="org-string">'3dof'</span>, <span class="org-string">'4dof'</span>})} = <span class="org-string">'2dof'</span>
<span class="org-variable-name">args</span>.kRx (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>5
<span class="org-variable-name">args</span>.kRy (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>5
<span class="org-variable-name">args</span>.kRz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>260
<span class="org-variable-name">args</span>.kz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>1e8
<span class="org-variable-name">args</span>.cRx (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.1
<span class="org-variable-name">args</span>.cRy (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.1
<span class="org-variable-name">args</span>.cRz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.1
<span class="org-variable-name">args</span>.cz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>1e2
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org58455ca" class="outline-4">
<h4 id="org58455ca">Initialize the structure</h4>
<div class="outline-text-4" id="text-org58455ca">
<div class="org-src-container">
<pre class="src src-matlab">flex_bot = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf261788" class="outline-4">
<h4 id="orgf261788">Set the Joint&rsquo;s type</h4>
<div class="outline-text-4" id="text-orgf261788">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'2dof'</span>
flex_bot.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'3dof'</span>
flex_bot.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'4dof'</span>
flex_bot.type = 3;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgede603f" class="outline-4">
<h4 id="orgede603f">Set parameters</h4>
<div class="outline-text-4" id="text-orgede603f">
<div class="org-src-container">
<pre class="src src-matlab">flex_bot.kRx = args.kRx;
flex_bot.kRy = args.kRy;
flex_bot.kRz = args.kRz;
flex_bot.kz = args.kz;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">flex_bot.cRx = args.cRx;
flex_bot.cRy = args.cRy;
flex_bot.cRz = args.cRz;
flex_bot.cz = args.cz;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgef70627" class="outline-3">
<h3 id="orgef70627"><span class="section-number-3">7.2</span> <code>initializeTopFlexibleJoint</code> - Initialize Flexible Joint</h3>
<div class="outline-text-3" id="text-7-2">
<p>
<a id="org0c42a5d"></a>
</p>
</div>
<div id="outline-container-org091fbd8" class="outline-4">
<h4 id="org091fbd8">Function description</h4>
<div class="outline-text-4" id="text-org091fbd8">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[flex_top]</span> = <span class="org-function-name">initializeTopFlexibleJoint</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% initializeTopFlexibleJoint -</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [flex_top] = initializeTopFlexibleJoint(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args -</span>
<span class="org-comment">%</span>
<span class="org-comment">% Outputs:</span>
<span class="org-comment">% - flex_top -</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org1d37383" class="outline-4">
<h4 id="org1d37383">Optional Parameters</h4>
<div class="outline-text-4" id="text-org1d37383">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
<span class="org-variable-name">args</span>.type char {mustBeMember(args.type,{<span class="org-string">'2dof'</span>, <span class="org-string">'3dof'</span>, <span class="org-string">'4dof'</span>})} = <span class="org-string">'2dof'</span>
<span class="org-variable-name">args</span>.kRx (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>5
<span class="org-variable-name">args</span>.kRy (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>5
<span class="org-variable-name">args</span>.kRz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>260
<span class="org-variable-name">args</span>.kz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>1e8
<span class="org-variable-name">args</span>.cRx (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.1
<span class="org-variable-name">args</span>.cRy (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.1
<span class="org-variable-name">args</span>.cRz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.1
<span class="org-variable-name">args</span>.cz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>1e2
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc52ebc0" class="outline-4">
<h4 id="orgc52ebc0">Initialize the structure</h4>
<div class="outline-text-4" id="text-orgc52ebc0">
<div class="org-src-container">
<pre class="src src-matlab">flex_top = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org0fa0554" class="outline-4">
<h4 id="org0fa0554">Set the Joint&rsquo;s type</h4>
<div class="outline-text-4" id="text-org0fa0554">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'2dof'</span>
flex_top.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'3dof'</span>
flex_top.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'4dof'</span>
flex_top.type = 3;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org5590e46" class="outline-4">
<h4 id="org5590e46">Set parameters</h4>
<div class="outline-text-4" id="text-org5590e46">
<div class="org-src-container">
<pre class="src src-matlab">flex_top.kRx = args.kRx;
flex_top.kRy = args.kRy;
flex_top.kRz = args.kRz;
flex_top.kz = args.kz;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">flex_top.cRx = args.cRx;
flex_top.cRy = args.cRy;
flex_top.cRz = args.cRz;
flex_top.cz = args.cz;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgacd4906" class="outline-3">
<h3 id="orgacd4906"><span class="section-number-3">7.3</span> <code>initializeAPA</code> - Initialize APA</h3>
<div class="outline-text-3" id="text-7-3">
<p>
<a id="org1e9c7e6"></a>
</p>
</div>
<div id="outline-container-orga698c5e" class="outline-4">
<h4 id="orga698c5e">Function description</h4>
<div class="outline-text-4" id="text-orga698c5e">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[actuator]</span> = <span class="org-function-name">initializeAPA</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% initializeAPA -</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [actuator] = initializeAPA(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args -</span>
<span class="org-comment">%</span>
<span class="org-comment">% Outputs:</span>
<span class="org-comment">% - actuator -</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org29dad87" class="outline-4">
<h4 id="org29dad87">Optional Parameters</h4>
<div class="outline-text-4" id="text-org29dad87">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
<span class="org-variable-name">args</span>.type char {mustBeMember(args.type,{<span class="org-string">'2dof'</span>, <span class="org-string">'flexible frame'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'2dof'</span>
<span class="org-variable-name">args</span>.Ga (1,1) double {mustBeNumeric} = 0
<span class="org-variable-name">args</span>.Gs (1,1) double {mustBeNumeric} = 0
<span class="org-comment">% For 2DoF</span>
<span class="org-variable-name">args</span>.k (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.38e6
<span class="org-variable-name">args</span>.ke (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>1.75e6
<span class="org-variable-name">args</span>.ka (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>3e7
<span class="org-variable-name">args</span>.c (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>3e1
<span class="org-variable-name">args</span>.ce (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>2e1
<span class="org-variable-name">args</span>.ca (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>2e1
<span class="org-variable-name">args</span>.Leq (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.056
<span class="org-comment">% Force Flexible APA</span>
<span class="org-variable-name">args</span>.xi (1,1) double {mustBeNumeric, mustBePositive} = 0.5
<span class="org-comment">% For Flexible Frame</span>
<span class="org-variable-name">args</span>.ks (1,1) double {mustBeNumeric, mustBePositive} = 235e6
<span class="org-variable-name">args</span>.cs (1,1) double {mustBeNumeric, mustBePositive} = 1e1
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org6eeae8c" class="outline-4">
<h4 id="org6eeae8c">Initialize Structure</h4>
<div class="outline-text-4" id="text-org6eeae8c">
<div class="org-src-container">
<pre class="src src-matlab">actuator = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org9b8fb4b" class="outline-4">
<h4 id="org9b8fb4b">Type</h4>
<div class="outline-text-4" id="text-org9b8fb4b">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'2dof'</span>
actuator.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'flexible frame'</span>
actuator.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
actuator.type = 3;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org62c5ed8" class="outline-4">
<h4 id="org62c5ed8">Actuator/Sensor Constants</h4>
<div class="outline-text-4" id="text-org62c5ed8">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Ga <span class="org-type">==</span> 0
<span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'2dof'</span>
actuator.Ga = <span class="org-type">-</span>30.0;
<span class="org-keyword">case</span> <span class="org-string">'flexible frame'</span>
actuator.Ga = 1; <span class="org-comment">% TODO</span>
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
actuator.Ga = 23.4;
<span class="org-keyword">end</span>
<span class="org-keyword">else</span>
actuator.Ga = args.Ga; <span class="org-comment">% Actuator gain [N/V]</span>
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.Gs <span class="org-type">==</span> 0
<span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'2dof'</span>
actuator.Gs = 0.098;
<span class="org-keyword">case</span> <span class="org-string">'flexible frame'</span>
actuator.Gs = 1; <span class="org-comment">% TODO</span>
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
actuator.Gs = <span class="org-type">-</span>4674824;
<span class="org-keyword">end</span>
<span class="org-keyword">else</span>
actuator.Gs = args.Gs; <span class="org-comment">% Sensor gain [V/m]</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org0fd8dea" class="outline-4">
<h4 id="org0fd8dea">2DoF parameters</h4>
<div class="outline-text-4" id="text-org0fd8dea">
<div class="org-src-container">
<pre class="src src-matlab">actuator.k = args.k; <span class="org-comment">% [N/m]</span>
actuator.ke = args.ke; <span class="org-comment">% [N/m]</span>
actuator.ka = args.ka; <span class="org-comment">% [N/m]</span>
actuator.c = args.c; <span class="org-comment">% [N/(m/s)]</span>
actuator.ce = args.ce; <span class="org-comment">% [N/(m/s)]</span>
actuator.ca = args.ca; <span class="org-comment">% [N/(m/s)]</span>
actuator.Leq = args.Leq; <span class="org-comment">% [m]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org1d5fd8f" class="outline-4">
<h4 id="org1d5fd8f">Flexible frame and fully flexible</h4>
<div class="outline-text-4" id="text-org1d5fd8f">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'flexible frame'</span>
actuator.K = readmatrix(<span class="org-string">'APA300ML_b_mat_K.CSV'</span>); <span class="org-comment">% Stiffness Matrix</span>
actuator.M = readmatrix(<span class="org-string">'APA300ML_b_mat_M.CSV'</span>); <span class="org-comment">% Mass Matrix</span>
actuator.P = extractNodes(<span class="org-string">'APA300ML_b_out_nodes_3D.txt'</span>); <span class="org-comment">% Node coordinates [m]</span>
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
actuator.K = readmatrix(<span class="org-string">'full_APA300ML_K.CSV'</span>); <span class="org-comment">% Stiffness Matrix</span>
actuator.M = readmatrix(<span class="org-string">'full_APA300ML_M.CSV'</span>); <span class="org-comment">% Mass Matrix</span>
actuator.P = extractNodes(<span class="org-string">'full_APA300ML_out_nodes_3D.txt'</span>); <span class="org-comment">% Node coordiantes [m]</span>
<span class="org-keyword">end</span>
actuator.xi = args.xi; <span class="org-comment">% Damping ratio</span>
actuator.ks = args.ks; <span class="org-comment">% Stiffness of one stack [N/m]</span>
actuator.cs = args.cs; <span class="org-comment">% Damping of one stack [N/m]</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgbbd63f4" class="outline-3">
<h3 id="orgbbd63f4"><span class="section-number-3">7.4</span> <code>generateSweepExc</code>: Generate sweep sinus excitation</h3>
<div class="outline-text-3" id="text-7-4">
<p>
<a id="org54e0cd1"></a>
</p>
</div>
<div id="outline-container-org4047364" class="outline-4">
<h4 id="org4047364">Function description</h4>
<div class="outline-text-4" id="text-org4047364">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[U_exc]</span> = <span class="org-function-name">generateSweepExc</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% generateSweepExc - Generate a Sweep Sine excitation signal</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [U_exc] = generateSweepExc(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args - Optinal arguments:</span>
<span class="org-comment">% - Ts - Sampling Time - [s]</span>
<span class="org-comment">% - f_start - Start frequency of the sweep - [Hz]</span>
<span class="org-comment">% - f_end - End frequency of the sweep - [Hz]</span>
<span class="org-comment">% - V_mean - Mean value of the excitation voltage - [V]</span>
<span class="org-comment">% - V_exc - Excitation Amplitude for the Sweep, could be numeric or TF - [V]</span>
<span class="org-comment">% - t_start - Time at which the sweep begins - [s]</span>
<span class="org-comment">% - exc_duration - Duration of the sweep - [s]</span>
<span class="org-comment">% - sweep_type - 'logarithmic' or 'linear' - [-]</span>
<span class="org-comment">% - smooth_ends - 'true' or 'false': smooth transition between 0 and V_mean - [-]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgdb7f1e4" class="outline-4">
<h4 id="orgdb7f1e4">Optional Parameters</h4>
<div class="outline-text-4" id="text-orgdb7f1e4">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
<span class="org-variable-name">args</span>.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e<span class="org-type">-</span>4
<span class="org-variable-name">args</span>.f_start (1,1) double {mustBeNumeric, mustBePositive} = 1
<span class="org-variable-name">args</span>.f_end (1,1) double {mustBeNumeric, mustBePositive} = 1e3
<span class="org-variable-name">args</span>.V_mean (1,1) double {mustBeNumeric} = 0
<span class="org-variable-name">args</span>.V_exc = 1
<span class="org-variable-name">args</span>.t_start (1,1) double {mustBeNumeric, mustBeNonnegative} = 5
<span class="org-variable-name">args</span>.exc_duration (1,1) double {mustBeNumeric, mustBePositive} = 10
<span class="org-variable-name">args</span>.sweep_type char {mustBeMember(args.sweep_type,{<span class="org-string">'log'</span>, <span class="org-string">'lin'</span>})} = <span class="org-string">'lin'</span>
<span class="org-variable-name">args</span>.smooth_ends logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org46430d0" class="outline-4">
<h4 id="org46430d0">Sweep Sine part</h4>
<div class="outline-text-4" id="text-org46430d0">
<div class="org-src-container">
<pre class="src src-matlab">t_sweep = 0<span class="org-type">:</span>args.Ts<span class="org-type">:</span>args.exc_duration;
<span class="org-keyword">if</span> strcmp(args.sweep_type, <span class="org-string">'log'</span>)
V_exc = sin(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>args.f_start <span class="org-type">*</span> args.exc_duration<span class="org-type">/</span>log(args.f_end<span class="org-type">/</span>args.f_start) <span class="org-type">*</span> (exp(log(args.f_end<span class="org-type">/</span>args.f_start)<span class="org-type">*</span>t_sweep<span class="org-type">/</span>args.exc_duration) <span class="org-type">-</span> 1));
<span class="org-keyword">elseif</span> strcmp(args.sweep_type, <span class="org-string">'lin'</span>)
V_exc = sin(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>(args.f_start <span class="org-type">+</span> (args.f_end <span class="org-type">-</span> args.f_start)<span class="org-type">/</span>2<span class="org-type">/</span>args.exc_duration<span class="org-type">*</span>t_sweep)<span class="org-type">.*</span>t_sweep);
<span class="org-keyword">else</span>
error(<span class="org-string">'sweep_type should either be equal to "log" or to "lin"'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> isnumeric(args.V_exc)
V_sweep = args.V_mean <span class="org-type">+</span> args.V_exc<span class="org-type">*</span>V_exc;
<span class="org-keyword">elseif</span> isct(args.V_exc)
<span class="org-keyword">if</span> strcmp(args.sweep_type, <span class="org-string">'log'</span>)
V_sweep = args.V_mean <span class="org-type">+</span> abs(squeeze(freqresp(args.V_exc, args.f_start<span class="org-type">*</span>(args.f_end<span class="org-type">/</span>args.f_start)<span class="org-type">.^</span>(t_sweep<span class="org-type">/</span>args.exc_duration), <span class="org-string">'Hz'</span>)))<span class="org-type">'.*</span>V_exc;
<span class="org-keyword">elseif</span> strcmp(args.sweep_type, <span class="org-string">'lin'</span>)
V_sweep = args.V_mean <span class="org-type">+</span> abs(squeeze(freqresp(args.V_exc, args.f_start<span class="org-type">+</span>(args.f_end<span class="org-type">-</span>args.f_start)<span class="org-type">/</span>args.exc_duration<span class="org-type">*</span>t_sweep, <span class="org-string">'Hz'</span>)))<span class="org-type">'.*</span>V_exc;
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org3d78f6c" class="outline-4">
<h4 id="org3d78f6c">Smooth Ends</h4>
<div class="outline-text-4" id="text-org3d78f6c">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.t_start <span class="org-type">&gt;</span> 0
t_smooth_start = args.Ts<span class="org-type">:</span>args.Ts<span class="org-type">:</span>args.t_start;
V_smooth_start = zeros(size(t_smooth_start));
V_smooth_end = zeros(size(t_smooth_start));
<span class="org-keyword">if</span> args.smooth_ends
Vd_max = args.V_mean<span class="org-type">/</span>(0.7<span class="org-type">*</span>args.t_start);
V_d = zeros(size(t_smooth_start));
V_d(t_smooth_start <span class="org-type">&lt;</span> 0.2<span class="org-type">*</span>args.t_start) = t_smooth_start(t_smooth_start <span class="org-type">&lt;</span> 0.2<span class="org-type">*</span>args.t_start)<span class="org-type">*</span>Vd_max<span class="org-type">/</span>(0.2<span class="org-type">*</span>args.t_start);
V_d(t_smooth_start <span class="org-type">&gt;</span> 0.2<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.7<span class="org-type">*</span>args.t_start) = Vd_max;
V_d(t_smooth_start <span class="org-type">&gt;</span> 0.7<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.9<span class="org-type">*</span>args.t_start) = Vd_max <span class="org-type">-</span> (t_smooth_start(t_smooth_start <span class="org-type">&gt;</span> 0.7<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.9<span class="org-type">*</span>args.t_start) <span class="org-type">-</span> 0.7<span class="org-type">*</span>args.t_start)<span class="org-type">*</span>Vd_max<span class="org-type">/</span>(0.2<span class="org-type">*</span>args.t_start);
V_smooth_start = cumtrapz(V_d)<span class="org-type">*</span>args.Ts;
V_smooth_end = args.V_mean <span class="org-type">-</span> V_smooth_start;
<span class="org-keyword">end</span>
<span class="org-keyword">else</span>
V_smooth_start = [];
V_smooth_end = [];
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org63f6cb4" class="outline-4">
<h4 id="org63f6cb4">Combine Excitation signals</h4>
<div class="outline-text-4" id="text-org63f6cb4">
<div class="org-src-container">
<pre class="src src-matlab">V_exc = [V_smooth_start, V_sweep, V_smooth_end];
t_exc = args.Ts<span class="org-type">*</span>[0<span class="org-type">:</span>1<span class="org-type">:</span>length(V_exc)<span class="org-type">-</span>1];
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">U_exc = [t_exc; V_exc];
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org9628aeb" class="outline-3">
<h3 id="org9628aeb"><span class="section-number-3">7.5</span> <code>generateShapedNoise</code>: Generate Shaped Noise excitation</h3>
<div class="outline-text-3" id="text-7-5">
<p>
<a id="org2cc91b1"></a>
</p>
</div>
<div id="outline-container-org526c60c" class="outline-4">
<h4 id="org526c60c">Function description</h4>
<div class="outline-text-4" id="text-org526c60c">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[U_exc]</span> = <span class="org-function-name">generateShapedNoise</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% generateShapedNoise - Generate a Shaped Noise excitation signal</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [U_exc] = generateShapedNoise(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args - Optinal arguments:</span>
<span class="org-comment">% - Ts - Sampling Time - [s]</span>
<span class="org-comment">% - V_mean - Mean value of the excitation voltage - [V]</span>
<span class="org-comment">% - V_exc - Excitation Amplitude, could be numeric or TF - [V rms]</span>
<span class="org-comment">% - t_start - Time at which the noise begins - [s]</span>
<span class="org-comment">% - exc_duration - Duration of the noise - [s]</span>
<span class="org-comment">% - smooth_ends - 'true' or 'false': smooth transition between 0 and V_mean - [-]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org61cf959" class="outline-4">
<h4 id="org61cf959">Optional Parameters</h4>
<div class="outline-text-4" id="text-org61cf959">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
<span class="org-variable-name">args</span>.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e<span class="org-type">-</span>4
<span class="org-variable-name">args</span>.V_mean (1,1) double {mustBeNumeric} = 0
<span class="org-variable-name">args</span>.V_exc = 1
<span class="org-variable-name">args</span>.t_start (1,1) double {mustBeNumeric, mustBePositive} = 5
<span class="org-variable-name">args</span>.exc_duration (1,1) double {mustBeNumeric, mustBePositive} = 10
<span class="org-variable-name">args</span>.smooth_ends logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org8ecc3f8" class="outline-4">
<h4 id="org8ecc3f8">Shaped Noise</h4>
<div class="outline-text-4" id="text-org8ecc3f8">
<div class="org-src-container">
<pre class="src src-matlab">t_noise = 0<span class="org-type">:</span>args.Ts<span class="org-type">:</span>args.exc_duration;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> isnumeric(args.V_exc)
V_noise = args.V_mean <span class="org-type">+</span> args.V_exc<span class="org-type">*</span>sqrt(1<span class="org-type">/</span>args.Ts<span class="org-type">/</span>2)<span class="org-type">*</span>randn(length(t_noise), 1)<span class="org-type">'</span>;
<span class="org-keyword">elseif</span> isct(args.V_exc)
V_noise = args.V_mean <span class="org-type">+</span> lsim(args.V_exc, sqrt(1<span class="org-type">/</span>args.Ts<span class="org-type">/</span>2)<span class="org-type">*</span>randn(length(t_noise), 1), t_noise)<span class="org-type">'</span>;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgebfd6a4" class="outline-4">
<h4 id="orgebfd6a4">Smooth Ends</h4>
<div class="outline-text-4" id="text-orgebfd6a4">
<div class="org-src-container">
<pre class="src src-matlab">t_smooth_start = args.Ts<span class="org-type">:</span>args.Ts<span class="org-type">:</span>args.t_start;
V_smooth_start = zeros(size(t_smooth_start));
V_smooth_end = zeros(size(t_smooth_start));
<span class="org-keyword">if</span> args.smooth_ends
Vd_max = args.V_mean<span class="org-type">/</span>(0.7<span class="org-type">*</span>args.t_start);
V_d = zeros(size(t_smooth_start));
V_d(t_smooth_start <span class="org-type">&lt;</span> 0.2<span class="org-type">*</span>args.t_start) = t_smooth_start(t_smooth_start <span class="org-type">&lt;</span> 0.2<span class="org-type">*</span>args.t_start)<span class="org-type">*</span>Vd_max<span class="org-type">/</span>(0.2<span class="org-type">*</span>args.t_start);
V_d(t_smooth_start <span class="org-type">&gt;</span> 0.2<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.7<span class="org-type">*</span>args.t_start) = Vd_max;
V_d(t_smooth_start <span class="org-type">&gt;</span> 0.7<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.9<span class="org-type">*</span>args.t_start) = Vd_max <span class="org-type">-</span> (t_smooth_start(t_smooth_start <span class="org-type">&gt;</span> 0.7<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.9<span class="org-type">*</span>args.t_start) <span class="org-type">-</span> 0.7<span class="org-type">*</span>args.t_start)<span class="org-type">*</span>Vd_max<span class="org-type">/</span>(0.2<span class="org-type">*</span>args.t_start);
V_smooth_start = cumtrapz(V_d)<span class="org-type">*</span>args.Ts;
V_smooth_end = args.V_mean <span class="org-type">-</span> V_smooth_start;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge82c676" class="outline-4">
<h4 id="orge82c676">Combine Excitation signals</h4>
<div class="outline-text-4" id="text-orge82c676">
<div class="org-src-container">
<pre class="src src-matlab">V_exc = [V_smooth_start, V_noise, V_smooth_end];
t_exc = args.Ts<span class="org-type">*</span>[0<span class="org-type">:</span>1<span class="org-type">:</span>length(V_exc)<span class="org-type">-</span>1];
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">U_exc = [t_exc; V_exc];
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org5066270" class="outline-3">
<h3 id="org5066270"><span class="section-number-3">7.6</span> <code>generateSinIncreasingAmpl</code>: Generate Sinus with increasing amplitude</h3>
<div class="outline-text-3" id="text-7-6">
<p>
<a id="orgc13a81a"></a>
</p>
</div>
<div id="outline-container-org6e1c161" class="outline-4">
<h4 id="org6e1c161">Function description</h4>
<div class="outline-text-4" id="text-org6e1c161">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[U_exc]</span> = <span class="org-function-name">generateSinIncreasingAmpl</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% generateSinIncreasingAmpl - Generate Sinus with increasing amplitude</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [U_exc] = generateSinIncreasingAmpl(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args - Optinal arguments:</span>
<span class="org-comment">% - Ts - Sampling Time - [s]</span>
<span class="org-comment">% - V_mean - Mean value of the excitation voltage - [V]</span>
<span class="org-comment">% - sin_ampls - Excitation Amplitudes - [V]</span>
<span class="org-comment">% - sin_freq - Excitation Frequency - [Hz]</span>
<span class="org-comment">% - sin_num - Number of period for each amplitude - [-]</span>
<span class="org-comment">% - t_start - Time at which the excitation begins - [s]</span>
<span class="org-comment">% - smooth_ends - 'true' or 'false': smooth transition between 0 and V_mean - [-]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orga64324d" class="outline-4">
<h4 id="orga64324d">Optional Parameters</h4>
<div class="outline-text-4" id="text-orga64324d">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
<span class="org-variable-name">args</span>.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e<span class="org-type">-</span>4
<span class="org-variable-name">args</span>.V_mean (1,1) double {mustBeNumeric} = 0
<span class="org-variable-name">args</span>.sin_ampls double {mustBeNumeric, mustBePositive} = [0.1, 0.2, 0.3]
<span class="org-variable-name">args</span>.sin_period (1,1) double {mustBeNumeric, mustBePositive} = 1
<span class="org-variable-name">args</span>.sin_num (1,1) double {mustBeNumeric, mustBePositive, mustBeInteger} = 3
<span class="org-variable-name">args</span>.t_start (1,1) double {mustBeNumeric, mustBePositive} = 5
<span class="org-variable-name">args</span>.smooth_ends logical {mustBeNumericOrLogical} = <span class="org-constant">true</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge158235" class="outline-4">
<h4 id="orge158235">Sinus excitation</h4>
<div class="outline-text-4" id="text-orge158235">
<div class="org-src-container">
<pre class="src src-matlab">t_noise = 0<span class="org-type">:</span>args.Ts<span class="org-type">:</span>args.sin_period<span class="org-type">*</span>args.sin_num;
sin_exc = [];
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">sin_ampl</span> = <span class="org-constant">args.sin_ampls</span>
sin_exc = [sin_exc, args.V_mean <span class="org-type">+</span> sin_ampl<span class="org-type">*</span>sin(2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">/</span>args.sin_period<span class="org-type">*</span>t_noise)];
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org2afc938" class="outline-4">
<h4 id="org2afc938">Smooth Ends</h4>
<div class="outline-text-4" id="text-org2afc938">
<div class="org-src-container">
<pre class="src src-matlab">t_smooth_start = args.Ts<span class="org-type">:</span>args.Ts<span class="org-type">:</span>args.t_start;
V_smooth_start = zeros(size(t_smooth_start));
V_smooth_end = zeros(size(t_smooth_start));
<span class="org-keyword">if</span> args.smooth_ends
Vd_max = args.V_mean<span class="org-type">/</span>(0.7<span class="org-type">*</span>args.t_start);
V_d = zeros(size(t_smooth_start));
V_d(t_smooth_start <span class="org-type">&lt;</span> 0.2<span class="org-type">*</span>args.t_start) = t_smooth_start(t_smooth_start <span class="org-type">&lt;</span> 0.2<span class="org-type">*</span>args.t_start)<span class="org-type">*</span>Vd_max<span class="org-type">/</span>(0.2<span class="org-type">*</span>args.t_start);
V_d(t_smooth_start <span class="org-type">&gt;</span> 0.2<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.7<span class="org-type">*</span>args.t_start) = Vd_max;
V_d(t_smooth_start <span class="org-type">&gt;</span> 0.7<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.9<span class="org-type">*</span>args.t_start) = Vd_max <span class="org-type">-</span> (t_smooth_start(t_smooth_start <span class="org-type">&gt;</span> 0.7<span class="org-type">*</span>args.t_start <span class="org-type">&amp;</span> t_smooth_start <span class="org-type">&lt;</span> 0.9<span class="org-type">*</span>args.t_start) <span class="org-type">-</span> 0.7<span class="org-type">*</span>args.t_start)<span class="org-type">*</span>Vd_max<span class="org-type">/</span>(0.2<span class="org-type">*</span>args.t_start);
V_smooth_start = cumtrapz(V_d)<span class="org-type">*</span>args.Ts;
V_smooth_end = args.V_mean <span class="org-type">-</span> V_smooth_start;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org1f109d0" class="outline-4">
<h4 id="org1f109d0">Combine Excitation signals</h4>
<div class="outline-text-4" id="text-org1f109d0">
<div class="org-src-container">
<pre class="src src-matlab">V_exc = [V_smooth_start, sin_exc, V_smooth_end];
t_exc = args.Ts<span class="org-type">*</span>[0<span class="org-type">:</span>1<span class="org-type">:</span>length(V_exc)<span class="org-type">-</span>1];
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">U_exc = [t_exc; V_exc];
</pre>
</div>
</div>
</div>
</div>
</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>Souleille, Adrien, Thibault Lampert, V Lafarga, Sylvain Hellegouarch, Alan Rondineau, Gonçalo Rodrigues, and Christophe Collette. 2018. “A Concept of Active Mount for Space Applications.” <i>CEAS Space Journal</i> 10 (2). Springer:15765.</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2021-06-09 mer. 19:01</p>
</div>
</body>
</html>