Compare commits

..

No commits in common. "8e95886e68254f7c55406c67a28fb79eedd9b191" and "21cd0b1471e12a7a9c7fab19f02f467912b88f58" have entirely different histories.

12 changed files with 164 additions and 3497 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2020-08-20 jeu. 23:08 -->
<!-- 2020-07-24 ven. 15:48 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Test Bench APA95ML</title>
<meta name="generator" content="Org mode" />
@ -27,49 +27,42 @@
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgd70d66f">1. Setup</a>
<li><a href="#orgde2ca90">1. Setup</a>
<ul>
<li><a href="#org07d3c47">1.1. Parameters</a></li>
<li><a href="#orgbd4b8f3">1.2. Filter White Noise</a></li>
<li><a href="#orgc62d598">1.1. Parameters</a></li>
<li><a href="#org128d329">1.2. Filter White Noise</a></li>
</ul>
</li>
<li><a href="#orgebffd67">2. Run Experiment and Save Data</a>
<li><a href="#orga229608">2. Run Experiment and Save Data</a>
<ul>
<li><a href="#org9db9f37">2.1. Load Data</a></li>
<li><a href="#org5b3c786">2.2. Save Data</a></li>
<li><a href="#org117998a">2.1. Load Data</a></li>
<li><a href="#org0aec1ce">2.2. Save Data</a></li>
</ul>
</li>
<li><a href="#orge25b163">3. Huddle Test</a>
<li><a href="#orge436fe5">3. Huddle Test</a>
<ul>
<li><a href="#orgbc09977">3.1. Time Domain Data</a></li>
<li><a href="#org7e6bc47">3.2. PSD of Measurement Noise</a></li>
<li><a href="#orga50e600">3.1. Time Domain Data</a></li>
<li><a href="#org6637acb">3.2. PSD of Measurement Noise</a></li>
</ul>
</li>
<li><a href="#org0348c7c">4. Transfer Function Estimation using the DAC as the driver</a>
<li><a href="#org1e70b14">4. Transfer Function Estimation using the DAC as the driver</a>
<ul>
<li><a href="#orgf0f7314">4.1. Time Domain Data</a></li>
<li><a href="#orge50aef7">4.2. Comparison of the PSD with Huddle Test</a></li>
<li><a href="#org870e2ef">4.3. Compute TF estimate and Coherence</a></li>
<li><a href="#orgb06d21d">4.4. Comparison with the FEM model</a></li>
<li><a href="#org627cdd4">4.1. Time Domain Data</a></li>
<li><a href="#orgb2e3ad4">4.2. Comparison of the PSD with Huddle Test</a></li>
<li><a href="#orgd81c13d">4.3. Compute TF estimate and Coherence</a></li>
<li><a href="#org7b450ca">4.4. Comparison with the FEM model</a></li>
</ul>
</li>
<li><a href="#org563fed9">5. Transfer Function Estimation using the PI Amplifier</a>
<li><a href="#orgf7b3cee">5. Transfer Function Estimation using the PI Amplifier</a>
<ul>
<li><a href="#org9c121df">5.1. Load Data</a></li>
<li><a href="#org990c144">5.2. Comparison of the PSD with Huddle Test</a></li>
<li><a href="#org323b9c5">5.3. Compute TF estimate and Coherence</a></li>
<li><a href="#org6045724">5.4. Comparison with the FEM model</a></li>
<li><a href="#orgd96ab97">5.1. Comparison of the PSD with Huddle Test</a></li>
<li><a href="#orgf49c967">5.2. Compute TF estimate and Coherence</a></li>
<li><a href="#orgeb00ff9">5.3. Comparison with the FEM model</a></li>
</ul>
</li>
<li><a href="#org5ef5f65">6. Transfer function from force actuator to force sensor</a>
<li><a href="#org0baf7a6">6. Transfer function of the PI Amplifier</a>
<ul>
<li><a href="#org098bbb0">6.1. System Identification</a></li>
<li><a href="#orge0e4f46">6.2. Integral Force Feedback</a></li>
</ul>
</li>
<li><a href="#org102cc6a">7. IFF Tests</a>
<ul>
<li><a href="#org9e16daf">7.1. Load Data</a></li>
<li><a href="#org94a6d47">6.1. Compute TF estimate and Coherence</a></li>
</ul>
</li>
</ul>
@ -77,26 +70,26 @@
</div>
<div id="org5c42466" class="figure">
<div id="orgfac2673" class="figure">
<p><img src="figs/setup_picture.png" alt="setup_picture.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Picture of the Setup</p>
</div>
<div id="orgc98a0fb" class="figure">
<div id="orgd8fb946" class="figure">
<p><img src="figs/setup_zoom.png" alt="setup_zoom.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Zoom on the APA</p>
</div>
<div id="outline-container-orgd70d66f" class="outline-2">
<h2 id="orgd70d66f"><span class="section-number-2">1</span> Setup</h2>
<div id="outline-container-orgde2ca90" class="outline-2">
<h2 id="orgde2ca90"><span class="section-number-2">1</span> Setup</h2>
<div class="outline-text-2" id="text-1">
</div>
<div id="outline-container-org07d3c47" class="outline-3">
<h3 id="org07d3c47"><span class="section-number-3">1.1</span> Parameters</h3>
<div id="outline-container-orgc62d598" class="outline-3">
<h3 id="orgc62d598"><span class="section-number-3">1.1</span> Parameters</h3>
<div class="outline-text-3" id="text-1-1">
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e-4;
@ -105,8 +98,8 @@
</div>
</div>
<div id="outline-container-orgbd4b8f3" class="outline-3">
<h3 id="orgbd4b8f3"><span class="section-number-3">1.2</span> Filter White Noise</h3>
<div id="outline-container-org128d329" class="outline-3">
<h3 id="org128d329"><span class="section-number-3">1.2</span> Filter White Noise</h3>
<div class="outline-text-3" id="text-1-2">
<div class="org-src-container">
<pre class="src src-matlab">Glpf = 1/(1 + s/2/pi/500);
@ -118,13 +111,13 @@ Gz = c2d(Glpf, Ts, 'tustin');
</div>
</div>
<div id="outline-container-orgebffd67" class="outline-2">
<h2 id="orgebffd67"><span class="section-number-2">2</span> Run Experiment and Save Data</h2>
<div id="outline-container-orga229608" class="outline-2">
<h2 id="orga229608"><span class="section-number-2">2</span> Run Experiment and Save Data</h2>
<div class="outline-text-2" id="text-2">
</div>
<div id="outline-container-org9db9f37" class="outline-3">
<h3 id="org9db9f37"><span class="section-number-3">2.1</span> Load Data</h3>
<div id="outline-container-org117998a" class="outline-3">
<h3 id="org117998a"><span class="section-number-3">2.1</span> Load Data</h3>
<div class="outline-text-3" id="text-2-1">
<div class="org-src-container">
<pre class="src src-matlab">data = SimulinkRealTime.utils.getFileScopeData('data/apa95ml.dat').data;
@ -133,8 +126,8 @@ Gz = c2d(Glpf, Ts, 'tustin');
</div>
</div>
<div id="outline-container-org5b3c786" class="outline-3">
<h3 id="org5b3c786"><span class="section-number-3">2.2</span> Save Data</h3>
<div id="outline-container-org0aec1ce" class="outline-3">
<h3 id="org0aec1ce"><span class="section-number-3">2.2</span> Save Data</h3>
<div class="outline-text-3" id="text-2-2">
<div class="org-src-container">
<pre class="src src-matlab">u = data(:, 1); % Input Voltage [V]
@ -151,16 +144,16 @@ t = data(:, 3); % Time [s]
</div>
</div>
<div id="outline-container-orge25b163" class="outline-2">
<h2 id="orge25b163"><span class="section-number-2">3</span> Huddle Test</h2>
<div id="outline-container-orge436fe5" class="outline-2">
<h2 id="orge436fe5"><span class="section-number-2">3</span> Huddle Test</h2>
<div class="outline-text-2" id="text-3">
</div>
<div id="outline-container-orgbc09977" class="outline-3">
<h3 id="orgbc09977"><span class="section-number-3">3.1</span> Time Domain Data</h3>
<div id="outline-container-orga50e600" class="outline-3">
<h3 id="orga50e600"><span class="section-number-3">3.1</span> Time Domain Data</h3>
<div class="outline-text-3" id="text-3-1">
<div id="orgfbf5913" class="figure">
<div id="org9f3cece" class="figure">
<p><img src="figs/huddle_test_time_domain.png" alt="huddle_test_time_domain.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Measurement of the Mass displacement during Huddle Test</p>
@ -168,8 +161,8 @@ t = data(:, 3); % Time [s]
</div>
</div>
<div id="outline-container-org7e6bc47" class="outline-3">
<h3 id="org7e6bc47"><span class="section-number-3">3.2</span> PSD of Measurement Noise</h3>
<div id="outline-container-org6637acb" class="outline-3">
<h3 id="org6637acb"><span class="section-number-3">3.2</span> PSD of Measurement Noise</h3>
<div class="outline-text-3" id="text-3-2">
<div class="org-src-container">
<pre class="src src-matlab">Ts = t(end)/(length(t)-1);
@ -185,7 +178,7 @@ win = hanning(ceil(1*Fs));
</div>
<div id="orgaf72ca6" class="figure">
<div id="org53e3466" class="figure">
<p><img src="figs/huddle_test_pdf.png" alt="huddle_test_pdf.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Amplitude Spectral Density of the Displacement during Huddle Test</p>
@ -194,22 +187,16 @@ win = hanning(ceil(1*Fs));
</div>
</div>
<div id="outline-container-org0348c7c" class="outline-2">
<h2 id="org0348c7c"><span class="section-number-2">4</span> Transfer Function Estimation using the DAC as the driver</h2>
<div id="outline-container-org1e70b14" class="outline-2">
<h2 id="org1e70b14"><span class="section-number-2">4</span> Transfer Function Estimation using the DAC as the driver</h2>
<div class="outline-text-2" id="text-4">
<div class="important">
<p>
Results presented in this sections are wrong as the ADC cannot deliver enought current to the piezoelectric actuator.
</p>
</div>
</div>
<div id="outline-container-orgf0f7314" class="outline-3">
<h3 id="orgf0f7314"><span class="section-number-3">4.1</span> Time Domain Data</h3>
<div id="outline-container-org627cdd4" class="outline-3">
<h3 id="org627cdd4"><span class="section-number-3">4.1</span> Time Domain Data</h3>
<div class="outline-text-3" id="text-4-1">
<div id="org60f734d" class="figure">
<div id="orga0b06b8" class="figure">
<p><img src="figs/apa95ml_5kg_10V_time_domain.png" alt="apa95ml_5kg_10V_time_domain.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Time domain signals during the test</p>
@ -217,8 +204,8 @@ Results presented in this sections are wrong as the ADC cannot deliver enought c
</div>
</div>
<div id="outline-container-orge50aef7" class="outline-3">
<h3 id="orge50aef7"><span class="section-number-3">4.2</span> Comparison of the PSD with Huddle Test</h3>
<div id="outline-container-orgb2e3ad4" class="outline-3">
<h3 id="orgb2e3ad4"><span class="section-number-3">4.2</span> Comparison of the PSD with Huddle Test</h3>
<div class="outline-text-3" id="text-4-2">
<div class="org-src-container">
<pre class="src src-matlab">Ts = t(end)/(length(t)-1);
@ -235,7 +222,7 @@ win = hanning(ceil(1*Fs));
</div>
<div id="orga45d905" class="figure">
<div id="org8170f8d" class="figure">
<p><img src="figs/apa95ml_5kg_10V_pdf_comp_huddle.png" alt="apa95ml_5kg_10V_pdf_comp_huddle.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Comparison of the ASD for the identification test and the huddle test</p>
@ -243,8 +230,8 @@ win = hanning(ceil(1*Fs));
</div>
</div>
<div id="outline-container-org870e2ef" class="outline-3">
<h3 id="org870e2ef"><span class="section-number-3">4.3</span> Compute TF estimate and Coherence</h3>
<div id="outline-container-orgd81c13d" class="outline-3">
<h3 id="orgd81c13d"><span class="section-number-3">4.3</span> Compute TF estimate and Coherence</h3>
<div class="outline-text-3" id="text-4-3">
<div class="org-src-container">
<pre class="src src-matlab">Ts = t(end)/(length(t)-1);
@ -261,14 +248,14 @@ Fs = 1/Ts;
</div>
<div id="org6abff24" class="figure">
<div id="orgb44ea20" class="figure">
<p><img src="figs/apa95ml_5kg_10V_coh.png" alt="apa95ml_5kg_10V_coh.png" />
</p>
<p><span class="figure-number">Figure 7: </span>Coherence</p>
</div>
<div id="org8e6794a" class="figure">
<div id="org0f7463c" class="figure">
<p><img src="figs/apa95ml_5kg_10V_tf.png" alt="apa95ml_5kg_10V_tf.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Estimation of the transfer function from input voltage to displacement</p>
@ -276,8 +263,8 @@ Fs = 1/Ts;
</div>
</div>
<div id="outline-container-orgb06d21d" class="outline-3">
<h3 id="orgb06d21d"><span class="section-number-3">4.4</span> Comparison with the FEM model</h3>
<div id="outline-container-org7b450ca" class="outline-3">
<h3 id="org7b450ca"><span class="section-number-3">4.4</span> Comparison with the FEM model</h3>
<div class="outline-text-3" id="text-4-4">
<div class="org-src-container">
<pre class="src src-matlab">load('mat/fem_model_5kg.mat', 'Ghm');
@ -285,7 +272,7 @@ Fs = 1/Ts;
</div>
<div id="org4563de9" class="figure">
<div id="orgbdfdc24" class="figure">
<p><img src="figs/apa95ml_5kg_comp_fem.png" alt="apa95ml_5kg_comp_fem.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Comparison of the identified transfer function and the one estimated from the FE model</p>
@ -304,35 +291,14 @@ In the next section, a current amplifier is used.
</div>
</div>
<div id="outline-container-org563fed9" class="outline-2">
<h2 id="org563fed9"><span class="section-number-2">5</span> Transfer Function Estimation using the PI Amplifier</h2>
<div id="outline-container-orgf7b3cee" class="outline-2">
<h2 id="orgf7b3cee"><span class="section-number-2">5</span> Transfer Function Estimation using the PI Amplifier</h2>
<div class="outline-text-2" id="text-5">
</div>
<div id="outline-container-org9c121df" class="outline-3">
<h3 id="org9c121df"><span class="section-number-3">5.1</span> Load Data</h3>
<div id="outline-container-orgd96ab97" class="outline-3">
<h3 id="orgd96ab97"><span class="section-number-3">5.1</span> Comparison of the PSD with Huddle Test</h3>
<div class="outline-text-3" id="text-5-1">
<div class="org-src-container">
<pre class="src src-matlab">ht = load('./mat/huddle_test.mat', 't', 'u', 'y');
load('./mat/apa95ml_5kg_Amp_E505.mat', 't', 'u', 'um', 'y');
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">u = 10*(u - mean(u)); % Input Voltage of Piezo [V]
um = 10*(um - mean(um)); % Monitor [V]
y = y - mean(y); % Mass displacement [m]
ht.u = 10*(ht.u - mean(ht.u));
ht.y = ht.y - mean(ht.y);
</pre>
</div>
</div>
</div>
<div id="outline-container-org990c144" class="outline-3">
<h3 id="org990c144"><span class="section-number-3">5.2</span> Comparison of the PSD with Huddle Test</h3>
<div class="outline-text-3" id="text-5-2">
<div class="org-src-container">
<pre class="src src-matlab">Ts = t(end)/(length(t)-1);
Fs = 1/Ts;
@ -347,7 +313,7 @@ win = hanning(ceil(1*Fs));
</div>
<div id="orgf6222d7" class="figure">
<div id="orgbc7a9a7" class="figure">
<p><img src="figs/apa95ml_5kg_PI_pdf_comp_huddle.png" alt="apa95ml_5kg_PI_pdf_comp_huddle.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Comparison of the ASD for the identification test and the huddle test</p>
@ -355,9 +321,9 @@ win = hanning(ceil(1*Fs));
</div>
</div>
<div id="outline-container-org323b9c5" class="outline-3">
<h3 id="org323b9c5"><span class="section-number-3">5.3</span> Compute TF estimate and Coherence</h3>
<div class="outline-text-3" id="text-5-3">
<div id="outline-container-orgf49c967" class="outline-3">
<h3 id="orgf49c967"><span class="section-number-3">5.2</span> Compute TF estimate and Coherence</h3>
<div class="outline-text-3" id="text-5-2">
<div class="org-src-container">
<pre class="src src-matlab">Ts = t(end)/(length(t)-1);
Fs = 1/Ts;
@ -374,14 +340,14 @@ Fs = 1/Ts;
</div>
<div id="org751008e" class="figure">
<div id="org883cf4f" class="figure">
<p><img src="figs/apa95ml_5kg_PI_coh.png" alt="apa95ml_5kg_PI_coh.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Coherence</p>
</div>
<div id="orgaed957e" class="figure">
<div id="orgefbbeeb" class="figure">
<p><img src="figs/apa95ml_5kg_PI_tf.png" alt="apa95ml_5kg_PI_tf.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Estimation of the transfer function from input voltage to displacement</p>
@ -389,16 +355,16 @@ Fs = 1/Ts;
</div>
</div>
<div id="outline-container-org6045724" class="outline-3">
<h3 id="org6045724"><span class="section-number-3">5.4</span> Comparison with the FEM model</h3>
<div class="outline-text-3" id="text-5-4">
<div id="outline-container-orgeb00ff9" class="outline-3">
<h3 id="orgeb00ff9"><span class="section-number-3">5.3</span> Comparison with the FEM model</h3>
<div class="outline-text-3" id="text-5-3">
<div class="org-src-container">
<pre class="src src-matlab">load('mat/fem_model_5kg.mat', 'G');
<pre class="src src-matlab">load('mat/fem_model_5kg.mat', 'Ghm');
</pre>
</div>
<div id="org693de8c" class="figure">
<div id="orgfd1fd2d" class="figure">
<p><img src="figs/apa95ml_5kg_pi_comp_fem.png" alt="apa95ml_5kg_pi_comp_fem.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Comparison of the identified transfer function and the one estimated from the FE model</p>
@ -406,207 +372,76 @@ Fs = 1/Ts;
</div>
</div>
</div>
<div id="outline-container-org5ef5f65" class="outline-2">
<h2 id="org5ef5f65"><span class="section-number-2">6</span> Transfer function from force actuator to force sensor</h2>
<div id="outline-container-org0baf7a6" class="outline-2">
<h2 id="org0baf7a6"><span class="section-number-2">6</span> Transfer function of the PI Amplifier</h2>
<div class="outline-text-2" id="text-6">
<p>
Two measurements are performed:
</p>
<ul class="org-ul">
<li>Speedgoat DAC =&gt; Voltage Amplifier (x20) =&gt; 1 Piezo Stack =&gt; &#x2026; =&gt; 2 Stacks as Force Sensor (parallel) =&gt; Speedgoat ADC</li>
<li>Speedgoat DAC =&gt; Voltage Amplifier (x20) =&gt; 2 Piezo Stacks (parallel) =&gt; &#x2026; =&gt; 1 Stack as Force Sensor =&gt; Speedgoat ADC</li>
</ul>
<p>
The obtained dynamics from force actuator to force sensor are compare with the FEM model.
</p>
<p>
The data are loaded:
</p>
<div class="org-src-container">
<pre class="src src-matlab">a_ss = load('mat/apa95ml_5kg_1a_2s.mat', 't', 'u', 'y', 'v');
aa_s = load('mat/apa95ml_5kg_2a_1s.mat', 't', 'u', 'y', 'v');
load('mat/G_force_sensor_5kg.mat', 'G');
</pre>
</div>
<p>
Let&rsquo;s use the amplifier gain to obtain the true voltage applied to the actuator stack(s)
</p>
<p>
The parameters of the piezoelectric stacks are defined below:
</p>
<div class="org-src-container">
<pre class="src src-matlab">d33 = 3e-10; % Strain constant [m/V]
n = 80; % Number of layers per stack
eT = 1.6e-8; % Permittivity under constant stress [F/m]
sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
ka = 235e6; % Stack stiffness [N/m]
</pre>
</div>
<p>
From the FEM, we construct the transfer function from DAC voltage to ADC voltage.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gfem_aa_s = exp(-s/1e4)*20*(2*d33*n*ka)*(G(3,1)+G(3,2))*d33/(eT*sD*n);
Gfem_a_ss = exp(-s/1e4)*20*( d33*n*ka)*(G(3,1)+G(2,1))*d33/(eT*sD*n);
</pre>
</div>
<p>
The transfer function from input voltage to output voltage are computed and shown in Figure <a href="#orge80e7b7">14</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Ts = a_ss.t(end)/(length(a_ss.t)-1);
Fs = 1/Ts;
win = hann(ceil(10/Ts));
[tf_a_ss, f] = tfestimate(a_ss.u, a_ss.v, win, [], [], 1/Ts);
[coh_a_ss, ~] = mscohere( a_ss.u, a_ss.v, win, [], [], 1/Ts);
[tf_aa_s, f] = tfestimate(aa_s.u, aa_s.v, win, [], [], 1/Ts);
[coh_aa_s, ~] = mscohere( aa_s.u, aa_s.v, win, [], [], 1/Ts);
</pre>
</div>
<div id="orge80e7b7" class="figure">
<p><img src="figs/bode_plot_force_sensor_voltage_comp_fem.png" alt="bode_plot_force_sensor_voltage_comp_fem.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Comparison of the identified dynamics from voltage output to voltage input and the FEM</p>
</div>
</div>
<div id="outline-container-org098bbb0" class="outline-3">
<h3 id="org098bbb0"><span class="section-number-3">6.1</span> System Identification</h3>
<div id="outline-container-org94a6d47" class="outline-3">
<h3 id="org94a6d47"><span class="section-number-3">6.1</span> Compute TF estimate and Coherence</h3>
<div class="outline-text-3" id="text-6-1">
<div class="org-src-container">
<pre class="src src-matlab">w_z = 2*pi*111; % Zeros frequency [rad/s]
w_p = 2*pi*255; % Pole frequency [rad/s]
xi_z = 0.05;
xi_p = 0.015;
G_inf = 2;
Gi = G_inf*(s^2 - 2*xi_z*w_z*s + w_z^2)/(s^2 + 2*xi_p*w_p*s + w_p^2);
<pre class="src src-matlab">Ts = t(end)/(length(t)-1);
Fs = 1/Ts;
</pre>
</div>
<div id="org76af419" class="figure">
<p><img src="figs/iff_plant_identification_apa95ml.png" alt="iff_plant_identification_apa95ml.png" />
<p>
The coherence and the transfer function are estimate from the voltage input of the PI amplifier to its voltage inputs.
</p>
<p><span class="figure-number">Figure 15: </span>Identification of the IFF plant</p>
</div>
</div>
</div>
<div id="outline-container-orge0e4f46" class="outline-3">
<h3 id="orge0e4f46"><span class="section-number-3">6.2</span> Integral Force Feedback</h3>
<div class="outline-text-3" id="text-6-2">
<div id="org114ceb2" class="figure">
<p><img src="figs/root_locus_iff_apa95ml_identification.png" alt="root_locus_iff_apa95ml_identification.png" />
<p>
The coherence is very good as expected (Figure <a href="#org12654c2">14</a>).
</p>
<p><span class="figure-number">Figure 16: </span>Root Locus for IFF</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org102cc6a" class="outline-2">
<h2 id="org102cc6a"><span class="section-number-2">7</span> IFF Tests</h2>
<div class="outline-text-2" id="text-7">
</div>
<div id="outline-container-org9e16daf" class="outline-3">
<h3 id="org9e16daf"><span class="section-number-3">7.1</span> Load Data</h3>
<div class="outline-text-3" id="text-7-1">
<div class="org-src-container">
<pre class="src src-matlab">iff_g10 = load('./mat/apa95ml_iff_g10_res.mat', 'u', 't', 'y', 'v');
iff_g100 = load('./mat/apa95ml_iff_g100_res.mat', 'u', 't', 'y', 'v');
iff_of = load('./mat/apa95ml_iff_off_res.mat', 'u', 't', 'y', 'v');
</pre>
</div>
<p>
The transfer function show a low pass filter behavior with a lot of phase drop (Figure <a href="#org23ba982">15</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e-4;
win = hann(ceil(10/Ts));
<pre class="src src-matlab">win = hann(ceil(10/Ts));
[tf_iff_g10, f] = tfestimate(iff_g10.u, iff_g10.y, win, [], [], 1/Ts);
[co_iff_g10, ~] = mscohere(iff_g10.u, iff_g10.y, win, [], [], 1/Ts);
[tf_iff_g100, f] = tfestimate(iff_g100.u, iff_g100.y, win, [], [], 1/Ts);
[co_iff_g100, ~] = mscohere(iff_g100.u, iff_g100.y, win, [], [], 1/Ts);
[tf_iff_of, ~] = tfestimate(iff_of.u, iff_of.y, win, [], [], 1/Ts);
[co_iff_of, ~] = mscohere(iff_of.u, iff_of.y, win, [], [], 1/Ts);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">figure;
hold on;
plot(f, co_iff_of, '-', 'DisplayName', 'g=0')
plot(f, co_iff_g10, '-', 'DisplayName', 'g=10')
plot(f, co_iff_g100, '-', 'DisplayName', 'g=100')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Coherence'); xlabel('Frequency [Hz]');
hold off;
legend();
xlim([60, 600])
[tf_est, f] = tfestimate(u, um, win, [], [], 1/Ts);
[co_est, ~] = mscohere( u, um, win, [], [], 1/Ts);
</pre>
</div>
<div id="org3768cef" class="figure">
<p><img src="figs/iff_first_test_coherence.png" alt="iff_first_test_coherence.png" />
<div id="org12654c2" class="figure">
<p><img src="figs/PI_E505_coh.png" alt="PI_E505_coh.png" />
</p>
<p><span class="figure-number">Figure 17: </span>Coherence</p>
<p><span class="figure-number">Figure 14: </span>Coherence</p>
</div>
<div id="org23ba982" class="figure">
<p><img src="figs/PI_E505_tf.png" alt="PI_E505_tf.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Estimation of the transfer function from input voltage to displacement</p>
</div>
<p>
The delay can be estimated as follow (in ms):
</p>
<div class="org-src-container">
<pre class="src src-matlab">figure;
ax1 = subplot(2, 1, 1);
hold on;
plot(f, abs(tf_iff_of), '-', 'DisplayName', 'g=0')
plot(f, abs(tf_iff_g10), '-', 'DisplayName', 'g=10')
plot(f, abs(tf_iff_g100), '-', 'DisplayName', 'g=100')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude'); xlabel('Frequency [Hz]');
hold off;
legend();
ax2 = subplot(2, 1, 2);
hold on;
plot(f, 180/pi*angle(-tf_iff_of), '-')
plot(f, 180/pi*angle(-tf_iff_g10), '-')
plot(f, 180/pi*angle(-tf_iff_g100), '-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Phase'); xlabel('Frequency [Hz]');
hold off;
linkaxes([ax1,ax2], 'x');
xlim([60, 600]);
<pre class="src src-matlab">finddelay(u, um)*(1000*Ts)
</pre>
</div>
<pre class="example">
0.4
</pre>
<div id="orgf1ca4d4" class="figure">
<p><img src="figs/iff_first_test_bode_plot.png" alt="iff_first_test_bode_plot.png" />
<p>
This most probably corresponds to a FIR filter.
</p>
<p><span class="figure-number">Figure 18: </span>Bode plot for different values of IFF gain</p>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-08-20 jeu. 23:08</p>
<p class="date">Created: 2020-07-24 ven. 15:48</p>
</div>
</body>
</html>

288
index.org
View File

@ -166,11 +166,6 @@
:header-args:matlab+: :comments org :mkdirp yes
:END:
** Introduction :ignore:
#+begin_important
Results presented in this sections are wrong as the ADC cannot deliver enought current to the piezoelectric actuator.
#+end_important
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
@ -358,18 +353,18 @@ In the next section, a current amplifier is used.
<<matlab-init>>
#+end_src
** Load Data
** Load Data :noexport:
#+begin_src matlab
ht = load('./mat/huddle_test.mat', 't', 'u', 'y');
load('./mat/apa95ml_5kg_Amp_E505.mat', 't', 'u', 'um', 'y');
#+end_src
#+begin_src matlab
u = 10*(u - mean(u)); % Input Voltage of Piezo [V]
um = 10*(um - mean(um)); % Monitor [V]
y = y - mean(y); % Mass displacement [m]
u = u - mean(u);
um = um - mean(um);
y = y - mean(y);
ht.u = 10*(ht.u - mean(ht.u));
ht.u = ht.u - mean(ht.u);
ht.y = ht.y - mean(ht.y);
#+end_src
@ -448,7 +443,7 @@ In the next section, a current amplifier is used.
plot(f, abs(tf_est), 'DisplayName', 'Input Voltage')
plot(f, abs(tf_um), 'DisplayName', 'Monitor Voltage')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude [m/V]'); xlabel('Frequency [Hz]');
ylabel('Amplitude'); xlabel('Frequency [Hz]');
hold off;
legend('location', 'southwest')
@ -477,7 +472,7 @@ In the next section, a current amplifier is used.
** Comparison with the FEM model
#+begin_src matlab
load('mat/fem_model_5kg.mat', 'G');
load('mat/fem_model_5kg.mat', 'Ghm');
#+end_src
#+begin_src matlab :exports none
@ -485,17 +480,17 @@ In the next section, a current amplifier is used.
figure;
ax1 = subplot(2, 1, 1);
hold on;
plot(f, abs(tf_um), 'DisplayName', 'Identification')
plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz'))), 'DisplayName', 'FEM')
plot(f, 1/10*170/1400*abs(tf_um), 'DisplayName', 'Identification')
plot(freqs, abs(squeeze(freqresp(Ghm, freqs, 'Hz'))), 'DisplayName', 'FEM')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude [m/V]'); xlabel('Frequency [Hz]');
ylabel('Amplitude'); xlabel('Frequency [Hz]');
legend('location', 'northeast')
hold off;
ax2 = subplot(2, 1, 2);
hold on;
plot(f, 180/pi*unwrap(angle(tf_um)))
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G, freqs, 'Hz')))))
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Ghm, freqs, 'Hz')))))
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Phase'); xlabel('Frequency [Hz]');
hold off;
@ -514,15 +509,7 @@ In the next section, a current amplifier is used.
#+caption: Comparison of the identified transfer function and the one estimated from the FE model
#+RESULTS:
[[file:figs/apa95ml_5kg_pi_comp_fem.png]]
* Transfer function from force actuator to force sensor
** Introduction :ignore:
Two measurements are performed:
- Speedgoat DAC => Voltage Amplifier (x20) => 1 Piezo Stack => ... => 2 Stacks as Force Sensor (parallel) => Speedgoat ADC
- Speedgoat DAC => Voltage Amplifier (x20) => 2 Piezo Stacks (parallel) => ... => 1 Stack as Force Sensor => Speedgoat ADC
The obtained dynamics from force actuator to force sensor are compare with the FEM model.
* Transfer function of the PI Amplifier
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
@ -532,258 +519,87 @@ The obtained dynamics from force actuator to force sensor are compare with the F
<<matlab-init>>
#+end_src
** Load Data :ignore:
The data are loaded:
** Load Data :noexport:
#+begin_src matlab
a_ss = load('mat/apa95ml_5kg_1a_2s.mat', 't', 'u', 'y', 'v');
aa_s = load('mat/apa95ml_5kg_2a_1s.mat', 't', 'u', 'y', 'v');
load('mat/G_force_sensor_5kg.mat', 'G');
load('./mat/apa95ml_5kg_Amp_E505.mat', 't', 'u', 'um');
#+end_src
** Adjust gain :ignore:
Let's use the amplifier gain to obtain the true voltage applied to the actuator stack(s)
The parameters of the piezoelectric stacks are defined below:
** Compute TF estimate and Coherence
#+begin_src matlab
d33 = 3e-10; % Strain constant [m/V]
n = 80; % Number of layers per stack
eT = 1.6e-8; % Permittivity under constant stress [F/m]
sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
ka = 235e6; % Stack stiffness [N/m]
#+end_src
From the FEM, we construct the transfer function from DAC voltage to ADC voltage.
#+begin_src matlab
Gfem_aa_s = exp(-s/1e4)*20*(2*d33*n*ka)*(G(3,1)+G(3,2))*d33/(eT*sD*n);
Gfem_a_ss = exp(-s/1e4)*20*( d33*n*ka)*(G(3,1)+G(2,1))*d33/(eT*sD*n);
#+end_src
** Compute TF estimate and Coherence :ignore:
The transfer function from input voltage to output voltage are computed and shown in Figure [[fig:bode_plot_force_sensor_voltage_comp_fem]].
#+begin_src matlab
Ts = a_ss.t(end)/(length(a_ss.t)-1);
Ts = t(end)/(length(t)-1);
Fs = 1/Ts;
#+end_src
The coherence and the transfer function are estimate from the voltage input of the PI amplifier to its voltage inputs.
The coherence is very good as expected (Figure [[fig:PI_E505_coh]]).
The transfer function show a low pass filter behavior with a lot of phase drop (Figure [[fig:PI_E505_tf]]).
#+begin_src matlab
win = hann(ceil(10/Ts));
[tf_a_ss, f] = tfestimate(a_ss.u, a_ss.v, win, [], [], 1/Ts);
[coh_a_ss, ~] = mscohere( a_ss.u, a_ss.v, win, [], [], 1/Ts);
[tf_aa_s, f] = tfestimate(aa_s.u, aa_s.v, win, [], [], 1/Ts);
[coh_aa_s, ~] = mscohere( aa_s.u, aa_s.v, win, [], [], 1/Ts);
[tf_est, f] = tfestimate(u, um, win, [], [], 1/Ts);
[co_est, ~] = mscohere( u, um, win, [], [], 1/Ts);
#+end_src
#+begin_src matlab :exports none
freqs = logspace(1, 4, 1000);
figure;
ax1 = subplot(2, 1, 1);
hold on;
set(gca,'ColorOrderIndex',1)
plot(f, abs(tf_aa_s), '-')
set(gca,'ColorOrderIndex',1)
plot(freqs, abs(squeeze(freqresp(Gfem_aa_s, freqs, 'Hz'))), '--')
set(gca,'ColorOrderIndex',2)
plot(f, abs(tf_a_ss), '-')
set(gca,'ColorOrderIndex',2)
plot(freqs, abs(squeeze(freqresp(Gfem_a_ss, freqs, 'Hz'))), '--')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude'); xlabel('Frequency [Hz]');
hold off;
ylim([1e-2, 1e2]);
ax2 = subplot(2, 1, 2);
hold on;
set(gca,'ColorOrderIndex',1)
plot(f, 180/pi*angle(tf_aa_s), '-', 'DisplayName', '2 Act - 1 Sen')
set(gca,'ColorOrderIndex',1)
plot(freqs, 180/pi*angle(squeeze(freqresp(Gfem_aa_s, freqs, 'Hz'))), '--', 'DisplayName', '2 Act - 1 Sen, - FEM')
set(gca,'ColorOrderIndex',2)
plot(f, 180/pi*angle(tf_a_ss), '-', 'DisplayName', '1 Act - 2 Sen')
set(gca,'ColorOrderIndex',2)
plot(freqs, 180/pi*angle(squeeze(freqresp(Gfem_a_ss, freqs, 'Hz'))), '--', 'DisplayName', '1 Act - 2 Sen, - FEM')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Phase'); xlabel('Frequency [Hz]');
hold off;
ylim([-180, 180]);
yticks(-180:90:180);
legend('location', 'northeast')
linkaxes([ax1,ax2], 'x');
xlim([10, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/bode_plot_force_sensor_voltage_comp_fem.pdf', 'width', 'full', 'height', 'full');
#+end_src
#+name: fig:bode_plot_force_sensor_voltage_comp_fem
#+caption: Comparison of the identified dynamics from voltage output to voltage input and the FEM
#+RESULTS:
[[file:figs/bode_plot_force_sensor_voltage_comp_fem.png]]
** System Identification
#+begin_src matlab
w_z = 2*pi*111; % Zeros frequency [rad/s]
w_p = 2*pi*255; % Pole frequency [rad/s]
xi_z = 0.05;
xi_p = 0.015;
G_inf = 2;
Gi = G_inf*(s^2 - 2*xi_z*w_z*s + w_z^2)/(s^2 + 2*xi_p*w_p*s + w_p^2);
#+end_src
#+begin_src matlab :exports none
freqs = logspace(1, 4, 1000);
figure;
ax1 = subplot(2, 1, 1);
hold on;
plot(f, abs(tf_aa_s), '-')
plot(freqs, abs(squeeze(freqresp(Gi, freqs, 'Hz'))), '--')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude'); xlabel('Frequency [Hz]');
hold off;
ylim([1e-2, 1e2]);
ax2 = subplot(2, 1, 2);
hold on;
plot(f, 180/pi*angle(tf_aa_s), '-', 'DisplayName', '2 Act - 1 Sen')
plot(freqs, 180/pi*angle(squeeze(freqresp(Gi, freqs, 'Hz'))), '--', 'DisplayName', '2 Act - 1 Sen, - FEM')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Phase'); xlabel('Frequency [Hz]');
hold off;
ylim([-180, 180]);
yticks(-180:90:180);
legend('location', 'northeast')
linkaxes([ax1,ax2], 'x');
xlim([10, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/iff_plant_identification_apa95ml.pdf', 'width', 'full', 'height', 'full');
#+end_src
#+name: fig:iff_plant_identification_apa95ml
#+caption: Identification of the IFF plant
#+RESULTS:
[[file:figs/iff_plant_identification_apa95ml.png]]
** Integral Force Feedback
#+begin_src matlab :exports none
gains = logspace(0, 5, 1000);
figure;
hold on;
plot(real(pole(Gi)), imag(pole(Gi)), 'kx');
plot(real(tzero(Gi)), imag(tzero(Gi)), 'ko');
for i = 1:length(gains)
cl_poles = pole(feedback(Gi, (gains(i)/s)));
plot(real(cl_poles), imag(cl_poles), 'k.');
end
ylim([0, 1800]);
xlim([-1600,200]);
xlabel('Real Part')
ylabel('Imaginary Part')
axis square
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/root_locus_iff_apa95ml_identification.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:root_locus_iff_apa95ml_identification
#+caption: Root Locus for IFF
#+RESULTS:
[[file:figs/root_locus_iff_apa95ml_identification.png]]
* IFF Tests
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
** Load Data
#+begin_src matlab
iff_g10 = load('./mat/apa95ml_iff_g10_res.mat', 'u', 't', 'y', 'v');
iff_g100 = load('./mat/apa95ml_iff_g100_res.mat', 'u', 't', 'y', 'v');
iff_of = load('./mat/apa95ml_iff_off_res.mat', 'u', 't', 'y', 'v');
#+end_src
#+begin_src matlab
Ts = 1e-4;
win = hann(ceil(10/Ts));
[tf_iff_g10, f] = tfestimate(iff_g10.u, iff_g10.y, win, [], [], 1/Ts);
[co_iff_g10, ~] = mscohere(iff_g10.u, iff_g10.y, win, [], [], 1/Ts);
[tf_iff_g100, f] = tfestimate(iff_g100.u, iff_g100.y, win, [], [], 1/Ts);
[co_iff_g100, ~] = mscohere(iff_g100.u, iff_g100.y, win, [], [], 1/Ts);
[tf_iff_of, ~] = tfestimate(iff_of.u, iff_of.y, win, [], [], 1/Ts);
[co_iff_of, ~] = mscohere(iff_of.u, iff_of.y, win, [], [], 1/Ts);
#+end_src
#+begin_src matlab
figure;
hold on;
plot(f, co_iff_of, '-', 'DisplayName', 'g=0')
plot(f, co_iff_g10, '-', 'DisplayName', 'g=10')
plot(f, co_iff_g100, '-', 'DisplayName', 'g=100')
plot(f, co_est, 'k-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Coherence'); xlabel('Frequency [Hz]');
hold off;
legend();
xlim([60, 600])
xlim([10, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/iff_first_test_coherence.pdf', 'width', 'wide', 'height', 'normal');
exportFig('figs/PI_E505_coh.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:iff_first_test_coherence
#+name: fig:PI_E505_coh
#+caption: Coherence
#+RESULTS:
[[file:figs/iff_first_test_coherence.png]]
[[file:figs/PI_E505_coh.png]]
#+begin_src matlab
#+begin_src matlab :exports none
figure;
ax1 = subplot(2, 1, 1);
hold on;
plot(f, abs(tf_iff_of), '-', 'DisplayName', 'g=0')
plot(f, abs(tf_iff_g10), '-', 'DisplayName', 'g=10')
plot(f, abs(tf_iff_g100), '-', 'DisplayName', 'g=100')
plot(f, abs(tf_est), 'k-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude'); xlabel('Frequency [Hz]');
hold off;
legend();
ax2 = subplot(2, 1, 2);
hold on;
plot(f, 180/pi*angle(-tf_iff_of), '-')
plot(f, 180/pi*angle(-tf_iff_g10), '-')
plot(f, 180/pi*angle(-tf_iff_g100), '-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
plot(f, 180/pi*angle(tf_est), 'k-')
set(gca, 'Xscale', 'lin'); set(gca, 'Yscale', 'lin');
ylabel('Phase'); xlabel('Frequency [Hz]');
hold off;
ylim([-180, 180]);
yticks(-180:90:180);
linkaxes([ax1,ax2], 'x');
xlim([60, 600]);
xlim([10, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/iff_first_test_bode_plot.pdf', 'width', 'full', 'height', 'full');
exportFig('figs/PI_E505_tf.pdf', 'width', 'full', 'height', 'full');
#+end_src
#+name: fig:iff_first_test_bode_plot
#+caption: Bode plot for different values of IFF gain
#+name: fig:PI_E505_tf
#+caption: Estimation of the transfer function from input voltage to displacement
#+RESULTS:
[[file:figs/iff_first_test_bode_plot.png]]
[[file:figs/PI_E505_tf.png]]
The delay can be estimated as follow (in ms):
#+begin_src matlab :results replace value
finddelay(u, um)*(1000*Ts)
#+end_src
#+RESULTS:
: 0.4
This most probably corresponds to a FIR filter.