%% Clear Workspace and Close figures clear; close all; clc; %% Intialize Laplace variable s = zpk('s'); %% Path for functions, data and scripts addpath('./mat/'); % Path for data addpath('./src/'); % Path for Functions %% Colors for the figures colors = colororder; %% Nano-Hexapod on top of Micro-Station model mdl = 'nass_rotating_model'; %% Load micro-station parameters load('uniaxial_micro_station_parameters.mat') %% Load controllers load('nass_controllers.mat'); % System dynamics %% Nano-Hexapod mn = 15; % Nano-Hexapod mass [kg] %% Light Sample ms = 1; % Sample Mass [kg] %% General Configuration model_config = struct(); model_config.controller = "open_loop"; % Default: Open-Loop model_config.Tuv_type = "normal"; % Default: 2DoF stage %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Forces [Fu, Fv] io(io_i) = linio([mdl, '/fd'], 1, 'openinput'); io_i = io_i + 1; % Direct Forces on Sample [Fdx, Fdy] io(io_i) = linio([mdl, '/xf'], 1, 'openinput'); io_i = io_i + 1; % Floor Motion [Dfx, Dfy] io(io_i) = linio([mdl, '/ft'], 1, 'openinput'); io_i = io_i + 1; % Micro-Station Disturbances [Ftx, Fty] io(io_i) = linio([mdl, '/nano_hexapod'], 1, 'openoutput'); io_i = io_i + 1; % [Fmu, Fmv] io(io_i) = linio([mdl, '/nano_hexapod'], 2, 'openoutput'); io_i = io_i + 1; % [Du, Dv] io(io_i) = linio([mdl, '/ext_metrology'],1, 'openoutput'); io_i = io_i + 1; % [Dx, Dy] % The dynamics of the undamped and damped plants are identified. % The active damping parameters used are the optimal ones previously identified (i.e. for the rotating nano-hexapod fixed on a rigid platform). %% Voice Coil (i.e. soft) Nano-Hexapod kn = 1e4; % Nano-Hexapod Stiffness [N/m] cn = 2*0.005*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)] Wz = 0; % Rotating Velocity [rad/s] G_vc_norot = linearize(mdl, io, 0.0); G_vc_norot.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_vc_norot.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; Wz = 2*pi; % Rotating Velocity [rad/s] G_vc_fast = linearize(mdl, io, 0.0); G_vc_fast.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_vc_fast.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; %% APA (i.e. relatively stiff) Nano-Hexapod kn = 1e6; % Nano-Hexapod Stiffness [N/m] cn = 2*0.005*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)] Wz = 0; % Rotating Velocity [rad/s] G_md_norot = linearize(mdl, io, 0.0); G_md_norot.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_md_norot.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; Wz = 2*pi; % Rotating Velocity [rad/s] G_md_fast = linearize(mdl, io, 0.0); G_md_fast.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_md_fast.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; %% Piezoelectric (i.e. stiff) Nano-Hexapod kn = 1e8; % Nano-Hexapod Stiffness [N/m] cn = 2*0.005*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)] Wz = 0; % Rotating Velocity [rad/s] G_pz_norot = linearize(mdl, io, 0.0); G_pz_norot.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_pz_norot.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; Wz = 2*pi; % Rotating Velocity [rad/s] G_pz_fast = linearize(mdl, io, 0.0); G_pz_fast.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_pz_fast.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; %% Identify plants with Parallel stiffnesses model_config.Tuv_type = "parallel_k"; % Default: 2DoF stage % Voice Coil kp = 1e3; cp = 2*0.001*sqrt((ms + mn)*kp); kn = 1e4-kp; % Nano-Hexapod Stiffness [N/m] cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)] % Identify dynamics Wz = 2*pi; % [rad/s] G_vc_kp_fast = linearize(mdl, io, 0); G_vc_kp_fast.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_vc_kp_fast.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; Wz = 0; % [rad/s] G_vc_kp_norot = linearize(mdl, io, 0); G_vc_kp_norot.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_vc_kp_norot.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; % APA kp = 1e4; cp = 2*0.001*sqrt((ms + mn)*kp); kn = 1e6 - kp; % Nano-Hexapod Stiffness [N/m] cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)] % Identify dynamics Wz = 2*pi; % [rad/s] G_md_kp_fast = linearize(mdl, io, 0); G_md_kp_fast.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_md_kp_fast.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; Wz = 0; % [rad/s] G_md_kp_norot = linearize(mdl, io, 0); G_md_kp_norot.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_md_kp_norot.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; % Piezo kp = 1e5; cp = 2*0.001*sqrt((ms + mn)*kp); kn = 1e8 - kp; % Nano-Hexapod Stiffness [N/m] cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)] % Identify dynamics Wz = 2*pi; % [rad/s] G_pz_kp_fast = linearize(mdl, io, 0); G_pz_kp_fast.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_pz_kp_fast.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; Wz = 0; % [rad/s] G_pz_kp_norot = linearize(mdl, io, 0); G_pz_kp_norot.InputName = {'Fu', 'Fv', 'Fdx', 'Fdy', 'Dfx', 'Dfy', 'Ftx', 'Fty'}; G_pz_kp_norot.OutputName = {'fu', 'fv', 'Du', 'Dv', 'Dx', 'Dy'}; %% Closed Loop Plants - IFF with HPF G_vc_norot_iff_hpf = feedback(G_vc_norot, Kiff_hpf_vc, 'name'); G_vc_fast_iff_hpf = feedback(G_vc_fast, Kiff_hpf_vc, 'name'); G_md_norot_iff_hpf = feedback(G_md_norot, Kiff_hpf_md, 'name'); G_md_fast_iff_hpf = feedback(G_md_fast, Kiff_hpf_md, 'name'); G_pz_norot_iff_hpf = feedback(G_pz_norot, Kiff_hpf_pz, 'name'); G_pz_fast_iff_hpf = feedback(G_pz_fast, Kiff_hpf_pz, 'name'); %% Closed Loop Plants - IFF with Parallel Stiffness G_vc_norot_iff_kp = feedback(G_vc_kp_norot, Kiff_kp_vc, 'name'); G_vc_fast_iff_kp = feedback(G_vc_kp_fast, Kiff_kp_vc, 'name'); G_md_norot_iff_kp = feedback(G_md_kp_norot, Kiff_kp_md, 'name'); G_md_fast_iff_kp = feedback(G_md_kp_fast, Kiff_kp_md, 'name'); G_pz_norot_iff_kp = feedback(G_pz_kp_norot, Kiff_kp_pz, 'name'); G_pz_fast_iff_kp = feedback(G_pz_kp_fast, Kiff_kp_pz, 'name'); %% Closed Loop Plants - RDC G_vc_norot_rdc = feedback(G_vc_norot, Krdc_vc, 'name'); G_vc_fast_rdc = feedback(G_vc_fast, Krdc_vc, 'name'); G_md_norot_rdc = feedback(G_md_norot, Krdc_md, 'name'); G_md_fast_rdc = feedback(G_md_fast, Krdc_md, 'name'); G_pz_norot_rdc = feedback(G_pz_norot, Krdc_pz, 'name'); G_pz_fast_rdc = feedback(G_pz_fast, Krdc_pz, 'name'); % The undamped and damped plants are shown in Figure ref:fig:rotating_nass_plant_comp_stiffness. % Three nano-hexapod velocities are shown (from left to right): $k_n = \SI{0.01}{\N\per\mu\m}$, $k_n = \SI{1}{\N\per\mu\m}$ and $k_n = \SI{100}{\N\per\mu\m}$. % The direct terms are shown by the solid curves while the coupling terms are shown by the shaded ones. % #+begin_important % It can be observed on Figure ref:fig:rotating_nass_plant_comp_stiffness that: % - Coupling (ratio between the off-diagonal and direct terms) is larger for the soft nano-hexapod % - Damping added by the three proposed techniques is quite high and the obtained plant is rather easy to control % - There is some coupling between nano-hexapod and micro-station dynamics for the stiff nano-hexapod (mode at 200Hz) % - The two proposed IFF modification yields similar results % #+end_important %% Bode plot of the transfer function from nano-hexapod actuator to measured motion by the external metrology freqs_vc = logspace(-1, 2, 1000); freqs_md = logspace(0, 3, 1000); freqs_pz = logspace(0, 3, 1000); figure; tiledlayout(3, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); ax1 = nexttile([2,1]); hold on; plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast('Dx', 'Fu'), freqs_vc, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast('Dy', 'Fu'), freqs_vc, 'Hz'))), 'color', [zeros(1,3), 0.5], ... 'DisplayName', 'Coupling'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_iff_hpf('Dx', 'Fu'), freqs_vc, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_iff_hpf('Dy', 'Fu'), freqs_vc, 'Hz'))), 'color', [colors(1,:), 0.5], ... 'HandleVisibility', 'off'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_iff_kp('Dx', 'Fu'), freqs_vc, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_iff_kp('Dy', 'Fu'), freqs_vc, 'Hz'))), 'color', [colors(2,:), 0.5], ... 'HandleVisibility', 'off'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_rdc('Dx', 'Fu'), freqs_vc, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_rdc('Dy', 'Fu'), freqs_vc, 'Hz'))), 'color', [colors(3,:), 0.5], ... 'HandleVisibility', 'off'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Magnitude [m/N]'); set(gca, 'XTickLabel',[]); ylim([1e-12, 1e-2]) title('$k_n = 0.01\,N/\mu m$'); ax2 = nexttile([2,1]); hold on; plot(freqs_md, abs(squeeze(freqresp(G_md_fast('Dx', 'Fu'), freqs_md, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast('Dy', 'Fu'), freqs_md, 'Hz'))), 'color', [zeros(1,3), 0.5], ... 'DisplayName', 'Coupling'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_iff_hpf('Dx', 'Fu'), freqs_md, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_iff_hpf('Dy', 'Fu'), freqs_md, 'Hz'))), 'color', [colors(1,:), 0.5], ... 'HandleVisibility', 'off'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_iff_kp('Dx', 'Fu'), freqs_md, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_iff_kp('Dy', 'Fu'), freqs_md, 'Hz'))), 'color', [colors(2,:), 0.5], ... 'HandleVisibility', 'off'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_rdc('Dx', 'Fu'), freqs_md, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_rdc('Dy', 'Fu'), freqs_md, 'Hz'))), 'color', [colors(3,:), 0.5], ... 'HandleVisibility', 'off'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XTickLabel',[]); set(gca, 'YTickLabel',[]); ylim([1e-12, 1e-2]) title('$k_n = 1\,N/\mu m$'); ax3 = nexttile([2,1]); hold on; plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast('Dx', 'Fu'), freqs_pz, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast('Dy', 'Fu'), freqs_pz, 'Hz'))), 'color', [zeros(1,3), 0.5], ... 'DisplayName', 'Coupling'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_iff_hpf('Dx', 'Fu'), freqs_pz, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_iff_hpf('Dy', 'Fu'), freqs_pz, 'Hz'))), 'color', [colors(1,:), 0.5], ... 'HandleVisibility', 'off'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_iff_kp('Dx', 'Fu'), freqs_pz, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_iff_kp('Dy', 'Fu'), freqs_pz, 'Hz'))), 'color', [colors(2,:), 0.5], ... 'HandleVisibility', 'off'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_rdc('Dx', 'Fu'), freqs_pz, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_rdc('Dy', 'Fu'), freqs_pz, 'Hz'))), 'color', [colors(3,:), 0.5], ... 'HandleVisibility', 'off'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XTickLabel',[]); set(gca, 'YTickLabel',[]); ylim([1e-12, 1e-2]) ldg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); ldg.ItemTokenSize = [20, 1]; title('$k_n = 100\,N/\mu m$'); ax1b = nexttile; hold on; plot(freqs_vc, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_fast('Dx', 'Fu'), freqs_vc, 'Hz')))), 'color', zeros(1,3)); plot(freqs_vc, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_fast_iff_hpf('Dx', 'Fu'), freqs_vc, 'Hz')))), 'color', colors(1,:)); plot(freqs_vc, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_fast_iff_kp('Dx', 'Fu'), freqs_vc, 'Hz')))), 'color', colors(2,:)); plot(freqs_vc, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_fast_rdc('Dx', 'Fu'), freqs_vc, 'Hz')))), 'color', colors(3,:)); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); hold off; yticks(-360:90:360); ylim([-270, 90]); ax2b = nexttile; hold on; plot(freqs_md, 180/pi*unwrap(angle(squeeze(freqresp(G_md_fast('Dx', 'Fu'), freqs_md, 'Hz')))), 'color', zeros(1,3)); plot(freqs_md, 180/pi*unwrap(angle(squeeze(freqresp(G_md_fast_iff_hpf('Dx', 'Fu'), freqs_md, 'Hz')))), 'color', colors(1,:)); plot(freqs_md, 180/pi*unwrap(angle(squeeze(freqresp(G_md_fast_iff_kp('Dx', 'Fu'), freqs_md, 'Hz')))), 'color', colors(2,:)); plot(freqs_md, 180/pi*unwrap(angle(squeeze(freqresp(G_md_fast_rdc('Dx', 'Fu'), freqs_md, 'Hz')))), 'color', colors(3,:)); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); hold off; yticks(-360:90:360); ylim([-270, 90]); ax3b = nexttile; hold on; plot(freqs_pz, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_fast('Dx', 'Fu'), freqs_pz, 'Hz')))), 'color', zeros(1,3)); plot(freqs_pz, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_fast_iff_hpf('Dx', 'Fu'), freqs_pz, 'Hz')))), 'color', colors(1,:)); plot(freqs_pz, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_fast_iff_kp('Dx', 'Fu'), freqs_pz, 'Hz')))), 'color', colors(2,:)); plot(freqs_pz, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_fast_rdc('Dx', 'Fu'), freqs_pz, 'Hz')))), 'color', colors(3,:)); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); hold off; yticks(-360:90:360); ylim([-270, 90]); linkaxes([ax1,ax1b],'x'); xlim([freqs_vc(1), freqs_vc(end)]); linkaxes([ax2,ax2b],'x'); xlim([freqs_md(1), freqs_md(end)]); linkaxes([ax3,ax3b],'x'); xlim([freqs_pz(1), freqs_pz(end)]); % #+name: fig:rotating_nass_plant_comp_stiffness % #+caption: Bode plot of the transfer function from nano-hexapod actuator to measured motion by the external metrology % #+RESULTS: % [[file:figs/rotating_nass_plant_comp_stiffness.png]] % To confirm that the coupling is smaller when the stiffness of the nano-hexapod is increase, the /coupling ratio/ for the three nano-hexapod stiffnesses are shown in Figure ref:fig:rotating_nass_plant_coupling_comp. %% Coupling ratio for the proposed active damping techniques evaluated for the three nano-hexapod stiffnesses figure; freqs_vc = logspace(-1, 2, 1000); freqs_md = logspace(0, 3, 1000); freqs_pz = logspace(0, 3, 1000); figure; tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); ax1 = nexttile(); hold on; plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast('Dy', 'Fu')/G_vc_fast('Dx', 'Fu'), freqs_vc, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_iff_hpf('Dy', 'Fu')/G_vc_fast_iff_hpf('Dx', 'Fu'), freqs_vc, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_iff_kp('Dy', 'Fu')/G_vc_fast_iff_kp('Dx', 'Fu'), freqs_vc, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs_vc, abs(squeeze(freqresp(G_vc_fast_rdc('Dy', 'Fu')/G_vc_fast_rdc('Dx', 'Fu'), freqs_vc, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('Coupling Ratio'); title('$k_n = 0.01\,N/\mu m$'); ax2 = nexttile(); hold on; plot(freqs_md, abs(squeeze(freqresp(G_md_fast('Dy', 'Fu')/G_md_fast('Dx', 'Fu'), freqs_md, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_iff_hpf('Dy', 'Fu')/G_md_fast_iff_hpf('Dx', 'Fu'), freqs_md, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_iff_kp('Dy', 'Fu')/G_md_fast_iff_kp('Dx', 'Fu'), freqs_md, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs_md, abs(squeeze(freqresp(G_md_fast_rdc('Dy', 'Fu')/G_md_fast_rdc('Dx', 'Fu'), freqs_md, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); title('$k_n = 1\,N/\mu m$'); ax3 = nexttile(); hold on; plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast('Dy', 'Fu')/G_pz_fast('Dx', 'Fu'), freqs_pz, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_iff_hpf('Dy', 'Fu')/G_pz_fast_iff_hpf('Dx', 'Fu'), freqs_pz, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_iff_kp('Dy', 'Fu')/G_pz_fast_iff_kp('Dx', 'Fu'), freqs_pz, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs_pz, abs(squeeze(freqresp(G_pz_fast_rdc('Dy', 'Fu')/G_pz_fast_rdc('Dx', 'Fu'), freqs_pz, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); title('$k_n = 100\,N/\mu m$'); ldg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1); ldg.ItemTokenSize = [20, 1]; linkaxes([ax1,ax2,ax3], 'y') % Effect of disturbances % The effect of three disturbances are considered: % - Floor motion (Figure ref:fig:rotating_nass_effect_floor_motion) % - Micro-Station vibrations (Figure ref:fig:rotating_nass_effect_stage_vibration) % - Direct force applied on the payload (Figure ref:fig:rotating_nass_effect_direct_forces) % #+begin_important % Conclusions are similar than with the uniaxial (non-rotating) model: % - Regarding the effect of floor motion and forces applied on the payload: % - The stiffer, the better (magnitudes are lower for the right curves, Figures ref:fig:rotating_nass_effect_floor_motion and ref:fig:rotating_nass_effect_direct_forces) % - Integral Force Feedback degrades the performances at low frequency compared to relative damping control % - Regarding the effect of micro-station vibrations: % - Having a soft nano-hexapod allows to filter these vibrations between the suspensions modes of the nano-hexapod and some flexible modes of the micro-station. Using relative damping control reduce this filtering (Figure ref:fig:rotating_nass_effect_stage_vibration, left). % #+end_important %% Effect of Floor motion on the position error - Comparison of active damping techniques for the three nano-hexapod stiffnesses freqs = logspace(-1, 3, 1000); figure; tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); ax1 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_vc_fast('Dx', 'Dfx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_iff_hpf('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_iff_kp('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_rdc('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('Magnitude $d_x/D_{f,x}$ [m/N]'); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 0.01\,N/\mu m$'); ax2 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_md_fast('Dx', 'Dfx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_md_fast_iff_hpf('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_md_fast_iff_kp('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_md_fast_rdc('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 1\,N/\mu m$'); ax3 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_pz_fast('Dx', 'Dfx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_iff_hpf('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_iff_kp('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_rdc('Dx', 'Dfx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 100\,N/\mu m$'); ldg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1); ldg.ItemTokenSize = [20, 1]; linkaxes([ax1,ax2,ax3], 'y') % #+name: fig:rotating_nass_effect_floor_motion % #+caption: Effect of Floor motion on the position error - Comparison of active damping techniques for the three nano-hexapod stiffnesses % #+RESULTS: % [[file:figs/rotating_nass_effect_floor_motion.png]] %% Effect of micro-station vibrations on the position error - Comparison of active damping techniques for the three nano-hexapod stiffnesses figure; tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); ax1 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_vc_fast('Dx', 'Ftx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_iff_hpf('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_iff_kp('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_rdc('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('Magnitude $d_x/f_{t,x}$ [m/N]'); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 0.01\,N/\mu m$'); ax2 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_md_fast('Dx', 'Ftx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_md_fast_iff_hpf('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_md_fast_iff_kp('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_md_fast_rdc('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 1\,N/\mu m$'); ax3 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_pz_fast('Dx', 'Ftx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_iff_hpf('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_iff_kp('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_rdc('Dx', 'Ftx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 100\,N/\mu m$'); ldg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1); ldg.ItemTokenSize = [20, 1]; linkaxes([ax1,ax2,ax3], 'y') % #+name: fig:rotating_nass_effect_stage_vibration % #+caption: Effect of micro-station vibrations on the position error - Comparison of active damping techniques for the three nano-hexapod stiffnesses % #+RESULTS: % [[file:figs/rotating_nass_effect_stage_vibration.png]] %% Effect of sample forces on the position error - Comparison of active damping techniques for the three nano-hexapod stiffnesses figure; tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); ax1 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_vc_fast('Dx', 'Fdx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_iff_hpf('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_iff_kp('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_vc_fast_rdc('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('Magnitude $d_x/f_{s,x}$ [m/N]'); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 0.01\,N/\mu m$'); ax2 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_md_fast('Dx', 'Fdx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_md_fast_iff_hpf('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_md_fast_iff_kp('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_md_fast_rdc('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 1\,N/\mu m$'); ax3 = nexttile(); hold on; plot(freqs, abs(squeeze(freqresp(G_pz_fast('Dx', 'Fdx'), freqs, 'Hz'))), 'color', zeros(1,3), ... 'DisplayName', 'OL'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_iff_hpf('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(1,:), ... 'DisplayName', 'IFF + $k_p$'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_iff_kp('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(2,:), ... 'DisplayName', 'IFF + HPF'); plot(freqs, abs(squeeze(freqresp(G_pz_fast_rdc('Dx', 'Fdx'), freqs, 'Hz'))), 'color', colors(3,:), ... 'DisplayName', 'RDC'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); xticks([1e-1, 1e0, 1e1, 1e2, 1e3]); xtickangle(0) title('$k_n = 100\,N/\mu m$'); ldg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1); ldg.ItemTokenSize = [20, 1]; linkaxes([ax1,ax2,ax3], 'y')