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