diff --git a/figs/comp_iff_gains_dvf_plant.pdf b/figs/comp_iff_gains_dvf_plant.pdf new file mode 100644 index 0000000..adaa41b Binary files /dev/null and b/figs/comp_iff_gains_dvf_plant.pdf differ diff --git a/figs/comp_iff_gains_dvf_plant.png b/figs/comp_iff_gains_dvf_plant.png new file mode 100644 index 0000000..2b74e7d Binary files /dev/null and b/figs/comp_iff_gains_dvf_plant.png differ diff --git a/figs/comp_iff_gains_dvf_plant_zoom.pdf b/figs/comp_iff_gains_dvf_plant_zoom.pdf new file mode 100644 index 0000000..50e566c Binary files /dev/null and b/figs/comp_iff_gains_dvf_plant_zoom.pdf differ diff --git a/figs/comp_iff_gains_dvf_plant_zoom.png b/figs/comp_iff_gains_dvf_plant_zoom.png new file mode 100644 index 0000000..f5ee94c Binary files /dev/null and b/figs/comp_iff_gains_dvf_plant_zoom.png differ diff --git a/figs/comp_undamped_opt_iff_gain_diagonal.pdf b/figs/comp_undamped_opt_iff_gain_diagonal.pdf new file mode 100644 index 0000000..1afaf1a Binary files /dev/null and b/figs/comp_undamped_opt_iff_gain_diagonal.pdf differ diff --git a/figs/comp_undamped_opt_iff_gain_diagonal.png b/figs/comp_undamped_opt_iff_gain_diagonal.png new file mode 100644 index 0000000..3126920 Binary files /dev/null and b/figs/comp_undamped_opt_iff_gain_diagonal.png differ diff --git a/figs/damped_iff_plant_comp_diagonal.pdf b/figs/damped_iff_plant_comp_diagonal.pdf new file mode 100644 index 0000000..0778d74 Binary files /dev/null and b/figs/damped_iff_plant_comp_diagonal.pdf differ diff --git a/figs/damped_iff_plant_comp_diagonal.png b/figs/damped_iff_plant_comp_diagonal.png new file mode 100644 index 0000000..0f1d076 Binary files /dev/null and b/figs/damped_iff_plant_comp_diagonal.png differ diff --git a/figs/damped_iff_plant_comp_off_diagonal.pdf b/figs/damped_iff_plant_comp_off_diagonal.pdf new file mode 100644 index 0000000..061815b Binary files /dev/null and b/figs/damped_iff_plant_comp_off_diagonal.pdf differ diff --git a/figs/damped_iff_plant_comp_off_diagonal.png b/figs/damped_iff_plant_comp_off_diagonal.png new file mode 100644 index 0000000..917b868 Binary files /dev/null and b/figs/damped_iff_plant_comp_off_diagonal.png differ diff --git a/matlab/iff_measure.slx.r2019b b/matlab/iff_measure.slx.r2019b new file mode 100644 index 0000000..39d36e3 Binary files /dev/null and b/matlab/iff_measure.slx.r2019b differ diff --git a/matlab/nass-simscape b/matlab/nass-simscape index ef7d7a5..571dfbf 160000 --- a/matlab/nass-simscape +++ b/matlab/nass-simscape @@ -1 +1 @@ -Subproject commit ef7d7a54d507b329d9bf23f1a3495ed7d5618a2d +Subproject commit 571dfbffb4be7f2cf1c061feff1e6140aa2c808c diff --git a/test-bench-nano-hexapod.html b/test-bench-nano-hexapod.html index 026597d..2f178ad 100644 --- a/test-bench-nano-hexapod.html +++ b/test-bench-nano-hexapod.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Nano-Hexapod - Test Bench @@ -39,33 +39,47 @@

Table of Contents

@@ -74,10 +88,10 @@

-In this document, the dynamics of the nano-hexapod shown in Figure 1 is identified. +In this document, the dynamics of the nano-hexapod shown in Figure 1 is identified.

-
+

Here are the documentation of the equipment used for this test bench:

@@ -92,27 +106,27 @@ Here are the documentation of the equipment used for this test bench:
-
+

IMG_20210608_152917.jpg

Figure 1: Nano-Hexapod

-
+

IMG_20210608_154722.jpg

Figure 2: Nano-Hexapod and the control electronics

-
+

nano_hexapod_signals.png

Figure 3: Block diagram of the system with named signals

- +
@@ -229,12 +243,12 @@ Here are the documentation of the equipment used for this test bench:
Table 1: List of signals
-
-

1 Encoders fixed to the Struts

+
+

1 Encoders fixed to the Struts

-
-

1.1 Introduction

+
+

1.1 Introduction

In this section, the encoders are fixed to the struts. @@ -242,12 +256,12 @@ In this section, the encoders are fixed to the struts.

-
-

1.2 Identification of the dynamics

+
+

1.2 Identification of the dynamics

-
-

1.2.1 Load Data

+
+

1.2.1 Load Data

%% Load Identification Data
@@ -262,8 +276,8 @@ meas_data_lf = {};
 
-
-

1.2.2 Spectral Analysis - Setup

+
+

1.2.2 Spectral Analysis - Setup

%% Setup useful variables
@@ -286,11 +300,11 @@ i_hf = f > 250; % Poi
 
-
-

1.2.3 DVF Plant

+
+

1.2.3 DVF Plant

-First, let’s compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure 4). +First, let’s compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure 4).

@@ -306,14 +320,14 @@ coh_dvf_hf = zeros(length(f), 6, 6);
-
+

enc_struts_dvf_coh.png

Figure 4: Obtained coherence for the DVF plant

-Then the 6x6 transfer function matrix is estimated (Figure 5). +Then the 6x6 transfer function matrix is estimated (Figure 5).

%% DVF Plant (transfer function from u to dLm)
@@ -328,7 +342,7 @@ G_dvf_hf = zeros(length(f), 6, 6);
 
-
+

enc_struts_dvf_frf.png

Figure 5: Measured FRF for the DVF plant

@@ -337,11 +351,11 @@ G_dvf_hf = zeros(length(f), 6, 6);
-
-

1.2.4 IFF Plant

+
+

1.2.4 IFF Plant

-First, let’s compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure 6). +First, let’s compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure 6).

@@ -358,14 +372,14 @@ coh_iff_hf = zeros(length(f), 6, 6);
-
+

enc_struts_iff_coh.png

Figure 6: Obtained coherence for the IFF plant

-Then the 6x6 transfer function matrix is estimated (Figure 7). +Then the 6x6 transfer function matrix is estimated (Figure 7).

%% IFF Plant
@@ -380,7 +394,7 @@ G_iff_hf = zeros(length(f), 6, 6);
 
-
+

enc_struts_iff_frf.png

Figure 7: Measured FRF for the IFF plant

@@ -389,16 +403,16 @@ G_iff_hf = zeros(length(f), 6, 6);
-
-

1.3 Comparison with the Simscape Model

+
+

1.3 Comparison with the Simscape Model

In this section, the measured dynamics is compared with the dynamics estimated from the Simscape model.

-
-

1.3.1 Dynamics from Actuator to Force Sensors

+
+

1.3.1 Dynamics from Actuator to Force Sensors

%% Initialize Nano-Hexapod
@@ -420,14 +434,14 @@ Giff = exp(-s*Ts)
 
 
-
+

enc_struts_iff_comp_simscape.png

Figure 8: Diagonal elements of the IFF Plant

-
+

enc_struts_iff_comp_offdiag_simscape.png

Figure 9: Off diagonal elements of the IFF Plant

@@ -435,8 +449,8 @@ Giff = exp(-s*Ts)
-
-

1.3.2 Dynamics from Actuator to Encoder

+
+

1.3.2 Dynamics from Actuator to Encoder

%% Initialization of the Nano-Hexapod
@@ -458,14 +472,14 @@ Gdvf = exp(-s*Ts)
 
 
-
+

enc_struts_dvf_comp_simscape.png

Figure 10: Diagonal elements of the DVF Plant

-
+

enc_struts_dvf_comp_offdiag_simscape.png

Figure 11: Off diagonal elements of the DVF Plant

@@ -474,12 +488,12 @@ Gdvf = exp(-s*Ts)
-
-

1.4 Integral Force Feedback

+
+

1.4 Integral Force Feedback

-
-

1.4.1 Root Locus and Decentralized Loop gain

+
+

1.4.1 Root Locus and Decentralized Loop gain

%% IFF Controller
@@ -491,7 +505,7 @@ Kiff_g1 = (1/(s + 2<
 
-
+

enc_struts_iff_root_locus.png

Figure 12: Root Locus for the IFF control strategy

@@ -507,7 +521,7 @@ Kiff = g*Kiff_g1;
-
+

enc_struts_iff_opt_loop_gain.png

Figure 13: Bode plot of the “decentralized loop gain” \(G_\text{iff}(i,i) \times K_\text{iff}(i,i)\)

@@ -515,12 +529,12 @@ Kiff = g*Kiff_g1;
-
-

1.4.2 Multiple Gains - Simulation

+
+

1.4.2 Multiple Gains - Simulation

%% Tested IFF gains
-iff_gains = [4, 10, 20, 40, 100, 200, 400, 1000];
+iff_gains = [4, 10, 20, 40, 100, 200, 400];
 
@@ -552,7 +566,7 @@ io(io_i) = linio([mdl, '/D'], 1, +

enc_struts_iff_gains_effect_dvf_plant.png

Figure 14: Effect of the IFF gain \(g\) on the transfer function from \(\bm{\tau}\) to \(d\bm{\mathcal{L}}_m\)

@@ -560,19 +574,200 @@ io(io_i) = linio([mdl, '/D'], 1, -

1.4.3 Experimental Results

+
+

1.4.3 Experimental Results - Gains

+
+

+Let’s look at the damping introduced by IFF as a function of the IFF gain and compare that with the results obtained using the Simscape model. +

+
+ +
+
1.4.3.1 Load Data
+
+
+
%% Load Identification Data
+meas_iff_gains = {};
+
+for i = 1:length(iff_gains)
+    meas_iff_gains(i) = {load(sprintf('mat/iff_strut_1_noise_g_%i.mat', iff_gains(i)), 't', 'Vexc', 'Vs', 'de', 'u')};
+end
+
-
-

2 Encoders fixed to the plates

+
+
1.4.3.2 Spectral Analysis - Setup
+
+
+
%% Setup useful variables
+% Sampling Time [s]
+Ts = (meas_iff_gains{1}.t(end) - (meas_iff_gains{1}.t(1)))/(length(meas_iff_gains{1}.t)-1);
+
+% Sampling Frequency [Hz]
+Fs = 1/Ts;
+
+% Hannning Windows
+win = hanning(ceil(1*Fs));
+
+% And we get the frequency vector
+[~, f] = tfestimate(meas_iff_gains{1}.Vexc, meas_iff_gains{1}.de, win, [], [], 1/Ts);
+
+
+
+
+ +
+
1.4.3.3 DVF Plant
+
+
+
%% DVF Plant (transfer function from u to dLm)
+G_iff_gains = {};
+
+for i = 1:length(iff_gains)
+    G_iff_gains{i} = tfestimate(meas_iff_gains{i}.Vexc, meas_iff_gains{i}.de(:,1), win, [], [], 1/Ts);
+end
+
+
+ + +
+

comp_iff_gains_dvf_plant.png +

+

Figure 15: Transfer function from \(u\) to \(d\mathcal{L}_m\) for multiple values of the IFF gain

+
+ + +
+

comp_iff_gains_dvf_plant_zoom.png +

+

Figure 16: Transfer function from \(u\) to \(d\mathcal{L}_m\) for multiple values of the IFF gain (Zoom)

+
+ +
+

+The IFF control strategy is very effective for the damping of the suspension modes. +It however does not damp the modes at 200Hz, 300Hz and 400Hz (flexible modes of the APA). +This is very logical. +

+ +

+Also, the experimental results and the models obtained from the Simscape model are in agreement. +

+ +
+
+
+ +
+
1.4.3.4 Experimental Results - Comparison of the un-damped and fully damped system
+
+ +
+

comp_undamped_opt_iff_gain_diagonal.png +

+

Figure 17: Comparison of the diagonal elements of the tranfer function from \(\bm{u}\) to \(d\bm{\mathcal{L}}_m\) without active damping and with optimal IFF gain

+
+
+
+
+ +
+

1.4.4 Experimental Results - Damped Plant with Optimal gain

+
+

+Let’s now look at the \(6 \times 6\) damped plant with the optimal gain \(g = 400\). +

+
+ +
+
1.4.4.1 Load Data
+
+
+
%% Load Identification Data
+meas_iff_struts = {};
+
+for i = 1:6
+    meas_iff_struts(i) = {load(sprintf('mat/iff_strut_%i_noise_g_400.mat', i), 't', 'Vexc', 'Vs', 'de', 'u')};
+end
+
+
+
+
+ +
+
1.4.4.2 Spectral Analysis - Setup
+
+
+
%% Setup useful variables
+% Sampling Time [s]
+Ts = (meas_iff_struts{1}.t(end) - (meas_iff_struts{1}.t(1)))/(length(meas_iff_struts{1}.t)-1);
+
+% Sampling Frequency [Hz]
+Fs = 1/Ts;
+
+% Hannning Windows
+win = hanning(ceil(1*Fs));
+
+% And we get the frequency vector
+[~, f] = tfestimate(meas_iff_struts{1}.Vexc, meas_iff_struts{1}.de, win, [], [], 1/Ts);
+
+
+
+
+ +
+
1.4.4.3 DVF Plant
+
+
+
%% DVF Plant (transfer function from u to dLm)
+G_iff_opt = {};
+
+for i = 1:6
+    G_iff_opt{i} = tfestimate(meas_iff_struts{i}.Vexc, meas_iff_struts{i}.de, win, [], [], 1/Ts);
+end
+
+
+ + +
+

damped_iff_plant_comp_diagonal.png +

+

Figure 18: Comparison of the diagonal elements of the transfer functions from \(\bm{u}\) to \(d\bm{\mathcal{L}}_m\) with active damping (IFF) applied with an optimal gain \(g = 400\)

+
+ + +
+

damped_iff_plant_comp_off_diagonal.png +

+

Figure 19: Comparison of the off-diagonal elements of the transfer functions from \(\bm{u}\) to \(d\bm{\mathcal{L}}_m\) with active damping (IFF) applied with an optimal gain \(g = 400\)

+
+ +
+

+With the IFF control strategy applied and the optimal gain used, the suspension modes are very well dapmed. +Remains the undamped flexible modes of the APA, and the modes of the plates. +

+ +

+The Simscape model and the experimental results are in very good agreement. +

+ +
+
+
+
+
+
+ +
+

2 Encoders fixed to the plates

Author: Dehaeze Thomas

-

Created: 2021-06-09 mer. 18:13

+

Created: 2021-06-10 jeu. 17:52

diff --git a/test-bench-nano-hexapod.org b/test-bench-nano-hexapod.org index eaac5af..8d23bf7 100644 --- a/test-bench-nano-hexapod.org +++ b/test-bench-nano-hexapod.org @@ -1011,7 +1011,7 @@ exportFig('figs/enc_struts_iff_opt_loop_gain.pdf', 'width', 'wide', 'height', 't *** Multiple Gains - Simulation #+begin_src matlab %% Tested IFF gains -iff_gains = [4, 10, 20, 40, 100, 200, 400, 1000]; +iff_gains = [4, 10, 20, 40, 100, 200, 400]; #+end_src #+begin_src matlab @@ -1081,7 +1081,365 @@ exportFig('figs/enc_struts_iff_gains_effect_dvf_plant.pdf', 'width', 'wide', 'he #+RESULTS: [[file:figs/enc_struts_iff_gains_effect_dvf_plant.png]] -*** Experimental Results +*** Experimental Results - Gains +**** Introduction :ignore: +Let's look at the damping introduced by IFF as a function of the IFF gain and compare that with the results obtained using the Simscape model. + +**** Load Data +#+begin_src matlab +%% Load Identification Data +meas_iff_gains = {}; + +for i = 1:length(iff_gains) + meas_iff_gains(i) = {load(sprintf('mat/iff_strut_1_noise_g_%i.mat', iff_gains(i)), 't', 'Vexc', 'Vs', 'de', 'u')}; +end +#+end_src + +**** Spectral Analysis - Setup +#+begin_src matlab +%% Setup useful variables +% Sampling Time [s] +Ts = (meas_iff_gains{1}.t(end) - (meas_iff_gains{1}.t(1)))/(length(meas_iff_gains{1}.t)-1); + +% Sampling Frequency [Hz] +Fs = 1/Ts; + +% Hannning Windows +win = hanning(ceil(1*Fs)); + +% And we get the frequency vector +[~, f] = tfestimate(meas_iff_gains{1}.Vexc, meas_iff_gains{1}.de, win, [], [], 1/Ts); +#+end_src + +**** DVF Plant +#+begin_src matlab +%% DVF Plant (transfer function from u to dLm) +G_iff_gains = {}; + +for i = 1:length(iff_gains) + G_iff_gains{i} = tfestimate(meas_iff_gains{i}.Vexc, meas_iff_gains{i}.de(:,1), win, [], [], 1/Ts); +end +#+end_src + +#+begin_src matlab :exports none +%% Bode plot of the transfer function from u to dLm for tested values of the IFF gain +freqs = 2*logspace(1, 3, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:length(iff_gains) + plot(f, abs(G_iff_gains{i}), '-', ... + 'DisplayName', sprintf('$g_{iff} = %.0f$', iff_gains(i))); +end +set(gca,'ColorOrderIndex',1) +for i = 1:length(iff_gains) + plot(freqs, abs(squeeze(freqresp(Gd_iff{i}(1,1), freqs, 'Hz'))), '--', ... + 'HandleVisibility', 'off'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); + +ax2 = nexttile; +hold on; +for i =1:length(iff_gains) + plot(f, 180/pi*angle(G_iff_gains{i}), '-'); +end +set(gca,'ColorOrderIndex',1) +for i = 1:length(iff_gains) + plot(freqs, 180/pi*angle(squeeze(freqresp(Gd_iff{i}(1,1), freqs, 'Hz'))), '--'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); +ylim([-180, 180]); +yticks([-180, -90, 0, 90, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([freqs(1), freqs(end)]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/comp_iff_gains_dvf_plant.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:comp_iff_gains_dvf_plant +#+caption: Transfer function from $u$ to $d\mathcal{L}_m$ for multiple values of the IFF gain +#+RESULTS: +[[file:figs/comp_iff_gains_dvf_plant.png]] + +#+begin_src matlab :exports none +xlim([20, 200]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/comp_iff_gains_dvf_plant_zoom.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:comp_iff_gains_dvf_plant_zoom +#+caption: Transfer function from $u$ to $d\mathcal{L}_m$ for multiple values of the IFF gain (Zoom) +#+RESULTS: +[[file:figs/comp_iff_gains_dvf_plant_zoom.png]] + +#+begin_important +The IFF control strategy is very effective for the damping of the suspension modes. +It however does not damp the modes at 200Hz, 300Hz and 400Hz (flexible modes of the APA). +This is very logical. + +Also, the experimental results and the models obtained from the Simscape model are in agreement. +#+end_important + +**** Experimental Results - Comparison of the un-damped and fully damped system +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +freqs = 2*logspace(1, 3, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +% Un Damped measurement +set(gca,'ColorOrderIndex',1) +plot(f(i_lf), abs(G_dvf_lf(i_lf,1, 1)), ... + 'DisplayName', 'Un-Damped') +set(gca,'ColorOrderIndex',1) +plot(f(i_hf), abs(G_dvf_hf(i_hf,1, 1)), ... + 'HandleVisibility', 'off'); +for i = 2:6 + set(gca,'ColorOrderIndex',1) + plot(f(i_lf), abs(G_dvf_lf(i_lf,i, i)), ... + 'HandleVisibility', 'off'); + set(gca,'ColorOrderIndex',1) + plot(f(i_hf), abs(G_dvf_hf(i_hf,i, i)), ... + 'HandleVisibility', 'off'); +end + +% IFF Damped measurement +set(gca,'ColorOrderIndex',2) +plot(f, abs(G_iff_opt{1}(:,1)), ... + 'DisplayName', 'Optimal gain') +for i = 2:6 + set(gca,'ColorOrderIndex',2) + plot(f, abs(G_iff_opt{i}(:,i)), ... + 'HandleVisibility', 'off'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/V_{exc}$ [m/V]'); set(gca, 'XTickLabel',[]); +ylim([1e-9, 1e-3]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +for i =1:6 + set(gca,'ColorOrderIndex',1) + plot(f(i_lf), 180/pi*angle(G_dvf_lf(i_lf,i, i))); + set(gca,'ColorOrderIndex',1) + plot(f(i_hf), 180/pi*angle(G_dvf_hf(i_hf,i, i))); + set(gca,'ColorOrderIndex',2) + plot(f, 180/pi*angle(G_iff_opt{i}(:,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([20, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/comp_undamped_opt_iff_gain_diagonal.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:comp_undamped_opt_iff_gain_diagonal +#+caption: Comparison of the diagonal elements of the tranfer function from $\bm{u}$ to $d\bm{\mathcal{L}}_m$ without active damping and with optimal IFF gain +#+RESULTS: +[[file:figs/comp_undamped_opt_iff_gain_diagonal.png]] + +*** Experimental Results - Damped Plant with Optimal gain +**** Introduction :ignore: +Let's now look at the $6 \times 6$ damped plant with the optimal gain $g = 400$. + +**** Load Data +#+begin_src matlab +%% Load Identification Data +meas_iff_struts = {}; + +for i = 1:6 + meas_iff_struts(i) = {load(sprintf('mat/iff_strut_%i_noise_g_400.mat', i), 't', 'Vexc', 'Vs', 'de', 'u')}; +end +#+end_src + +**** Spectral Analysis - Setup +#+begin_src matlab +%% Setup useful variables +% Sampling Time [s] +Ts = (meas_iff_struts{1}.t(end) - (meas_iff_struts{1}.t(1)))/(length(meas_iff_struts{1}.t)-1); + +% Sampling Frequency [Hz] +Fs = 1/Ts; + +% Hannning Windows +win = hanning(ceil(1*Fs)); + +% And we get the frequency vector +[~, f] = tfestimate(meas_iff_struts{1}.Vexc, meas_iff_struts{1}.de, win, [], [], 1/Ts); +#+end_src + +**** DVF Plant +#+begin_src matlab +%% DVF Plant (transfer function from u to dLm) +G_iff_opt = {}; + +for i = 1:6 + G_iff_opt{i} = tfestimate(meas_iff_struts{i}.Vexc, meas_iff_struts{i}.de, win, [], [], 1/Ts); +end +#+end_src + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +freqs = 2*logspace(1, 3, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +% Diagonal Elements FRF +plot(f, abs(G_iff_opt{1}(:,1)), 'color', [0,0,0,0.2], ... + 'DisplayName', '$d\mathcal{L}_{m,i}/u_i$ - FRF') +for i = 2:6 + plot(f, abs(G_iff_opt{i}(:,i)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); +end + +% Diagonal Elements Model +set(gca,'ColorOrderIndex',2) +plot(freqs, abs(squeeze(freqresp(Gd_iff{end}(1,1), freqs, 'Hz'))), '-', ... + 'DisplayName', '$d\mathcal{L}_{m,i}/u_i$ - Model') +for i = 2:6 + set(gca,'ColorOrderIndex',2) + plot(freqs, abs(squeeze(freqresp(Gd_iff{end}(i,i), freqs, 'Hz'))), '-', ... + 'HandleVisibility', 'off'); +end + +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/V_{exc}$ [m/V]'); set(gca, 'XTickLabel',[]); +ylim([1e-9, 1e-3]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(f, 180/pi*angle(G_iff_opt{i}(:,i)), 'color', [0,0,0,0.2]); + set(gca,'ColorOrderIndex',2) + plot(freqs, 180/pi*angle(squeeze(freqresp(Gd_iff{end}(i,i), freqs, 'Hz')))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([20, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/damped_iff_plant_comp_diagonal.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:damped_iff_plant_comp_diagonal +#+caption: Comparison of the diagonal elements of the transfer functions from $\bm{u}$ to $d\bm{\mathcal{L}}_m$ with active damping (IFF) applied with an optimal gain $g = 400$ +#+RESULTS: +[[file:figs/damped_iff_plant_comp_diagonal.png]] + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +freqs = 2*logspace(1, 3, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +% Off diagonal FRF +plot(f, abs(G_iff_opt{1}(:,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', '$d\mathcal{L}_{m,i}/u_j$ - FRF') +for i = 1:5 + for j = i+1:6 + plot(f, abs(G_iff_opt{i}(:,j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + end +end + +% Off diagonal Model +set(gca,'ColorOrderIndex',2) +plot(freqs, abs(squeeze(freqresp(Gd_iff{end}(1,2), freqs, 'Hz'))), '-', ... + 'DisplayName', '$d\mathcal{L}_{m,i}/u_j$ - Model') +for i = 1:5 + for j = i+1:6 + set(gca,'ColorOrderIndex',2) + plot(freqs, abs(squeeze(freqresp(Gd_iff{end}(i,j), freqs, 'Hz'))), ... + 'HandleVisibility', 'off'); + end +end + +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/V_{exc}$ [m/V]'); set(gca, 'XTickLabel',[]); +ylim([1e-9, 1e-3]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +% Off diagonal FRF +for i = 1:5 + for j = i+1:6 + plot(f, 180/pi*angle(G_iff_opt{i}(:,j)), 'color', [0, 0, 0, 0.2]); + end +end + +% Off diagonal Model +for i = 1:5 + for j = i+1:6 + set(gca,'ColorOrderIndex',2) + plot(freqs, 180/pi*angle(squeeze(freqresp(Gd_iff{end}(i,j), freqs, 'Hz')))); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([20, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/damped_iff_plant_comp_off_diagonal.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:damped_iff_plant_comp_off_diagonal +#+caption: Comparison of the off-diagonal elements of the transfer functions from $\bm{u}$ to $d\bm{\mathcal{L}}_m$ with active damping (IFF) applied with an optimal gain $g = 400$ +#+RESULTS: +[[file:figs/damped_iff_plant_comp_off_diagonal.png]] + +#+begin_important +With the IFF control strategy applied and the optimal gain used, the suspension modes are very well dapmed. +Remains the undamped flexible modes of the APA, and the modes of the plates. + +The Simscape model and the experimental results are in very good agreement. +#+end_important * Encoders fixed to the plates ** Introduction :ignore: diff --git a/test-bench-nano-hexapod.pdf b/test-bench-nano-hexapod.pdf index 69103aa..ebdbbff 100644 Binary files a/test-bench-nano-hexapod.pdf and b/test-bench-nano-hexapod.pdf differ