Add two sections (payload dynamics and limited support compliance)
This commit is contained in:
Binary file not shown.
@@ -18,56 +18,30 @@ freqs = logspace(0, 3, 1000);
|
||||
|
||||
|
||||
|
||||
% #+name: fig:micro_station_meas_dynamics_schematic
|
||||
% #+caption: Measurement setup - Schematic
|
||||
% #+RESULTS:
|
||||
% #+name: fig:micro_station_uniaxial_model
|
||||
% #+caption: Schematic of the Micro-Station measurement setup and uniaxial model.
|
||||
% #+begin_figure
|
||||
% #+attr_latex: :caption \subcaption{\label{fig:micro_station_meas_dynamics_schematic}Measurement setup - Schematic}
|
||||
% #+attr_latex: :options {0.69\textwidth}
|
||||
% #+begin_subfigure
|
||||
% #+attr_latex: :scale 1
|
||||
% [[file:figs/micro_station_meas_dynamics_schematic.png]]
|
||||
% #+end_subfigure
|
||||
% #+attr_latex: :caption \subcaption{\label{fig:uniaxial_model_micro_station}Uniaxial model of the micro-station}
|
||||
% #+attr_latex: :options {0.29\textwidth}
|
||||
% #+begin_subfigure
|
||||
% #+attr_latex: :scale 1
|
||||
% [[file:figs/uniaxial_model_micro_station.png]]
|
||||
% #+end_subfigure
|
||||
% #+end_figure
|
||||
|
||||
% Due to the bad coherence at low frequency, the frequency response functions are only shown between 20 and 200Hz (Figure ref:fig:uniaxial_measured_frf_vertical).
|
||||
% Due to the bad coherence at low frequency, the frequency response functions will only be shown between 20 and 200Hz (solid lines in Figure ref:fig:uniaxial_comp_frf_meas_model).
|
||||
|
||||
|
||||
%% Load measured FRF
|
||||
load('meas_microstation_frf.mat');
|
||||
|
||||
%% Measured Frequency Response Functions in the vertical direction
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(f(f>20), abs(frf_Fhx_to_Dhx(f>20)), ...
|
||||
'DisplayName', '$D_{h}/F_{h}$');
|
||||
plot(f(f>20), abs(frf_Fgx_to_Dhx(f>20)), ...
|
||||
'DisplayName', '$D_{h}/F_{g}$');
|
||||
plot(f(f>20), abs(frf_Fgx_to_Dgx(f>20)), ...
|
||||
'DisplayName', '$D_{g}/F_{g}$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-10, 2e-6]);
|
||||
legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
plot(f(f>20), 180/pi*unwrap(angle(frf_Fhx_to_Dhx(f>20))));
|
||||
plot(f(f>30), 180/pi*unwrap(angle(frf_Fgx_to_Dhx(f>30))));
|
||||
plot(f(f>20), 180/pi*unwrap(angle(frf_Fgx_to_Dgx(f>20))));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||
hold off;
|
||||
yticks(-360:90:360);
|
||||
ylim([-360, 10]);
|
||||
|
||||
linkaxes([ax1,ax2],'x');
|
||||
xlim([1, 500]);
|
||||
|
||||
|
||||
|
||||
% #+name: fig:uniaxial_model_micro_station
|
||||
% #+caption: Uniaxial model of the micro-station
|
||||
% #+RESULTS:
|
||||
% [[file:figs/uniaxial_model_micro_station.png]]
|
||||
|
||||
% Masses are estimated from the CAD.
|
||||
|
||||
@@ -115,7 +89,9 @@ G_id.InputName = {'Fg', 'Fh'};
|
||||
G_id.OutputName = {'Dg', 'Dh'};
|
||||
|
||||
% Comparison of the model and measurements
|
||||
% The comparison between the measurements and the model is done in Figure ref:fig:uniaxial_comp_frf_meas_model.
|
||||
% The comparison between the measurements and the model is shown in Figure ref:fig:uniaxial_comp_frf_meas_model.
|
||||
|
||||
% Only three modes are modelled with frequencies at 70Hz, 140Hz and 320Hz.
|
||||
|
||||
% As the model is simplistic, the goal is not to match exactly the measurement but to have a first approximation.
|
||||
% More accurate models will be used later on.
|
||||
|
@@ -36,11 +36,13 @@ cn = 2*0.01*sqrt(mn*kn); % [N/(m/s)]
|
||||
%% Sample Mass
|
||||
ms = 10; % [kg]
|
||||
|
||||
% Obtained Dynamics
|
||||
% Obtained Dynamic Response
|
||||
% The sensitivity to disturbances (i.e. $x_f$, $f_t$ and $f_s$) are shown in Figure ref:fig:uniaxial_sensitivity_dist_first_params.
|
||||
% The /plant/ (i.e. the transfer function from actuator force $f$ to measured displacement $d$) is shown in Figure ref:fig:uniaxial_plant_first_params.
|
||||
|
||||
% #+begin_important
|
||||
% For further analysis, 9 configurations are considered: three nano-hexapod stiffnesses ($k_n = 0.01\,N/\mu m$, $k_n = 1\,N/\mu m$ and $k_n = 100\,N/\mu m$) combined with three sample's masses ($m_s = 1\,kg$, $m_s = 25\,kg$ and $m_s = 50\,kg$).
|
||||
% #+end_important
|
||||
|
||||
|
||||
%% Use 1DoF Nano-Hexpod model
|
||||
@@ -95,7 +97,7 @@ xlim([1, 500]);
|
||||
|
||||
|
||||
% #+name: fig:uniaxial_sensitivity_dist_first_params
|
||||
% #+caption: Sensitivity to disturbances
|
||||
% #+caption: Sensitivity of the relative motion $d$ to disturbances: $f_s$ the direct forces applied on the sample, $f_t$ disturbances from the micro-station stages and $x_f$ the floor motion (from left to right)
|
||||
% #+RESULTS:
|
||||
% [[file:figs/uniaxial_sensitivity_dist_first_params.png]]
|
||||
|
||||
|
@@ -76,7 +76,7 @@ psd_xf = psd_V.*abs(squeeze(freqresp(G_geo, f, 'Hz'))).^2; % [m^2/Hz]
|
||||
% The amplitude spectral density $\Gamma_{x_f}$ of the measured displacement $x_f$ is shown in Figure ref:fig:asd_floor_motion_id31.
|
||||
|
||||
|
||||
%% Measured Amplitude Spectral Density of the Floor motion on ID31
|
||||
%% Amplitude Spectral Density of the measured Floor motion on ID31
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, sqrt(psd_xf), 'DisplayName', '$\Gamma_{x_{f}}$');
|
||||
@@ -114,7 +114,7 @@ win = hanning(ceil(2*Fs)); % Hanning window
|
||||
% It is shown that the spindle rotation induces vibrations in a wide frequency spectrum.
|
||||
|
||||
|
||||
%% Measured Amplitude Spectral Density of the relative motion between the granite and the micro-hexapod's top platform during Spindle rotating
|
||||
%% Amplitude Spectral Density of the relative motion measured between the granite and the micro-hexapod's top platform during Spindle rotating
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, sqrt(psd_vft)./(2*pi*f), 'DisplayName', '6rpm');
|
||||
@@ -128,7 +128,7 @@ xlim([1, 500]); ylim([1e-12, 1e-7])
|
||||
|
||||
|
||||
% #+name: fig:asd_vibration_spindle_rotation
|
||||
% #+caption: Measured Amplitude Spectral Density of the relative motion between the granite and the micro-hexapod's top platform during Spindle rotating
|
||||
% #+caption: Amplitude Spectral Density of the relative motion measured between the granite and the micro-hexapod's top platform during Spindle rotating
|
||||
% #+RESULTS:
|
||||
% [[file:figs/asd_vibration_spindle_rotation.png]]
|
||||
|
||||
|
@@ -32,10 +32,10 @@ load('uniaxial_plants.mat', 'G_vc_light', 'G_md_light', 'G_pz_light', ...
|
||||
% The obtained sensitivity to disturbances for the three nano-hexapod stiffnesses are shown in Figure ref:fig:uniaxial_sensitivity_disturbances_nano_hexapod_stiffnesses for the light sample (same conclusions can be drawn with the heavy one).
|
||||
|
||||
% #+begin_important
|
||||
% From Figure ref:fig:uniaxial_sensitivity_disturbances_nano_hexapod_stiffnesses, following can be concluded for the *soft nano-hexapod*:
|
||||
% From Figure ref:fig:uniaxial_sensitivity_disturbances_nano_hexapod_stiffnesses, the following can be concluded for the *soft nano-hexapod*:
|
||||
% - It is more sensitive to forces applied on the sample (cable forces for instance), which is expected due to the lower stiffness
|
||||
% - Between the suspension mode of the nano-hexapod (here at 5Hz) and the first mode of the micro-station (here at 70Hz), the disturbances induced by the stage vibrations are filtered out.
|
||||
% - Above the suspension mode of the nano-hexapod, the sample's motion is unaffected by the floor motion, and therefore the sensitivity to floor motion is almost $1$.
|
||||
% - Above the suspension mode of the nano-hexapod, the sample's motion is unaffected by the floor motion, and therefore the sensitivity to floor motion is close to $1$.
|
||||
% #+end_important
|
||||
|
||||
|
||||
|
@@ -23,11 +23,12 @@ load('uniaxial_plants.mat', 'G_vc_light', 'G_md_light', 'G_pz_light', ...
|
||||
|
||||
% Plant Dynamics for Active Damping
|
||||
% The plant dynamics for all three active damping techniques are shown in Figure ref:fig:uniaxial_plant_active_damping_techniques.
|
||||
% All have *alternating poles and zeros* meaning that the phase is bounded to $\pm 90\,\text{deg}$ which makes the controller very robust.
|
||||
% All have *alternating poles and zeros* meaning that the phase do not vary by more than $\pm 90\,\text{deg}$ which makes the design of a robust controller very easy.
|
||||
% The reason all three plants in Figure ref:fig:uniaxial_plant_active_damping_techniques have alternating poles and zeros is because the three sensors are all collocated with the actuator [[cite:&preumont18_vibrat_contr_activ_struc_fourt_edition Chapter 7]].
|
||||
|
||||
% When the nano-hexapod's suspension modes are at lower frequencies than the resonances of the micro-station (blue and red curves in Figure ref:fig:uniaxial_plant_active_damping_techniques), the resonances of the micro-stations have little impact on the transfer functions from IFF and DVF.
|
||||
% When the nano-hexapod's suspension modes are at lower frequencies than the resonances of the micro-station (blue and red curves in Figure ref:fig:uniaxial_plant_active_damping_techniques), the resonances of the micro-stations have little impact on the IFF and DVF transfer functions.
|
||||
|
||||
% For the stiff nano-hexapod, the micro-station dynamics can be seen on the transfer functions in Figure ref:fig:uniaxial_plant_active_damping_techniques.
|
||||
% For the stiff nano-hexapod (yellow curves), the micro-station dynamics can be seen on the transfer functions in Figure ref:fig:uniaxial_plant_active_damping_techniques.
|
||||
% Therefore, it is expected that the micro-station dynamics might impact the achievable damping if a stiff nano-hexapod is used.
|
||||
|
||||
|
||||
@@ -145,13 +146,21 @@ linkaxes([ax1,ax2,ax3,ax1b,ax2b,ax3b],'x');
|
||||
xlim([1, 1000]);
|
||||
|
||||
% Achievable Damping - Root Locus
|
||||
% <<ssec:uniaxial_active_damping_achievable_damping>>
|
||||
% The Root Locus are computed for the three nano-hexapod stiffnesses and for the three active damping techniques.
|
||||
% They are shown in Figure ref:fig:uniaxial_root_locus_damping_techniques.
|
||||
|
||||
% All three active damping approach can lead to *critical damping* of the nano-hexapod suspension mode.
|
||||
|
||||
% There is even a little bit of authority on micro-station modes with IFF and DVF applied on the stiff nano-hexapod (Figure ref:fig:uniaxial_root_locus_damping_techniques, right) and with RDC for a soft nano-hexapod (Figure ref:fig:uniaxial_root_locus_damping_techniques_micro_station_mode).
|
||||
% This can be explained by the fact that above the suspension mode of the soft nano-hexapod, the relative motion sensor acts as an inertial sensor for the micro-station top platform. Therefore, it is like DVF was applied (the nano-hexapod acts as a geophone!).
|
||||
% There is even some damping authority on micro-station modes in the following cases:
|
||||
% - IFF with a stiff nano-hexapod (Figure ref:fig:uniaxial_root_locus_damping_techniques, right) ::
|
||||
% This can be understood from the mechanical equivalent of IFF shown in Figure ref:fig:uniaxial_active_damping_iff_equiv (right) considering an high stiffness $k$.
|
||||
% The micro-station top platform is connected to an inertial mass (the nano-hexapod) through a damper, which damps the micro-station suspension suspension mode.
|
||||
% - DVF with a stiff nano-hexapod (Figure ref:fig:uniaxial_root_locus_damping_techniques, right) ::
|
||||
% In that case, the "sky hook damper" (see mechanical equivalent of IFF in Figure ref:fig:uniaxial_active_damping_dvf_equiv, right) is connected to the micro-station top platform through the stiff nano-hexapod.
|
||||
% - RDC with a soft nano-hexapod (Figure ref:fig:uniaxial_root_locus_damping_techniques_micro_station_mode) ::
|
||||
% At the frequency of the micro-station mode, the nano-hexapod top mass is behaving as an inertial reference as the suspension mode of the soft nano-hexapod is at much lower frequency.
|
||||
% The micro-station and the nano-hexapod masses are connected through a large damper induced by RDC (see mechanical equivalent in Figure ref:fig:uniaxial_active_damping_rdc_equiv, right) which allows some damping of the micro-station.
|
||||
|
||||
|
||||
%% Active Damping Robustness to change of sample's mass - Root Locus for all three damping techniques with 3 different sample's masses
|
||||
@@ -286,7 +295,7 @@ xlim([-4000, 0]); ylim([0, 4000]);
|
||||
|
||||
|
||||
% #+name: fig:uniaxial_root_locus_damping_techniques
|
||||
% #+caption: Root Loci for the three active damping techniques (IFF in blue, RDC in red and DVF in yellow). This is shown for three nano-hexapod stiffnesses.
|
||||
% #+caption: Root Loci for the three active damping techniques (IFF in blue, RDC in red and DVF in yellow). This is shown for three nano-hexapod stiffnesses. The Root Loci are zoomed on the suspension mode of the nano-hexapod.
|
||||
% #+RESULTS:
|
||||
% [[file:figs/uniaxial_root_locus_damping_techniques.png]]
|
||||
|
||||
@@ -425,7 +434,7 @@ isstable(G_dvf_vc_light) && isstable(G_dvf_vc_mid) && isstable(G_dvf_vc_heavy) &
|
||||
isstable(G_dvf_md_light) && isstable(G_dvf_md_mid) && isstable(G_dvf_md_heavy) && ...
|
||||
isstable(G_dvf_pz_light) && isstable(G_dvf_pz_mid) && isstable(G_dvf_pz_heavy)
|
||||
|
||||
%% Save Active Damping Controller
|
||||
%% Save Damped Plants
|
||||
save('./mat/uniaxial_damped_plants.mat', 'G_iff_vc_light', 'G_iff_md_light', 'G_iff_pz_light', ...
|
||||
'G_rdc_vc_light', 'G_rdc_md_light', 'G_rdc_pz_light', ...
|
||||
'G_dvf_vc_light', 'G_dvf_md_light', 'G_dvf_pz_light', ...
|
||||
@@ -437,6 +446,8 @@ save('./mat/uniaxial_damped_plants.mat', 'G_iff_vc_light', 'G_iff_md_light', 'G_
|
||||
'G_dvf_vc_heavy', 'G_dvf_md_heavy', 'G_dvf_pz_heavy');
|
||||
|
||||
% Change of sensitivity to disturbances
|
||||
% <<ssec:uniaxial_active_damping_sensitivity_disturbances>>
|
||||
|
||||
% The sensitivity to disturbances (direct forces $f_s$, stage vibrations $f_t$ and floor motion $x_f$) for all three active damping techniques are compared in Figure ref:fig:uniaxial_sensitivity_dist_active_damping.
|
||||
% The comparison is done with the nano-hexapod having a stiffness $k_n = 1\,N/\mu m$.
|
||||
|
||||
@@ -490,10 +501,11 @@ linkaxes([ax1,ax2,ax3],'x');
|
||||
xlim([1, 500]);
|
||||
|
||||
% Noise Budgeting after Active Damping
|
||||
% <<ssec:uniaxial_active_damping_noise_budget>>
|
||||
% Cumulative Amplitude Spectrum of the distance $d$ with all three active damping techniques are compared in Figure ref:fig:uniaxial_cas_active_damping.
|
||||
% All three active damping methods are giving similar results (except the RDC which is a little bit worse for the stiff nano-hexapod).
|
||||
|
||||
% Compare to the open-loop case, the active damping helps to lower the vibrations induced by the nano-hexapod resonance.
|
||||
% Compared to the open-loop case, the active damping helps to lower the vibrations induced by the nano-hexapod resonance.
|
||||
|
||||
|
||||
%% Cumulative Amplitude Spectrum of the distance d with all three active damping techniques
|
||||
@@ -565,7 +577,7 @@ linkaxes([ax1,ax2,ax3], 'xy')
|
||||
xlim([1, 500]);
|
||||
ylim([2e-10, 3e-6])
|
||||
|
||||
% Obtained Damped Plant
|
||||
% Obtained Closed Loop Response
|
||||
% The transfer functions from the plant input $f$ to the relative displacement $d$ while the active damping is implemented are shown in Figure ref:fig:uniaxial_damped_plant_three_active_damping_techniques.
|
||||
% All three active damping techniques yield similar damped plants.
|
||||
|
||||
@@ -744,6 +756,8 @@ linkaxes([ax1,ax2,ax3,ax1b,ax2b,ax3b],'x');
|
||||
xlim([1, 1e3]);
|
||||
|
||||
% Robustness to change of payload's mass
|
||||
% <<ssec:uniaxial_active_damping_robustness>>
|
||||
|
||||
% The Root Locus for the three damping techniques are shown in Figure ref:fig:uniaxial_active_damping_robustness_mass_root_locus for three sample's mass (1kg, 25kg and 50kg).
|
||||
% The closed-loop poles are shown by the squares for a specific gain.
|
||||
|
||||
|
@@ -33,10 +33,17 @@ load('uniaxial_damped_plants.mat', 'G_iff_vc_light', 'G_iff_md_light', 'G_iff_pz
|
||||
'G_dvf_vc_heavy', 'G_dvf_md_heavy', 'G_dvf_pz_heavy');
|
||||
|
||||
% Damped Plant Dynamics
|
||||
% <<ssec:uniaxial_position_control_damped_dynamics>>
|
||||
|
||||
% As was shown in Section ref:sec:uniaxial_active_damping, all three proposed active damping techniques yield similar damping plants.
|
||||
% Therefore, /Integral Force Feedback/ will be used in this section to study the HAC-LAC performances.
|
||||
% Therefore, /Integral Force Feedback/ will be used in this section to study the HAC-LAC performance.
|
||||
|
||||
% The obtained damped plants for the three nano-hexapod stiffnesses are shown in Figure ref:fig:uniaxial_hac_iff_damped_plants_masses.
|
||||
% For $k_n = 0.01\,N/\mu m$ and $k_n = 1\,N/\mu m$, except from the nano-hexapod mode, the dynamics is quite simple and can be well approximated by a second order plant.
|
||||
% However, this is not the case for the stiff nano-hexapod ($k_n = 100\,N/\mu m$) where two modes can be seen (Figure ref:fig:uniaxial_hac_iff_damped_plants_masses, right).
|
||||
|
||||
% This is due to the interaction between the micro-station (modelled modes at 70Hz, 140Hz and 320Hz) and the nano-hexapod.
|
||||
% Such effect will be explained in Section ref:sec:uniaxial_support_compliance.
|
||||
|
||||
|
||||
%% Damped plant - Robustness to change of sample's mass
|
||||
@@ -45,22 +52,28 @@ tiledlayout(3, 3, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_vc_light('d', 'f'), freqs, 'Hz'))), '-', 'DisplayName', '$m_s = 1\,kg$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_vc_mid( 'd', 'f'), freqs, 'Hz'))), '-', 'DisplayName', '$m_s = 25\,kg$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_vc_heavy('d', 'f'), freqs, 'Hz'))), '-', 'DisplayName', '$m_s = 50\,kg$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_vc_light('d', 'f'), freqs, 'Hz'))), 'color', [colors(1,:), 0.5]);
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_vc_light('d', 'f'), freqs, 'Hz'))), 'color', colors(1,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_vc_mid( 'd', 'f'), freqs, 'Hz'))), 'color', colors(2,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_vc_heavy('d', 'f'), freqs, 'Hz'))), 'color', colors(3,:));
|
||||
loglog(10.^(0.4*cos([0:0.01:2*pi])+log10(100)), ...
|
||||
10.^(0.8*sin([0:0.01:2*pi]-pi/4)+log10(8e-8)), 'k--');
|
||||
text(20, 4e-8, sprintf('Small\nInteraction'), 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
title('$k_n = 0.01\,N/\mu m$');
|
||||
ylim([5e-10, 1e-3]);
|
||||
ldg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [20, 1];
|
||||
|
||||
ax2 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_md_light('d', 'f'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_md_mid( 'd', 'f'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_md_heavy('d', 'f'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_md_light('d', 'f'), freqs, 'Hz'))), 'color', [colors(1,:), 0.5]);
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_md_light('d', 'f'), freqs, 'Hz'))), 'color', colors(1,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_md_mid( 'd', 'f'), freqs, 'Hz'))), 'color', colors(2,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_md_heavy('d', 'f'), freqs, 'Hz'))), 'color', colors(3,:));
|
||||
loglog(10.^(0.4*cos([0:0.01:2*pi])+log10(200)), ...
|
||||
10.^(0.8*sin([0:0.01:2*pi]-pi/4)+log10(2e-8)), 'k--');
|
||||
text(40, 1e-8, sprintf('Small\nInteraction'), 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'XTickLabel',[]); set(gca, 'YTickLabel',[]);
|
||||
@@ -69,20 +82,27 @@ ylim([5e-10, 1e-3]);
|
||||
|
||||
ax3 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_pz_light('d', 'f'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_pz_mid( 'd', 'f'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_pz_heavy('d', 'f'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_pz_light('d', 'f'), freqs, 'Hz'))), 'color', [colors(1,:), 0.5], 'DisplayName', '$m_s = 1\,kg$, OL');
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_pz_light('d', 'f'), freqs, 'Hz'))), 'color', colors(1,:), 'DisplayName', '$m_s = 1\,kg$, IFF');
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_pz_mid( 'd', 'f'), freqs, 'Hz'))), 'color', colors(2,:), 'DisplayName', '$m_s = 25\,kg$, IFF');
|
||||
plot(freqs, abs(squeeze(freqresp(G_iff_pz_heavy('d', 'f'), freqs, 'Hz'))), 'color', colors(3,:), 'DisplayName', '$m_s = 50\,kg$, IFF');
|
||||
loglog(10.^(0.8*cos([0:0.01:2*pi])+log10(350)), ...
|
||||
10.^(1.2*sin([0:0.01:2*pi])+log10(8e-9)), 'k--', 'HandleVisibility', 'off');
|
||||
text(200, 5e-7, sprintf('$\\mu$ Station\nCoupling'), 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'XTickLabel',[]); set(gca, 'YTickLabel',[]);
|
||||
title('$k_n = 100\,N/\mu m$');
|
||||
ylim([5e-10, 1e-3]);
|
||||
ldg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [20, 1];
|
||||
|
||||
ax1b = nexttile();
|
||||
hold on;
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_vc_light('d', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_vc_mid( 'd', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_vc_heavy('d', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_light('d', 'f'), freqs, 'Hz')))), 'color', [colors(1,:), 0.5]);
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_vc_light('d', 'f'), freqs, 'Hz')))), 'color', colors(1,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_vc_mid( 'd', 'f'), freqs, 'Hz')))), 'color', colors(2,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_vc_heavy('d', 'f'), freqs, 'Hz')))), 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||
@@ -92,9 +112,10 @@ ylim([-200, 20]);
|
||||
|
||||
ax2b = nexttile();
|
||||
hold on;
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_md_light('d', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_md_mid( 'd', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_md_heavy('d', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_md_light('d', 'f'), freqs, 'Hz')))), 'color', [colors(1,:), 0.5]);
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_md_light('d', 'f'), freqs, 'Hz')))), 'color', colors(1,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_md_mid( 'd', 'f'), freqs, 'Hz')))), 'color', colors(2,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_md_heavy('d', 'f'), freqs, 'Hz')))), 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
|
||||
@@ -104,9 +125,10 @@ ylim([-200, 20]);
|
||||
|
||||
ax3b = nexttile();
|
||||
hold on;
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_pz_light('d', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_pz_mid( 'd', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, unwrap(180/pi*angle(squeeze(freqresp(G_iff_pz_heavy('d', 'f'), freqs, 'Hz')))));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_light('d', 'f'), freqs, 'Hz')))), 'color', [colors(1,:), 0.5]);
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_pz_light('d', 'f'), freqs, 'Hz')))), 'color', colors(1,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_pz_mid( 'd', 'f'), freqs, 'Hz')))), 'color', colors(2,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff_pz_heavy('d', 'f'), freqs, 'Hz')))), 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
|
||||
@@ -118,13 +140,15 @@ linkaxes([ax1,ax2,ax3,ax1b,ax2b,ax3b],'x');
|
||||
xlim([1, 1e3]);
|
||||
|
||||
% Position Feedback Controller
|
||||
% <<ssec:uniaxial_position_control_design>>
|
||||
|
||||
% The objective now is to design a position feedback controller for each of the three nano-hexapods that are robust to the change of sample's mass.
|
||||
|
||||
% The required feedback bandwidth was approximately determined un Section ref:sec:uniaxial_noise_budgeting:
|
||||
% The required feedback bandwidth was approximately determined in Section ref:sec:uniaxial_noise_budgeting:
|
||||
% - $\approx 10\,\text{Hz}$ for the soft nano-hexapod ($k_n = 0.01\,N/\mu m$).
|
||||
% Near this frequency, the plants are equivalent to a mass line.
|
||||
% The gain of the mass line can vary up to a fact $\approx 5$ (suspended mass from $16\,kg$ up to $65\,kg$).
|
||||
% This mean that the designed controller will need to have large gain margins to be robust to the change of sample's mass.
|
||||
% This means that the designed controller will need to have large gain margins to be robust to the change of sample's mass.
|
||||
% - $\approx 50\,\text{Hz}$ for the relatively stiff nano-hexapod ($k_n = 1\,N/\mu m$).
|
||||
% Similarly to the soft nano-hexapod, the plants near the crossover frequency are equivalent to a mass line.
|
||||
% It will be probably easier to have a little bit more bandwidth in this configuration to be further away from the nano-hexapod suspension mode.
|
||||
@@ -136,7 +160,37 @@ xlim([1, 1e3]);
|
||||
|
||||
|
||||
% Position feedback controllers are designed for each nano-hexapod such that it is stable for all considered sample masses with similar stability margins (see Nyquist plots in Figure ref:fig:uniaxial_nyquist_hac).
|
||||
% These high authority controllers are generally composed of a two integrators at low frequency for disturbance rejection, a lead to increase the phase margin near the crossover frequency and a low pass filter to increase the robustness to high frequency dynamics.
|
||||
% These high authority controllers are generally composed of a lag at low frequency for disturbance rejection, a lead to increase the phase margin near the crossover frequency and a low pass filter to increase the robustness to high frequency dynamics.
|
||||
% The controllers used for the three nano-hexapod are shown in Equation eqref:eq:uniaxial_hac_formulas, and the parameters are summarized in Table ref:tab:uniaxial_feedback_controller_parameters.
|
||||
|
||||
% \begin{subequations} \label{eq:uniaxial_hac_formulas}
|
||||
% \begin{align}
|
||||
% K_{\text{soft}}(s) &= g \cdot
|
||||
% \underbrace{\frac{s + \omega_0}{s + \omega_i}}_{\text{lag}} \cdot
|
||||
% \underbrace{\frac{1 + \frac{s}{\omega_c/\sqrt{a}}}{1 + \frac{s}{\omega_c \sqrt{a}}}}_{\text{lead}} \cdot
|
||||
% \underbrace{\frac{1}{1 + \frac{s}{\omega_l}}}_{\text{LPF}} \\
|
||||
% K_{\text{mid}}(s) &= g \cdot
|
||||
% \underbrace{\left(\frac{s + \omega_0}{s + \omega_i}\right)^2}_{\text{2 lags}} \cdot
|
||||
% \underbrace{\frac{1 + \frac{s}{\omega_c/\sqrt{a}}}{1 + \frac{s}{\omega_c \sqrt{a}}}}_{\text{lead}} \cdot
|
||||
% \underbrace{\frac{1}{1 + \frac{s}{\omega_l}}}_{\text{LPF}} \\
|
||||
% K_{\text{stiff}}(s) &= g \cdot
|
||||
% \underbrace{\left(\frac{1}{s + \omega_i}\right)^2}_{\text{2 lags}} \cdot
|
||||
% \underbrace{\left(\frac{1 + \frac{s}{\omega_c/\sqrt{a}}}{1 + \frac{s}{\omega_c \sqrt{a}}}\right)^2}_{\text{2 leads}} \cdot
|
||||
% \underbrace{\frac{1}{1 + \frac{s}{\omega_l}}}_{\text{LPF}}
|
||||
% \end{align}
|
||||
% \end{subequations}
|
||||
|
||||
% #+name: tab:uniaxial_feedback_controller_parameters
|
||||
% #+caption: Parameters used for the position feedback controllers
|
||||
% #+attr_latex: :environment tabularx :width \linewidth :align lXXX
|
||||
% #+attr_latex: :center t :booktabs t
|
||||
% | | *Soft* | *Moderately stiff* | *Stiff* |
|
||||
% |--------+-------------------------------------------+--------------------------------------------+------------------------------------------|
|
||||
% | *Gain* | $g = 4 \cdot 10^5$ | $g = 3 \cdot 10^6$ | $g = 6 \cdot 10^12$ |
|
||||
% | *Lead* | $a = 5$, $\omega_c = 20\,Hz$ | $a = 4$, $\omega_c = 70\,Hz$ | $a = 5$, $\omega_c = 100\,Hz$ |
|
||||
% | *Lag* | $\omega_0 = 5\,Hz$, $\omega_i = 0.01\,Hz$ | $\omega_0 = 20\,Hz$, $\omega_i = 0.01\,Hz$ | $\omega_i = 0.01\,Hz$ |
|
||||
% | *LPF* | $\omega_l = 200\,Hz$ | $\omega_l = 300\,Hz$ | $\omega_l = 500\,Hz$ |
|
||||
|
||||
% The loop gains for the three nano-hexapod are shown in Figure ref:fig:uniaxial_loop_gain_hac.
|
||||
% We can see that:
|
||||
% - for the soft and moderately stiff nano-hexapod, the crossover frequency varies a lot with the sample mass.
|
||||
@@ -144,8 +198,8 @@ xlim([1, 1e3]);
|
||||
% - for the stiff nano-hexapod, the obtained crossover frequency is not at high as what was estimated necessary.
|
||||
% The crossover frequency in that case is close to the stiffness line of the plant, which makes the robust design of the controller easier.
|
||||
|
||||
% Note that these controller were quickly tuned by hand and not designed using any optimization methods.
|
||||
% The goal is just to have a first estimation of the attainable performances.
|
||||
% Note that these controllers were quickly tuned by hand and not designed using any optimization methods.
|
||||
% The goal is just to have a first estimation of the attainable performance.
|
||||
|
||||
|
||||
%% High Authority Controller - Soft Nano-Hexapod
|
||||
@@ -154,61 +208,65 @@ a = 5; % Amount of phase lead / width of the phase lead / high frequency gain
|
||||
wc = 2*pi*20; % Frequency with the maximum phase lead [rad/s]
|
||||
H_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)));
|
||||
|
||||
% Lag at low frequency
|
||||
H_lag = (s + 2*pi*5)/(s + 2*pi*0.01);
|
||||
|
||||
% Low Pass filter to increase robustness
|
||||
H_lpf = 1/(1 + s/2/pi/200);
|
||||
|
||||
% Added integrator at low frequency
|
||||
H_int = (s + 2*pi*5)/(s + 2*pi*0.01);
|
||||
|
||||
% High Authority Controller
|
||||
K_hac_vc = 4e5 * ... % Gain
|
||||
H_lead * ... % Lead
|
||||
H_int * ... % Integrator
|
||||
H_lag * ... % Lag
|
||||
H_lpf; % LPF
|
||||
K_hac_vc.InputName = {'d'};
|
||||
K_hac_vc.OutputName = {'f'};
|
||||
|
||||
%% High Authority Controller - Mid Stiffness Nano-Hexapod
|
||||
% Integrator as low frequency
|
||||
H_int = (s + 2*pi*10)/(s + 2*pi*0.01) * (s + 2*pi*20)/(s + 2*pi*0.01);
|
||||
|
||||
% Lead to increase phase margin
|
||||
a = 4; % Amount of phase lead / width of the phase lead / high frequency gain
|
||||
wc = 2*pi*70; % Frequency with the maximum phase lead [rad/s]
|
||||
|
||||
H_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)));
|
||||
|
||||
% Lag at low frequency
|
||||
H_lag = ((s + 2*pi*15)/(s + 2*pi*0.01))^2;
|
||||
|
||||
% Low Pass filter to increase robustness
|
||||
H_lpf = 1/(1 + s/2/pi/300);
|
||||
|
||||
% High Authority Controller
|
||||
K_hac_md = 3e6 * ... % Gain
|
||||
H_lead * ... % Lead
|
||||
H_lpf * ... % Low Pass Filter
|
||||
H_int; % Integrator
|
||||
H_lag * ... % Lag
|
||||
H_lpf; % LPF
|
||||
K_hac_md.InputName = {'d'};
|
||||
K_hac_md.OutputName = {'f'};
|
||||
|
||||
%% High Authority Controller - Stiff Nano-Hexapod
|
||||
% Integrator as low frequency
|
||||
H_int = 1/(s + 2*pi*0.01) * 1/(s + 2*pi*0.01);
|
||||
|
||||
% Lead to increase phase margin
|
||||
a = 5; % Amount of phase lead / width of the phase lead / high frequency gain
|
||||
wc = 2*pi*100; % Frequency with the maximum phase lead [rad/s]
|
||||
H_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)));
|
||||
H_lead = ((1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a))))^2;
|
||||
|
||||
% Integrator
|
||||
H_int = 1/(s + 2*pi*0.01)^2;
|
||||
|
||||
% Low Pass filter to increase robustness
|
||||
H_lpf = 1/(1 + s/2/pi/500);
|
||||
|
||||
% High Authority Controller
|
||||
K_hac_pz = 6e12 * ... % Gain
|
||||
H_lead^2 * ... % Lead
|
||||
H_lpf * ... % Low Pass Filter
|
||||
H_int; % Integrator
|
||||
K_hac_pz = 6e12 * ... % Gain
|
||||
H_lead * ... % Lead
|
||||
H_int * ... % Lag
|
||||
H_lpf; % LPF
|
||||
K_hac_pz.InputName = {'d'};
|
||||
K_hac_pz.OutputName = {'f'};
|
||||
|
||||
%% Save High Authority Controllers
|
||||
save('/mat/uniaxial_high_authority_controllers.mat', ...
|
||||
'K_hac_vc', 'K_hac_md', 'K_hac_pz');
|
||||
|
||||
%% Compute Loop gain for Nyquist Plot
|
||||
L_vc_light = squeeze(freqresp(K_hac_vc*G_iff_vc_light('d', 'f'), freqs, 'Hz'));
|
||||
L_vc_mid = squeeze(freqresp(K_hac_vc*G_iff_vc_mid( 'd', 'f'), freqs, 'Hz'));
|
||||
@@ -304,6 +362,8 @@ linkaxes([ax1,ax2],'x');
|
||||
xlim([1, 500]);
|
||||
|
||||
% Closed-Loop Noise Budgeting
|
||||
% <<ssec:uniaxial_position_control_cl_noise_budget>>
|
||||
|
||||
% The high authority position feedback controllers are then implemented and the closed-loop sensitivity to disturbances are computed.
|
||||
% These are compared with the open-loop and damped plants cases in Figure ref:fig:uniaxial_sensitivity_dist_hac_lac for just one configuration (moderately stiff nano-hexapod with 25kg sample's mass).
|
||||
% As expected, the sensitivity to disturbances is decreased in the controller bandwidth and slightly increase outside this bandwidth.
|
||||
@@ -370,7 +430,7 @@ xlim([1, 500]);
|
||||
|
||||
|
||||
% #+name: fig:uniaxial_sensitivity_dist_hac_lac
|
||||
% #+caption: Change of sensitivity to disturbances with LAC and with HAC-LAC
|
||||
% #+caption: Change of sensitivity to disturbances with LAC and with HAC-LAC. Nano-Hexapod with $k_n = 1\,N/\mu m$ and sample mass of $25\,kg$ are used.
|
||||
% #+RESULTS:
|
||||
% [[file:figs/uniaxial_sensitivity_dist_hac_lac.png]]
|
||||
|
||||
|
245
matlab/uniaxial_7_support_compliance.m
Normal file
245
matlab/uniaxial_7_support_compliance.m
Normal file
@@ -0,0 +1,245 @@
|
||||
%% 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
|
||||
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Load the micro-station parameters
|
||||
load('uniaxial_micro_station_parameters.mat')
|
||||
|
||||
%% Frequency Vector [Hz]
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
% Neglected support compliance
|
||||
|
||||
% Let's first neglect the limited compliance of the micro-station and use the uniaxial model show in Figure ref:fig:uniaxial_support_compliance_nano_hexapod_only.
|
||||
% Let's choose a nano-hexapod mass (including the payload) of $20\,\text{kg}$ and three hexapod stiffnesses such that their resonance frequencies are at $\omega_{\nu} = 10\,\text{Hz}$, $\omega_{\nu} = 70\,\text{Hz}$ and $\omega_{\nu} = 400\,\text{Hz}$.
|
||||
|
||||
% The obtained transfer functions from $F$ to $L^\prime$ are shown in Figure ref:fig:uniaxial_effect_support_compliance_neglected.
|
||||
% When neglecting the support compliance, large feedback bandwidth can be achieve for all three Nano-Hexapod.
|
||||
|
||||
|
||||
%% Nano-Hexapod Parameters
|
||||
m = 20; % Mass [kg]
|
||||
|
||||
% "Soft" Nano-Hexapod
|
||||
k_soft = m*(2*pi*10)^2; % Stiffness [N/m]
|
||||
c_soft = 0.1*2*sqrt(m*k_soft); % Damping [N/(m/s)]
|
||||
|
||||
% "Mid" Nano-Hexapod
|
||||
k_mid = m*(2*pi*70)^2; % Stiffness [N/m]
|
||||
c_mid = 0.1*2*sqrt(m*k_mid); % Damping [N/(m/s)]
|
||||
|
||||
% "Stiff" Nano-Hexapod
|
||||
k_stiff = m*(2*pi*400)^2; % Stiffness [N/m]
|
||||
c_stiff = 0.1*2*sqrt(m*k_stiff); % Damping [N/(m/s)]
|
||||
|
||||
%% Compute the transfer functions for considered nano-hexapods - From F to L'
|
||||
% "Soft" Nano-Hexapod
|
||||
G_soft_a = 1/(m*s^2 + c_soft*s + k_soft); % Transfer function from F to L'
|
||||
|
||||
% "Mid" Nano-Hexapod
|
||||
G_mid_a = 1/(m*s^2 + c_mid*s + k_mid); % Transfer function from F to L'
|
||||
|
||||
% "Stiff" Nano-Hexapod
|
||||
G_stiff_a = 1/(m*s^2 + c_stiff*s + k_stiff); % Transfer function from F to L'
|
||||
|
||||
%% Obtained transfer functions from F to L when neglecing support compliance
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
figure;
|
||||
tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_soft_a, freqs, 'Hz'))), '-', 'color', colors(1,:));
|
||||
text(50, 5e-5, '$\omega_\nu =$ 10Hz', 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Magnitude [m/N]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Soft" $\nu$-hexapod');
|
||||
|
||||
ax2 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_mid_a, freqs, 'Hz'))), '-', 'color', colors(1,:));
|
||||
text(70, 3e-6, '$\omega_\nu =$ 70Hz', 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]');
|
||||
set(gca, 'YTickLabel',[]);
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Mid" $\nu$-hexapod');
|
||||
|
||||
ax3 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_stiff_a, freqs, 'Hz'))), '-', 'color', colors(1,:), ...
|
||||
'DisplayName', '$L^\prime/F$');
|
||||
text(200, 8e-8, '$\omega_\nu =$ 400Hz', 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'YTickLabel',[]);
|
||||
legend('location', 'northeast');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Stiff" $\nu$-hexapod');
|
||||
|
||||
linkaxes([ax1,ax2,ax3],'xy');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
ylim([1e-9, 1e-4]);
|
||||
|
||||
% Effect of support compliance on $L/F$
|
||||
|
||||
% Let's now add some support compliance and use the model shown in Figure ref:fig:uniaxial_support_compliance_test_system.
|
||||
% The parameters of the support (i.e. $m^{\prime}$, $c^{\prime}$ and $k^{\prime}$) are chosen in such a way that the main vertical mode at $\omega_\mu = 70\,\text{Hz}$ seen on the micro-station is matched (Figure ref:fig:uniaxial_comp_frf_meas_model, yellow curve).
|
||||
|
||||
|
||||
%% Parameters of the support compliance
|
||||
w0h = 2*pi*70; % [rad/s]
|
||||
xih = 0.1; % [-]
|
||||
|
||||
mh = 20; % [kg]
|
||||
kh = mh*w0h^2;
|
||||
ch = xih*2*sqrt(kh*mh);
|
||||
|
||||
%% Compute the transfer functions from F to L and from F to d for considered Nano-Hexapods
|
||||
% "Soft" Nano-Hexapod
|
||||
G_soft = (mh*s^2 + ch*s + kh)/(m*s^2*(c_soft*s + k_soft) + (m*s^2 + c_soft*s + k_soft)*(mh*s^2 + ch*s + kh)); % d/F
|
||||
G_soft_r = (1 - m*s^2*G_soft)/(c_soft*s + k_soft); % L/F
|
||||
|
||||
% "Mid" Nano-Hexapod
|
||||
G_mid = (mh*s^2 + ch*s + kh)/(m*s^2*(c_mid*s + k_mid) + (m*s^2 + c_mid*s + k_mid)*(mh*s^2 + ch*s + kh)); % d/F
|
||||
G_mid_r = (1 - m*s^2*G_mid)/(c_mid*s + k_mid); % L/F
|
||||
|
||||
% "Stiff" Nano-Hexapod
|
||||
G_stiff = (mh*s^2 + ch*s + kh)/(m*s^2*(c_stiff*s + k_stiff) + (m*s^2 + c_stiff*s + k_stiff)*(mh*s^2 + ch*s + kh)); % d/F
|
||||
G_stiff_r = (1 - m*s^2*G_stiff)/(c_stiff*s + k_stiff); % L/F
|
||||
|
||||
|
||||
|
||||
% The transfer functions from $F$ to $L$ (i.e. control of the relative motion of the nano-hexapod) and from $L$ to $d$ (i.e. control of the position between the nano-hexapod and the fixed granite) can then be computed.
|
||||
|
||||
% When the relative displacement of the nano-hexapod $L$ is to be controlled (dynamics shown in Figure ref:fig:uniaxial_effect_support_compliance_dynamics), having a stiff nano-hexapod (i.e. with a suspension mode at higher frequency than the mode of the support) makes the dynamics less affected by the limited support compliance (Figure ref:fig:uniaxial_effect_support_compliance_dynamics, right).
|
||||
|
||||
% This is why it is very common to have stiff piezoelectric stages fixed at the very top of positioning stages.
|
||||
% In such case, the control of the piezoelectric stage using its integrated metrology (typically capacitive sensors) is quite simple as the plant is not much affected by the dynamics of the support on which is it fixed.
|
||||
% # Add references of such stations with piezo stages on top
|
||||
|
||||
% If a soft nano-hexapod is used, the support dynamics appears in the dynamics between $F$ and $L$ (see Figure ref:fig:uniaxial_effect_support_compliance_dynamics, left) which will impact the control robustness and performance.
|
||||
|
||||
|
||||
%% Effect of the support compliance on the transfer functions from F to L and from F to d
|
||||
figure;
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
figure;
|
||||
tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_soft_a, freqs, 'Hz'))), '-', 'color', colors(1,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_soft_r, freqs, 'Hz'))), '-', 'color', colors(2,:));
|
||||
loglog(10.^(0.3*cos(0:0.01:2*pi)+log10(60)), ...
|
||||
10.^(0.6*sin(0:0.01:2*pi)+log10(4e-7)), 'k--');
|
||||
text(8, 3e-7, sprintf('Support\nDynamics'), 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Soft" $\nu$-hexapod');
|
||||
ylabel('Magnitude [m/N]');
|
||||
|
||||
|
||||
ax2 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_mid_a, freqs, 'Hz'))), '-', 'color', colors(1,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_mid_r, freqs, 'Hz'))), '-', 'color', colors(2,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Mid" $\nu$-hexapod');
|
||||
set(gca, 'YTickLabel',[]);
|
||||
|
||||
ax3 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_stiff_a, freqs, 'Hz'))), '-', 'color', colors(1,:), ...
|
||||
'DisplayName', '$L^\prime/F$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_stiff_r, freqs, 'Hz'))), '-', 'color', colors(2,:), ...
|
||||
'DisplayName', '$L/F$');
|
||||
loglog(10.^(0.3*cos(0:0.01:2*pi)+log10(50)), ...
|
||||
10.^(0.3*sin(0:0.01:2*pi)+log10(8e-9)), 'k--', 'HandleVisibility', 'off');
|
||||
text(50, 3e-8, 'No effect', 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'YTickLabel',[]);
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Stiff" $\nu$-hexapod');
|
||||
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
|
||||
linkaxes([ax1,ax2,ax3],'xy');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
ylim([1e-9, 1e-4]);
|
||||
|
||||
% Effect of support compliance on $d/F$
|
||||
|
||||
% When the motion to be controlled is the relative displacement $d$ between the granite and the nano-hexapod's top platform, the effect of the support compliance on the plant dynamics is opposite than what was previously observed.
|
||||
% Indeed, using a "soft" nano-hexapod (i.e. with a suspension mode at lower frequency than the mode of the support) makes the dynamics less affected by the support dynamics (Figure ref:fig:uniaxial_effect_support_compliance_dynamics_d, left).
|
||||
% On the contrary, if a "stiff" nano-hexapod is used, the support dynamics appears in the plant dynamics (Figure ref:fig:uniaxial_effect_support_compliance_dynamics_d, right).
|
||||
|
||||
|
||||
%% Effect of the support compliance on the transfer functions from F to L and from F to d
|
||||
figure;
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
figure;
|
||||
tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_soft_a, freqs, 'Hz'))), '-', 'color', colors(1,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_soft, freqs, 'Hz'))), '-', 'color', colors(3,:));
|
||||
loglog(10.^(0.3*cos(0:0.01:2*pi)+log10(60)), ...
|
||||
10.^(0.6*sin(0:0.01:2*pi)+log10(4e-7)), 'k--');
|
||||
text(8, 3e-7, 'No effect', 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Soft" $\nu$-hexapod');
|
||||
ylabel('Magnitude [m/N]');
|
||||
|
||||
|
||||
ax2 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_mid_a, freqs, 'Hz'))), '-', 'color', colors(1,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_mid, freqs, 'Hz'))), '-', 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Mid" $\nu$-hexapod');
|
||||
set(gca, 'YTickLabel',[]);
|
||||
|
||||
ax3 = nexttile();
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_stiff_a, freqs, 'Hz'))), '-', 'color', colors(1,:), ...
|
||||
'DisplayName', '$L^\prime/F$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_stiff, freqs, 'Hz'))), '-', 'color', colors(3,:), ...
|
||||
'DisplayName', '$d/F$');
|
||||
loglog(10.^(0.4*cos(0:0.01:2*pi)+log10(50)), ...
|
||||
10.^(0.8*sin(0:0.01:2*pi)+log10(8e-9)), 'k--', 'HandleVisibility', 'off');
|
||||
text(50, 2e-7, sprintf('Support\nDynamics'), 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'YTickLabel',[]);
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
title('"Stiff" $\nu$-hexapod');
|
||||
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
|
||||
linkaxes([ax1,ax2,ax3],'xy');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
ylim([1e-9, 1e-4]);
|
479
matlab/uniaxial_8_payload_dynamics.m
Normal file
479
matlab/uniaxial_8_payload_dynamics.m
Normal file
@@ -0,0 +1,479 @@
|
||||
%% 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
|
||||
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Uniaxial Simscape model name
|
||||
mdl = 'nass_uniaxial_model';
|
||||
|
||||
%% Load the micro-station parameters
|
||||
load('uniaxial_micro_station_parameters.mat')
|
||||
|
||||
%% Load the PSD of disturbances
|
||||
load('uniaxial_disturbance_psd.mat', 'f', 'psd_ft', 'psd_xf');
|
||||
|
||||
%% Load Active Damping Controller
|
||||
load('uniaxial_active_damping_controllers.mat', 'K_iff_vc', 'K_iff_md', 'K_iff_pz', ...
|
||||
'K_rdc_vc', 'K_rdc_md', 'K_rdc_pz', ...
|
||||
'K_dvf_vc', 'K_dvf_md', 'K_dvf_pz');
|
||||
|
||||
%% Load High Authority Controllers
|
||||
load('uniaxial_high_authority_controllers.mat', 'K_hac_vc', 'K_hac_md', 'K_hac_pz');
|
||||
|
||||
%% Frequency Vector [Hz]
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
% Impact on the plant dynamics
|
||||
% <<ssec:uniaxial_payload_dynamics_effect_dynamics>>
|
||||
|
||||
% To study the impact of sample dynamics, the following sample configurations are considered:
|
||||
% - rigid sample, corresponding to Figure ref:fig:uniaxial_paylaod_dynamics_rigid_schematic
|
||||
% - two flexible samples with a resonance at $\omega_s = 200\,\text{Hz}$ and at $\omega_s = 20\,\text{Hz}$ respectively, corresponding to Figure ref:fig:uniaxial_paylaod_dynamics_schematic
|
||||
% - for all cases, two sample masses are considered: $m_s = 1\,\text{kg}$ and $m_s = 50\,\text{kg}$
|
||||
|
||||
% The transfer functions from the nano-hexapod force to the motion of the nano-hexapod top platform are computed for all the above configurations and are compared for a soft Nano-Hexapod $k_n = 0.01\,N/\mu m$ in Figure ref:fig:uniaxial_payload_dynamics_soft_nano_hexapod.
|
||||
|
||||
% It can be seen that the mode of the sample adds an anti-resonance followed by a resonance (zero/pole pattern).
|
||||
% The frequency of the anti-resonance corresponds to the "free" resonance of the sample $\omega_s = \sqrt{k_s/m_s}$.
|
||||
% The flexibility of the sample also changes the high frequency gain (the mass line is shifted from $\frac{1}{(m_n + m_s)s^2}$ to $\frac{1}{m_ns^2}$).
|
||||
|
||||
|
||||
%% Soft Nano-Hexapod
|
||||
% Light payload mass
|
||||
mn = 15; % Nano-Hexapod mass [kg]
|
||||
ms = 1; % Sample Mass [kg]
|
||||
kn = 1e4; % Nano-Hexapod (soft) Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
|
||||
% Rigid sample
|
||||
G_vc_rigid_light = 1/((mn + ms)*s^2 + cn*s + kn);
|
||||
|
||||
% Soft Sample
|
||||
ws = 2*pi*20;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
G_vc_soft_light = (ms*s^2 + cs*s + ks)/((mn*s^2 + cn*s + kn)*(ms*s^2 + cs*s + ks) + ms*s^2*(cs*s + ks));
|
||||
|
||||
% Stiff Sample
|
||||
ws = 2*pi*200;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
G_vc_stiff_light = (ms*s^2 + cs*s + ks)/((mn*s^2 + cn*s + kn)*(ms*s^2 + cs*s + ks) + ms*s^2*(cs*s + ks));
|
||||
|
||||
% Heavy payload mass
|
||||
mn = 15; % Nano-Hexapod mass [kg]
|
||||
ms = 50; % Sample Mass [kg]
|
||||
kn = 1e4; % Nano-Hexapod (soft) Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
|
||||
% Rigid sample
|
||||
G_vc_rigid_heavy = 1/((mn + ms)*s^2 + cn*s + kn);
|
||||
|
||||
% Soft Sample
|
||||
ws = 2*pi*20;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
G_vc_soft_heavy = (ms*s^2 + cs*s + ks)/((mn*s^2 + cn*s + kn)*(ms*s^2 + cs*s + ks) + ms*s^2*(cs*s + ks));
|
||||
|
||||
% Stiff Sample
|
||||
ws = 2*pi*200;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
G_vc_stiff_heavy = (ms*s^2 + cs*s + ks)/((mn*s^2 + cn*s + kn)*(ms*s^2 + cs*s + ks) + ms*s^2*(cs*s + ks));
|
||||
|
||||
%% Effect of the payload dynamics on the soft Nano-Hexapod. Light sample on the right, and heavy sample on the left
|
||||
figure;
|
||||
tiledlayout(3, 2, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_vc_rigid_light, freqs, 'Hz'))), '-', 'color', colors(1,:), 'DisplayName', 'Rigid sample');
|
||||
plot(freqs, abs(squeeze(freqresp(G_vc_stiff_light, freqs, 'Hz'))), '-', 'color', colors(2,:), 'DisplayName', '$\omega_s = 200\,Hz$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_vc_soft_light, freqs, 'Hz'))), '-', 'color', colors(3,:), 'DisplayName', '$\omega_s = 20\,Hz$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-10, 1e-2])
|
||||
title('$k_n = 0.01\,N/\mu m$, $m_s = 1\,kg$');
|
||||
|
||||
ax2 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_vc_rigid_heavy, freqs, 'Hz'))), '-', 'color', colors(1,:), 'DisplayName', 'Rigid sample');
|
||||
plot(freqs, abs(squeeze(freqresp(G_vc_stiff_heavy, freqs, 'Hz'))), '-', 'color', colors(2,:), 'DisplayName', '$\omega_s = 200\,Hz$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_vc_soft_heavy, freqs, 'Hz'))), '-', 'color', colors(3,:), 'DisplayName', '$\omega_s = 20\,Hz$');
|
||||
plot(freqs, abs(squeeze(freqresp(1/(mn*s^2), freqs, 'Hz'))), '-', 'color', [0,0,0,0.5], 'DisplayName', '$\frac{1}{m_n s^2}$');
|
||||
plot(freqs, abs(squeeze(freqresp(1/((mn + ms)*s^2), freqs, 'Hz'))), '--', 'color', [0,0,0,0.5], 'DisplayName', '$\frac{1}{(m_n + m_s) s^2}$');
|
||||
text(2.2, 3e-3, '$\omega_n = \sqrt{\frac{k_n}{m_n + m_s}}$', 'horizontalalignment', 'left');
|
||||
text(20, 1e-8, '$\omega_s = \sqrt{\frac{k_s}{m_s}}$', 'horizontalalignment', 'center');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'XTickLabel',[]); set(gca, 'YTickLabel',[]);
|
||||
title('$k_n = 0.01\,N/\mu m$, $m_s = 50\,kg$');
|
||||
ldg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [20, 1];
|
||||
ylim([1e-10, 1e-2])
|
||||
|
||||
ax1b = nexttile();
|
||||
hold on;
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_rigid_light, freqs, 'Hz')))), '-', 'color', colors(1,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_stiff_light, freqs, 'Hz')))), '-', 'color', colors(2,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_soft_light, freqs, 'Hz')))), '-', 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
yticks(-360:90:360);
|
||||
ylim([-200, 20]);
|
||||
|
||||
ax2b = nexttile();
|
||||
hold on;
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_rigid_heavy, freqs, 'Hz')))), '-', 'color', colors(1,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_stiff_heavy, freqs, 'Hz')))), '-', 'color', colors(2,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_vc_soft_heavy, freqs, 'Hz')))), '-', 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
yticks(-360:90:360);
|
||||
ylim([-200, 20]);
|
||||
|
||||
linkaxes([ax1,ax1b],'x');
|
||||
xlim([1, 1000]);
|
||||
|
||||
|
||||
|
||||
% #+name: fig:uniaxial_payload_dynamics_soft_nano_hexapod
|
||||
% #+caption: Effect of the payload dynamics on the soft Nano-Hexapod. Light sample on the right, and heavy sample on the left
|
||||
% #+RESULTS:
|
||||
% [[file:figs/uniaxial_payload_dynamics_soft_nano_hexapod.png]]
|
||||
|
||||
% The same transfer functions are now compared when using a stiff nano-hexapod ($k_n = 100\,N/\mu m$) in Figure ref:fig:uniaxial_payload_dynamics_stiff_nano_hexapod.
|
||||
% In that case, the sample's resonance $\omega_n$ is smaller than the nano-hexapod resonance $\omega_n$.
|
||||
% This changes the zero/pole pattern to a pole/zero pattern (the frequency of the zero still being equal to $\omega_s$).
|
||||
% Even tough the added sample's flexibility still changes the high frequency mass line from $\frac{1}{(m_n + m_s)s^2}$ to $\frac{1}{m_ns^2}$, the overall dynamics is much less impacted, even if the sample mass is high (see yellow curve in Figure ref:fig:uniaxial_payload_dynamics_stiff_nano_hexapod, right).
|
||||
|
||||
|
||||
%% Stiff Nano-Hexapod
|
||||
% Light payload mass
|
||||
mn = 15; % Nano-Hexapod mass [kg]
|
||||
ms = 1; % Sample Mass [kg]
|
||||
kn = 1e8; % Nano-Hexapod (soft) Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
|
||||
% Rigid sample
|
||||
G_pz_rigid_light = 1/((mn + ms)*s^2 + cn*s + kn);
|
||||
|
||||
% Soft Sample
|
||||
ws = 2*pi*20;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
G_pz_soft_light = (ms*s^2 + cs*s + ks)/((mn*s^2 + cn*s + kn)*(ms*s^2 + cs*s + ks) + ms*s^2*(cs*s + ks));
|
||||
|
||||
% Stiff Sample
|
||||
ws = 2*pi*200;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
G_pz_stiff_light = (ms*s^2 + cs*s + ks)/((mn*s^2 + cn*s + kn)*(ms*s^2 + cs*s + ks) + ms*s^2*(cs*s + ks));
|
||||
|
||||
% Heavy payload mass
|
||||
mn = 15; % Nano-Hexapod mass [kg]
|
||||
ms = 50; % Sample Mass [kg]
|
||||
kn = 1e8; % Nano-Hexapod (soft) Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
|
||||
% Rigid sample
|
||||
G_pz_rigid_heavy = 1/((mn + ms)*s^2 + cn*s + kn);
|
||||
|
||||
% Soft Sample
|
||||
ws = 2*pi*20;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
G_pz_soft_heavy = (ms*s^2 + cs*s + ks)/((mn*s^2 + cn*s + kn)*(ms*s^2 + cs*s + ks) + ms*s^2*(cs*s + ks));
|
||||
|
||||
% Stiff Sample
|
||||
ws = 2*pi*200;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
G_pz_stiff_heavy = (ms*s^2 + cs*s + ks)/((mn*s^2 + cn*s + kn)*(ms*s^2 + cs*s + ks) + ms*s^2*(cs*s + ks));
|
||||
|
||||
%% Effect of the payload dynamics on the stiff Nano-Hexapod. Light sample on the right, and heavy sample on the left
|
||||
figure;
|
||||
tiledlayout(3, 2, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_pz_rigid_light, freqs, 'Hz'))), '-', 'color', colors(1,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_pz_stiff_light, freqs, 'Hz'))), '-', 'color', colors(2,:));
|
||||
plot(freqs, abs(squeeze(freqresp(G_pz_soft_light, freqs, 'Hz'))), '-', 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-10, 1e-2])
|
||||
title('$k_n = 100\,N/\mu m$, $m_s = 1\,kg$');
|
||||
|
||||
ax2 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_pz_rigid_heavy, freqs, 'Hz'))), '-', 'color', colors(1,:), 'DisplayName', 'Rigid sample');
|
||||
plot(freqs, abs(squeeze(freqresp(G_pz_stiff_heavy, freqs, 'Hz'))), '-', 'color', colors(2,:), 'DisplayName', 'Stiff sample: $\omega_s = 200\,Hz$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_pz_soft_heavy, freqs, 'Hz'))), '-', 'color', colors(3,:), 'DisplayName', 'Soft sample: $\omega_s = 20\,Hz$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'XTickLabel',[]); set(gca, 'YTickLabel',[]);
|
||||
title('$k_n = 100\,N/\mu m$, $m_s = 50\,kg$');
|
||||
ylim([1e-10, 1e-2])
|
||||
ldg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [20, 1];
|
||||
|
||||
ax1b = nexttile();
|
||||
hold on;
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_rigid_light, freqs, 'Hz')))), '-', 'color', colors(1,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_stiff_light, freqs, 'Hz')))), '-', 'color', colors(2,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_soft_light, freqs, 'Hz')))), '-', 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
yticks(-360:90:360);
|
||||
ylim([-200, 20]);
|
||||
|
||||
ax2b = nexttile();
|
||||
hold on;
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_rigid_heavy, freqs, 'Hz')))), '-', 'color', colors(1,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_stiff_heavy, freqs, 'Hz')))), '-', 'color', colors(2,:));
|
||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_pz_soft_heavy, freqs, 'Hz')))), '-', 'color', colors(3,:));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
yticks(-360:90:360);
|
||||
ylim([-200, 20]);
|
||||
|
||||
linkaxes([ax1,ax1b],'x');
|
||||
xlim([1, 1000]);
|
||||
|
||||
|
||||
|
||||
% #+name: fig:uniaxial_sample_flexibility_control
|
||||
% #+caption: Uniaxial model considering a flexibility between the nano-hexapod top platform and the sample. In that case the measured and controlled distance $d$ is different from the distance $y$ that is wish to be controlled
|
||||
% #+RESULTS:
|
||||
% [[file:figs/uniaxial_sample_flexibility_control.png]]
|
||||
|
||||
% After the system dynamics extracted from the model, IFF is applied using the same gains as the ones used in Section ref:sec:uniaxial_active_damping.
|
||||
% Thanks to the collocation between the nano-hexapod and the force sensor used for IFF, the damped plants are still stable and similar damping values are obtained than when considering a rigid sample.
|
||||
|
||||
% The High Authority Controllers used in Section ref:sec:uniaxial_position_control are then implemented on the damped plants.
|
||||
% The obtained closed-loop systems are stable, indicating good robustness.
|
||||
|
||||
% Finally, closed-loop noise budgeting is computed for the obtained the closed-loop system and the cumulative amplitude spectrum of $d$ and $y$ are shown in Figure ref:fig:uniaxial_sample_flexibility_noise_budget_y.
|
||||
% The cumulative amplitude spectrum of the measured distance $d$ (Figure ref:fig:uniaxial_sample_flexibility_noise_budget_d) shows that the added flexibility at the sample location have very little effect on the control performance.
|
||||
% However, the cumulative amplitude spectrum of the distance $y$ (Figure ref:fig:uniaxial_sample_flexibility_noise_budget_y) shows that the stability of $y$ is degraded when the sample flexibility is considered and is degraded as $\omega_s$ is lowered.
|
||||
|
||||
% What happens is that above $\omega_s$, even though the motion $d$ can be controlled perfectly, the sample's mass is "isolated" from the motion of the nano-hexapod and the control on $y$ is not effective.
|
||||
|
||||
|
||||
%% Nano-Hexpod model
|
||||
model_config = struct();
|
||||
model_config.controller = "open_loop";
|
||||
mn = 15; % Nano-Hexapod mass [kg]
|
||||
ms = 1; % Sample Mass [kg]
|
||||
|
||||
%% Identification
|
||||
clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force
|
||||
io(io_i) = linio([mdl, '/micro_station/xf'], 1, 'openinput'); io_i = io_i + 1; % Floor Motion
|
||||
io(io_i) = linio([mdl, '/micro_station/ft'], 1, 'openinput'); io_i = io_i + 1; % Stage vibrations
|
||||
io(io_i) = linio([mdl, '/fs'], 1, 'openinput'); io_i = io_i + 1; % Direct sample forces
|
||||
io(io_i) = linio([mdl, '/dL'], 1, 'openoutput'); io_i = io_i + 1; % Relative Motion Sensor
|
||||
io(io_i) = linio([mdl, '/fm'], 1, 'openoutput'); io_i = io_i + 1; % Force Sensor
|
||||
io(io_i) = linio([mdl, '/vn'] , 1, 'openoutput'); io_i = io_i + 1; % Geophone
|
||||
io(io_i) = linio([mdl, '/d'] , 1, 'openoutput'); io_i = io_i + 1; % Metrology Output
|
||||
io(io_i) = linio([mdl, '/y'] , 1, 'openoutput'); io_i = io_i + 1; % Sample's position
|
||||
|
||||
%% Soft Nano-Hexapod
|
||||
% Light payload mass
|
||||
kn = 1e4; % Nano-Hexapod (soft) Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
|
||||
% Rigid Sample
|
||||
model_config.nhexa = "1dof";
|
||||
G_vc_light_rigid = linearize(mdl, io, 0.0);
|
||||
G_vc_light_rigid.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_vc_light_rigid.OutputName = {'dL', 'fm', 'vn', 'd', 'y'};
|
||||
|
||||
% Soft Sample
|
||||
model_config.nhexa = "2dof";
|
||||
ws = 2*pi*20;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
|
||||
G_vc_light_soft = linearize(mdl, io, 0.0);
|
||||
G_vc_light_soft.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_vc_light_soft.OutputName = {'dL', 'fm', 'vn', 'd', 'y'};
|
||||
|
||||
% Rigid Sample
|
||||
model_config.nhexa = "2dof";
|
||||
ws = 2*pi*200;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
|
||||
G_vc_light_stiff = linearize(mdl, io, 0.0);
|
||||
G_vc_light_stiff.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_vc_light_stiff.OutputName = {'dL', 'fm', 'vn', 'd', 'y'};
|
||||
|
||||
%% Stiff Nano-Hexapod
|
||||
% Light payload mass
|
||||
kn = 1e8; % Nano-Hexapod (soft) Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
|
||||
% Rigid Sample
|
||||
model_config.nhexa = "1dof";
|
||||
G_pz_light_rigid = linearize(mdl, io, 0.0);
|
||||
G_pz_light_rigid.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_pz_light_rigid.OutputName = {'dL', 'fm', 'vn', 'd', 'y'};
|
||||
|
||||
% Soft Sample
|
||||
model_config.nhexa = "2dof";
|
||||
ws = 2*pi*20;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
|
||||
G_pz_light_soft = linearize(mdl, io, 0.0);
|
||||
G_pz_light_soft.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_pz_light_soft.OutputName = {'dL', 'fm', 'vn', 'd', 'y'};
|
||||
|
||||
% Rigid Sample
|
||||
model_config.nhexa = "2dof";
|
||||
ws = 2*pi*200;
|
||||
ks = ms * ws^2;
|
||||
cs = 2*0.01*sqrt(ms*ks);
|
||||
|
||||
G_pz_light_stiff = linearize(mdl, io, 0.0);
|
||||
G_pz_light_stiff.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_pz_light_stiff.OutputName = {'dL', 'fm', 'vn', 'd', 'y'};
|
||||
|
||||
%% Apply IFF and verify stability
|
||||
% Soft Nano-Hexapod
|
||||
G_iff_vc_light_rigid = feedback(G_vc_light_rigid, K_iff_vc, 'name', +1);
|
||||
G_iff_vc_light_soft = feedback(G_vc_light_soft , K_iff_vc, 'name', +1);
|
||||
G_iff_vc_light_stiff = feedback(G_vc_light_stiff, K_iff_vc, 'name', +1);
|
||||
|
||||
isstable(G_iff_vc_light_rigid)
|
||||
isstable(G_iff_vc_light_soft)
|
||||
isstable(G_iff_vc_light_stiff)
|
||||
|
||||
% Stiff Nano-Hexapod
|
||||
G_iff_pz_light_rigid = feedback(G_pz_light_rigid, K_iff_pz, 'name', +1);
|
||||
G_iff_pz_light_soft = feedback(G_pz_light_soft , K_iff_pz, 'name', +1);
|
||||
G_iff_pz_light_stiff = feedback(G_pz_light_stiff, K_iff_pz, 'name', +1);
|
||||
|
||||
isstable(G_iff_pz_light_rigid)
|
||||
isstable(G_iff_pz_light_soft)
|
||||
isstable(G_iff_pz_light_stiff)
|
||||
|
||||
%% Compute closed-loop plants and verify stability
|
||||
% Soft Nano-Hexapod
|
||||
G_hac_iff_vc_light_rigid = feedback(G_iff_vc_light_rigid, K_hac_vc, 'name', -1);
|
||||
G_hac_iff_vc_light_soft = feedback(G_iff_vc_light_soft , K_hac_vc, 'name', -1);
|
||||
G_hac_iff_vc_light_stiff = feedback(G_iff_vc_light_stiff, K_hac_vc, 'name', -1);
|
||||
|
||||
isstable(G_hac_iff_vc_light_rigid)
|
||||
isstable(G_hac_iff_vc_light_soft)
|
||||
isstable(G_hac_iff_vc_light_stiff)
|
||||
|
||||
% Stiff Nano-Hexapod
|
||||
G_hac_iff_pz_light_rigid = feedback(G_iff_pz_light_rigid, K_hac_pz, 'name', -1);
|
||||
G_hac_iff_pz_light_soft = feedback(G_iff_pz_light_soft , K_hac_pz, 'name', -1);
|
||||
G_hac_iff_pz_light_stiff = feedback(G_iff_pz_light_stiff, K_hac_pz, 'name', -1);
|
||||
|
||||
isstable(G_hac_iff_pz_light_rigid)
|
||||
isstable(G_hac_iff_pz_light_soft)
|
||||
isstable(G_hac_iff_pz_light_stiff)
|
||||
|
||||
%% Cumulative Amplitude Spectrum of d - Effect of Sample's flexibility
|
||||
figure;
|
||||
tiledlayout(1, 2, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile();
|
||||
hold on;
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_vc_light_rigid('d', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_vc_light_rigid('d', 'xf'), f, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', 'Rigid sample');
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_vc_light_stiff('d', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_vc_light_stiff('d', 'xf'), f, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', 'Stiff $\omega_s = 200\,$Hz');
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_vc_light_soft('d', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_vc_light_soft('d', 'xf'), f, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', 'Soft $\omega_s = 20\,$Hz');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
ylabel('CAS of $d$ [m]'); xlabel('Frequency [Hz]');
|
||||
legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
title('$k_n = 0.01\,N/\mu m$');
|
||||
|
||||
ax2 = nexttile();
|
||||
hold on;
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_pz_light_rigid('d', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_pz_light_rigid('d', 'xf'), f, 'Hz'))).^2)))), '-');
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_pz_light_stiff('d', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_pz_light_stiff('d', 'xf'), f, 'Hz'))).^2)))), '-');
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_pz_light_soft('d', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_pz_light_soft('d', 'xf'), f, 'Hz'))).^2)))), '-');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
|
||||
title('$k_n = 100\,N/\mu m$');
|
||||
xlim([1, 500]);
|
||||
|
||||
linkaxes([ax1,ax2],'xy');
|
||||
xlim([1, 500]);
|
||||
ylim([2e-10, 2e-7])
|
||||
|
||||
%% Cumulative Amplitude Spectrum - Effect of Sample's flexibility
|
||||
figure;
|
||||
tiledlayout(1, 2, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile();
|
||||
hold on;
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_vc_light_rigid('y', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_vc_light_rigid('y', 'xf'), f, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', 'Rigid sample');
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_vc_light_stiff('y', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_vc_light_stiff('y', 'xf'), f, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', 'Stiff $\omega_s = 200\,$Hz');
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_vc_light_soft('y', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_vc_light_soft('y', 'xf'), f, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', 'Soft $\omega_s = 20\,$Hz');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
ylabel('CAS of $y$ [m]'); xlabel('Frequency [Hz]');
|
||||
legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
title('$k_n = 0.01\,N/\mu m$');
|
||||
|
||||
ax2 = nexttile();
|
||||
hold on;
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_pz_light_rigid('y', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_pz_light_rigid('y', 'xf'), f, 'Hz'))).^2)))), '-');
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_pz_light_stiff('y', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_pz_light_stiff('y', 'xf'), f, 'Hz'))).^2)))), '-');
|
||||
plot(f, sqrt(flip(-cumtrapz(flip(f), flip(psd_ft.*abs(squeeze(freqresp(G_hac_iff_pz_light_soft('y', 'ft'), f, 'Hz'))).^2 + ...
|
||||
psd_xf.*abs(squeeze(freqresp(G_hac_iff_pz_light_soft('y', 'xf'), f, 'Hz'))).^2)))), '-');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
|
||||
title('$k_n = 100\,N/\mu m$');
|
||||
xlim([1, 500]);
|
||||
|
||||
linkaxes([ax1,ax2],'xy');
|
||||
xlim([1, 500]);
|
||||
ylim([2e-10, 2e-7])
|
Reference in New Issue
Block a user