Add analysis on the force sensor

This commit is contained in:
Thomas Dehaeze 2020-10-29 09:59:29 +01:00
parent 0f1c082b66
commit 2d6a2953cf
22 changed files with 884 additions and 55 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
figs/force_sensor_sin_u.pdf Normal file

Binary file not shown.

BIN
figs/force_sensor_sin_u.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 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-10-25 dim. 09:06 -->
<!-- 2020-10-29 jeu. 09:59 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Encoder - Test Bench</title>
<meta name="generator" content="Org mode" />
@ -31,37 +31,49 @@
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org62e3fd3">1. Experimental Setup</a></li>
<li><a href="#org12a748d">2. Huddle Test</a>
<li><a href="#org6fbc445">1. Experimental Setup</a></li>
<li><a href="#orgdbbcb08">2. Huddle Test</a>
<ul>
<li><a href="#orgcc6a5f5">2.1. Load Data</a></li>
<li><a href="#org38dca56">2.2. Time Domain Results</a></li>
<li><a href="#orgb3db033">2.3. Frequency Domain Noise</a></li>
<li><a href="#orge0cae84">2.1. Load Data</a></li>
<li><a href="#orgeb6de99">2.2. Time Domain Results</a></li>
<li><a href="#orga9c316e">2.3. Frequency Domain Noise</a></li>
</ul>
</li>
<li><a href="#org99db9f6">3. Comparison Interferometer / Encoder</a>
<li><a href="#org3f480f8">3. Comparison Interferometer / Encoder</a>
<ul>
<li><a href="#org1d63b9a">3.1. Load Data</a></li>
<li><a href="#org185e20d">3.2. Time Domain Results</a></li>
<li><a href="#org04cd372">3.3. Difference between Encoder and Interferometer as a function of time</a></li>
<li><a href="#org0271741">3.4. Difference between Encoder and Interferometer as a function of position</a></li>
<li><a href="#org1144cae">3.1. Load Data</a></li>
<li><a href="#org504ca00">3.2. Time Domain Results</a></li>
<li><a href="#org0bb5487">3.3. Difference between Encoder and Interferometer as a function of time</a></li>
<li><a href="#org8ffe43b">3.4. Difference between Encoder and Interferometer as a function of position</a></li>
</ul>
</li>
<li><a href="#orga08d704">4. Identification</a>
<li><a href="#org8db94b6">4. Identification</a>
<ul>
<li><a href="#orgaa05248">4.1. Load Data</a></li>
<li><a href="#org0d4f0cd">4.2. Identification</a></li>
<li><a href="#org5dbc303">4.1. Load Data</a></li>
<li><a href="#org7e6c771">4.2. Identification</a></li>
</ul>
</li>
<li><a href="#org34f3a3e">5. Change of Stiffness due to Sensors stack being open/closed circuit</a>
<ul>
<li><a href="#org74a3435">5.1. Load Data</a></li>
<li><a href="#org3c7c26d">5.2. Transfer Functions</a></li>
</ul>
</li>
<li><a href="#org939e6d1">6. Generated Number of Charge / Voltage</a>
<ul>
<li><a href="#org24ebf58">6.1. Steps</a></li>
<li><a href="#orgd891bf7">6.2. Sinus</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org62e3fd3" class="outline-2">
<h2 id="org62e3fd3"><span class="section-number-2">1</span> Experimental Setup</h2>
<div id="outline-container-org6fbc445" class="outline-2">
<h2 id="org6fbc445"><span class="section-number-2">1</span> Experimental Setup</h2>
<div class="outline-text-2" id="text-1">
<p>
The experimental Setup is schematically represented in Figure <a href="#org4fd66dc">1</a>.
The experimental Setup is schematically represented in Figure <a href="#orgd0e8875">1</a>.
</p>
<p>
@ -70,21 +82,21 @@ The displacement of the mass (relative to the mechanical frame) is measured both
</p>
<div id="org4fd66dc" class="figure">
<div id="orgd0e8875" class="figure">
<p><img src="figs/exp_setup_schematic.png" alt="exp_setup_schematic.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Schematic of the Experiment</p>
</div>
<div id="orge37bdbc" class="figure">
<div id="orga0a129f" class="figure">
<p><img src="figs/IMG_20201023_153905.jpg" alt="IMG_20201023_153905.jpg" />
</p>
<p><span class="figure-number">Figure 2: </span>Side View of the encoder</p>
</div>
<div id="org168fd7f" class="figure">
<div id="org3eb8621" class="figure">
<p><img src="figs/IMG_20201023_153914.jpg" alt="IMG_20201023_153914.jpg" />
</p>
<p><span class="figure-number">Figure 3: </span>Front View of the encoder</p>
@ -92,8 +104,8 @@ The displacement of the mass (relative to the mechanical frame) is measured both
</div>
</div>
<div id="outline-container-org12a748d" class="outline-2">
<h2 id="org12a748d"><span class="section-number-2">2</span> Huddle Test</h2>
<div id="outline-container-orgdbbcb08" class="outline-2">
<h2 id="orgdbbcb08"><span class="section-number-2">2</span> Huddle Test</h2>
<div class="outline-text-2" id="text-2">
<p>
The goal in this section is the estimate the noise of both the encoder and the intereferometer.
@ -105,8 +117,8 @@ Ideally, a mechanical part would clamp the two together, we here suppose that th
</p>
</div>
<div id="outline-container-orgcc6a5f5" class="outline-3">
<h3 id="orgcc6a5f5"><span class="section-number-3">2.1</span> Load Data</h3>
<div id="outline-container-orge0cae84" class="outline-3">
<h3 id="orge0cae84"><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">load(<span class="org-string">'mat/int_enc_huddle_test.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'t'</span>);
@ -121,11 +133,11 @@ encoder = detrend(encoder, 0);
</div>
</div>
<div id="outline-container-org38dca56" class="outline-3">
<h3 id="org38dca56"><span class="section-number-3">2.2</span> Time Domain Results</h3>
<div id="outline-container-orgeb6de99" class="outline-3">
<h3 id="orgeb6de99"><span class="section-number-3">2.2</span> Time Domain Results</h3>
<div class="outline-text-3" id="text-2-2">
<div id="org1e8928d" class="figure">
<div id="org686e97a" class="figure">
<p><img src="figs/huddle_test_time_domain.png" alt="huddle_test_time_domain.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Huddle test - Time domain signals</p>
@ -137,7 +149,7 @@ encoder = detrend(encoder, 0);
</div>
<div id="org831d12c" class="figure">
<div id="orgb481e1f" class="figure">
<p><img src="figs/huddle_test_time_domain_filtered.png" alt="huddle_test_time_domain_filtered.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Huddle test - Time domain signals filtered with a LPF at 10Hz</p>
@ -145,8 +157,8 @@ encoder = detrend(encoder, 0);
</div>
</div>
<div id="outline-container-orgb3db033" class="outline-3">
<h3 id="orgb3db033"><span class="section-number-3">2.3</span> Frequency Domain Noise</h3>
<div id="outline-container-orga9c316e" class="outline-3">
<h3 id="orga9c316e"><span class="section-number-3">2.3</span> Frequency Domain Noise</h3>
<div class="outline-text-3" id="text-2-3">
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4;
@ -158,7 +170,7 @@ win = hann(ceil(10<span class="org-type">/</span>Ts));
</div>
<div id="orgd4d1e96" class="figure">
<div id="org8d5409d" class="figure">
<p><img src="figs/huddle_test_asd.png" alt="huddle_test_asd.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Amplitude Spectral Density of the signals during the Huddle test</p>
@ -167,8 +179,8 @@ win = hann(ceil(10<span class="org-type">/</span>Ts));
</div>
</div>
<div id="outline-container-org99db9f6" class="outline-2">
<h2 id="org99db9f6"><span class="section-number-2">3</span> Comparison Interferometer / Encoder</h2>
<div id="outline-container-org3f480f8" class="outline-2">
<h2 id="org3f480f8"><span class="section-number-2">3</span> Comparison Interferometer / Encoder</h2>
<div class="outline-text-2" id="text-3">
<p>
The goal here is to make sure that the interferometer and encoder measurements are coherent.
@ -176,8 +188,8 @@ We may see non-linearity in the interferometric measurement.
</p>
</div>
<div id="outline-container-org1d63b9a" class="outline-3">
<h3 id="org1d63b9a"><span class="section-number-3">3.1</span> Load Data</h3>
<div id="outline-container-org1144cae" class="outline-3">
<h3 id="org1144cae"><span class="section-number-3">3.1</span> Load Data</h3>
<div class="outline-text-3" id="text-3-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/int_enc_comp.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
@ -193,18 +205,18 @@ u = detrend(u, 0);
</div>
</div>
<div id="outline-container-org185e20d" class="outline-3">
<h3 id="org185e20d"><span class="section-number-3">3.2</span> Time Domain Results</h3>
<div id="outline-container-org504ca00" class="outline-3">
<h3 id="org504ca00"><span class="section-number-3">3.2</span> Time Domain Results</h3>
<div class="outline-text-3" id="text-3-2">
<div id="orgf56a137" class="figure">
<div id="org5e28133" class="figure">
<p><img src="figs/int_enc_one_cycle.png" alt="int_enc_one_cycle.png" />
</p>
<p><span class="figure-number">Figure 7: </span>One cycle measurement</p>
</div>
<div id="org3adb535" class="figure">
<div id="org1d42180" class="figure">
<p><img src="figs/int_enc_one_cycle_error.png" alt="int_enc_one_cycle_error.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Difference between the Encoder and the interferometer during one cycle</p>
@ -212,8 +224,8 @@ u = detrend(u, 0);
</div>
</div>
<div id="outline-container-org04cd372" class="outline-3">
<h3 id="org04cd372"><span class="section-number-3">3.3</span> Difference between Encoder and Interferometer as a function of time</h3>
<div id="outline-container-org0bb5487" class="outline-3">
<h3 id="org0bb5487"><span class="section-number-3">3.3</span> Difference between Encoder and Interferometer as a function of time</h3>
<div class="outline-text-3" id="text-3-3">
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4;
@ -234,7 +246,7 @@ d_err_mean = d_err_mean <span class="org-type">-</span> mean(d_err_mean);
</div>
<div id="orgd16ecc5" class="figure">
<div id="org8fda1bf" class="figure">
<p><img src="figs/int_enc_error_mean_time.png" alt="int_enc_error_mean_time.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Difference between the two measurement in the time domain, averaged for all the cycles</p>
@ -242,8 +254,8 @@ d_err_mean = d_err_mean <span class="org-type">-</span> mean(d_err_mean);
</div>
</div>
<div id="outline-container-org0271741" class="outline-3">
<h3 id="org0271741"><span class="section-number-3">3.4</span> Difference between Encoder and Interferometer as a function of position</h3>
<div id="outline-container-org8ffe43b" class="outline-3">
<h3 id="org8ffe43b"><span class="section-number-3">3.4</span> Difference between Encoder and Interferometer as a function of position</h3>
<div class="outline-text-3" id="text-3-4">
<p>
Compute the mean of the interferometer measurement corresponding to each of the encoder measurement.
@ -262,7 +274,7 @@ i_mean_error = (i_mean <span class="org-type">-</span> e_sorted);
</div>
<div id="org81096af" class="figure">
<div id="org3b4facc" class="figure">
<p><img src="figs/int_enc_error_mean_position.png" alt="int_enc_error_mean_position.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Difference between the two measurement as a function of the measured position by the encoder, averaged for all the cycles</p>
@ -283,7 +295,7 @@ e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init<span class="org-typ
</div>
<div id="orgd460333" class="figure">
<div id="org8f808d8" class="figure">
<p><img src="figs/int_non_linearity_period_wavelength.png" alt="int_non_linearity_period_wavelength.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Non-Linearity of the Interferometer over the period of the wavelength</p>
@ -292,12 +304,12 @@ e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init<span class="org-typ
</div>
</div>
<div id="outline-container-orga08d704" class="outline-2">
<h2 id="orga08d704"><span class="section-number-2">4</span> Identification</h2>
<div id="outline-container-org8db94b6" class="outline-2">
<h2 id="org8db94b6"><span class="section-number-2">4</span> Identification</h2>
<div class="outline-text-2" id="text-4">
</div>
<div id="outline-container-orgaa05248" class="outline-3">
<h3 id="orgaa05248"><span class="section-number-3">4.1</span> Load Data</h3>
<div id="outline-container-org5dbc303" class="outline-3">
<h3 id="org5dbc303"><span class="section-number-3">4.1</span> Load Data</h3>
<div class="outline-text-3" id="text-4-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/int_enc_id_noise_bis.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
@ -313,8 +325,8 @@ u = detrend(u, 0);
</div>
</div>
<div id="outline-container-org0d4f0cd" class="outline-3">
<h3 id="org0d4f0cd"><span class="section-number-3">4.2</span> Identification</h3>
<div id="outline-container-org7e6c771" class="outline-3">
<h3 id="org7e6c771"><span class="section-number-3">4.2</span> Identification</h3>
<div class="outline-text-3" id="text-4-2">
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% Sampling Time [s]</span>
@ -332,24 +344,436 @@ win = hann(ceil(10<span class="org-type">/</span>Ts));
</div>
<div id="org0157819" class="figure">
<div id="org002dcef" class="figure">
<p><img src="figs/identification_dynamics_coherence.png" alt="identification_dynamics_coherence.png" />
</p>
</div>
<div id="org4b89965" class="figure">
<div id="orgdbdd6e0" class="figure">
<p><img src="figs/identification_dynamics_bode.png" alt="identification_dynamics_bode.png" />
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org34f3a3e" class="outline-2">
<h2 id="org34f3a3e"><span class="section-number-2">5</span> Change of Stiffness due to Sensors stack being open/closed circuit</h2>
<div class="outline-text-2" id="text-5">
</div>
<div id="outline-container-org74a3435" class="outline-3">
<h3 id="org74a3435"><span class="section-number-3">5.1</span> Load Data</h3>
<div class="outline-text-3" id="text-5-1">
<div class="org-src-container">
<pre class="src src-matlab">oc = load(<span class="org-string">'./mat/identification_open_circuit.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>);
sc = load(<span class="org-string">'./mat/identification_short_circuit.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org3c7c26d" class="outline-3">
<h3 id="org3c7c26d"><span class="section-number-3">5.2</span> Transfer Functions</h3>
<div class="outline-text-3" id="text-5-2">
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% Sampling Time [s]</span>
win = hann(ceil(10<span class="org-type">/</span>Ts));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[tf_oc_est, f] = tfestimate(oc.u, oc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
[co_oc_est, <span class="org-type">~</span>] = mscohere( oc.u, oc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
[tf_sc_est, <span class="org-type">~</span>] = tfestimate(sc.u, sc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
[co_sc_est, <span class="org-type">~</span>] = mscohere( sc.u, sc.encoder, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="org3137b17" class="figure">
<p><img src="figs/stiffness_force_sensor_coherence.png" alt="stiffness_force_sensor_coherence.png" />
</p>
</div>
<div id="org0b7ba5b" class="figure">
<p><img src="figs/stiffness_force_sensor_bode.png" alt="stiffness_force_sensor_bode.png" />
</p>
</div>
<div id="org8bfdbdd" class="figure">
<p><img src="figs/stiffness_force_sensor_bode_zoom.png" alt="stiffness_force_sensor_bode_zoom.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Zoom on the change of resonance</p>
</div>
<div class="important" id="org98481c9">
<p>
The change of resonance frequency / stiffness is very small and is not important here.
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org939e6d1" class="outline-2">
<h2 id="org939e6d1"><span class="section-number-2">6</span> Generated Number of Charge / Voltage</h2>
<div class="outline-text-2" id="text-6">
<p>
Two stacks are used as actuator (in parallel) and one stack is used as sensor.
</p>
<p>
The amplifier gain is 20V/V (Cedrat LA75B).
</p>
</div>
<div id="outline-container-org24ebf58" class="outline-3">
<h3 id="org24ebf58"><span class="section-number-3">6.1</span> Steps</h3>
<div class="outline-text-3" id="text-6-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'./mat/force_sensor_steps.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
tiledlayout(2, 1, <span class="org-string">'TileSpacing'</span>, <span class="org-string">'None'</span>, <span class="org-string">'Padding'</span>, <span class="org-string">'None'</span>);
nexttile;
plot(t, v);
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Measured voltage [V]'</span>);
nexttile;
plot(t, u);
xlabel(<span class="org-string">'Time [s]'</span>); ylabel(<span class="org-string">'Actuator Voltage [V]'</span>);
</pre>
</div>
<div id="org487995c" class="figure">
<p><img src="figs/force_sen_steps_time_domain.png" alt="force_sen_steps_time_domain.png" />
</p>
<p><span class="figure-number">Figure 17: </span>Time domain signal during the 3 actuator voltage steps</p>
</div>
<p>
Three steps are performed at the following time intervals:
</p>
<ul class="org-ul">
<li>2.5, 23</li>
<li>23.8, 35</li>
<li>35.8, 50</li>
</ul>
<p>
Fit function:
</p>
<div class="org-src-container">
<pre class="src src-matlab">f = @(b,x) b(1)<span class="org-type">.*</span>exp(b(2)<span class="org-type">.*</span>x) <span class="org-type">+</span> b(3);
</pre>
</div>
<p>
We are interested by the <code>b(2)</code> term, which is the time constant of the exponential.
</p>
<div class="org-src-container">
<pre class="src src-matlab">tau = zeros(3,1);
V0 = zeros(3,1);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">t_cur = t(2.5 <span class="org-type">&lt;</span> t <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 23);
t_cur = t_cur <span class="org-type">-</span> t_cur(1);
y_cur = v(2.5 <span class="org-type">&lt;</span> t <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 23);
nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
B0 = [0.5, <span class="org-type">-</span>0.15, 2.2]; <span class="org-comment">% Choose Appropriate Initial Estimates</span>
[B,rnrm] = fminsearch(nrmrsd, B0); <span class="org-comment">% Estimate Parameters &#8216;B&#8217;</span>
tau<span class="org-type">(1) </span>= 1<span class="org-type">/</span>B(2);
V0<span class="org-type">(1) </span>= B(3);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">t_cur = t(23.8 <span class="org-type">&lt;</span> t <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 35);
t_cur = t_cur <span class="org-type">-</span> t_cur(1);
y_cur = v(23.8 <span class="org-type">&lt;</span> t <span class="org-type">&amp;</span> t <span class="org-type">&lt;</span> 35);
nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
B0 = [0.5, <span class="org-type">-</span>0.15, 2.2]; <span class="org-comment">% Choose Appropriate Initial Estimates</span>
[B,rnrm] = fminsearch(nrmrsd, B0); <span class="org-comment">% Estimate Parameters &#8216;B&#8217;</span>
tau<span class="org-type">(2) </span>= 1<span class="org-type">/</span>B(2);
V0<span class="org-type">(2) </span>= B(3);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">t_cur = t(35.8 <span class="org-type">&lt;</span> t);
t_cur = t_cur <span class="org-type">-</span> t_cur(1);
y_cur = v(35.8 <span class="org-type">&lt;</span> t);
nrmrsd = @(b) norm(y_cur <span class="org-type">-</span> f(b,t_cur)); <span class="org-comment">% Residual Norm Cost Function</span>
B0 = [0.5, <span class="org-type">-</span>0.15, 2.2]; <span class="org-comment">% Choose Appropriate Initial Estimates</span>
[B,rnrm] = fminsearch(nrmrsd, B0); <span class="org-comment">% Estimate Parameters &#8216;B&#8217;</span>
tau<span class="org-type">(3) </span>= 1<span class="org-type">/</span>B(2);
V0<span class="org-type">(3) </span>= B(3);
</pre>
</div>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">\(tau\) [s]</th>
<th scope="col" class="org-right">\(V_0\) [V]</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">6.47</td>
<td class="org-right">2.26</td>
</tr>
<tr>
<td class="org-right">6.76</td>
<td class="org-right">2.26</td>
</tr>
<tr>
<td class="org-right">6.49</td>
<td class="org-right">2.25</td>
</tr>
</tbody>
</table>
<p>
With the capacitance being \(C = 4.4 \mu F\), the internal impedance of the Speedgoat ADC can be computed as follows:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Cp = 4.4e<span class="org-type">-</span>6; <span class="org-comment">% [F]</span>
Rin = abs(mean(tau))<span class="org-type">/</span>Cp;
</pre>
</div>
<pre class="example">
1494100.0
</pre>
<p>
The input impedance of the Speedgoat&rsquo;s ADC should then be close to \(1.5\,M\Omega\) (specified at \(1\,M\Omega\)).
</p>
<div class="important" id="org3005c4e">
<p>
How can we explain the voltage offset?
</p>
</div>
<p>
As shown in Figure <a href="#org63387ea">18</a> (taken from (<a href="#citeproc_bib_item_1">Reza and Andrew 2006</a>)), an input voltage offset is due to the input bias current \(i_n\).
</p>
<div id="org63387ea" class="figure">
<p><img src="figs/piezo_sensor_model_instrumentation.png" alt="piezo_sensor_model_instrumentation.png" />
</p>
<p><span class="figure-number">Figure 18: </span>Model of a piezoelectric transducer (left) and instrumentation amplifier (right)</p>
</div>
<p>
The estimated input bias current is then:
</p>
<div class="org-src-container">
<pre class="src src-matlab">in = mean(V0)<span class="org-type">/</span>Rin;
</pre>
</div>
<pre class="example">
1.5119e-06
</pre>
<p>
An additional resistor in parallel with \(R_{in}\) would have two effects:
</p>
<ul class="org-ul">
<li>reduce the input voltage offset
\[ V_{off} = \frac{R_a R_{in}}{R_a + R_{in}} i_n \]</li>
<li>increase the high pass corner frequency \(f_c\)
\[ C_p \frac{R_{in}R_a}{R_{in} + R_a} = \tau_c = \frac{1}{f_c} \]
\[ R_a = \frac{R_i}{f_c C_p R_i - 1} \]</li>
</ul>
<p>
If we allow the high pass corner frequency to be equals to 3Hz:
</p>
<div class="org-src-container">
<pre class="src src-matlab">fc = 3;
Ra = Rin<span class="org-type">/</span>(fc<span class="org-type">*</span>C<span class="org-type">*</span>Rin <span class="org-type">-</span> 1);
</pre>
</div>
<pre class="example">
79804
</pre>
<p>
With this parallel resistance value, the voltage offset would be:
</p>
<div class="org-src-container">
<pre class="src src-matlab">V_offset = Ra<span class="org-type">*</span>Rin<span class="org-type">/</span>(Ra <span class="org-type">+</span> Rin) <span class="org-type">*</span> in;
</pre>
</div>
<pre class="example">
0.11454
</pre>
<p>
Which is much more acceptable.
</p>
</div>
</div>
<div id="outline-container-orgd891bf7" class="outline-3">
<h3 id="orgd891bf7"><span class="section-number-3">6.2</span> Sinus</h3>
<div class="outline-text-3" id="text-6-2">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'./mat/force_sensor_sin.mat'</span>, <span class="org-string">'t'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'v'</span>);
u = u(t<span class="org-type">&gt;</span>25);
v = v(t<span class="org-type">&gt;</span>25);
encoder = encoder(t<span class="org-type">&gt;</span>25) <span class="org-type">-</span> mean(encoder(t<span class="org-type">&gt;</span>25));
t = t(t<span class="org-type">&gt;</span>25);
</pre>
</div>
<p>
The driving voltage is a sinus at 0.5Hz centered on 3V and with an amplitude of 3V (Figure <a href="#orgf11f3a7">19</a>).
</p>
<div id="orgf11f3a7" class="figure">
<p><img src="figs/force_sensor_sin_u.png" alt="force_sensor_sin_u.png" />
</p>
<p><span class="figure-number">Figure 19: </span>Driving Voltage</p>
</div>
<p>
The full stroke as measured by the encoder is:
</p>
<div class="org-src-container">
<pre class="src src-matlab">max(encoder)<span class="org-type">-</span>min(encoder)
</pre>
</div>
<pre class="example">
5.005e-05
</pre>
<p>
Its signal is shown in Figure <a href="#org3cc6daf">20</a>.
</p>
<div id="org3cc6daf" class="figure">
<p><img src="figs/force_sensor_sin_encoder.png" alt="force_sensor_sin_encoder.png" />
</p>
<p><span class="figure-number">Figure 20: </span>Encoder measurement</p>
</div>
<p>
The generated voltage by the stack is shown in Figure
</p>
<div id="orgd2cbe17" class="figure">
<p><img src="figs/force_sensor_sin_stack.png" alt="force_sensor_sin_stack.png" />
</p>
<p><span class="figure-number">Figure 21: </span>Voltage measured on the stack used as a sensor</p>
</div>
<p>
The capacitance of the stack is
</p>
<div class="org-src-container">
<pre class="src src-matlab">Cp = 4.4e<span class="org-type">-</span>6; <span class="org-comment">% [F]</span>
</pre>
</div>
<p>
The corresponding generated charge is then shown in Figure <a href="#org5b6dc79">22</a>.
</p>
<div id="org5b6dc79" class="figure">
<p><img src="figs/force_sensor_sin_charge.png" alt="force_sensor_sin_charge.png" />
</p>
<p><span class="figure-number">Figure 22: </span>Generated Charge</p>
</div>
<p>
The relation between the generated voltage and the measured displacement is almost linear as shown in Figure <a href="#org9b9ea94">23</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">b1 = encoder<span class="org-type">\</span>(v<span class="org-type">-</span>mean(v));
</pre>
</div>
<div id="org9b9ea94" class="figure">
<p><img src="figs/force_sensor_linear_relation.png" alt="force_sensor_linear_relation.png" />
</p>
<p><span class="figure-number">Figure 23: </span>Almost linear relation between the relative displacement and the generated voltage</p>
</div>
<p>
With a 16bits ADC, the resolution will then be equals to (in [nm]):
</p>
<div class="org-src-container">
<pre class="src src-matlab">abs((20<span class="org-type">/</span>2<span class="org-type">^</span>16)<span class="org-type">/</span>(b1<span class="org-type">/</span>1e9))
</pre>
</div>
<pre class="example">
3.9838
</pre>
<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>Reza, Moheimani, and Fleming Andrew. 2006. <i>Piezoelectric Transducers for Vibration Control and Damping</i>. London: Springer.</div>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-10-25 dim. 09:06</p>
<p class="date">Created: 2020-10-29 jeu. 09:59</p>
</div>
</body>
</html>

405
index.org
View File

@ -404,3 +404,408 @@ The period of the non-linearity seems to be $1.53 \mu m$ which corresponds to th
#+caption:
#+RESULTS:
[[file:figs/identification_dynamics_bode.png]]
* Change of Stiffness due to Sensors stack being open/closed circuit
** 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
oc = load('./mat/identification_open_circuit.mat', 't', 'encoder', 'u');
sc = load('./mat/identification_short_circuit.mat', 't', 'encoder', 'u');
#+end_src
** Transfer Functions
#+begin_src matlab
Ts = 1e-4; % Sampling Time [s]
win = hann(ceil(10/Ts));
#+end_src
#+begin_src matlab
[tf_oc_est, f] = tfestimate(oc.u, oc.encoder, win, [], [], 1/Ts);
[co_oc_est, ~] = mscohere( oc.u, oc.encoder, win, [], [], 1/Ts);
[tf_sc_est, ~] = tfestimate(sc.u, sc.encoder, win, [], [], 1/Ts);
[co_sc_est, ~] = mscohere( sc.u, sc.encoder, win, [], [], 1/Ts);
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(f, co_oc_est, '-')
plot(f, co_sc_est, '-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Coherence'); xlabel('Frequency [Hz]');
hold off;
xlim([0.5, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/stiffness_force_sensor_coherence.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:stiffness_force_sensor_coherence
#+caption:
#+RESULTS:
[[file:figs/stiffness_force_sensor_coherence.png]]
#+begin_src matlab :exports none
figure;
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
ax1 = nexttile;
hold on;
plot(f, abs(tf_oc_est), '-', 'DisplayName', 'Open-Circuit')
plot(f, abs(tf_sc_est), '-', 'DisplayName', 'Short-Circuit')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
hold off;
ylim([1e-7, 3e-4]);
legend('location', 'southwest');
ax2 = nexttile;
hold on;
plot(f, 180/pi*angle(tf_oc_est), '-')
plot(f, 180/pi*angle(tf_sc_est), '-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Phase'); xlabel('Frequency [Hz]');
hold off;
yticks(-360:90:360);
axis padded 'auto x'
linkaxes([ax1,ax2], 'x');
xlim([0.5, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/stiffness_force_sensor_bode.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:stiffness_force_sensor_bode
#+caption:
#+RESULTS:
[[file:figs/stiffness_force_sensor_bode.png]]
#+begin_src matlab :tangle no :exports results :results file replace
xlim([180, 280]);
exportFig('figs/stiffness_force_sensor_bode_zoom.pdf', 'width', 'small', 'height', 'tall');
#+end_src
#+name: fig:stiffness_force_sensor_bode_zoom
#+caption: Zoom on the change of resonance
#+RESULTS:
[[file:figs/stiffness_force_sensor_bode_zoom.png]]
#+begin_important
The change of resonance frequency / stiffness is very small and is not important here.
#+end_important
* Generated Number of Charge / Voltage
** Introduction :ignore:
Two stacks are used as actuator (in parallel) and one stack is used as sensor.
The amplifier gain is 20V/V (Cedrat LA75B).
** 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
** Steps
#+begin_src matlab
load('./mat/force_sensor_steps.mat', 't', 'encoder', 'u', 'v');
#+end_src
#+begin_src matlab
figure;
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
nexttile;
plot(t, v);
xlabel('Time [s]'); ylabel('Measured voltage [V]');
nexttile;
plot(t, u);
xlabel('Time [s]'); ylabel('Actuator Voltage [V]');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/force_sen_steps_time_domain.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:force_sen_steps_time_domain
#+caption: Time domain signal during the 3 actuator voltage steps
#+RESULTS:
[[file:figs/force_sen_steps_time_domain.png]]
Three steps are performed at the following time intervals:
- 2.5, 23
- 23.8, 35
- 35.8, 50
Fit function:
#+begin_src matlab
f = @(b,x) b(1).*exp(b(2).*x) + b(3);
#+end_src
We are interested by the =b(2)= term, which is the time constant of the exponential.
#+begin_src matlab
tau = zeros(3,1);
V0 = zeros(3,1);
#+end_src
#+begin_src matlab
t_cur = t(2.5 < t & t < 23);
t_cur = t_cur - t_cur(1);
y_cur = v(2.5 < t & t < 23);
nrmrsd = @(b) norm(y_cur - f(b,t_cur)); % Residual Norm Cost Function
B0 = [0.5, -0.15, 2.2]; % Choose Appropriate Initial Estimates
[B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters B
tau(1) = 1/B(2);
V0(1) = B(3);
#+end_src
#+begin_src matlab
t_cur = t(23.8 < t & t < 35);
t_cur = t_cur - t_cur(1);
y_cur = v(23.8 < t & t < 35);
nrmrsd = @(b) norm(y_cur - f(b,t_cur)); % Residual Norm Cost Function
B0 = [0.5, -0.15, 2.2]; % Choose Appropriate Initial Estimates
[B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters B
tau(2) = 1/B(2);
V0(2) = B(3);
#+end_src
#+begin_src matlab
t_cur = t(35.8 < t);
t_cur = t_cur - t_cur(1);
y_cur = v(35.8 < t);
nrmrsd = @(b) norm(y_cur - f(b,t_cur)); % Residual Norm Cost Function
B0 = [0.5, -0.15, 2.2]; % Choose Appropriate Initial Estimates
[B,rnrm] = fminsearch(nrmrsd, B0); % Estimate Parameters B
tau(3) = 1/B(2);
V0(3) = B(3);
#+end_src
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([abs(tau), V0], {}, {'$tau$ [s]', '$V_0$ [V]'}, ' %.2f ');
#+end_src
#+RESULTS:
| $tau$ [s] | $V_0$ [V] |
|-----------+-----------|
| 6.47 | 2.26 |
| 6.76 | 2.26 |
| 6.49 | 2.25 |
With the capacitance being $C = 4.4 \mu F$, the internal impedance of the Speedgoat ADC can be computed as follows:
#+begin_src matlab
Cp = 4.4e-6; % [F]
Rin = abs(mean(tau))/Cp;
#+end_src
#+begin_src matlab :results value replace :exports results
ans = Rin
#+end_src
#+RESULTS:
: 1494100.0
The input impedance of the Speedgoat's ADC should then be close to $1.5\,M\Omega$ (specified at $1\,M\Omega$).
#+begin_important
How can we explain the voltage offset?
#+end_important
As shown in Figure [[fig:piezo_sensor_model_instrumentation]] (taken from cite:reza06_piezoel_trans_vibrat_contr_dampin), an input voltage offset is due to the input bias current $i_n$.
#+name: fig:piezo_sensor_model_instrumentation
#+caption: Model of a piezoelectric transducer (left) and instrumentation amplifier (right)
[[file:figs/piezo_sensor_model_instrumentation.png]]
The estimated input bias current is then:
#+begin_src matlab
in = mean(V0)/Rin;
#+end_src
#+begin_src matlab :results value replace :exports results
ans = in
#+end_src
#+RESULTS:
: 1.5119e-06
An additional resistor in parallel with $R_{in}$ would have two effects:
- reduce the input voltage offset
\[ V_{off} = \frac{R_a R_{in}}{R_a + R_{in}} i_n \]
- increase the high pass corner frequency $f_c$
\[ C_p \frac{R_{in}R_a}{R_{in} + R_a} = \tau_c = \frac{1}{f_c} \]
\[ R_a = \frac{R_i}{f_c C_p R_i - 1} \]
If we allow the high pass corner frequency to be equals to 3Hz:
#+begin_src matlab
fc = 3;
Ra = Rin/(fc*C*Rin - 1);
#+end_src
#+begin_src matlab :results value replace :exports results
ans = Ra
#+end_src
#+RESULTS:
: 79804
With this parallel resistance value, the voltage offset would be:
#+begin_src matlab
V_offset = Ra*Rin/(Ra + Rin) * in;
#+end_src
#+begin_src matlab :results value replace :exports results
ans = V_offset
#+end_src
#+RESULTS:
: 0.11454
Which is much more acceptable.
** Sinus
#+begin_src matlab
load('./mat/force_sensor_sin.mat', 't', 'encoder', 'u', 'v');
u = u(t>25);
v = v(t>25);
encoder = encoder(t>25) - mean(encoder(t>25));
t = t(t>25);
#+end_src
The driving voltage is a sinus at 0.5Hz centered on 3V and with an amplitude of 3V (Figure [[fig:force_sensor_sin_u]]).
#+begin_src matlab :exports none
figure;
plot(t, u)
xlabel('Time [s]'); ylabel('Control Voltage [V]');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/force_sensor_sin_u.pdf', 'width', 'normal', 'height', 'small');
#+end_src
#+name: fig:force_sensor_sin_u
#+caption: Driving Voltage
#+RESULTS:
[[file:figs/force_sensor_sin_u.png]]
The full stroke as measured by the encoder is:
#+begin_src matlab :results value replace
max(encoder)-min(encoder)
#+end_src
#+RESULTS:
: 5.005e-05
Its signal is shown in Figure [[fig:force_sensor_sin_encoder]].
#+begin_src matlab :exports none
figure;
plot(t, encoder)
xlabel('Time [s]'); ylabel('Encoder [m]');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/force_sensor_sin_encoder.pdf', 'width', 'normal', 'height', 'small');
#+end_src
#+name: fig:force_sensor_sin_encoder
#+caption: Encoder measurement
#+RESULTS:
[[file:figs/force_sensor_sin_encoder.png]]
The generated voltage by the stack is shown in Figure
#+begin_src matlab :exports none
figure;
plot(t, v)
xlabel('Time [s]'); ylabel('Force Sensor Output [V]');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/force_sensor_sin_stack.pdf', 'width', 'normal', 'height', 'small');
#+end_src
#+name: fig:force_sensor_sin_stack
#+caption: Voltage measured on the stack used as a sensor
#+RESULTS:
[[file:figs/force_sensor_sin_stack.png]]
The capacitance of the stack is
#+begin_src matlab
Cp = 4.4e-6; % [F]
#+end_src
The corresponding generated charge is then shown in Figure [[fig:force_sensor_sin_charge]].
#+begin_src matlab :exports none
figure;
plot(t, 1e6*Cp*(v-mean(v)))
xlabel('Time [s]'); ylabel('Generated Charge [$\mu C$]');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/force_sensor_sin_charge.pdf', 'width', 'normal', 'height', 'small');
#+end_src
#+name: fig:force_sensor_sin_charge
#+caption: Generated Charge
#+RESULTS:
[[file:figs/force_sensor_sin_charge.png]]
The relation between the generated voltage and the measured displacement is almost linear as shown in Figure [[fig:force_sensor_linear_relation]].
#+begin_src matlab
b1 = encoder\(v-mean(v));
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(encoder, v-mean(v), 'DisplayName', 'Measured Voltage');
plot(encoder, encoder*b1, 'DisplayName', sprintf('Linear Fit: $U_s \\approx %.3f [V/\\mu m] \\cdot d$', 1e-6*abs(b1)));
hold off;
xlabel('Measured Displacement [m]'); ylabel('Generated Voltage [V]');
legend();
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/force_sensor_linear_relation.pdf', 'width', 'normal', 'height', 'small');
#+end_src
#+name: fig:force_sensor_linear_relation
#+caption: Almost linear relation between the relative displacement and the generated voltage
#+RESULTS:
[[file:figs/force_sensor_linear_relation.png]]
With a 16bits ADC, the resolution will then be equals to (in [nm]):
#+begin_src matlab :results value replace
abs((20/2^16)/(b1/1e9))
#+end_src
#+RESULTS:
: 3.9838