183 lines
6.7 KiB
Matlab
183 lines
6.7 KiB
Matlab
%% 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');
|
|
|
|
% Ground Motion
|
|
% The geophone fixed to the floor to measure the floor motion.
|
|
|
|
|
|
%% Load floor motion data
|
|
% t: time in [s]
|
|
% V: measured voltage genrated by the geophone and amplified by a 60dB gain voltage amplifier [V]
|
|
load('ground_motion_measurement.mat', 't', 'V');
|
|
|
|
|
|
|
|
% The voltage generated by each geophone is amplified using a voltage amplifier (gain of 60dB) before going to the ADC.
|
|
% The sensitivity of the geophone as well as the gain of the voltage amplifier are then taken into account to reconstruct the floor displacement.
|
|
|
|
%% Sensitivity of the geophone
|
|
S0 = 88; % Sensitivity [V/(m/s)]
|
|
f0 = 2; % Cut-off frequency [Hz]
|
|
|
|
S = S0*(s/2/pi/f0)/(1+s/2/pi/f0); % Geophone's transfer function [V/(m/s)]
|
|
|
|
%% Gain of the voltage amplifier
|
|
G0_db = 60; % [dB]
|
|
G0 = 10^(G0_db/20); % [abs]
|
|
|
|
%% Transfer function from measured voltage to displacement
|
|
G_geo = 1/S/G0/s; % [m/V]
|
|
|
|
|
|
|
|
% The PSD $S_{V_f}$ of the measured voltage $V_f$ is computed.
|
|
|
|
%% Compute measured voltage PSD
|
|
Fs = 1/(t(2)-t(1)); % Sampling Frequency [Hz]
|
|
win = hanning(ceil(2*Fs)); % Hanning window
|
|
|
|
[psd_V, f] = pwelch(V, win, [], [], Fs); % [V^2/Hz]
|
|
|
|
|
|
|
|
% The PSD of the corresponding displacement can be computed as follows:
|
|
% \begin{equation}
|
|
% S_{x_f}(\omega) = \frac{S_{V_f}(\omega)}{|S_{\text{geo}}(j\omega)| \cdot G_{\text{amp}} \cdot \omega}
|
|
% \end{equation}
|
|
% with:
|
|
% - $S_{\text{geo}}$ the sensitivity of the Geophone in $[Vs/m]$
|
|
% - $G_{\text{amp}}$ the gain of the voltage amplifier
|
|
% - $\omega$ is here to integrate and have the displacement instead of the velocity
|
|
|
|
|
|
%% Ground Motion ASD
|
|
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:uniaxial_asd_floor_motion_id31.
|
|
|
|
|
|
%% Amplitude Spectral Density of the measured Floor motion on ID31
|
|
figure;
|
|
hold on;
|
|
plot(f, sqrt(psd_xf), 'DisplayName', '$\Gamma_{x_{f}}$');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('Ampl. Spectral Density $\left[\frac{m}{\sqrt{Hz}}\right]$')
|
|
xlim([1, 500]);
|
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
|
|
|
% Stage Vibration
|
|
% During Spindle rotation (here at 6rpm), the granite velocity and micro-hexapod's top platform velocity are measured with the geophones.
|
|
|
|
|
|
%% Measured velocity of granite and hexapod during spindle rotation
|
|
% t: time in [s]
|
|
% vg: measured granite velocity [m/s]
|
|
% vg: measured micro-hexapod's top platform velocity [m/s]
|
|
load('meas_spindle_on.mat', 't', 'vg', 'vh');
|
|
spindle_off = load('meas_spindle_off.mat', 't', 'vg', 'vh'); % No Rotation
|
|
|
|
|
|
|
|
% The Power Spectral Density of the relative velocity between the hexapod and the granite is computed.
|
|
|
|
%% Compute Power Spectral Density of the relative velocity between granite and hexapod during spindle rotation
|
|
Fs = 1/(t(2)-t(1)); % Sampling Frequency [Hz]
|
|
win = hanning(ceil(2*Fs)); % Hanning window
|
|
|
|
[psd_vft, f] = pwelch(vh-vg, win, [], [], Fs); % [(m/s)^2/Hz]
|
|
[psd_off, ~] = pwelch(spindle_off.vh-spindle_off.vg, win, [], [], Fs); % [(m/s)^2/Hz]
|
|
|
|
|
|
|
|
% It is then integrated to obtain the Amplitude Spectral Density of the relative motion which is compared with a non-rotating case (Figure ref:fig:uniaxial_asd_vibration_spindle_rotation).
|
|
% It is shown that the spindle rotation induces vibrations in a wide frequency spectrum.
|
|
|
|
|
|
%% 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');
|
|
plot(f, sqrt(psd_off)./(2*pi*f), 'DisplayName', '0rpm');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('Ampl. Spectral Density $\left[\frac{m}{\sqrt{Hz}}\right]$')
|
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
|
xlim([1, 500]); ylim([1e-12, 1e-7])
|
|
|
|
|
|
|
|
% #+name: fig:uniaxial_asd_vibration_spindle_rotation
|
|
% #+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/uniaxial_asd_vibration_spindle_rotation.png]]
|
|
|
|
% In order to compute the equivalent disturbance force $f_t$ that induces such motion, the transfer function from $f_t$ to the relative motion of the hexapod's top platform and the granite is extracted from the model.
|
|
|
|
%% Disable the Nano-Hexpod for now
|
|
model_config = struct();
|
|
model_config.nhexa = "none";
|
|
model_config.controller = "open_loop";
|
|
|
|
%% Identify the transfer function from u to taum
|
|
clear io; io_i = 1;
|
|
io(io_i) = linio([mdl, '/micro_station/ft'], 1, 'openinput'); io_i = io_i + 1; % Stage Disturbance Force
|
|
io(io_i) = linio([mdl, '/micro_station/xg'], 1, 'openoutput'); io_i = io_i + 1; % Absolute motion of Granite
|
|
io(io_i) = linio([mdl, '/micro_station/xh'], 1, 'openoutput'); io_i = io_i + 1; % Absolute motion of Hexapod
|
|
|
|
%% Perform the model extraction
|
|
G = linearize(mdl, io, 0.0);
|
|
G.InputName = {'ft'};
|
|
G.OutputName = {'Dg', 'Dh'};
|
|
|
|
|
|
|
|
% The power spectral density $\Gamma_{f_{t}}$ of the disturbance force can be computed as follows:
|
|
% \begin{equation}
|
|
% \Gamma_{f_{t}}(\omega) = \frac{\Gamma_{v_{t}}(\omega)}{|G_{\text{model}}(j\omega)|^2}
|
|
% \end{equation}
|
|
% with:
|
|
% - $\Gamma_{v_{t}}$ the measured power spectral density of the relative motion between the micro-hexapod's top platform and the granite during the spindle's rotation
|
|
% - $G_{\text{model}}$ the transfer function (extracted from the uniaxial model) from $f_t$ to the relative motion between the micro-hexapod's top platform and the granite
|
|
|
|
|
|
%% Power Spectral Density of the equivalent force ft
|
|
psd_ft = (psd_vft./(2*pi*f).^2)./abs(squeeze(freqresp(G('Dh', 'ft') - G('Dg', 'ft'), f, 'Hz'))).^2;
|
|
|
|
|
|
|
|
% The obtained amplitude spectral density of the disturbance force $f_t$ is shown in Figure ref:fig:uniaxial_asd_disturbance_force.
|
|
|
|
%% Estimated disturbance force ft from measurement and uniaxial model
|
|
figure;
|
|
hold on;
|
|
plot(f, sqrt(psd_ft), 'DisplayName', '$\Gamma_{f_{t}}$');
|
|
hold off;
|
|
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
|
xlabel('Frequency [Hz]'); ylabel('Ampl. Spectral Density $\left[\frac{N}{\sqrt{Hz}}\right]$')
|
|
xlim([1, 500]);
|
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
|
|
|
%% Save PSD of disturbances
|
|
save('./mat/uniaxial_disturbance_psd.mat', 'f', 'psd_ft', 'psd_xf');
|