encoder-test-bench/matlab/dynamics_encoder.m

119 lines
3.2 KiB
Mathematica
Raw Normal View History

2020-11-10 12:53:45 +01:00
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
% Load Data
% As usual, the measurement data are loaded.
load('int_enc_id_noise_bis.mat', 'interferometer', 'encoder', 'u', 't');
% The first 0.1 seconds are removed as it corresponds to transient behavior.
interferometer = interferometer(t>0.1);
encoder = encoder(t>0.1);
u = u(t>0.1);
t = t(t>0.1);
% Finally the offset are removed using the =detrend= command.
interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);
% Excitation and Measured Signals
% The excitation signal is a white noise filtered by a low pass filter to not excite too much the high frequency modes.
% The excitation signal is shown in Figure [[fig:encoder_identification_excitation_time]].
figure;
plot(t, u);
xlabel('Time [s]'); ylabel('Voltage [V]');
% #+name: fig:encoder_identification_excitation_time
% #+caption:
% #+RESULTS:
% [[file:figs/encoder_identification_excitation_time.png]]
% The measured motion by the interferometer and encoder is shown in Figure
figure;
hold on;
plot(t, interferometer, 'DisplayName', 'Interferometer');
plot(t, encoder, 'DisplayName', 'Encoder');
hold off;
xlabel('Time [s]'); ylabel('Displacement [m]');
legend('location', 'southeast');
% Identification
% Now the dynamics from the voltage sent to the voltage amplitude driving the APA95ML to the measured displacement by both the encoder and interferometer are computed.
Ts = 1e-4; % Sampling Time [s]
win = hann(ceil(10/Ts));
[tf_i_est, f] = tfestimate(u, interferometer, win, [], [], 1/Ts);
[co_i_est, ~] = mscohere(u, interferometer, win, [], [], 1/Ts);
[tf_e_est, ~] = tfestimate(u, encoder, win, [], [], 1/Ts);
[co_e_est, ~] = mscohere(u, encoder, win, [], [], 1/Ts);
% The obtained coherence is shown in Figure [[fig:identification_dynamics_coherence]].
% It is shown that the identification is good until 500Hz for the interferometer and until 1kHz for the encoder.
figure;
hold on;
plot(f, co_i_est, '-', 'DisplayName', 'Interferometer')
plot(f, co_e_est, '-', 'DisplayName', 'Encoder')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Coherence'); xlabel('Frequency [Hz]');
hold off;
xlim([0.5, 5e3]);
legend('location', 'southwest');
% #+name: fig:identification_dynamics_coherence
% #+caption:
% #+RESULTS:
% [[file:figs/identification_dynamics_coherence.png]]
% The compared dynamics as measured by the intereferometer and encoder are shown in Figure [[fig:identification_dynamics_bode]].
figure;
tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None');
ax1 = nexttile([2, 1]);
hold on;
plot(f, abs(tf_i_est), '-', 'DisplayName', 'Interferometer')
plot(f, abs(tf_e_est), '-', 'DisplayName', 'Encoder')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
hold off;
ylim([1e-7, 3e-4]);
legend('location', 'southwest');
ax2 = nexttile;
hold on;
plot(f, 180/pi*angle(tf_i_est), '-')
plot(f, 180/pi*angle(tf_e_est), '-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
hold off;
yticks(-360:90:360);
axis padded 'auto x'
linkaxes([ax1,ax2], 'x');
xlim([0.5, 5e3]);