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">
- +-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:
Figure 1: Nano-Hexapod
Figure 2: Nano-Hexapod and the control electronics
Figure 3: Block diagram of the system with named signals
In this section, the encoders are fixed to the struts. @@ -242,12 +256,12 @@ In this section, the encoders are fixed to the struts.
%% Load Identification Data
@@ -262,8 +276,8 @@ meas_data_lf = {};
%% Setup useful variables @@ -286,11 +300,11 @@ i_hf = f > 250; % Poi
-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).
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);
Figure 5: Measured FRF for the DVF plant
@@ -337,11 +351,11 @@ G_dvf_hf = zeros(length(f), 6, 6);-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).
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);
Figure 7: Measured FRF for the IFF plant
@@ -389,16 +403,16 @@ G_iff_hf = zeros(length(f), 6, 6);In this section, the measured dynamics is compared with the dynamics estimated from the Simscape model.
%% Initialize Nano-Hexapod @@ -420,14 +434,14 @@ Giff = exp(-s*Ts)- +-
Figure 8: Diagonal elements of the IFF Plant
+-
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)- +-
Figure 10: Diagonal elements of the DVF Plant
+-
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<+-
Figure 12: Root Locus for the IFF control strategy
@@ -507,7 +521,7 @@ Kiff = g*Kiff_g1;+-
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
@@ -552,7 +566,7 @@ io(io_i) = linio([mdl, '/D'], 1, +%% Tested IFF gains -iff_gains = [4, 10, 20, 40, 100, 200, 400, 1000]; +iff_gains = [4, 10, 20, 40, 100, 200, 400];
+ +
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 ++++ + ++
+Figure 15: Transfer function from \(u\) to \(d\mathcal{L}_m\) for multiple values of the IFF gain
+++ ++
+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
++ +++++
+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 ++++ + ++
+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\)
+++ ++
+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
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 -Created: 2021-06-09 mer. 18:13
+Created: 2021-06-10 jeu. 17:52