test-bench-apa300ml/test-bench-apa300ml.html

5193 lines
225 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-17 jeu. 23:20 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Nano-Hexapod Struts - 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">Nano-Hexapod Struts - Test Bench</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgf89ffed">1. Model of the Amplified Piezoelectric Actuator</a>
<ul>
<li><a href="#orgba9c126">1.1. Two Degrees of Freedom Model</a></li>
<li><a href="#orgccde226">1.2. Flexible Model</a></li>
<li><a href="#org357b53f">1.3. Actuator and Sensor constants</a></li>
</ul>
</li>
<li><a href="#org82876e8">2. First Basic Measurements</a>
<ul>
<li><a href="#orgf228f96">2.1. Geometrical Measurements</a>
<ul>
<li><a href="#orgd254f0a">2.1.1. Measurement Setup</a></li>
<li><a href="#org695e32b">2.1.2. Measurement Results</a></li>
</ul>
</li>
<li><a href="#org17a12d9">2.2. Electrical Measurements</a>
<ul>
<li><a href="#org24f3038">2.2.1. Measurement Setup</a></li>
<li><a href="#org25a9179">2.2.2. Measured Capacitance</a></li>
</ul>
</li>
<li><a href="#org183f8ef">2.3. Stroke measurement</a>
<ul>
<li><a href="#org57d0d2c">2.3.1. Voltage applied on one stack</a></li>
<li><a href="#org5626388">2.3.2. Voltage applied on two stacks</a></li>
<li><a href="#org6da7040">2.3.3. Voltage applied on all three stacks</a></li>
<li><a href="#orga1410c0">2.3.4. Conclusion</a></li>
</ul>
</li>
<li><a href="#org8ccf86f">2.4. Spurious resonances</a>
<ul>
<li><a href="#org38a17b6">2.4.1. Introduction</a></li>
<li><a href="#orgd0314e1">2.4.2. Measurement Setup</a></li>
<li><a href="#org9198a64">2.4.3. X-Bending Mode</a></li>
<li><a href="#orgd200b45">2.4.4. Y-Bending Mode</a></li>
<li><a href="#org3f208a8">2.4.5. Z-Torsion Mode</a></li>
<li><a href="#org539691c">2.4.6. Compare</a></li>
<li><a href="#orgc2fec9d">2.4.7. Conclusion</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org8062446">3. Dynamical measurements - APA</a>
<ul>
<li><a href="#org987aa03">3.1. Measurements on APA 1</a>
<ul>
<li><a href="#org724368f">3.1.1. Excitation Signals</a></li>
<li><a href="#orge74f168">3.1.2. First Measurement</a></li>
<li><a href="#org49d2a73">3.1.3. FRF - Setup</a></li>
<li><a href="#orgdd50e06">3.1.4. FRF - Encoder and Interferometer</a></li>
<li><a href="#org960a3f3">3.1.5. FRF - Force Sensor</a></li>
<li><a href="#orgba61515">3.1.6. Hysteresis</a></li>
<li><a href="#org3e3fdc4">3.1.7. Estimation of the APA axial stiffness</a></li>
<li><a href="#org3b51b82">3.1.8. Stiffness change due to electrical connections</a></li>
<li><a href="#orgfbecab4">3.1.9. Effect of the resistor on the IFF Plant</a></li>
</ul>
</li>
<li><a href="#org9c1fe4d">3.2. Comparison of all the APA</a>
<ul>
<li><a href="#orgd5c5acb">3.2.1. Axial Stiffnesses - Comparison</a></li>
<li><a href="#org779fdce">3.2.2. FRF - Setup</a></li>
<li><a href="#org487d966">3.2.3. FRF - Encoder and Interferometer</a></li>
<li><a href="#orgbcec578">3.2.4. FRF - Force Sensor</a></li>
<li><a href="#orga9bc47e">3.2.5. Conclusion</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#orgd3338d7">4. Test Bench APA300ML - Simscape Model</a>
<ul>
<li><a href="#orgc502b31">4.1. First Identification</a></li>
<li><a href="#orga4f438b">4.2. Identify Sensor/Actuator constants and compare with measured FRF</a>
<ul>
<li><a href="#org28d63ca">4.2.1. How to identify these constants?</a>
<ul>
<li><a href="#org03b4db0">4.2.1.1. Piezoelectric Actuator Constant</a></li>
<li><a href="#orgf719300">4.2.1.2. Piezoelectric Sensor Constant</a></li>
</ul>
</li>
<li><a href="#orga73a7c3">4.2.2. Identification Data</a></li>
<li><a href="#orgd336333">4.2.3. 2DoF APA</a>
<ul>
<li><a href="#orga3802e5">4.2.3.1. 2DoF APA</a></li>
<li><a href="#org6c7fac2">4.2.3.2. Identification without actuator or sensor constants</a></li>
<li><a href="#org1755613">4.2.3.3. Actuator Constant</a></li>
<li><a href="#org32520e8">4.2.3.4. Sensor Constant</a></li>
<li><a href="#org4cf1b7c">4.2.3.5. Comparison</a></li>
</ul>
</li>
<li><a href="#orgf53fa02">4.2.4. Flexible APA</a>
<ul>
<li><a href="#org9fe0f1b">4.2.4.1. Flexible APA</a></li>
<li><a href="#org49338d9">4.2.4.2. Identification without actuator or sensor constants</a></li>
<li><a href="#org9f3c55f">4.2.4.3. Actuator Constant</a></li>
<li><a href="#org5efa6ad">4.2.4.4. Sensor Constant</a></li>
<li><a href="#org4c9a071">4.2.4.5. Comparison</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#orgf10e44f">4.3. Optimize 2-DoF model to fit the experimental Data</a></li>
</ul>
</li>
<li><a href="#org932ad75">5. Dynamical measurements - Struts</a>
<ul>
<li><a href="#org62233c8">5.1. Measurement on Strut 1</a>
<ul>
<li><a href="#org3a89238">5.1.1. Without Encoder</a>
<ul>
<li><a href="#org31b81aa">5.1.1.1. FRF Identification - Setup</a></li>
<li><a href="#org2d19176">5.1.1.2. FRF Identification - Interferometer</a></li>
<li><a href="#orgf190cb1">5.1.1.3. FRF Identification - IFF</a></li>
</ul>
</li>
<li><a href="#orga8e1cd6">5.1.2. With Encoder</a>
<ul>
<li><a href="#org6aab1af">5.1.2.1. Measurement Data</a></li>
<li><a href="#org39ba2bd">5.1.2.2. FRF Identification - Interferometer</a></li>
<li><a href="#org8a01f33">5.1.2.3. FRF Identification - Encoder</a></li>
<li><a href="#org0da1bd9">5.1.2.4. APA Resonances Frequency</a></li>
<li><a href="#org323e041">5.1.2.5. FRF Identification - Force Sensor</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org1e8bc71">5.2. Comparison of all the Struts</a>
<ul>
<li><a href="#org5211b31">5.2.1. FRF Identification - Setup</a></li>
<li><a href="#org35ef651">5.2.2. FRF Identification - Encoder</a></li>
<li><a href="#orge319461">5.2.3. FRF Identification - Interferometer</a></li>
<li><a href="#org51c4216">5.2.4. FRF Identification - Force Sensor</a></li>
<li><a href="#org3810396">5.2.5. Conclusion</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org5814e2a">6. Test Bench Struts - Simscape Model</a>
<ul>
<li><a href="#orgd44a8c7">6.1. Comparison with the 2-DoF Model</a>
<ul>
<li><a href="#org3a72c91">6.1.1. First Identification</a></li>
<li><a href="#orgf98c6c1">6.1.2. Comparison with the experimental Data</a></li>
</ul>
</li>
<li><a href="#orgd880ba3">6.2. Effect of a misalignment of the APA and flexible joints on the transfer function from actuator to encoder</a>
<ul>
<li><a href="#orgafe9e23">6.2.1. Perfectly aligned APA</a></li>
<li><a href="#org5305829">6.2.2. Effect of a misalignment in y</a></li>
<li><a href="#org321a2c2">6.2.3. Effect of a misalignment in x</a></li>
<li><a href="#org7d83225">6.2.4. Find the misalignment of each strut</a></li>
</ul>
</li>
<li><a href="#org41a4b7b">6.3. Effect of flexible joint&rsquo;s stiffness</a>
<ul>
<li><a href="#orgfb25dc2">6.3.1. Effect of bending stiffness of the flexible joints</a></li>
<li><a href="#org85988d8">6.3.2. Effect of axial stiffness of the flexible joints</a></li>
<li><a href="#org8da2e09">6.3.3. Effect of bending damping</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#orge9a1b7a">7. Function</a>
<ul>
<li><a href="#org9c626c3">7.1. <code>initializeBotFlexibleJoint</code> - Initialize Flexible Joint</a>
<ul>
<li><a href="#orgcfa95b6">Function description</a></li>
<li><a href="#org444afff">Optional Parameters</a></li>
<li><a href="#org29faf0b">Initialize the structure</a></li>
<li><a href="#org7132f76">Set the Joint&rsquo;s type</a></li>
<li><a href="#orgc6ad76b">Set parameters</a></li>
</ul>
</li>
<li><a href="#orga3944eb">7.2. <code>initializeTopFlexibleJoint</code> - Initialize Flexible Joint</a>
<ul>
<li><a href="#orgdafbe7f">Function description</a></li>
<li><a href="#org09a9f39">Optional Parameters</a></li>
<li><a href="#orgcd65ce5">Initialize the structure</a></li>
<li><a href="#orgf9a1697">Set the Joint&rsquo;s type</a></li>
<li><a href="#org2b181ab">Set parameters</a></li>
</ul>
</li>
<li><a href="#orgc8bf923">7.3. <code>initializeAPA</code> - Initialize APA</a>
<ul>
<li><a href="#org5beabbf">Function description</a></li>
<li><a href="#org33f75b4">Optional Parameters</a></li>
<li><a href="#org9abcbe5">Initialize Structure</a></li>
<li><a href="#org46d3bf7">Type</a></li>
<li><a href="#org6179f95">Actuator/Sensor Constants</a></li>
<li><a href="#org43090e9">2DoF parameters</a></li>
<li><a href="#org35c0df5">Flexible frame and fully flexible</a></li>
</ul>
</li>
<li><a href="#org64d97f9">7.4. <code>generateSweepExc</code>: Generate sweep sinus excitation</a>
<ul>
<li><a href="#orgf3de67c">Function description</a></li>
<li><a href="#orgc4503a2">Optional Parameters</a></li>
<li><a href="#org60674bb">Sweep Sine part</a></li>
<li><a href="#orge154095">Smooth Ends</a></li>
<li><a href="#org4ac212d">Combine Excitation signals</a></li>
</ul>
</li>
<li><a href="#orgfa4d784">7.5. <code>generateShapedNoise</code>: Generate Shaped Noise excitation</a>
<ul>
<li><a href="#orgaf0e6a4">Function description</a></li>
<li><a href="#orgba46446">Optional Parameters</a></li>
<li><a href="#org775e5b0">Shaped Noise</a></li>
<li><a href="#orgbe14828">Smooth Ends</a></li>
<li><a href="#org300b9ed">Combine Excitation signals</a></li>
</ul>
</li>
<li><a href="#orgbb76802">7.6. <code>generateSinIncreasingAmpl</code>: Generate Sinus with increasing amplitude</a>
<ul>
<li><a href="#orgbcff655">Function description</a></li>
<li><a href="#orgdd5692f">Optional Parameters</a></li>
<li><a href="#org6bb7030">Sinus excitation</a></li>
<li><a href="#org3c57b4b">Smooth Ends</a></li>
<li><a href="#org512d985">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>
In this document, a test-bench is used to characterize the struts of the nano-hexapod.
</p>
<p>
Each strut includes (Figure <a href="#org0a46503">1</a>):
</p>
<ul class="org-ul">
<li>2 flexible joints at each ends.
These flexible joints have been characterized in a <a href="../test-bench-nass-flexible-joints/test-bench-flexible-joints.html">separate test bench</a>.</li>
<li>1 Amplified Piezoelectric Actuator (APA300ML) (described in Section <a href="#orge688b3f">1</a>).
Two stacks are used as an actuator and one stack as a (force) sensor.</li>
<li>1 encoder (Renishaw Vionic) that has been characterized in a <a href="../test-bench-vionic/test-bench-vionic.html">separate test bench</a>.</li>
</ul>
<div id="org0a46503" class="figure">
<p><img src="figs/picture_strut_top_view.jpg" alt="picture_strut_top_view.jpg" />
</p>
<p><span class="figure-number">Figure 1: </span>One strut including two flexible joints, an amplified piezoelectric actuator and an encoder</p>
</div>
<p>
The first goal is to characterize the APA300ML in terms of:
</p>
<ul class="org-ul">
<li>The, geometric features, electrical capacitance, stroke, hysteresis, spurious resonances.
This is performed in Section <a href="#orga65f646">2</a>.</li>
<li>The dynamics from the generated DAC voltage (going to the voltage amplifiers and then applied on the actuator stacks) to the induced displacement, and to the measured voltage by the force sensor stack.
Also the &ldquo;actuator constant&rdquo; and &ldquo;sensor constant&rdquo; are identified.
This is done in Section <a href="#orgb03eef7">3</a>.</li>
<li>Compare the measurements with the Simscape models (2DoF, Super-Element) in order to tuned/validate the models.
This is explained in Section <a href="#org31551cc">4</a>.</li>
</ul>
<p>
Then the struts are mounted (procedure described <a href="../test-bench-strut-mounting/test-bench-strut-mounting.html">here</a>), and are fixed to the same measurement bench.
Similarly, the goals are to:
</p>
<ul class="org-ul">
<li>Section <a href="#org4aeda2d">5</a>: Identify the dynamics from the generated DAC voltage to:
<ul class="org-ul">
<li>the sensors stack generated voltage</li>
<li>the measured displacement by the encoder</li>
<li>the measured displacement by the interferometer (representing encoders that would be fixed to the nano-hexapod&rsquo;s plates instead of the struts)</li>
</ul></li>
<li>Section <a href="#org1adf24d">6</a>: Compare the measurements with the Simscape model of the struts and tune the models</li>
</ul>
<p>
The final goal of the work presented in this document is to have an accurate Simscape model of the struts that can then be included in the Simscape model of the nano-hexapod.
</p>
<div id="outline-container-orgf89ffed" class="outline-2">
<h2 id="orgf89ffed"><span class="section-number-2">1</span> Model of the Amplified Piezoelectric Actuator</h2>
<div class="outline-text-2" id="text-1">
<p>
<a id="orge688b3f"></a>
</p>
<p>
The Amplified Piezoelectric Actuator (APA) used is the APA300ML from Cedrat technologies (Figure <a href="#orgc23e09d">2</a>).
</p>
<div id="orgc23e09d" class="figure">
<p><img src="figs/apa300ML.png" alt="apa300ML.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Picture of the APA300ML</p>
</div>
<p>
Two simscape models of the APA300ML are developed:
</p>
<ul class="org-ul">
<li>Section <a href="#orgf2f3350">1.1</a>: a simple 2 degrees of freedom (DoF) model</li>
<li>Section <a href="#org2d8d624">1.2</a>: a &ldquo;flexible&rdquo; model using a &ldquo;super-element&rdquo; extracted from a Finite Element Model of the APA</li>
</ul>
<p>
For both models, an &ldquo;actuator constant&rdquo; and a &ldquo;sensor constant&rdquo; are used.
These constants are used to link the electrical domain and the mechanical domain.
They are described in Section <a href="#org697b595">1.3</a>.
</p>
</div>
<div id="outline-container-orgba9c126" class="outline-3">
<h3 id="orgba9c126"><span class="section-number-3">1.1</span> Two Degrees of Freedom Model</h3>
<div class="outline-text-3" id="text-1-1">
<p>
<a id="orgf2f3350"></a>
</p>
<p>
The presented model is based on (<a href="#citeproc_bib_item_1">Souleille et al. 2018</a>) and represented in Figure <a href="#org9ca4dfb">3</a>.
</p>
<div id="org9ca4dfb" class="figure">
<p><img src="./figs/souleille18_model_piezo.png" alt="souleille18_model_piezo.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Picture of an APA100M from Cedrat Technologies. Simplified model of a one DoF payload mounted on such isolator</p>
</div>
<p>
The parameters are described in Table <a href="#org2a2d2e8">1</a>.
</p>
<table id="org2a2d2e8" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 1:</span> Parameters used for the model of the APA 100M</caption>
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-left"><b>Meaning</b></th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(k_e\)</td>
<td class="org-left">Stiffness used to adjust the pole of the isolator</td>
</tr>
<tr>
<td class="org-left">\(k_1\)</td>
<td class="org-left">Stiffness of the metallic suspension when the stack is removed</td>
</tr>
<tr>
<td class="org-left">\(k_a\)</td>
<td class="org-left">Stiffness of the actuator</td>
</tr>
<tr>
<td class="org-left">\(c_1\)</td>
<td class="org-left">Added viscous damping</td>
</tr>
</tbody>
</table>
<p>
The model is shown again in Figure <a href="#orgd45aa85">4</a>.
As will be shown in the next section, such model can be quite accurate in modelling the axial behavior of the APA.
However, it does not model the flexibility of the APA in the other directions.
</p>
<p>
Therefore this model can be useful for quick simulations as it contains a very limited number of states, but when more complex dynamics of the APA is to be modelled, a flexible model will be used.
</p>
<div id="orgd45aa85" class="figure">
<p><img src="figs/2dof_apa_model.png" alt="2dof_apa_model.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Schematic of the 2DoF model for the Amplified Piezoelectric Actuator</p>
</div>
</div>
</div>
<div id="outline-container-orgccde226" class="outline-3">
<h3 id="orgccde226"><span class="section-number-3">1.2</span> Flexible Model</h3>
<div class="outline-text-3" id="text-1-2">
<p>
<a id="org2d8d624"></a>
</p>
<p>
In order to model with high accuracy the behavior of the APA, a flexible model can be used.
</p>
<p>
The idea is to do a Finite element model of the structure, and to defined &ldquo;remote points&rdquo; as shown in Figure <a href="#org8e427b2">5</a>.
Then, on the finite element software, a &ldquo;super-element&rdquo; can be extracted which consists of a mass matrix, a stiffness matrix, and the coordinates of the remote points.
</p>
<div id="org8e427b2" class="figure">
<p><img src="figs/mesh_APA.png" alt="mesh_APA.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Remote points for the APA300ML (Ansys)</p>
</div>
<p>
This &ldquo;super-element&rdquo; can then be included in the Simscape model as shown in Figure <a href="#org04fc004">6</a>.
The remotes points are defined as &ldquo;frames&rdquo; in Simscape, and the &ldquo;super-element&rdquo; can be connected with other Simscape elements (mechanical joints, masses, force actuators, etc..).
</p>
<div id="org04fc004" class="figure">
<p><img src="figs/super_element_simscape.png" alt="super_element_simscape.png" />
</p>
<p><span class="figure-number">Figure 6: </span>From a finite Element Model (Ansys, bottom left) is extract the mass and stiffness matrices that are then used on Simscape (right)</p>
</div>
</div>
</div>
<div id="outline-container-org357b53f" class="outline-3">
<h3 id="org357b53f"><span class="section-number-3">1.3</span> Actuator and Sensor constants</h3>
<div class="outline-text-3" id="text-1-3">
<p>
<a id="org697b595"></a>
</p>
<p>
On Simscape, we want to model both the actuator stacks and the sensors stack.
We therefore need to link the electrical domain (voltages, charges) with the mechanical domain (forces, strain).
To do so, we use the &ldquo;actuator constant&rdquo; and the &ldquo;sensor constant&rdquo;.
</p>
<p>
Consider a schematic of the Amplified Piezoelectric Actuator in Figure <a href="#org1e76d2f">7</a>.
</p>
<div id="org1e76d2f" class="figure">
<p><img src="figs/apa_model_schematic.png" alt="apa_model_schematic.png" />
</p>
<p><span class="figure-number">Figure 7: </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}
\boxed{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}
\boxed{V_s = g_s \cdot dl}
\end{equation}
<p>
The block-diagram model of the piezoelectric actuator is then as shown in Figure <a href="#orgec89873">8</a>.
</p>
<div id="orgec89873" class="figure">
<p><img src="figs/apa-model-simscape-schematic.png" alt="apa-model-simscape-schematic.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Model of the APA with Simscape/Simulink</p>
</div>
<p>
The constants \(g_a\) and \(g_s\) will be experimentally estimated.
</p>
</div>
</div>
</div>
<div id="outline-container-org82876e8" class="outline-2">
<h2 id="org82876e8"><span class="section-number-2">2</span> First Basic Measurements</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="orga65f646"></a>
</p>
<p>
Before using the measurement bench to characterize the APA300ML, first simple measurements are performed:
</p>
<ul class="org-ul">
<li>Section <a href="#org13b2fd8">2.1</a>: the geometric tolerances of the interface planes are checked</li>
<li>Section <a href="#org106a6df">2.2</a>: the capacitance of the stacks are measured</li>
<li>Section <a href="#org921fba7">2.3</a>: the stroke of the APA are measured</li>
<li>Section <a href="#orga1cb712">2.4</a>: the &ldquo;spurious&rdquo; resonances of the APA are investigated</li>
</ul>
</div>
<div id="outline-container-orgf228f96" class="outline-3">
<h3 id="orgf228f96"><span class="section-number-3">2.1</span> Geometrical Measurements</h3>
<div class="outline-text-3" id="text-2-1">
<p>
<a id="org13b2fd8"></a>
</p>
<p>
The received APA are shown in Figure <a href="#orgbd648a9">9</a>.
</p>
<div id="orgbd648a9" class="figure">
<p><img src="figs/received_apa.jpg" alt="received_apa.jpg" />
</p>
<p><span class="figure-number">Figure 9: </span>Received APA</p>
</div>
</div>
<div id="outline-container-orgd254f0a" class="outline-4">
<h4 id="orgd254f0a"><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="#orgbe73fe4">10</a>.
</p>
<div id="orgbe73fe4" class="figure">
<p><img src="figs/flatness_meas_setup.jpg" alt="flatness_meas_setup.jpg" />
</p>
<p><span class="figure-number">Figure 10: </span>Measurement Setup</p>
</div>
</div>
</div>
<div id="outline-container-org695e32b" class="outline-4">
<h4 id="org695e32b"><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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Measured height for all the APA at the 8 locations</span></span>
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"><span class="org-matlab-cellbreak"><span class="org-comment">%% X-Y positions of the measurements points</span></span>
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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Using fminsearch to find the best fitting plane</span></span>
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="#org63a149b">2</a>.
</p>
<table id="org63a149b" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 2:</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 class="important" id="org2f82690">
<p>
The measured flatness of the APA300ML interface planes are within the specifications.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org17a12d9" class="outline-3">
<h3 id="org17a12d9"><span class="section-number-3">2.2</span> Electrical Measurements</h3>
<div class="outline-text-3" id="text-2-2">
<p>
<a id="org106a6df"></a>
</p>
</div>
<div id="outline-container-org24f3038" class="outline-4">
<h4 id="org24f3038"><span class="section-number-4">2.2.1</span> Measurement Setup</h4>
<div class="outline-text-4" id="text-2-2-1">
<div class="note" id="orgfcd5b07">
<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>) shown in Figure <a href="#org33ff18a">11</a>.
The excitation frequency is set to be 1kHz.
</p>
</div>
<div id="org33ff18a" class="figure">
<p><img src="figs/LCR_meter.jpg" alt="LCR_meter.jpg" />
</p>
<p><span class="figure-number">Figure 11: </span>LCR Meter used for the measurements</p>
</div>
</div>
</div>
<div id="outline-container-org25a9179" class="outline-4">
<h4 id="org25a9179"><span class="section-number-4">2.2.2</span> Measured Capacitance</h4>
<div class="outline-text-4" id="text-2-2-2">
<p>
From the documentation of the APA300ML, the total capacitance of the three stacks should be between \(18\mu F\) and \(26\mu F\) with a nominal capacitance of \(20\mu F\).
However, from the documentation of the stack themselves, it can be seen that the capacitance of a single stack should be \(4.4\mu F\).
Clearly, the total capacitance of the APA300ML if more than just three times the capacitance of one stack.
</p>
<div class="question" id="orgc51d972">
<p>
Could it be possible that the capacitance of the stacks increase that much when they are pre-stressed?
</p>
</div>
<p>
The measured capacitance of the stacks are summarized in Table <a href="#orgef1201a">3</a>.
</p>
<table id="orgef1201a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 3:</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="important" id="orgf8bb937">
<p>
From the measurements (Table <a href="#orgef1201a">3</a>), the capacitance of one stack is found to be \(\approx 5 \mu F\).
</p>
</div>
<div class="warning" id="org18e8158">
<p>
There is clearly a problem with APA300ML number 3
The APA number 3 has ben sent back to Cedrat, and a new APA300ML has been shipped back.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org183f8ef" class="outline-3">
<h3 id="org183f8ef"><span class="section-number-3">2.3</span> Stroke measurement</h3>
<div class="outline-text-3" id="text-2-3">
<p>
<a id="org921fba7"></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="#orga3337d2">12</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="org3ccb58a">
<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="orga3337d2" class="figure">
<p><img src="figs/stroke_test_bench.jpg" alt="stroke_test_bench.jpg" />
</p>
<p><span class="figure-number">Figure 12: </span>Bench to measured the APA stroke</p>
</div>
<p>
From the documentation, the nominal stroke of the APA300ML is \(304\,\mu m\).
</p>
</div>
<div id="outline-container-org57d0d2c" class="outline-4">
<h4 id="org57d0d2c"><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="#orgd01296f">13</a>.
</p>
<div id="orgd01296f" class="figure">
<p><img src="figs/apa_stroke_voltage_time.png" alt="apa_stroke_voltage_time.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Applied voltage as a function of time</p>
</div>
<p>
The obtained displacements for all the APA are shown in Figure <a href="#org6564681">14</a>.
The displacement is set to zero at initial time when the voltage applied is -20V.
</p>
<div id="org6564681" class="figure">
<p><img src="figs/apa_stroke_time_1s.png" alt="apa_stroke_time_1s.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Displacement as a function of time for all the APA300ML (only one stack is used as an actuator)</p>
</div>
<p>
Finally, the displacement is shown as a function of the applied voltage in Figure <a href="#org48ef173">15</a>.
We can clearly see that there is a problem with the APA 3.
Also, there is a large hysteresis.
</p>
<div id="org48ef173" 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 15: </span>Displacement as a function of the applied voltage (on only one stack)</p>
</div>
<div class="important" id="org1c6ad6c">
<p>
We can clearly confirm from Figure <a href="#org48ef173">15</a> that there is a problem with the APA number 3.
</p>
</div>
</div>
</div>
<div id="outline-container-org5626388" class="outline-4">
<h4 id="org5626388"><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="#org2e4e7e9">16</a>.
The displacement is set to zero at initial time when the voltage applied is -20V.
</p>
<div id="org2e4e7e9" class="figure">
<p><img src="figs/apa_stroke_time_2s.png" alt="apa_stroke_time_2s.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Displacement as a function of time for all the APA300ML (two stacks are used as actuators)</p>
</div>
<p>
Finally, the displacement is shown as a function of the applied voltage in Figure <a href="#org0585afd">17</a>.
</p>
<div id="org0585afd" 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 17: </span>Displacement as a function of the applied voltage on two stacks</p>
</div>
</div>
</div>
<div id="outline-container-org6da7040" class="outline-4">
<h4 id="org6da7040"><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="#org86897bd">18</a>).
</p>
<div id="org86897bd" 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 18: </span>Displacement as a function of the applied voltage on all three stacks</p>
</div>
<p>
The obtained maximum stroke for all the APA are summarized in Table <a href="#orgec29dcd">4</a>.
</p>
<table id="orgec29dcd" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 4:</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 id="outline-container-orga1410c0" class="outline-4">
<h4 id="orga1410c0"><span class="section-number-4">2.3.4</span> Conclusion</h4>
<div class="outline-text-4" id="text-2-3-4">
<div class="important" id="org6953943">
<p>
The except from APA 3 that has a problem, all the APA are similar when it comes to stroke and hysteresis.
Also, the obtained stroke is more than specified in the documentation.
Therefore, only two stacks can be used as an actuator.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org8ccf86f" class="outline-3">
<h3 id="org8ccf86f"><span class="section-number-3">2.4</span> Spurious resonances</h3>
<div class="outline-text-3" id="text-2-4">
<p>
<a id="orga1cb712"></a>
</p>
</div>
<div id="outline-container-org38a17b6" class="outline-4">
<h4 id="org38a17b6"><span class="section-number-4">2.4.1</span> Introduction</h4>
<div class="outline-text-4" id="text-2-4-1">
<p>
From a Finite Element Model of the struts, it have been found that three main resonances are foreseen to be problematic for the control of the APA300ML (Figure <a href="#org0d3b6de">19</a>):
</p>
<ul class="org-ul">
<li>Mode in X-bending at 200Hz</li>
<li>Mode in Y-bending at 285Hz</li>
<li>Mode in Z-torsion at 400Hz</li>
</ul>
<div id="org0d3b6de" class="figure">
<p><img src="figs/apa_mode_shapes.gif" alt="apa_mode_shapes.gif" />
</p>
<p><span class="figure-number">Figure 19: </span>Spurious resonances. a) X-bending mode at 189Hz. b) Y-bending mode at 285Hz. c) Z-torsion mode at 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-orgd0314e1" class="outline-4">
<h4 id="orgd0314e1"><span class="section-number-4">2.4.2</span> Measurement Setup</h4>
<div class="outline-text-4" id="text-2-4-2">
<p>
The measurement setup is shown in Figure <a href="#orgc12bdee">20</a>.
A Laser vibrometer is measuring the difference of motion between 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="org34324e7">
<p>
The instrumentation used are:
</p>
<ul class="org-ul">
<li>Laser Doppler Vibrometer Polytec OFV512</li>
<li>Instrumented hammer</li>
</ul>
</div>
<div id="orgc12bdee" class="figure">
<p><img src="figs/measurement_setup_torsion.jpg" alt="measurement_setup_torsion.jpg" />
</p>
<p><span class="figure-number">Figure 20: </span>Measurement setup with a Laser Doppler Vibrometer and one instrumental hammer</p>
</div>
</div>
</div>
<div id="outline-container-org9198a64" class="outline-4">
<h4 id="org9198a64"><span class="section-number-4">2.4.3</span> X-Bending Mode</h4>
<div class="outline-text-4" id="text-2-4-3">
<p>
The vibrometer is setup to measure the X-bending motion is shown in Figure <a href="#org0cc6c28">21</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="org0cc6c28" class="figure">
<p><img src="figs/measurement_setup_X_bending.jpg" alt="measurement_setup_X_bending.jpg" />
</p>
<p><span class="figure-number">Figure 21: </span>X-Bending measurement setup</p>
</div>
<p>
The data is loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span>
bending_X = load(<span class="org-string">'apa300ml_bending_X_top.mat'</span>);
</pre>
</div>
<p>
The configuration (Sampling time and windows) for <code>tfestimate</code> is done:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Spectral Analysis setup</span></span>
Ts = bending_X.Track1_X_Resolution; <span class="org-comment">% Sampling Time [s]</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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute the transfer function from applied force to measured rotation</span></span>
[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="#orgfe14c3a">22</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="orgfe14c3a" 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 22: </span>Obtained FRF for the X-bending</p>
</div>
<p>
Then the APA is in the &ldquo;free-free&rdquo; condition, this bending mode is foreseen to be at 200Hz (Figure <a href="#org0d3b6de">19</a>).
We are here in the &ldquo;fixed-free&rdquo; condition.
If we consider that we therefore double the stiffness associated with this mode, we should obtain a resonance a factor \(\sqrt{2}\) higher than 200Hz which is indeed 280Hz.
Not sure this reasoning is correct though.
</p>
</div>
</div>
<div id="outline-container-orgd200b45" class="outline-4">
<h4 id="orgd200b45"><span class="section-number-4">2.4.4</span> Y-Bending Mode</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="#orgb8da833">23</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="orgb8da833" class="figure">
<p><img src="figs/measurement_setup_Y_bending.jpg" alt="measurement_setup_Y_bending.jpg" />
</p>
<p><span class="figure-number">Figure 23: </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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span>
bending_Y = load(<span class="org-string">'apa300ml_bending_Y_top.mat'</span>);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Compute the transfer function</span></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="#org7a58175">24</a>.
The main resonance is at 412Hz, and we also see the third &ldquo;harmonic&rdquo; at 1220Hz.
</p>
<div id="org7a58175" 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 24: </span>Obtained FRF for the Y-bending</p>
</div>
<p>
We can apply the same reasoning as in the previous section and estimate the mode to be a factor \(\sqrt{2}\) higher than the mode estimated in the &ldquo;free-free&rdquo; condition.
We would obtain a mode at 403Hz which is very close to the one estimated here.
</p>
</div>
</div>
<div id="outline-container-org3f208a8" class="outline-4">
<h4 id="org3f208a8"><span class="section-number-4">2.4.5</span> Z-Torsion Mode</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="#orgc553371">25</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="orgc553371" class="figure">
<p><img src="figs/measurement_setup_torsion_bis.jpg" alt="measurement_setup_torsion_bis.jpg" />
</p>
<p><span class="figure-number">Figure 25: </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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span>
torsion = load(<span class="org-string">'apa300ml_torsion_left.mat'</span>);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Compute transfer function</span></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="#org34eb9f4">26</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.
A third mode at 800Hz could correspond to this torsion mode.
</p>
<div id="org34eb9f4" 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 26: </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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load data</span></span>
torsion = load(<span class="org-string">'apa300ml_torsion_top.mat'</span>);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Compute transfer function</span></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="#org5cef96f">27</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="org5cef96f" 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 27: </span>Obtained FRF for the Z-torsion</p>
</div>
</div>
</div>
<div id="outline-container-org539691c" class="outline-4">
<h4 id="org539691c"><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="#orgd88ad0f">28</a>.
</p>
<div id="orgd88ad0f" class="figure">
<p><img src="figs/apa300ml_meas_freq_compare.png" alt="apa300ml_meas_freq_compare.png" />
</p>
<p><span class="figure-number">Figure 28: </span>Obtained FRF - Comparison</p>
</div>
</div>
</div>
<div id="outline-container-orgc2fec9d" class="outline-4">
<h4 id="orgc2fec9d"><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="org55f364f" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 5:</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"><b>Mode</b></th>
<th scope="col" class="org-left"><b>FEM - Strut mode</b></th>
<th scope="col" class="org-left"><b>Measured Frequency</b></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">800Hz?</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="outline-container-org8062446" class="outline-2">
<h2 id="org8062446"><span class="section-number-2">3</span> Dynamical measurements - APA</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="orgb03eef7"></a>
</p>
<p>
In this section, a measurement test bench is used 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>&ldquo;Actuator constant&rdquo;: Gain from the applied voltage \(V_a\) to the generated Force \(F_a\)</li>
<li>&ldquo;Sensor constant&rdquo;: Gain from the sensor stack strain \(\delta L\) to the generated voltage \(V_s\)</li>
<li>Dynamical behavior from the actuator to the force sensor and to the motion of the APA</li>
</ul>
<p>
The bench is shown in Figure <a href="#orge527671">29</a>, and a zoom picture on the APA and encoder is shown in Figure <a href="#org5afcec7">30</a>.
</p>
<div id="orge527671" class="figure">
<p><img src="figs/picture_apa_bench.jpg" alt="picture_apa_bench.jpg" />
</p>
<p><span class="figure-number">Figure 29: </span>Picture of the test bench</p>
</div>
<div id="org5afcec7" class="figure">
<p><img src="figs/picture_apa_bench_encoder.jpg" alt="picture_apa_bench_encoder.jpg" />
</p>
<p><span class="figure-number">Figure 30: </span>Zoom on the APA with the encoder</p>
</div>
<div class="note" id="org5171d31">
<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="#orgb8ffb51">31</a> and the signal used are summarized in Table <a href="#orgab90504">6</a>.
</p>
<div id="orgb8ffb51" class="figure">
<p><img src="figs/test_bench_apa_alone.png" alt="test_bench_apa_alone.png" />
</p>
<p><span class="figure-number">Figure 31: </span>Schematic of the Test Bench</p>
</div>
<table id="orgab90504" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 6:</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"><b>Variable</b></th>
<th scope="col" class="org-left"><b>Description</b></th>
<th scope="col" class="org-left"><b>Unit</b></th>
<th scope="col" class="org-left"><b>Hardware</b></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 - PD200 - 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 - 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="#org2498d19">3.1</a>: the measurements are first performed on one APA.</li>
<li>Section <a href="#org90a1314">3.2</a>: the same measurements are performed on all the APA and are compared.</li>
</ul>
</div>
<div id="outline-container-org987aa03" class="outline-3">
<h3 id="org987aa03"><span class="section-number-3">3.1</span> Measurements on APA 1</h3>
<div class="outline-text-3" id="text-3-1">
<p>
<a id="org2498d19"></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-org724368f" class="outline-4">
<h4 id="org724368f"><span class="section-number-4">3.1.1</span> Excitation Signals</h4>
<div class="outline-text-4" id="text-3-1-1">
<p>
Different excitation signals are used to perform FRF estimations.
</p>
<p>
Typically, this is done in three steps:
</p>
<ol class="org-ol">
<li>A low pass filtered white noise is used with rather small amplitudes (Figure <a href="#org5e9a9fa">32</a>).
This first excitation is used to estimate the main resonance of the system.</li>
<li>A sweep-sine from 10Hz to 400Hz is used (Figure <a href="#org1dd1cbc">33</a>).
The sweep-sine is is notched around the estimated resonance of the system.</li>
<li>A band-limited white noise from 300Hz to 2kHz is used to estimate the high frequency behavior (Figure <a href="#org785fe0e">34</a>).</li>
</ol>
<p>
For all the excitation signals, before the excitation starts, the mean voltage is slowly increased halfway between the minimum voltage (-20V) and the maximum (150V).
</p>
<p>
The first measurement is only used to have a first estimation of the dynamics and verify that everything is setup correctly.
The second excitation is done to estimate the dynamics from 10Hz to 350Hz and the third excitation from 350Hz to 2kHz.
The second and third measurements are therefore combined in the frequency domain to form one good estimation of the dynamics from 10Hz up to 2kHz.
</p>
<div id="org5e9a9fa" class="figure">
<p><img src="figs/exc_signal_1_noise.png" alt="exc_signal_1_noise.png" />
</p>
<p><span class="figure-number">Figure 32: </span>Low pass filtered white noise. Time domain (left), Frequency domain (right)</p>
</div>
<div id="org1dd1cbc" class="figure">
<p><img src="figs/exc_signal_2_sweep.png" alt="exc_signal_2_sweep.png" />
</p>
<p><span class="figure-number">Figure 33: </span>Sweep Sine with a decreased amplitude around the resonance of the APA</p>
</div>
<div id="org785fe0e" class="figure">
<p><img src="figs/exc_signal_3_hf_noise.png" alt="exc_signal_3_hf_noise.png" />
</p>
<p><span class="figure-number">Figure 34: </span>Band-pass white noise. Time domain (left), Frequency domain (right)</p>
</div>
</div>
</div>
<div id="outline-container-orge74f168" class="outline-4">
<h4 id="orge74f168"><span class="section-number-4">3.1.2</span> First Measurement</h4>
<div class="outline-text-4" id="text-3-1-2">
<p>
For this first measurement for the first APA, 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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load data</span></span>
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="#orgc17cc6e">35</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="orgc17cc6e" class="figure">
<p><img src="figs/apa_bench_exc_sweep.png" alt="apa_bench_exc_sweep.png" />
</p>
<p><span class="figure-number">Figure 35: </span>Excitation voltage</p>
</div>
</div>
</div>
<div id="outline-container-org49d2a73" class="outline-4">
<h4 id="org49d2a73"><span class="section-number-4">3.1.3</span> FRF - Setup</h4>
<div class="outline-text-4" id="text-3-1-3">
<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 Frequency / Time</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-orgdd50e06" class="outline-4">
<h4 id="orgdd50e06"><span class="section-number-4">3.1.4</span> FRF - Encoder and Interferometer</h4>
<div class="outline-text-4" id="text-3-1-4">
<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\) and from \(V_a\) to \(d_a\) are computed and shown in Figure <a href="#org0343996">36</a>.
They are 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">%% Compute the coherence</span></span>
[enc_coh, <span class="org-type">~</span>] = mscohere(apa_sweep.Va, apa_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
[int_coh, <span class="org-type">~</span>] = mscohere(apa_sweep.Va, apa_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="org0343996" class="figure">
<p><img src="figs/apa_1_coh_dvf.png" alt="apa_1_coh_dvf.png" />
</p>
<p><span class="figure-number">Figure 36: </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="#orga1ba7e5">37</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% TF - Encoder and interferometer</span></span>
[frf_enc, <span class="org-type">~</span>] = tfestimate(apa_sweep.Va, apa_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
[frf_int, <span class="org-type">~</span>] = tfestimate(apa_sweep.Va, apa_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<p>
It is shown than both the encoder and interferometers are measuring the same dynamics up to \(\approx 700\,Hz\).
Above that, it is possible that there is some flexible elements apart from the APA that is adding resonances into one or the other FRF.
</p>
<div id="orga1ba7e5" class="figure">
<p><img src="figs/apa_1_frf_dvf.png" alt="apa_1_frf_dvf.png" />
</p>
<p><span class="figure-number">Figure 37: </span>Obtained transfer functions from \(V_a\) to both \(d_e\) and \(d_a\)</p>
</div>
<div class="important" id="org28e3367">
<p>
The transfer functions obtained in Figure <a href="#orga1ba7e5">37</a> are very close to what was expected:
</p>
<ul class="org-ul">
<li>constant gain at low frequency</li>
<li>resonance at around 100Hz which corresponds to the APA axial mode</li>
<li>no further resonance up until high frequency (\(\approx 700\,Hz\)) at which points several elements of the test bench can induces resonances in the measured FRF</li>
</ul>
<p>
However, it was not expected to observe a &ldquo;double resonance&rdquo; at around 95Hz (instead of only one resonance).
</p>
</div>
</div>
</div>
<div id="outline-container-org960a3f3" class="outline-4">
<h4 id="org960a3f3"><span class="section-number-4">3.1.5</span> FRF - Force Sensor</h4>
<div class="outline-text-4" id="text-3-1-5">
<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="#orga3a0c94">38</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">%% Compute the coherence from Va to Vs</span></span>
[iff_coh, <span class="org-type">~</span>] = mscohere(apa_sweep.Va, apa_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="orga3a0c94" class="figure">
<p><img src="figs/apa_1_coh_iff.png" alt="apa_1_coh_iff.png" />
</p>
<p><span class="figure-number">Figure 38: </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="#org6dc54bd">39</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute the TF from Va to Vs</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="org6dc54bd" class="figure">
<p><img src="figs/apa_1_frf_iff.png" alt="apa_1_frf_iff.png" />
</p>
<p><span class="figure-number">Figure 39: </span>Obtained transfer functions from \(V_a\) to \(V_s\)</p>
</div>
<div class="important" id="org5cdb5ff">
<p>
The obtained dynamics from the excitation voltage \(V_a\) to the measured sensor stack voltage \(V_s\) is corresponding to what was expected:
</p>
<ul class="org-ul">
<li>constant gain at low frequency</li>
<li>complex conjugate zero and then complex conjugate pole</li>
<li>constant gain at high frequency</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-orgba61515" class="outline-4">
<h4 id="orgba61515"><span class="section-number-4">3.1.6</span> Hysteresis</h4>
<div class="outline-text-4" id="text-3-1-6">
<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 (halfway between -20V and 150V), and the sin amplitude is ranging from 1V up to 80V (full range).
</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="#org1ad5774">40</a>.
</p>
<div id="org1ad5774" class="figure">
<p><img src="figs/expected_hysteresis.png" alt="expected_hysteresis.png" />
</p>
<p><span class="figure-number">Figure 40: </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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load measured data - hysteresis</span></span>
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="#org0677cfa">41</a>.
</p>
<div id="org0677cfa" class="figure">
<p><img src="figs/hyst_exc_signal_time.png" alt="hyst_exc_signal_time.png" />
</p>
<p><span class="figure-number">Figure 41: </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, the motion is centered on zero.
</p>
<p>
The measured displacement at a function of the output voltage are shown in Figure <a href="#org09e5c6e">42</a>.
</p>
<div id="org09e5c6e" class="figure">
<p><img src="figs/hyst_results_multi_ampl.png" alt="hyst_results_multi_ampl.png" />
</p>
<p><span class="figure-number">Figure 42: </span>Obtained hysteresis for multiple excitation amplitudes</p>
</div>
<div class="important" id="orgde2b9da">
<p>
From Figure <a href="#org09e5c6e">42</a>, it is quite clear that hysteresis is increasing with the excitation amplitude.
For small excitation amplitudes (\(V_a < 0.4\,V\)) the hysteresis stays reasonably small.
</p>
<p>
Also, it is quite interesting to see that no hysteresis is found on the sensor stack voltage when using the same excitation signal.
</p>
</div>
</div>
</div>
<div id="outline-container-org3e3fdc4" class="outline-4">
<h4 id="org3e3fdc4"><span class="section-number-4">3.1.7</span> Estimation of the APA axial stiffness</h4>
<div class="outline-text-4" id="text-3-1-7">
<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.
</p>
<p>
The APA stiffness can then be estimated to be:
</p>
\begin{equation}
k_{\text{apa}} = \frac{m_a g}{d}
\end{equation}
<p>
The data is loaded, and the measured displacement is shown in Figure <a href="#org9830832">43</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load data for stiffness measurement</span></span>
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="org9830832" class="figure">
<p><img src="figs/apa_1_meas_stiffness.png" alt="apa_1_meas_stiffness.png" />
</p>
<p><span class="figure-number">Figure 43: </span>Measured displacement when adding the mass and removing the mass</p>
</div>
<p>
From Figure <a href="#org9830832">43</a>, it can be seen that there are some drifts that are probably due to some creep.
This will induce some uncertainties in the measured stiffness.
</p>
<p>
Here, a mass of 6.4 kg was 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 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>
<p>
The stiffness could also be estimated based on the main vertical resonance of the system at \(\omega_z = 2\pi \cdot 94 \,[rad/s]\).
The suspended mass is \(m_{\text{sus}} = 5\,kg\).
And therefore, the axial stiffness of the APA can be estimated to be:
</p>
\begin{equation}
k_{\text{APA}} = m_{\text{sus}} \omega_z^2
\end{equation}
<div class="org-src-container">
<pre class="src src-matlab">wz = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>94; <span class="org-comment">% [rad/s]</span>
msus = 5.7; <span class="org-comment">% [kg]</span>
k = msus <span class="org-type">*</span> wz<span class="org-type">^</span>2;
</pre>
</div>
<pre class="example">
k = 1.99 [N/um]
</pre>
<p>
The two values are found relatively close to each other.
Anyway, the stiffness of the model will be tuned to match the measured FRF.
</p>
</div>
</div>
<div id="outline-container-org3b51b82" class="outline-4">
<h4 id="org3b51b82"><span class="section-number-4">3.1.8</span> Stiffness change due to electrical connections</h4>
<div class="outline-text-4" id="text-3-1-8">
<p>
Changes in the electrical impedance connected to the piezoelectric actuator causes changes in the mechanical compliance (or stiffness) of the piezoelectric actuator.
</p>
<p>
In this section is measured the stiffness of the APA whether the piezoelectric actuator is connected to an open circuit or a short circuit (e.g. the output of a voltage amplifier).
</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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span>
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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Zero displacement at initial time</span></span>
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="#orgbdfd3cc">44</a>.
</p>
<div id="orgbdfd3cc" 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 44: </span>Measured displacement</p>
</div>
<p>
And the stiffness is estimated in both case.
The results are shown in Table <a href="#org66f1e0d">7</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="org66f1e0d" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 7:</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="orgd5d0160">
<p>
Clearly, connecting the actuator stacks to the amplified (basically equivalent as to short circuiting them) lowers its stiffness.
</p>
</div>
</div>
</div>
<div id="outline-container-orgfbecab4" class="outline-4">
<h4 id="orgfbecab4"><span class="section-number-4">3.1.9</span> Effect of the resistor on the IFF Plant</h4>
<div class="outline-text-4" id="text-3-1-9">
<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>
This is done for two reasons (explained in details <a href="../test-bench-force-sensor/test-bench-force-sensor.html">this document</a>):
</p>
<ol class="org-ol">
<li>Limit the voltage offset due to the input bias current of the ADC</li>
<li>Limit the low frequency gain</li>
</ol>
<p>
The (low frequency) transfer function from \(V_a\) to \(V_s\) with and without this resistor have been measured.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load the data</span></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">% With 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>); <span class="org-comment">% Without the resistor</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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute the transfer functions from Va to Vs</span></span>
[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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Model for the high pass filter</span></span>
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="#orgad22d43">45</a>.
</p>
<div id="orgad22d43" class="figure">
<p><img src="figs/frf_iff_effect_R.png" alt="frf_iff_effect_R.png" />
</p>
<p><span class="figure-number">Figure 45: </span>Transfer function from \(V_a\) to \(V_s\) with and without the resistor \(k\)</p>
</div>
<div class="important" id="org2e01782">
<p>
The added resistor has indeed the expected effect of forming an high pass filter.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org9c1fe4d" class="outline-3">
<h3 id="org9c1fe4d"><span class="section-number-3">3.2</span> Comparison of all the APA</h3>
<div class="outline-text-3" id="text-3-2">
<p>
<a id="org90a1314"></a>
</p>
<p>
The same measurements that was performed in Section <a href="#org2498d19">3.1</a> are now performed on all the APA and then compared.
</p>
</div>
<div id="outline-container-orgd5c5acb" class="outline-4">
<h4 id="orgd5c5acb"><span class="section-number-4">3.2.1</span> Axial Stiffnesses - Comparison</h4>
<div class="outline-text-4" id="text-3-2-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 numbers 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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span>
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="#org9d1651d">46</a>.
All the APA seems to have similar stiffness except the APA 7 which show strange behavior.
</p>
<div class="question" id="org535d7f1">
<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?
It is probably due to the fact that the mechanical element holding the granite in place was not removed.
</p>
</div>
<div id="org9d1651d" class="figure">
<p><img src="figs/apa_meas_k_time.png" alt="apa_meas_k_time.png" />
</p>
<p><span class="figure-number">Figure 46: </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="#org6a3aecf">8</a>.
</p>
<table id="org6a3aecf" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 8:</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="org0f7c13a">
<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, maybe there was a problem with the experimental setup.
</p>
</div>
</div>
</div>
<div id="outline-container-org779fdce" class="outline-4">
<h4 id="org779fdce"><span class="section-number-4">3.2.2</span> FRF - Setup</h4>
<div class="outline-text-4" id="text-3-2-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>
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);
i_lf = f <span class="org-type">&lt;=</span> 350;
i_hf = f <span class="org-type">&gt;</span> 350;
</pre>
</div>
</div>
</div>
<div id="outline-container-org487d966" class="outline-4">
<h4 id="org487d966"><span class="section-number-4">3.2.3</span> FRF - Encoder and Interferometer</h4>
<div class="outline-text-4" id="text-3-2-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_enc = 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_lf, <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_hf, <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_enc(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [coh_lf(i_lf); coh_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The coherence is shown in Figure <a href="#org3bbf17c">47</a>, and it is found that the coherence is good from low frequency up to 700Hz.
</p>
<div id="org3bbf17c" 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 47: </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>
enc_frf = 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_lf, <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);
[frf_hf, <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);
enc_frf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [frf_lf(i_lf); frf_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained transfer functions are shown in Figure <a href="#org3b9e8d8">48</a>.
They are all superimposed except for the APA7.
</p>
<div class="question" id="org53ae7c5">
<p>
Why is the APA7 dynamical behavior is so different from the other?
We could think that the APA7 is stiffer, but also the mass line is off, and it should indeed be identical.
</p>
</div>
<div id="org3b9e8d8" 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 48: </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="#org20f0afe">49</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="org140b79f">
<p>
Why is there a double resonance at around 94Hz?
</p>
</div>
<div id="org20f0afe" 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 49: </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-orgbcec578" class="outline-4">
<h4 id="orgbcec578"><span class="section-number-4">3.2.4</span> FRF - Force Sensor</h4>
<div class="outline-text-4" id="text-3-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="#org828bcbe">50</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">%% Compute the Coherence</span></span>
coh_iff = 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_lf, <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_hf, <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_iff(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [coh_lf(i_lf); coh_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org828bcbe" 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 50: </span>Obtained coherence for the IFF plant</p>
</div>
<p>
Then the FRF are estimated and shown in Figure <a href="#org6a5142c">51</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_frf = 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_lf, <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);
[frf_hf, <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_frf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [frf_lf(i_lf); frf_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org6a5142c" 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 51: </span>Identified IFF Plant</p>
</div>
</div>
</div>
<div id="outline-container-orga9bc47e" class="outline-4">
<h4 id="orga9bc47e"><span class="section-number-4">3.2.5</span> Conclusion</h4>
<div class="outline-text-4" id="text-3-2-5">
<div class="important" id="org6871d0e">
<p>
Except the APA 7 which shows strange behavior, all the other APA are showing a very similar behavior.
</p>
<p>
So far, all the measured FRF are showing the dynamical behavior that was expected.
</p>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Remove the APA 7 (6 in the list) from measurements</span></span>
apa_nums<span class="org-type">(6) </span>= [];
enc_frf<span class="org-type">(:,6) </span>= [];
iff_frf<span class="org-type">(:,6) </span>= [];
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Save the measured FRF</span></span>
save(<span class="org-string">'mat/meas_apa_frf.mat'</span>, <span class="org-string">'f'</span>, <span class="org-string">'Ts'</span>, <span class="org-string">'enc_frf'</span>, <span class="org-string">'iff_frf'</span>, <span class="org-string">'apa_nums'</span>);
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd3338d7" class="outline-2">
<h2 id="orgd3338d7"><span class="section-number-2">4</span> Test Bench APA300ML - Simscape Model</h2>
<div class="outline-text-2" id="text-4">
<p>
<a id="org31551cc"></a>
</p>
<p>
In this section, a simscape model (Figure <a href="#orge0fb3c9">52</a>) of the measurement bench is used to compare the model of the APA with the measured FRF.
</p>
<p>
After the transfer functions are extracted from the model (Section <a href="#org0521d5e">4.1</a>), the comparison of the obtained dynamics with the measured FRF will permit to:
</p>
<ol class="org-ol">
<li>Estimate the &ldquo;actuator constant&rdquo; and &ldquo;sensor constant&rdquo; (Section <a href="#org578f655">4.2</a>)</li>
<li>Tune the model of the APA to match the measured dynamics (Section <a href="#org514d984">4.3</a>)</li>
</ol>
<div id="orge0fb3c9" class="figure">
<p><img src="figs/model_bench_apa.png" alt="model_bench_apa.png" />
</p>
<p><span class="figure-number">Figure 52: </span>Screenshot of the Simscape model</p>
</div>
</div>
<div id="outline-container-orgc502b31" class="outline-3">
<h3 id="orgc502b31"><span class="section-number-3">4.1</span> First Identification</h3>
<div class="outline-text-3" id="text-4-1">
<p>
<a id="org0521d5e"></a>
</p>
<p>
The APA is first initialized with default parameters:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Initialize the structure with default values</span></span>
n_hexapod = struct();
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-comment"> % Actuator constant [N/V]</span>
<span class="org-string">'Gs'</span>, 1); <span class="org-comment">% Sensor constant [V/m]</span>
</pre>
</div>
<p>
The transfer function from excitation voltage \(V_a\) (before the amplification of \(20\) due to the PD200 amplifier) to:
</p>
<ol class="org-ol">
<li>the sensor stack voltage \(V_s\)</li>
<li>the measured displacement by the encoder \(d_e\)</li>
<li>the measured displacement by the interferometer \(d_a\)</li>
</ol>
<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">% DAC 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">'/de'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Encoder</span>
io(io_i) = linio([mdl, <span class="org-string">'/da'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Interferometer</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">'de'</span>, <span class="org-string">'da'</span>};
</pre>
</div>
<p>
The obtain dynamics are shown in Figure <a href="#org302ada0">53</a> and <a href="#orgfd8868f">54</a>.
It can be seen that:
</p>
<ul class="org-ul">
<li>the shape of these bode plots are very similar to the one measured in Section <a href="#orgb03eef7">3</a> expect from a change in gain and exact location of poles and zeros</li>
<li>there is a sign error for the transfer function from \(V_a\) to \(V_s\).
This will be corrected by taking a negative &ldquo;sensor gain&rdquo;.</li>
<li>the low frequency zero of the transfer function from \(V_a\) to \(V_s\) is minimum phase as expected.
The measured FRF are showing non-minimum phase zero, but it is most likely due to measurements artifacts.</li>
</ul>
<div id="org302ada0" 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 53: </span>Bode plot of the transfer function from \(V_a\) to \(V_s\)</p>
</div>
<div id="orgfd8868f" 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 54: </span>Bode plot of the transfer function from \(V_a\) to \(d_L\) and to \(z\)</p>
</div>
</div>
</div>
<div id="outline-container-orga4f438b" class="outline-3">
<h3 id="orga4f438b"><span class="section-number-3">4.2</span> Identify Sensor/Actuator constants and compare with measured FRF</h3>
<div class="outline-text-3" id="text-4-2">
<p>
<a id="org578f655"></a>
</p>
</div>
<div id="outline-container-org28d63ca" class="outline-4">
<h4 id="org28d63ca"><span class="section-number-4">4.2.1</span> How to identify these constants?</h4>
<div class="outline-text-4" id="text-4-2-1">
</div>
<div id="outline-container-org03b4db0" class="outline-5">
<h5 id="org03b4db0"><span class="section-number-5">4.2.1.1</span> Piezoelectric Actuator Constant</h5>
<div class="outline-text-5" id="text-4-2-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} \label{eq:actuator_constant_formula}
\boxed{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-orgf719300" class="outline-5">
<h5 id="orgf719300"><span class="section-number-5">4.2.1.2</span> Piezoelectric Sensor Constant</h5>
<div class="outline-text-5" id="text-4-2-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 piezoelectric 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} \label{eq:sensor_constant_formula}
\boxed{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-orga73a7c3" class="outline-4">
<h4 id="orga73a7c3"><span class="section-number-4">4.2.2</span> Identification Data</h4>
<div class="outline-text-4" id="text-4-2-2">
<p>
Let&rsquo;s load the measured FRF from the DAC voltage to the measured encoder and to the sensor stack voltage.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span>
load(<span class="org-string">'meas_apa_frf.mat'</span>, <span class="org-string">'f'</span>, <span class="org-string">'Ts'</span>, <span class="org-string">'enc_frf'</span>, <span class="org-string">'iff_frf'</span>, <span class="org-string">'apa_nums'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd336333" class="outline-4">
<h4 id="orgd336333"><span class="section-number-4">4.2.3</span> 2DoF APA</h4>
<div class="outline-text-4" id="text-4-2-3">
</div>
<div id="outline-container-orga3802e5" class="outline-5">
<h5 id="orga3802e5"><span class="section-number-5">4.2.3.1</span> 2DoF APA</h5>
<div class="outline-text-5" id="text-4-2-3-1">
<p>
Let&rsquo;s initialize the APA as a 2DoF model with unity sensor and actuator gains.
</p>
<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-org6c7fac2" class="outline-5">
<h5 id="org6c7fac2"><span class="section-number-5">4.2.3.2</span> Identification without actuator or sensor constants</h5>
<div class="outline-text-5" id="text-4-2-3-2">
<p>
The transfer function from \(V_a\) to \(V_s\), \(d_e\) and \(d_a\) is identified.
</p>
<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">'/de'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Encoder</span>
io(io_i) = linio([mdl, <span class="org-string">'/da'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Attocube</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">'de'</span>, <span class="org-string">'da'</span>};
</pre>
</div>
</div>
</div>
<div id="outline-container-org1755613" class="outline-5">
<h5 id="org1755613"><span class="section-number-5">4.2.3.3</span> Actuator Constant</h5>
<div class="outline-text-5" id="text-4-2-3-3">
<p>
Then, the actuator constant can be computed as shown in Eq. \eqref{eq:actuator_constant_formula} by dividing the measured DC gain of the transfer function from \(V_a\) to \(d_e\) by the estimated DC gain of the transfer function from \(V_a\) (in truth the actuator force called \(F_a\)) to \(d_e\) using the Simscape model.
</p>
<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(enc_frf(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">'de'</span>, <span class="org-string">'Va'</span>)); <span class="org-comment">% [N/V]</span>
</pre>
</div>
<pre class="example">
ga = -32.2 [N/V]
</pre>
</div>
</div>
<div id="outline-container-org32520e8" class="outline-5">
<h5 id="org32520e8"><span class="section-number-5">4.2.3.4</span> Sensor Constant</h5>
<div class="outline-text-5" id="text-4-2-3-4">
<p>
Similarly, the sensor constant can be estimated using Eq. \eqref{eq:sensor_constant_formula}.
</p>
<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_frf(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.088 [V/m]
</pre>
</div>
</div>
<div id="outline-container-org4cf1b7c" class="outline-5">
<h5 id="org4cf1b7c"><span class="section-number-5">4.2.3.5</span> Comparison</h5>
<div class="outline-text-5" id="text-4-2-3-5">
<p>
Let&rsquo;s now initialize the APA with identified sensor and actuator constant:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Set the identified constants</span></span>
n_hexapod.actuator = initializeAPA(...
<span class="org-string">'type'</span>, <span class="org-string">'2dof'</span>, ...
<span class="org-string">'ga'</span>, ga, ...<span class="org-comment"> % Actuator gain [N/V]</span>
<span class="org-string">'gs'</span>, gs); <span class="org-comment">% Sensor gain [V/m]</span>
</pre>
</div>
<p>
And 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">'de'</span>, <span class="org-string">'da'</span>};
</pre>
</div>
<p>
The transfer functions from \(V_a\) to \(d_e\) are compared in Figure <a href="#org6329e65">55</a> and the one from \(V_a\) to \(V_s\) are compared in Figure <a href="#org7145a4e">56</a>.
</p>
<div id="org6329e65" class="figure">
<p><img src="figs/apa_act_constant_comp.png" alt="apa_act_constant_comp.png" />
</p>
<p><span class="figure-number">Figure 55: </span>Comparison of the experimental data and Simscape model (\(V_a\) to \(d_e\))</p>
</div>
<div id="org7145a4e" class="figure">
<p><img src="figs/apa_sens_constant_comp.png" alt="apa_sens_constant_comp.png" />
</p>
<p><span class="figure-number">Figure 56: </span>Comparison of the experimental data and Simscape model (\(V_a\) to \(V_s\))</p>
</div>
<div class="important" id="org01355d4">
<p>
The &ldquo;actuator constant&rdquo; and &ldquo;sensor constant&rdquo; can indeed be identified using this test bench.
After identifying these constants, the 2DoF model shows good agreement with the measured dynamics.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf53fa02" class="outline-4">
<h4 id="orgf53fa02"><span class="section-number-4">4.2.4</span> Flexible APA</h4>
<div class="outline-text-4" id="text-4-2-4">
<p>
In this section, the sensor and actuator &ldquo;constants&rdquo; are also estimated for the flexible model of the APA.
</p>
</div>
<div id="outline-container-org9fe0f1b" class="outline-5">
<h5 id="org9fe0f1b"><span class="section-number-5">4.2.4.1</span> Flexible APA</h5>
<div class="outline-text-5" id="text-4-2-4-1">
<p>
The Simscape APA model is initialized as a flexible one with unity &ldquo;constants&rdquo;.
</p>
<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-org49338d9" class="outline-5">
<h5 id="org49338d9"><span class="section-number-5">4.2.4.2</span> Identification without actuator or sensor constants</h5>
<div class="outline-text-5" id="text-4-2-4-2">
<p>
The dynamics from \(V_a\) to \(V_s\), \(d_e\) and \(d_a\) is identified.
</p>
<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">'de'</span>, <span class="org-string">'da'</span>};
</pre>
</div>
</div>
</div>
<div id="outline-container-org9f3c55f" class="outline-5">
<h5 id="org9f3c55f"><span class="section-number-5">4.2.4.3</span> Actuator Constant</h5>
<div class="outline-text-5" id="text-4-2-4-3">
<p>
Then, the actuator constant can be computed as shown in Eq. \eqref{eq:actuator_constant_formula}:
</p>
<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(enc_frf(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">'de'</span>, <span class="org-string">'Va'</span>)); <span class="org-comment">% [N/V]</span>
</pre>
</div>
<pre class="example">
ga = 23.5 [N/V]
</pre>
</div>
</div>
<div id="outline-container-org5efa6ad" class="outline-5">
<h5 id="org5efa6ad"><span class="section-number-5">4.2.4.4</span> Sensor Constant</h5>
<div class="outline-text-5" id="text-4-2-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_frf(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 = -4839841.756 [V/m]
</pre>
</div>
</div>
<div id="outline-container-org4c9a071" class="outline-5">
<h5 id="org4c9a071"><span class="section-number-5">4.2.4.5</span> Comparison</h5>
<div class="outline-text-5" id="text-4-2-4-5">
<p>
Let&rsquo;s now initialize the flexible APA with identified sensor and actuator constant:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Set the identified constants</span></span>
n_hexapod.actuator = initializeAPA(...
<span class="org-string">'type'</span>, <span class="org-string">'flexible'</span>, ...
<span class="org-string">'ga'</span>, ga, ...<span class="org-comment"> % Actuator gain [N/V]</span>
<span class="org-string">'gs'</span>, gs); <span class="org-comment">% Sensor gain [V/m]</span>
</pre>
</div>
<p>
And 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 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">'de'</span>, <span class="org-string">'da'</span>};
</pre>
</div>
<p>
The obtained dynamics is compared with the measured one in Figures <a href="#org4c95d0f">57</a> and <a href="#orgdaaaf96">58</a>.
</p>
<div id="org4c95d0f" 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 57: </span>Comparison of the experimental data and Simscape model (\(u\) to \(d\mathcal{L}_m\))</p>
</div>
<div id="orgdaaaf96" 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 58: </span>Comparison of the experimental data and Simscape model (\(u\) to \(\tau_m\))</p>
</div>
<div class="important" id="org97378a3">
<p>
The flexible model is a bit &ldquo;soft&rdquo; as compared with the experimental results.
</p>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf10e44f" class="outline-3">
<h3 id="orgf10e44f"><span class="section-number-3">4.3</span> Optimize 2-DoF model to fit the experimental Data</h3>
<div class="outline-text-3" id="text-4-3">
<p>
<a id="org514d984"></a>
The parameters of the 2DoF model presented in Section <a href="#orgf2f3350">1.1</a> are now optimize such that the model best matches the measured FRF.
</p>
<p>
After optimization, the following parameters are used:
</p>
<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>32.2, ...
<span class="org-string">'Gs'</span>, 0.088, ...
<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>
<p>
The dynamics is identified using the Simscape model and compared with the measured FRF in Figure <a href="#orgc548f75">59</a>.
</p>
<div id="orgc548f75" 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 59: </span>Comparison of the measured FRF and the optimized model</p>
</div>
<div class="important" id="org91d61ca">
<p>
The tuned 2DoF is very well representing the (axial) dynamics of the APA.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org932ad75" class="outline-2">
<h2 id="org932ad75"><span class="section-number-2">5</span> Dynamical measurements - Struts</h2>
<div class="outline-text-2" id="text-5">
<p>
<a id="org4aeda2d"></a>
</p>
<p>
The same bench used in Section <a href="#orgb03eef7">3</a> is here used with the strut instead of only the APA.
</p>
<p>
The bench is shown in Figure <a href="#orgc4723b3">60</a>.
Measurements are performed either when no encoder is fixed to the strut (Figure <a href="#orgdc1b972">61</a>) or when one encoder is fixed to the strut (Figure <a href="#orgef7f8fc">62</a>).
</p>
<div id="orgc4723b3" class="figure">
<p><img src="figs/test_bench_leg_overview.jpg" alt="test_bench_leg_overview.jpg" />
</p>
<p><span class="figure-number">Figure 60: </span>Test Bench with Strut - Overview</p>
</div>
<div id="orgdc1b972" class="figure">
<p><img src="figs/test_bench_leg_front.jpg" alt="test_bench_leg_front.jpg" />
</p>
<p><span class="figure-number">Figure 61: </span>Test Bench with Strut - Zoom on the strut</p>
</div>
<div id="orgef7f8fc" class="figure">
<p><img src="figs/test_bench_leg_coder.jpg" alt="test_bench_leg_coder.jpg" />
</p>
<p><span class="figure-number">Figure 62: </span>Test Bench with Strut - Zoom on the strut with the encoder</p>
</div>
<p>
Variables are named the same as in Section <a href="#orgb03eef7">3</a>.
</p>
<p>
First, only one strut is measured in details (Section <a href="#org4f97ac3">5.1</a>), and then all the struts are measured and compared (Section <a href="#org7e602a8">5.2</a>).
</p>
</div>
<div id="outline-container-org62233c8" class="outline-3">
<h3 id="org62233c8"><span class="section-number-3">5.1</span> Measurement on Strut 1</h3>
<div class="outline-text-3" id="text-5-1">
<p>
<a id="org4f97ac3"></a>
</p>
<p>
Measurements are first performed on one of the strut that contains:
</p>
<ul class="org-ul">
<li>the Amplified Piezoelectric Actuator (APA) number 1</li>
<li>flexible joints 1 and 2</li>
</ul>
<p>
In Section <a href="#org1023ea0">5.1.1</a>, the dynamics of the strut is measured without the encoder attached to it.
Then in Section <a href="#orga4fa6f7">5.1.2</a>, the encoder is attached to the struts, and the dynamic is identified.
</p>
</div>
<div id="outline-container-org3a89238" class="outline-4">
<h4 id="org3a89238"><span class="section-number-4">5.1.1</span> Without Encoder</h4>
<div class="outline-text-4" id="text-5-1-1">
<p>
<a id="org1023ea0"></a>
</p>
</div>
<div id="outline-container-org31b81aa" class="outline-5">
<h5 id="org31b81aa"><span class="section-number-5">5.1.1.1</span> FRF Identification - Setup</h5>
<div class="outline-text-5" id="text-5-1-1-1">
<p>
Similarly to what was done for the identification of the APA, 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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load Data</span></span>
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 frequency/time</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);
i_lf = f <span class="org-type">&lt;=</span> 350; <span class="org-comment">% Indices used for the low frequency</span>
i_hf = f <span class="org-type">&gt;</span> 350; <span class="org-comment">% Indices used for the low frequency</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org2d19176" class="outline-5">
<h5 id="org2d19176"><span class="section-number-5">5.1.1.2</span> FRF Identification - Interferometer</h5>
<div class="outline-text-5" id="text-5-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 and combine them.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute the coherence for both excitation signals</span></span>
[int_coh_sweep, <span class="org-type">~</span>] = mscohere(leg_sweep.Va, leg_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
[int_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);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the coherence</span></span>
int_coh = [int_coh_sweep(i_lf); int_coh_noise_hf(i_hf)];
</pre>
</div>
<p>
The combined coherence is shown in Figure <a href="#org7ffeb88">63</a>, and is found to be very good up to at least 1kHz.
</p>
<div id="org7ffeb88" 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 63: </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="#org27b61ba">64</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute FRF function from Va to da</span></span>
[frf_sweep, <span class="org-type">~</span>] = tfestimate(leg_sweep.Va, leg_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
[frf_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf.Va, leg_noise_hf.da, win, [], [], 1<span class="org-type">/</span>Ts);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the FRF</span></span>
int_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)];
</pre>
</div>
<div id="org27b61ba" 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 64: </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-orgf190cb1" class="outline-5">
<h5 id="orgf190cb1"><span class="section-number-5">5.1.1.3</span> FRF Identification - IFF</h5>
<div class="outline-text-5" id="text-5-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="#orga5b2cff">65</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">%% Compute the coherence for both excitation signals</span></span>
[iff_coh_sweep, <span class="org-type">~</span>] = mscohere(leg_sweep.Va, leg_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[iff_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);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the coherence</span></span>
iff_coh = [iff_coh_sweep(i_lf); iff_coh_noise_hf(i_hf)];
</pre>
</div>
<div id="orga5b2cff" 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 65: </span>Obtained coherence for the IFF plant</p>
</div>
<p>
Then the FRF are estimated and shown in Figure <a href="#orgba3c772">66</a>
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute the FRF</span></span>
[frf_sweep, <span class="org-type">~</span>] = tfestimate(leg_sweep.Va, leg_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[frf_noise_hf, <span class="org-type">~</span>] = tfestimate(leg_noise_hf.Va, leg_noise_hf.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the FRF</span></span>
iff_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)];
</pre>
</div>
<div id="orgba3c772" 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 66: </span>Identified IFF Plant for the Strut 1</p>
</div>
</div>
</div>
</div>
<div id="outline-container-orga8e1cd6" class="outline-4">
<h4 id="orga8e1cd6"><span class="section-number-4">5.1.2</span> With Encoder</h4>
<div class="outline-text-4" id="text-5-1-2">
<p>
<a id="orga4fa6f7"></a>
</p>
<p>
Now the encoder is fixed to the strut and the identification is performed.
</p>
</div>
<div id="outline-container-org6aab1af" class="outline-5">
<h5 id="org6aab1af"><span class="section-number-5">5.1.2.1</span> Measurement Data</h5>
<div class="outline-text-5" id="text-5-1-2-1">
<p>
The measurements are loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load data</span></span>
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-org39ba2bd" class="outline-5">
<h5 id="org39ba2bd"><span class="section-number-5">5.1.2.2</span> FRF Identification - Interferometer</h5>
<div class="outline-text-5" id="text-5-1-2-2">
<p>
In this section, the dynamics from \(V_a\) to \(d_a\) is identified.
</p>
<p>
First, the coherence is computed and shown in Figure <a href="#orgd9cc833">67</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute the coherence for both excitation signals</span></span>
[int_coh_sweep, <span class="org-type">~</span>] = mscohere(leg_enc_sweep.Va, leg_enc_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
[int_coh_noise_hf, <span class="org-type">~</span>] = mscohere(leg_enc_noise_hf.Va, leg_enc_noise_hf.da, win, [], [], 1<span class="org-type">/</span>Ts);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the coherinte</span></span>
int_coh = [int_coh_sweep(i_lf); int_coh_noise_hf(i_hf)];
</pre>
</div>
<div id="orgd9cc833" class="figure">
<p><img src="figs/strut_1_int_with_enc_frf_dvf_plant_coh.png" alt="strut_1_int_with_enc_frf_dvf_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 67: </span>Obtained coherence for the plant from \(V_a\) to \(d_a\)</p>
</div>
<p>
Then the FRF are computed and shown in Figure <a href="#org7e56df8">68</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute FRF function from Va to da</span></span>
[frf_sweep, <span class="org-type">~</span>] = tfestimate(leg_enc_sweep.Va, leg_enc_sweep.da, win, [], [], 1<span class="org-type">/</span>Ts);
[frf_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);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the FRF</span></span>
int_with_enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)];
</pre>
</div>
<div id="org7e56df8" class="figure">
<p><img src="figs/strut_1_int_with_enc_frf_dvf_plant_tf.png" alt="strut_1_int_with_enc_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>
<p>
The obtained FRF is very close to the one that was obtained when no encoder was fixed to the struts as shown in Figure <a href="#org742ef58">69</a>.
</p>
<div id="org742ef58" class="figure">
<p><img src="figs/strut_leg_compare_int_frf.png" alt="strut_leg_compare_int_frf.png" />
</p>
<p><span class="figure-number">Figure 69: </span>Comparison of the measured FRF from \(V_a\) to \(d_a\) with and without the encoders fixed to the struts</p>
</div>
</div>
</div>
<div id="outline-container-org8a01f33" class="outline-5">
<h5 id="org8a01f33"><span class="section-number-5">5.1.2.3</span> FRF Identification - Encoder</h5>
<div class="outline-text-5" id="text-5-1-2-3">
<p>
In this section, the dynamics from \(V_a\) to \(d_e\) (encoder) is identified.
</p>
<p>
The coherence is computed and shown in Figure <a href="#orga75a057">70</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute the coherence for both excitation signals</span></span>
[enc_coh_sweep, <span class="org-type">~</span>] = mscohere(leg_enc_sweep.Va, leg_enc_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
[enc_coh_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);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the coherence</span></span>
enc_coh = [enc_coh_sweep(i_lf); enc_coh_noise_hf(i_hf)];
</pre>
</div>
<div id="orga75a057" 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 70: </span>Obtained coherence for the plant from \(V_a\) to \(d_e\) and from \(V_a\) to \(d_a\)</p>
</div>
<p>
The FRF from \(V_a\) to the encoder measured displacement \(d_e\) is computed and shown in Figure <a href="#org09f042d">71</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute FRF function from Va to da</span></span>
[frf_sweep, <span class="org-type">~</span>] = tfestimate(leg_enc_sweep.Va, leg_enc_sweep.de, win, [], [], 1<span class="org-type">/</span>Ts);
[frf_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);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the FRF</span></span>
enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)];
</pre>
</div>
<div id="org09f042d" 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 71: </span>Estimated FRF for the DVF plant (transfer function from \(V_a\) to the encoder \(d_e\))</p>
</div>
<p>
The transfer functions from \(V_a\) to \(d_e\) (encoder) and to \(d_a\) (interferometer) are compared in Figure <a href="#org97a00f1">72</a>.
</p>
<div id="org97a00f1" 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 72: </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="org6e014a3">
<p>
The dynamics from the excitation voltage \(V_a\) to the measured displacement by the encoder \(d_e\) presents much more complicated behavior than the transfer function to the displacement as measured by the Interferometer (compared in Figure <a href="#org97a00f1">72</a>).
It will be further investigated why the two dynamics as so different and what are causing all these resonances.
</p>
</div>
</div>
</div>
<div id="outline-container-org0da1bd9" class="outline-5">
<h5 id="org0da1bd9"><span class="section-number-5">5.1.2.4</span> APA Resonances Frequency</h5>
<div class="outline-text-5" id="text-5-1-2-4">
<p>
As shown in Figure <a href="#org4ffe0c9">73</a>, we can clearly see three spurious resonances at 197Hz, 290Hz and 376Hz.
</p>
<div id="org4ffe0c9" class="figure">
<p><img src="figs/strut_1_spurious_resonances.png" alt="strut_1_spurious_resonances.png" />
</p>
<p><span class="figure-number">Figure 73: </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 strut itself.
</p>
<p>
They are very close to what was estimated using a finite element model of the strut (Figure <a href="#orgb51c045">74</a>):
</p>
<ul class="org-ul">
<li>Mode in X-bending at 189Hz</li>
<li>Mode in Y-bending at 285Hz</li>
<li>Mode in Z-torsion at 400Hz</li>
</ul>
<div id="orgb51c045" class="figure">
<p><img src="figs/apa_mode_shapes.gif" alt="apa_mode_shapes.gif" />
</p>
<p><span class="figure-number">Figure 74: </span>Spurious resonances. a) X-bending mode at 189Hz. b) Y-bending mode at 285Hz. c) Z-torsion mode at 400Hz</p>
</div>
<div class="important" id="org673e78c">
<p>
The resonances seen by the encoder in Figure <a href="#org4ffe0c9">73</a> are indeed corresponding to the modes of the strut as shown in Figure <a href="#orgb51c045">74</a>.
</p>
</div>
</div>
</div>
<div id="outline-container-org323e041" class="outline-5">
<h5 id="org323e041"><span class="section-number-5">5.1.2.5</span> FRF Identification - Force Sensor</h5>
<div class="outline-text-5" id="text-5-1-2-5">
<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="#orge6c43e7">75</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">%% Compute the coherence for both excitation signals</span></span>
[iff_coh_sweep, <span class="org-type">~</span>] = mscohere(leg_enc_sweep.Va, leg_enc_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[iff_coh_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);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the coherence</span></span>
iff_coh = [iff_coh_sweep(i_lf); iff_coh_noise_hf(i_hf)];
</pre>
</div>
<div id="orge6c43e7" class="figure">
<p><img src="figs/strut_1_frf_iff_with_enc_plant_coh.png" alt="strut_1_frf_iff_with_enc_plant_coh.png" />
</p>
<p><span class="figure-number">Figure 75: </span>Obtained coherence for the IFF plant</p>
</div>
<p>
Then the FRF are estimated and shown in Figure <a href="#orge09c095">76</a>
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Compute FRF function from Va to da</span></span>
[frf_sweep, <span class="org-type">~</span>] = tfestimate(leg_enc_sweep.Va, leg_enc_sweep.Vs, win, [], [], 1<span class="org-type">/</span>Ts);
[frf_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);
<span class="org-matlab-cellbreak"><span class="org-comment">%% Combine the FRF</span></span>
iff_with_enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)];
</pre>
</div>
<div id="orge09c095" 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 76: </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="#org5ba119c">77</a>).
</p>
<div id="org5ba119c" 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 77: </span>Effect of the encoder on the IFF plant</p>
</div>
<div class="important" id="org6a7837c">
<p>
The transfer function from the excitation voltage \(V_a\) to the generated voltage \(V_s\) by the sensor stack is not influence by the fixation of the encoder.
This means that the IFF control strategy should be as effective whether or not the encoders are fixed to the struts.
</p>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org1e8bc71" class="outline-3">
<h3 id="org1e8bc71"><span class="section-number-3">5.2</span> Comparison of all the Struts</h3>
<div class="outline-text-3" id="text-5-2">
<p>
<a id="org7e602a8"></a>
</p>
<p>
Now all struts are measured using the same procedure and test bench as in Section <a href="#org4f97ac3">5.1</a>.
</p>
</div>
<div id="outline-container-org5211b31" class="outline-4">
<h4 id="org5211b31"><span class="section-number-4">5.2.1</span> FRF Identification - Setup</h4>
<div class="outline-text-4" id="text-5-2-1">
<p>
The identification of the struts dynamics is performed in two steps:
</p>
<ol class="org-ol">
<li>The excitation signal is a white noise with small amplitude.
This is used to estimate the low frequency dynamics.</li>
<li>Then a high frequency noise band-passed between 300Hz and 2kHz is used to estimate the high frequency dynamics.</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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Numnbers of the measured legs</span></span>
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">%% First identification (low frequency noise)</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">%% Second identification (high frequency noise)</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);
i_lf = f <span class="org-type">&lt;=</span> 350;
i_hf = f <span class="org-type">&gt;</span> 350;
</pre>
</div>
</div>
</div>
<div id="outline-container-org35ef651" class="outline-4">
<h4 id="org35ef651"><span class="section-number-4">5.2.2</span> FRF Identification - Encoder</h4>
<div class="outline-text-4" id="text-5-2-2">
<p>
In this section, the dynamics from \(V_a\) to \(d_e\) (encoder) is identified.
</p>
<p>
The coherence is computed and shown in Figure <a href="#org815a257">78</a> for all the measured struts.
</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_enc = 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_lf, <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_hf, <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_enc(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [coh_lf(i_lf); coh_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org815a257" 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 78: </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 encoder \(d_e\) 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>
enc_frf = 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_lf, <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);
[frf_hf, <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);
enc_frf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [frf_lf(i_lf); frf_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained transfer functions are shown in Figure <a href="#org499f385">79</a>.
</p>
<div id="org499f385" 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 79: </span>Estimated FRF for the DVF plant (transfer function from \(V_a\) to the encoder \(d_e\))</p>
</div>
<div class="important" id="org0991711">
<p>
There is a very large variability of the dynamics as measured by the encoder as shown in Figure <a href="#org499f385">79</a>.
Even-though the same peaks are seen for all of the struts (95Hz, 200Hz, 300Hz, 400Hz), the amplitude of the peaks are not the same.
Moreover, the location or even the presence of complex conjugate zeros is changing from one strut to the other.
</p>
<p>
All of this will be explained in Section <a href="#org1adf24d">6</a> thanks to the Simscape model.
</p>
</div>
</div>
</div>
<div id="outline-container-orge319461" class="outline-4">
<h4 id="orge319461"><span class="section-number-4">5.2.3</span> FRF Identification - Interferometer</h4>
<div class="outline-text-4" id="text-5-2-3">
<p>
In this section, the dynamics from \(V_a\) to \(d_a\) (interferometer) is identified.
</p>
<p>
The coherence is computed and shown in Figure <a href="#org817176c">80</a>.
</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_int = 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_lf, <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_hf, <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_int(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [coh_lf(i_lf); coh_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org817176c" 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 80: </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 for all the struts and shown in Figure <a href="#org3beee88">81</a>.
All the struts are giving very similar FRF.
</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>
int_frf = 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_lf, <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);
[frf_hf, <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);
int_frf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [frf_lf(i_lf); frf_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org3beee88" 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 81: </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-org51c4216" class="outline-4">
<h4 id="org51c4216"><span class="section-number-4">5.2.4</span> FRF Identification - Force Sensor</h4>
<div class="outline-text-4" id="text-5-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="#org778b93a">82</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Coherence</span></span>
coh_iff = 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_lf, <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_hf, <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_iff(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [coh_lf(i_lf); coh_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org778b93a" 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 82: </span>Obtained coherence for the IFF plant</p>
</div>
<p>
Then the FRF are estimated and shown in Figure <a href="#orgd047fdd">83</a>.
They are also shown all to be very similar.
</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_frf = 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_lf, <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);
[frf_hf, <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_frf(<span class="org-type">:</span>, <span class="org-constant">i</span>) = [frf_lf(i_lf); frf_hf(i_hf)];
<span class="org-keyword">end</span>
</pre>
</div>
<div id="orgd047fdd" 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 83: </span>Identified IFF Plant</p>
</div>
</div>
</div>
<div id="outline-container-org3810396" class="outline-4">
<h4 id="org3810396"><span class="section-number-4">5.2.5</span> Conclusion</h4>
<div class="outline-text-4" id="text-5-2-5">
<div class="important" id="org1767917">
<p>
All the struts are giving very consistent behavior from the excitation voltage \(V_a\) to the force sensor generated voltage \(V_s\) and to the interferometer measured displacement \(d_a\).
However, the dynamics from \(V_a\) to the encoder measurement \(d_e\) is much more complex and variable from one strut to the other.
</p>
</div>
<p>
The measured FRF are now saved for further use.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Save the estimated FRF for further analysis</span></span>
save(<span class="org-string">'mat/meas_struts_frf.mat'</span>, <span class="org-string">'f'</span>, <span class="org-string">'Ts'</span>, <span class="org-string">'enc_frf'</span>, <span class="org-string">'int_frf'</span>, <span class="org-string">'iff_frf'</span>, <span class="org-string">'leg_nums'</span>);
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org5814e2a" class="outline-2">
<h2 id="org5814e2a"><span class="section-number-2">6</span> Test Bench Struts - Simscape Model</h2>
<div class="outline-text-2" id="text-6">
<p>
<a id="org1adf24d"></a>
</p>
<p>
The same simscape model that was presented in Section <a href="#org31551cc">4</a> is here used.
However, now the full strut is put instead of only the APA (see Figure <a href="#orgbb55998">84</a>).
</p>
<div id="orgbb55998" class="figure">
<p><img src="figs/simscape_model_bench_struts.png" alt="simscape_model_bench_struts.png" />
</p>
<p><span class="figure-number">Figure 84: </span>Screenshot of the Simscape model of the strut fixed to the bench</p>
</div>
<p>
This Simscape model is used to:
</p>
<ul class="org-ul">
<li>compare the measured FRF with the modelled FRF</li>
<li>help the correct understanding/interpretation of the results</li>
<li>tune the model of the struts (APA, flexible joints, encoder)</li>
</ul>
<p>
This study is structured as follow:
</p>
<ul class="org-ul">
<li>Section <a href="#orgece6e2d">6.1</a>: the measured FRF are compared with the 2DoF APA model.</li>
<li>Section <a href="#orgf92b6d3">6.2</a>: the flexible APA model is used, and the effect of a misalignment of the APA and flexible joints is studied.
It is found that the misalignment has a large impact on the dynamics from \(V_a\) to \(d_e\).</li>
<li>Section <a href="#org0019bab">6.3</a>: the effect of the flexible joint&rsquo;s stiffness on the dynamics is studied.
It is found that the axial stiffness of the joints has a large impact on the location of the zeros on the transfer function from \(V_s\) to \(d_e\).</li>
</ul>
</div>
<div id="outline-container-orgd44a8c7" class="outline-3">
<h3 id="orgd44a8c7"><span class="section-number-3">6.1</span> Comparison with the 2-DoF Model</h3>
<div class="outline-text-3" id="text-6-1">
<p>
<a id="orgece6e2d"></a>
</p>
</div>
<div id="outline-container-org3a72c91" class="outline-4">
<h4 id="org3a72c91"><span class="section-number-4">6.1.1</span> First Identification</h4>
<div class="outline-text-4" id="text-6-1-1">
<p>
The strut is initialized with default parameters (optimized parameters identified from previous experiments).
</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">'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>
<p>
The inputs and outputs of the model are defined.
</p>
<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">'/de'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Encoder</span>
io(io_i) = linio([mdl, <span class="org-string">'/da'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Interferometer</span>
</pre>
</div>
<p>
The dynamics is identified and shown in Figure <a href="#org52f9bc8">85</a>.
</p>
<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">'de'</span>, <span class="org-string">'da'</span>};
</pre>
</div>
<div id="org52f9bc8" class="figure">
<p><img src="figs/strut_bench_model_bode.png" alt="strut_bench_model_bode.png" />
</p>
<p><span class="figure-number">Figure 85: </span>Identified transfer function from \(V_a\) to \(V_s\) and from \(V_a\) to \(d_e,d_a\) using the simple 2DoF model for the APA</p>
</div>
</div>
</div>
<div id="outline-container-orgf98c6c1" class="outline-4">
<h4 id="orgf98c6c1"><span class="section-number-4">6.1.2</span> Comparison with the experimental Data</h4>
<div class="outline-text-4" id="text-6-1-2">
<p>
The experimentally measured FRF are loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load measured FRF</span></span>
load(<span class="org-string">'meas_struts_frf.mat'</span>, <span class="org-string">'f'</span>, <span class="org-string">'Ts'</span>, <span class="org-string">'enc_frf'</span>, <span class="org-string">'int_frf'</span>, <span class="org-string">'iff_frf'</span>, <span class="org-string">'leg_nums'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Add time delay to the Simscape model</span></span>
Gs = exp(<span class="org-type">-</span>s<span class="org-type">*</span>Ts)<span class="org-type">*</span>Gs;
</pre>
</div>
<p>
The FRF from \(V_a\) to \(d_a\) as well as from \(V_a\) to \(V_s\) are shown in Figure <a href="#org9a2ad42">86</a> and compared with the model.
They are both found to match quite well with the model.
</p>
<div id="org9a2ad42" 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>
<p>
The measured FRF from \(V_a\) to \(d_e\) (encoder) is compared with the model in Figure <a href="#org0ae8e30">87</a>.
</p>
<div id="org0ae8e30" class="figure">
<p><img src="figs/comp_strut_plant_iff_after_opt.png" alt="comp_strut_plant_iff_after_opt.png" />
</p>
<p><span class="figure-number">Figure 87: </span>Comparison of the measured FRF and the optimized model</p>
</div>
<div class="important" id="org092f2d2">
<p>
The 2-DoF model is quite effective in modelling the transfer function from actuator to force sensor and from actuator to interferometer (Figure <a href="#org9a2ad42">86</a>).
But it is not effective in modeling the transfer function from actuator to encoder (Figure <a href="#org0ae8e30">87</a>).
This is due to the fact that resonances greatly affecting the encoder reading are not modelled.
In the next section, flexible model of the APA will be used to model such resonances.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd880ba3" class="outline-3">
<h3 id="orgd880ba3"><span class="section-number-3">6.2</span> Effect of a misalignment of the APA and flexible joints on the transfer function from actuator to encoder</h3>
<div class="outline-text-3" id="text-6-2">
<p>
<a id="orgf92b6d3"></a>
</p>
<p>
As shown in Figure <a href="#org499f385">79</a>, the dynamics from actuator to encoder for all the struts is very different.
</p>
<p>
This could be explained by a large variability in the alignment of the flexible joints and the APA (at the time, the alignment pins were not used).
</p>
<p>
Depending on the alignment, the spurious resonances of the struts (Figure <a href="#org2c5207b">88</a>) can be excited differently.
</p>
<div id="org2c5207b" class="figure">
<p><img src="figs/apa_mode_shapes.gif" alt="apa_mode_shapes.gif" />
</p>
<p><span class="figure-number">Figure 88: </span>Spurious resonances. a) X-bending mode at 189Hz. b) Y-bending mode at 285Hz. c) Z-torsion mode at 400Hz</p>
</div>
<p>
For instance, consider Figure <a href="#org4745dff">89</a> where there is a misalignment in the \(y\) direction.
In such case, the mode at 200Hz is foreseen to be more excited as the misalignment \(d_y\) increases and therefore the dynamics from the actuator to the encoder should also change around 200Hz.
</p>
<div id="org4745dff" class="figure">
<p><img src="figs/strut_misalign_schematic.png" alt="strut_misalign_schematic.png" />
</p>
<p><span class="figure-number">Figure 89: </span>Mis-alignement between the joints and the APA</p>
</div>
<p>
If the misalignment is in the \(x\) direction, the mode at 285Hz should be more affected whereas a misalignment in the \(z\) direction should not affect these resonances.
</p>
<p>
Such statement is studied in this section.
</p>
<p>
But first, the measured FRF of the struts are loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Load measured FRF of the struts</span></span>
load(<span class="org-string">'meas_struts_frf.mat'</span>, <span class="org-string">'f'</span>, <span class="org-string">'Ts'</span>, <span class="org-string">'enc_frf'</span>, <span class="org-string">'int_frf'</span>, <span class="org-string">'iff_frf'</span>, <span class="org-string">'leg_nums'</span>);
</pre>
</div>
</div>
<div id="outline-container-orgafe9e23" class="outline-4">
<h4 id="orgafe9e23"><span class="section-number-4">6.2.1</span> Perfectly aligned APA</h4>
<div class="outline-text-4" id="text-6-2-1">
<p>
Let&rsquo;s first consider that the strut is perfectly mounted such that the two flexible joints and the APA are aligned.
</p>
<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">'flexible'</span>);
</pre>
</div>
<p>
And define the inputs and outputs of the models:
</p>
<ul class="org-ul">
<li>Input: voltage generated by the DAC</li>
<li>Output: measured displacement by the encoder</li>
</ul>
<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">'/de'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Encoder</span>
</pre>
</div>
<p>
The transfer function is identified and shown in Figure <a href="#orge4666b7">90</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><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">'de'</span>};
</pre>
</div>
<p>
From Figure <a href="#orge4666b7">90</a>, it is clear that:
</p>
<ol class="org-ol">
<li>The model with perfect alignment is not matching the measured FRF</li>
<li>The mode at 200Hz is not present in the identified dynamics of the Simscape model</li>
<li>The measured FRF have different shapes</li>
</ol>
<div id="orge4666b7" class="figure">
<p><img src="figs/comp_enc_frf_align_perfect.png" alt="comp_enc_frf_align_perfect.png" />
</p>
<p><span class="figure-number">Figure 90: </span>Comparison of the model with a perfectly aligned APA and flexible joints with the measured FRF from actuator to encoder</p>
</div>
<div class="question" id="org8a35a6a">
<p>
Why is the flexible mode of the strut at 200Hz is not seen in the model in Figure <a href="#orge4666b7">90</a>?
</p>
<p>
Probably because the presence of this mode is not due because of the &ldquo;unbalanced&rdquo; mass of the encoder, but rather because of the misalignment of the APA with respect to the two flexible joints.
This will be verified in the next sections.
</p>
</div>
</div>
</div>
<div id="outline-container-org5305829" class="outline-4">
<h4 id="org5305829"><span class="section-number-4">6.2.2</span> Effect of a misalignment in y</h4>
<div class="outline-text-4" id="text-6-2-2">
<p>
Let&rsquo;s compute the transfer function from output DAC voltage \(V_s\) to the measured displacement by the encoder \(d_e\) for several misalignment in the \(y\) direction:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Considered misalignments</span></span>
dy_aligns = [<span class="org-type">-</span>0.5, <span class="org-type">-</span>0.1, 0, 0.1, 0.5]<span class="org-type">*</span>1e<span class="org-type">-</span>3; <span class="org-comment">% [m]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Transfer functions from u to de for all the misalignment in y direction</span></span>
Gs_align = {zeros(length(dy_aligns), 1)};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(dy_aligns)</span>
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'d_align'</span>, [0; dy_aligns(<span class="org-constant">i</span>); 0]);
G = exp(<span class="org-type">-</span>s<span class="org-type">*</span>Ts)<span class="org-type">*</span>linearize(mdl, io, 0.0, options);
G.InputName = {<span class="org-string">'Va'</span>};
G.OutputName = {<span class="org-string">'de'</span>};
Gs_align(<span class="org-constant">i</span>) = {G};
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained dynamics are shown in Figure <a href="#org88f746e">91</a>.
</p>
<div id="org88f746e" class="figure">
<p><img src="figs/effect_misalignment_y.png" alt="effect_misalignment_y.png" />
</p>
<p><span class="figure-number">Figure 91: </span>Effect of a misalignement in the \(y\) direction</p>
</div>
<div class="important" id="org49555c3">
<p>
The alignment of the APA with the flexible joints as a <b>huge</b> influence on the dynamics from actuator voltage to measured displacement by the encoder.
The misalignment in the \(y\) direction mostly influences:
</p>
<ul class="org-ul">
<li>the presence of the flexible mode at 200Hz</li>
<li>the location of the complex conjugate zero between the first two resonances:
<ul class="org-ul">
<li>if \(d_y < 0\): there is no zero between the two resonances and possibly not even between the second and third ones</li>
<li>if \(d_y > 0\): there is a complex conjugate zero between the first two resonances</li>
</ul></li>
<li>the location of the high frequency complex conjugate zeros at 500Hz (secondary effect, as the axial stiffness of the joint also has large effect on the position of this zero)</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-org321a2c2" class="outline-4">
<h4 id="org321a2c2"><span class="section-number-4">6.2.3</span> Effect of a misalignment in x</h4>
<div class="outline-text-4" id="text-6-2-3">
<p>
Let&rsquo;s compute the transfer function from output DAC voltage to the measured displacement by the encoder for several misalignment in the \(x\) direction:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Considered misalignments</span></span>
dx_aligns = [<span class="org-type">-</span>0.1, <span class="org-type">-</span>0.05, 0, 0.05, 0.1]<span class="org-type">*</span>1e<span class="org-type">-</span>3; <span class="org-comment">% [m]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Transfer functions from u to de for all the misalignment in x direction</span></span>
Gs_align = {zeros(length(dx_aligns), 1)};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(dx_aligns)</span>
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'d_align'</span>, [dx_aligns(<span class="org-constant">i</span>); 0; 0]);
G = exp(<span class="org-type">-</span>s<span class="org-type">*</span>Ts)<span class="org-type">*</span>linearize(mdl, io, 0.0, options);
G.InputName = {<span class="org-string">'Va'</span>};
G.OutputName = {<span class="org-string">'de'</span>};
Gs_align(<span class="org-constant">i</span>) = {G};
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained dynamics are shown in Figure <a href="#orgd567dd1">92</a>.
</p>
<div id="orgd567dd1" class="figure">
<p><img src="figs/effect_misalignment_x.png" alt="effect_misalignment_x.png" />
</p>
<p><span class="figure-number">Figure 92: </span>Effect of a misalignement in the \(x\) direction</p>
</div>
<div class="important" id="org9bf91b4">
<p>
The misalignment in the \(x\) direction mostly influences the presence of the flexible mode at 300Hz.
</p>
</div>
</div>
</div>
<div id="outline-container-org7d83225" class="outline-4">
<h4 id="org7d83225"><span class="section-number-4">6.2.4</span> Find the misalignment of each strut</h4>
<div class="outline-text-4" id="text-6-2-4">
<p>
From the previous analysis on the effect of a \(x\) and \(y\) misalignment, it is possible to estimate the \(x,y\) misalignment of the measured struts.
</p>
<p>
The misalignment that gives the best match for the FRF are defined below.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Tuned misalignment [m]</span></span>
d_aligns = [[<span class="org-type">-</span>0.05, <span class="org-type">-</span>0.3, 0];
[ 0, 0.5, 0];
[<span class="org-type">-</span>0.1, <span class="org-type">-</span>0.3, 0];
[ 0, 0.3, 0];
[<span class="org-type">-</span>0.05, 0.05, 0]]<span class="org-type">'*</span>1e<span class="org-type">-</span>3;
</pre>
</div>
<p>
For each misalignment, the dynamics from the DAC voltage to the encoder measurement is identified.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Idenfity the transfer function from actuator to encoder for all cases</span></span>
Gs_align = {zeros(size(d_aligns,2), 1)};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:size(d_aligns,2)</span>
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'d_align'</span>, d_aligns(<span class="org-type">:</span>,<span class="org-constant">i</span>));
G = exp(<span class="org-type">-</span>s<span class="org-type">*</span>Ts)<span class="org-type">*</span>linearize(mdl, io, 0.0, options);
G.InputName = {<span class="org-string">'Va'</span>};
G.OutputName = {<span class="org-string">'de'</span>};
Gs_align(<span class="org-constant">i</span>) = {G};
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The results are shown in Figure <a href="#org99bb9c3">93</a>.
</p>
<div id="org99bb9c3" class="figure">
<p><img src="figs/comp_all_struts_corrected_misalign.png" alt="comp_all_struts_corrected_misalign.png" />
</p>
<p><span class="figure-number">Figure 93: </span>Comparison (model and measurements) of the FRF from DAC voltage u to measured displacement by the encoders for all the struts</p>
</div>
<div class="important" id="org87e4f40">
<p>
By tuning the misalignment of the APA with respect to the flexible joints, it is possible to obtain a good fit between the model and the measurements (Figure <a href="#org99bb9c3">93</a>).
</p>
<p>
If encoders are to be used when fixed on the struts, it is therefore very important to properly align the APA and the flexible joints when mounting the struts.
</p>
<p>
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>
<div id="outline-container-org41a4b7b" class="outline-3">
<h3 id="org41a4b7b"><span class="section-number-3">6.3</span> Effect of flexible joint&rsquo;s stiffness</h3>
<div class="outline-text-3" id="text-6-3">
<p>
<a id="org0019bab"></a>
</p>
<p>
As the struts are composed of one APA and two flexible joints, it is obvious that the flexible joint characteristics will change the dynamic behavior of the struts.
</p>
<p>
Using the Simscape model, the effect of the flexible joint&rsquo;s characteristics on the dynamics as measured on the test bench are studied:
</p>
<ul class="org-ul">
<li>Section <a href="#org9be9694">6.3.1</a>: the effects of a change of bending stiffness is studied</li>
<li>Section <a href="#orgf5102c1">6.3.2</a>: the effects of a change of axial stiffness is studied</li>
<li>Section <a href="#orgf676c79">6.3.3</a>: the effects of a change of bending damping is studied</li>
</ul>
<p>
The studied dynamics is between \(V_a\) and the encoder displacement \(d_e\).
</p>
<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">'/de'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Encoder</span>
</pre>
</div>
</div>
<div id="outline-container-orgfb25dc2" class="outline-4">
<h4 id="orgfb25dc2"><span class="section-number-4">6.3.1</span> Effect of bending stiffness of the flexible joints</h4>
<div class="outline-text-4" id="text-6-3-1">
<p>
<a id="org9be9694"></a>
</p>
<p>
Let&rsquo;s initialize an APA which is a little bit misaligned.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% APA Initialization</span></span>
n_hexapod.actuator = initializeAPA(<span class="org-string">'type'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'d_align'</span>, [0.1e<span class="org-type">-</span>3; 0.5e<span class="org-type">-</span>3; 0]);
</pre>
</div>
<p>
The bending stiffnesses for which the dynamics is identified are defined below.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Tested bending stiffnesses [Nm/rad]</span></span>
kRs = [3, 4, 5, 6, 7];
</pre>
</div>
<p>
Then the identification is performed for all the values of the bending stiffnesses.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Idenfity the transfer function from actuator to encoder for all bending stiffnesses</span></span>
Gs = {zeros(length(kRs), 1)};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(kRs)</span>
n_hexapod.flex_bot = initializeBotFlexibleJoint(...
<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>, ...
<span class="org-string">'kRx'</span>, kRs(<span class="org-constant">i</span>), ...
<span class="org-string">'kRy'</span>, kRs(<span class="org-constant">i</span>));
n_hexapod.flex_top = initializeTopFlexibleJoint(...
<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>, ...
<span class="org-string">'kRx'</span>, kRs(<span class="org-constant">i</span>), ...
<span class="org-string">'kRy'</span>, kRs(<span class="org-constant">i</span>));
G = exp(<span class="org-type">-</span>s<span class="org-type">*</span>Ts)<span class="org-type">*</span>linearize(mdl, io, 0.0, options);
G.InputName = {<span class="org-string">'Va'</span>};
G.OutputName = {<span class="org-string">'de'</span>};
Gs(<span class="org-constant">i</span>) = {G};
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained dynamics from DAC voltage to encoder measurements are compared in Figure <a href="#org47c9d38">94</a>.
</p>
<div id="org47c9d38" class="figure">
<p><img src="figs/effect_enc_bending_stiff.png" alt="effect_enc_bending_stiff.png" />
</p>
<p><span class="figure-number">Figure 94: </span>Dynamics from DAC output to encoder for several bending stiffnesses</p>
</div>
<div class="important" id="org5564964">
<p>
The bending stiffness of the joints has little impact on the transfer function from \(V_a\) to \(d_e\).
</p>
</div>
</div>
</div>
<div id="outline-container-org85988d8" class="outline-4">
<h4 id="org85988d8"><span class="section-number-4">6.3.2</span> Effect of axial stiffness of the flexible joints</h4>
<div class="outline-text-4" id="text-6-3-2">
<p>
<a id="orgf5102c1"></a>
</p>
<p>
The axial stiffnesses for which the dynamics is identified are defined below.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Tested axial stiffnesses [N/m]</span></span>
kzs = [5e7 7.5e7 1e8 2.5e8];
</pre>
</div>
<p>
Then the identification is performed for all the values of the bending stiffnesses.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Idenfity the transfer function from actuator to encoder for all bending stiffnesses</span></span>
Gs = {zeros(length(kzs), 1)};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(kzs)</span>
n_hexapod.flex_bot = initializeBotFlexibleJoint(...
<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>, ...
<span class="org-string">'kz'</span>, kzs(<span class="org-constant">i</span>));
n_hexapod.flex_top = initializeTopFlexibleJoint(...
<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>, ...
<span class="org-string">'kz'</span>, kzs(<span class="org-constant">i</span>));
G = exp(<span class="org-type">-</span>s<span class="org-type">*</span>Ts)<span class="org-type">*</span>linearize(mdl, io, 0.0, options);
G.InputName = {<span class="org-string">'Va'</span>};
G.OutputName = {<span class="org-string">'de'</span>};
Gs(<span class="org-constant">i</span>) = {G};
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The obtained dynamics from DAC voltage to encoder measurements are compared in Figure <a href="#org1293c59">95</a>.
</p>
<div id="org1293c59" class="figure">
<p><img src="figs/effect_enc_axial_stiff.png" alt="effect_enc_axial_stiff.png" />
</p>
<p><span class="figure-number">Figure 95: </span>Dynamics from DAC output to encoder for several axial stiffnesses</p>
</div>
<div class="important" id="orga9ff666">
<p>
The axial stiffness of the flexible joint has a large impact on the frequency of the complex conjugate zero.
Using the measured FRF on the test-bench, if is therefore possible to estimate the axial stiffness of the flexible joints from the location of the zero.
</p>
<p>
This method gives nice match between the measured FRF and the one extracted from the simscape model, however it could give not so accurate values of the joint&rsquo;s axial stiffness as other factors are also influencing the location of the zero.
</p>
<p>
Using this method, an axial stiffness of \(70 N/\mu m\) is found to give good results (and is reasonable based on the finite element models).
</p>
</div>
</div>
</div>
<div id="outline-container-org8da2e09" class="outline-4">
<h4 id="org8da2e09"><span class="section-number-4">6.3.3</span> Effect of bending damping</h4>
<div class="outline-text-4" id="text-6-3-3">
<p>
<a id="orgf676c79"></a>
Now let&rsquo;s study the effect of the bending damping of the flexible joints.
</p>
<p>
The tested bending damping are defined below:
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Tested bending dampings [Nm/(rad/s)]</span></span>
cRs = [1e<span class="org-type">-</span>3, 5e<span class="org-type">-</span>3, 1e<span class="org-type">-</span>2, 5e<span class="org-type">-</span>2, 1e<span class="org-type">-</span>1];
</pre>
</div>
<p>
Then the identification is performed for all the values of the bending damping.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Idenfity the transfer function from actuator to encoder for all bending dampins</span></span>
Gs = {zeros(length(kRs), 1)};
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(kRs)</span>
n_hexapod.flex_bot = initializeBotFlexibleJoint(...
<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>, ...
<span class="org-string">'cRx'</span>, cRs(<span class="org-constant">i</span>), ...
<span class="org-string">'cRy'</span>, cRs(<span class="org-constant">i</span>));
n_hexapod.flex_top = initializeTopFlexibleJoint(...
<span class="org-string">'type'</span>, <span class="org-string">'4dof'</span>, ...
<span class="org-string">'cRx'</span>, cRs(<span class="org-constant">i</span>), ...
<span class="org-string">'cRy'</span>, cRs(<span class="org-constant">i</span>));
G = exp(<span class="org-type">-</span>s<span class="org-type">*</span>Ts)<span class="org-type">*</span>linearize(mdl, io, 0.0, options);
G.InputName = {<span class="org-string">'Va'</span>};
G.OutputName = {<span class="org-string">'de'</span>};
Gs(<span class="org-constant">i</span>) = {G};
<span class="org-keyword">end</span>
</pre>
</div>
<p>
The results are shown in Figure <a href="#org6db8497">96</a>.
</p>
<div id="org6db8497" class="figure">
<p><img src="figs/effect_enc_bending_damp.png" alt="effect_enc_bending_damp.png" />
</p>
<p><span class="figure-number">Figure 96: </span>Dynamics from DAC output to encoder for several bending damping</p>
</div>
<div class="important" id="orgf41156a">
<p>
Adding damping in bending for the flexible joints could be a nice way to reduce the effects of the spurious resonances of the struts.
</p>
</div>
<div class="question" id="org3ddb7ec">
<p>
How to effectively add damping to the flexible joints?
</p>
<p>
One idea would be to introduce a sheet of damping material inside the flexible joint.
Not sure is would be effect though.
</p>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-orge9a1b7a" class="outline-2">
<h2 id="orge9a1b7a"><span class="section-number-2">7</span> Function</h2>
<div class="outline-text-2" id="text-7">
<p>
<a id="org7fdf7d5"></a>
</p>
</div>
<div id="outline-container-org9c626c3" class="outline-3">
<h3 id="org9c626c3"><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="org1064cce"></a>
</p>
</div>
<div id="outline-container-orgcfa95b6" class="outline-4">
<h4 id="orgcfa95b6">Function description</h4>
<div class="outline-text-4" id="text-orgcfa95b6">
<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-org444afff" class="outline-4">
<h4 id="org444afff">Optional Parameters</h4>
<div class="outline-text-4" id="text-org444afff">
<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>7e7
<span class="org-variable-name">args</span>.cRx (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.001
<span class="org-variable-name">args</span>.cRy (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.001
<span class="org-variable-name">args</span>.cRz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.001
<span class="org-variable-name">args</span>.cz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.001
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org29faf0b" class="outline-4">
<h4 id="org29faf0b">Initialize the structure</h4>
<div class="outline-text-4" id="text-org29faf0b">
<div class="org-src-container">
<pre class="src src-matlab">flex_bot = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org7132f76" class="outline-4">
<h4 id="org7132f76">Set the Joint&rsquo;s type</h4>
<div class="outline-text-4" id="text-org7132f76">
<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-orgc6ad76b" class="outline-4">
<h4 id="orgc6ad76b">Set parameters</h4>
<div class="outline-text-4" id="text-orgc6ad76b">
<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-orga3944eb" class="outline-3">
<h3 id="orga3944eb"><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="orga2e7002"></a>
</p>
</div>
<div id="outline-container-orgdafbe7f" class="outline-4">
<h4 id="orgdafbe7f">Function description</h4>
<div class="outline-text-4" id="text-orgdafbe7f">
<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-org09a9f39" class="outline-4">
<h4 id="org09a9f39">Optional Parameters</h4>
<div class="outline-text-4" id="text-org09a9f39">
<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>7e7
<span class="org-variable-name">args</span>.cRx (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.001
<span class="org-variable-name">args</span>.cRy (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.001
<span class="org-variable-name">args</span>.cRz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.001
<span class="org-variable-name">args</span>.cz (6,1) double {mustBeNumeric, mustBePositive} = ones(6,1)<span class="org-type">*</span>0.001
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgcd65ce5" class="outline-4">
<h4 id="orgcd65ce5">Initialize the structure</h4>
<div class="outline-text-4" id="text-orgcd65ce5">
<div class="org-src-container">
<pre class="src src-matlab">flex_top = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf9a1697" class="outline-4">
<h4 id="orgf9a1697">Set the Joint&rsquo;s type</h4>
<div class="outline-text-4" id="text-orgf9a1697">
<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-org2b181ab" class="outline-4">
<h4 id="org2b181ab">Set parameters</h4>
<div class="outline-text-4" id="text-org2b181ab">
<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-orgc8bf923" class="outline-3">
<h3 id="orgc8bf923"><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="org9b48ea6"></a>
</p>
</div>
<div id="outline-container-org5beabbf" class="outline-4">
<h4 id="org5beabbf">Function description</h4>
<div class="outline-text-4" id="text-org5beabbf">
<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-org33f75b4" class="outline-4">
<h4 id="org33f75b4">Optional Parameters</h4>
<div class="outline-text-4" id="text-org33f75b4">
<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-comment">% Actuator and Sensor constants</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.01
<span class="org-variable-name">args</span>.d_align (3,1) double {mustBeNumeric} = zeros(3,1) <span class="org-comment">% [m]</span>
<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-org9abcbe5" class="outline-4">
<h4 id="org9abcbe5">Initialize Structure</h4>
<div class="outline-text-4" id="text-org9abcbe5">
<div class="org-src-container">
<pre class="src src-matlab">actuator = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org46d3bf7" class="outline-4">
<h4 id="org46d3bf7">Type</h4>
<div class="outline-text-4" id="text-org46d3bf7">
<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-org6179f95" class="outline-4">
<h4 id="org6179f95">Actuator/Sensor Constants</h4>
<div class="outline-text-4" id="text-org6179f95">
<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-org43090e9" class="outline-4">
<h4 id="org43090e9">2DoF parameters</h4>
<div class="outline-text-4" id="text-org43090e9">
<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-org35c0df5" class="outline-4">
<h4 id="org35c0df5">Flexible frame and fully flexible</h4>
<div class="outline-text-4" id="text-org35c0df5">
<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>
actuator.d_align = args.d_align;
<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-org64d97f9" class="outline-3">
<h3 id="org64d97f9"><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="org30cfb34"></a>
</p>
</div>
<div id="outline-container-orgf3de67c" class="outline-4">
<h4 id="orgf3de67c">Function description</h4>
<div class="outline-text-4" id="text-orgf3de67c">
<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-orgc4503a2" class="outline-4">
<h4 id="orgc4503a2">Optional Parameters</h4>
<div class="outline-text-4" id="text-orgc4503a2">
<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-org60674bb" class="outline-4">
<h4 id="org60674bb">Sweep Sine part</h4>
<div class="outline-text-4" id="text-org60674bb">
<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-orge154095" class="outline-4">
<h4 id="orge154095">Smooth Ends</h4>
<div class="outline-text-4" id="text-orge154095">
<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-org4ac212d" class="outline-4">
<h4 id="org4ac212d">Combine Excitation signals</h4>
<div class="outline-text-4" id="text-org4ac212d">
<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-orgfa4d784" class="outline-3">
<h3 id="orgfa4d784"><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="org7781348"></a>
</p>
</div>
<div id="outline-container-orgaf0e6a4" class="outline-4">
<h4 id="orgaf0e6a4">Function description</h4>
<div class="outline-text-4" id="text-orgaf0e6a4">
<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-orgba46446" class="outline-4">
<h4 id="orgba46446">Optional Parameters</h4>
<div class="outline-text-4" id="text-orgba46446">
<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-org775e5b0" class="outline-4">
<h4 id="org775e5b0">Shaped Noise</h4>
<div class="outline-text-4" id="text-org775e5b0">
<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-orgbe14828" class="outline-4">
<h4 id="orgbe14828">Smooth Ends</h4>
<div class="outline-text-4" id="text-orgbe14828">
<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-org300b9ed" class="outline-4">
<h4 id="org300b9ed">Combine Excitation signals</h4>
<div class="outline-text-4" id="text-org300b9ed">
<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-orgbb76802" class="outline-3">
<h3 id="orgbb76802"><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="org18dfbab"></a>
</p>
</div>
<div id="outline-container-orgbcff655" class="outline-4">
<h4 id="orgbcff655">Function description</h4>
<div class="outline-text-4" id="text-orgbcff655">
<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-orgdd5692f" class="outline-4">
<h4 id="orgdd5692f">Optional Parameters</h4>
<div class="outline-text-4" id="text-orgdd5692f">
<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-org6bb7030" class="outline-4">
<h4 id="org6bb7030">Sinus excitation</h4>
<div class="outline-text-4" id="text-org6bb7030">
<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-org3c57b4b" class="outline-4">
<h4 id="org3c57b4b">Smooth Ends</h4>
<div class="outline-text-4" id="text-org3c57b4b">
<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-org512d985" class="outline-4">
<h4 id="org512d985">Combine Excitation signals</h4>
<div class="outline-text-4" id="text-org512d985">
<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-17 jeu. 23:20</p>
</div>
</body>
</html>