add all files
This commit is contained in:
191
A1-nass-uniaxial-model/uniaxial_2_nano_hexapod_model.m
Normal file
191
A1-nass-uniaxial-model/uniaxial_2_nano_hexapod_model.m
Normal file
@@ -0,0 +1,191 @@
|
||||
%% 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';
|
||||
|
||||
%% Frequency Vector [Hz]
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
%% Load the micro-station parameters
|
||||
load('uniaxial_micro_station_parameters.mat')
|
||||
|
||||
%% Nano-Hexapod Parameters
|
||||
mn = 15; % [kg]
|
||||
kn = 1e7; % [N/m]
|
||||
cn = 2*0.01*sqrt(mn*kn); % [N/(m/s)]
|
||||
|
||||
%% Sample Mass
|
||||
ms = 10; % [kg]
|
||||
|
||||
%% Use 1DoF Nano-Hexpod model
|
||||
model_config = struct();
|
||||
model_config.nhexa = "1dof";
|
||||
model_config.controller = "open_loop";
|
||||
|
||||
%% Identify the transfer function from disturbances and force actuator to d
|
||||
clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/controller'], 1, 'openinput'); io_i = io_i + 1; % Force Actuator
|
||||
io(io_i) = linio([mdl, '/fs'], 1, 'openinput'); io_i = io_i + 1; % Force applied on the sample
|
||||
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 disturbances
|
||||
io(io_i) = linio([mdl, '/d'] , 1, 'openoutput'); io_i = io_i + 1; % Metrology
|
||||
|
||||
%% Perform the model extraction
|
||||
G_ol = linearize(mdl, io, 0.0);
|
||||
G_ol.InputName = {'f', 'fs', 'xf', 'ft'};
|
||||
G_ol.OutputName = {'d'};
|
||||
|
||||
%% Sensitivity to disturbances - Fs
|
||||
figure;
|
||||
plot(freqs, abs(squeeze(freqresp(G_ol('d', 'fs'), freqs, 'Hz'))));
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude $d/f_{s}$ [m/N]'); xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
xlim([1, 500]);
|
||||
|
||||
%% Sensitivity to disturbances - Ft
|
||||
figure;
|
||||
plot(freqs, abs(squeeze(freqresp(G_ol('d', 'ft'), freqs, 'Hz'))));
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude $d/f_{t}$ [m/N]'); xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
xlim([1, 500]);
|
||||
|
||||
%% Sensitivity to disturbances - xf
|
||||
figure;
|
||||
plot(freqs, abs(squeeze(freqresp(G_ol('d', 'xf'), freqs, 'Hz'))));
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude $d/x_{f}$ [m/m]'); xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
xlim([1, 500]);
|
||||
ylim([1e-2, 1e2]);
|
||||
|
||||
%% Bode Plot of the transfer function from actuator forces to measured displacement by the metrology
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_ol('d', 'f'), freqs, 'Hz'))));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude $d/f$ [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ol('d', 'f'), freqs, 'Hz'))));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||
hold off;
|
||||
yticks(-360:90:360);
|
||||
ylim([-180, 0]);
|
||||
|
||||
linkaxes([ax1,ax2],'x');
|
||||
xlim([1, 500]);
|
||||
|
||||
%% Use 1DoF Nano-Hexpod model
|
||||
model_config = struct();
|
||||
model_config.nhexa = "1dof";
|
||||
model_config.controller = "open_loop";
|
||||
|
||||
%% Nano-Hexapod Mass
|
||||
mn = 15; % Nano-Hexapod mass [kg]
|
||||
|
||||
%% Identification of all combination of stiffnesses / masses
|
||||
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
|
||||
|
||||
%% Light Sample
|
||||
ms = 1; % Sample Mass [kg]
|
||||
|
||||
% Voice Coil (i.e. soft) Nano-Hexapod
|
||||
kn = 1e4; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_vc_light = linearize(mdl, io, 0.0);
|
||||
G_vc_light.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_vc_light.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
% APA (i.e. relatively stiff) Nano-Hexapod
|
||||
kn = 1e6; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_md_light = linearize(mdl, io, 0.0);
|
||||
G_md_light.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_md_light.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
% Piezoelectric (i.e. stiff) Nano-Hexapod
|
||||
kn = 1e8; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_pz_light = linearize(mdl, io, 0.0);
|
||||
G_pz_light.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_pz_light.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
%% Mid Sample
|
||||
ms = 25; % Sample Mass [kg]
|
||||
|
||||
% Voice Coil (i.e. soft) Nano-Hexapod
|
||||
kn = 1e4; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_vc_mid = linearize(mdl, io, 0.0);
|
||||
G_vc_mid.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_vc_mid.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
% APA (i.e. relatively stiff) Nano-Hexapod
|
||||
kn = 1e6; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_md_mid = linearize(mdl, io, 0.0);
|
||||
G_md_mid.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_md_mid.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
% Piezoelectric (i.e. stiff) Nano-Hexapod
|
||||
kn = 1e8; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_pz_mid = linearize(mdl, io, 0.0);
|
||||
G_pz_mid.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_pz_mid.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
%% Heavy Sample
|
||||
ms = 50; % Sample Mass [kg]
|
||||
|
||||
% Voice Coil (i.e. soft) Nano-Hexapod
|
||||
kn = 1e4; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_vc_heavy = linearize(mdl, io, 0.0);
|
||||
G_vc_heavy.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_vc_heavy.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
% APA (i.e. relatively stiff) Nano-Hexapod
|
||||
kn = 1e6; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_md_heavy = linearize(mdl, io, 0.0);
|
||||
G_md_heavy.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_md_heavy.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
% Piezoelectric (i.e. stiff) Nano-Hexapod
|
||||
kn = 1e8; % Nano-Hexapod Stiffness [N/m]
|
||||
cn = 2*0.01*sqrt((ms + mn)*kn); % Nano-Hexapod Damping [N/(m/s)]
|
||||
G_pz_heavy = linearize(mdl, io, 0.0);
|
||||
G_pz_heavy.InputName = {'f', 'xf', 'ft', 'fs'};
|
||||
G_pz_heavy.OutputName = {'dL', 'fm', 'vn', 'd'};
|
||||
|
||||
%% Save All Identified Plants
|
||||
save('./mat/uniaxial_plants.mat', 'G_vc_light', 'G_md_light', 'G_pz_light', ...
|
||||
'G_vc_mid', 'G_md_mid', 'G_pz_mid', ...
|
||||
'G_vc_heavy', 'G_md_heavy', 'G_pz_heavy');
|
Reference in New Issue
Block a user