From 9961970547eb3a2ced1655d10c6dd5807fbb6d03 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Tue, 1 Jun 2021 23:16:49 +0200 Subject: [PATCH] Analyze first measurements --- figs/frf_meas_sin_excitation.pdf | Bin 0 -> 23262 bytes figs/frf_meas_sin_excitation.png | Bin 0 -> 31581 bytes matlab/frf_analyze.m | 63 ++- matlab/frf_save.m | 2 +- matlab/frf_setup.m | 40 +- matlab/src/generateSinIncreasingAmpl.m | 54 +++ test-bench-apa300ml.org | 514 ++++++++++++++++++++++++- 7 files changed, 614 insertions(+), 59 deletions(-) create mode 100644 figs/frf_meas_sin_excitation.pdf create mode 100644 figs/frf_meas_sin_excitation.png create mode 100644 matlab/src/generateSinIncreasingAmpl.m diff --git a/figs/frf_meas_sin_excitation.pdf b/figs/frf_meas_sin_excitation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..88196f1dd55ce0243cbeb8562cae24610b8d79e0 GIT binary patch literal 23262 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 E0NwdL=>Px# literal 0 HcmV?d00001 diff --git a/figs/frf_meas_sin_excitation.png b/figs/frf_meas_sin_excitation.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb99d19014885046057b2b71ccbbe65ea9f37a6 GIT binary patch literal 31581 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 0.2*args.t_start & t_smooth_start < 0.7*args.t_start) = Vd_max; + V_d(t_smooth_start > 0.7*args.t_start & t_smooth_start < 0.9*args.t_start) = Vd_max - (t_smooth_start(t_smooth_start > 0.7*args.t_start & t_smooth_start < 0.9*args.t_start) - 0.7*args.t_start)*Vd_max/(0.2*args.t_start); + + V_smooth_start = cumtrapz(V_d)*args.Ts; + + V_smooth_end = args.V_mean - V_smooth_start; +end + +V_exc = [V_smooth_start, sin_exc, V_smooth_end]; +t_exc = args.Ts*[0:1:length(V_exc)-1]; + +U_exc = [t_exc; V_exc]; diff --git a/test-bench-apa300ml.org b/test-bench-apa300ml.org index ac81355..c227ce6 100644 --- a/test-bench-apa300ml.org +++ b/test-bench-apa300ml.org @@ -25,6 +25,7 @@ #+PROPERTY: header-args:matlab+ :results none #+PROPERTY: header-args:matlab+ :eval no-export #+PROPERTY: header-args:matlab+ :noweb yes +#+PROPERTY: header-args:matlab+ :tangle no #+PROPERTY: header-args:matlab+ :mkdirp yes #+PROPERTY: header-args:matlab+ :output-dir figs @@ -717,18 +718,29 @@ addpath('./matlab/'); addpath('./src/'); #+end_src -** Measurement Setup +** =frf_setup.m= - Measurement Setup :PROPERTIES: :header-args:matlab: :tangle matlab/frf_setup.m :header-args:matlab+: :comments no :END: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :exports none + +addpath('./src/'); +#+end_src First is defined the sampling frequency: #+begin_src matlab %% Simulation configuration Fs = 10e3; % Sampling Frequency [Hz] Ts = 1/Fs; % Sampling Time [s] -Tsim = 110; % Simulation Time [s] #+end_src #+begin_src matlab @@ -737,9 +749,20 @@ Trec_start = 5; % Start time for Recording [s] Trec_dur = 100; % Recording Duration [s] #+end_src +#+begin_src matlab +Tsim = 2*Trec_start + Trec_dur; % Simulation Time [s] +#+end_src + The maximum excitation voltage at resonance is 9Vrms, therefore corresponding to 0.6V of output DAC voltage. #+begin_src matlab %% Sweep Sine +gc = 0.1; +xi = 0.5; +wn = 2*pi*94.3; + +% Notch filter at the resonance of the APA +G_sweep = 0.2*(s^2 + 2*gc*xi*wn*s + wn^2)/(s^2 + 2*xi*wn*s + wn^2); + V_sweep = generateSweepExc('Ts', Ts, ... 'f_start', 10, ... 'f_end', 1e3, ... @@ -747,7 +770,7 @@ V_sweep = generateSweepExc('Ts', Ts, ... 't_start', Trec_start, ... 'exc_duration', Trec_dur, ... 'sweep_type', 'log', ... - 'V_exc', 0.5/(1 + s/2/pi/100)); + 'V_exc', G_sweep*1/(1 + s/2/pi/500)); #+end_src #+begin_src matlab :exports none :tangle no @@ -815,10 +838,36 @@ exportFig('figs/frf_meas_noise_excitation.pdf', 'width', 'full', 'height', 'norm #+RESULTS: [[file:figs/frf_meas_noise_excitation.png]] +#+begin_src matlab +%% Sinus excitation with increasing amplitude +V_sin = generateSinIncreasingAmpl('Ts', 1/Fs, ... + 'V_mean', 3.25, ... + 'sin_ampls', [0.1, 0.2, 0.4, 1, 2, 4], ... + 'sin_period', 1, ... + 'sin_num', 5, ... + 't_start', 10, ... + 'smooth_ends', true); +#+end_src + +#+begin_src matlab :exports none :tangle no +figure; +plot(V_sin(1,:), V_sin(2,:)); +xlabel('Time [s]'); ylabel('Amplitude [V]'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/frf_meas_sin_excitation.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:frf_meas_sin_excitation +#+caption: Example of Shaped noise excitation signal +#+RESULTS: +[[file:figs/frf_meas_sin_excitation.png]] + Then, we select the wanted excitation signal. #+begin_src matlab %% Select the excitation signal -V_exc = V_noise; +V_exc = timeseries(V_noise(2,:), V_noise(1,:)); #+end_src #+begin_src matlab :exports none :eval no @@ -838,7 +887,12 @@ set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); xlim([1, Fs/2]); ylim([1e-10, 1e0]); #+end_src -** Save Data +#+begin_src matlab +%% Save data that will be loaded in the Simulink file +save('./frf_data.mat', 'Fs', 'Ts', 'Tsim', 'Trec_start', 'Trec_dur', 'V_exc'); +#+end_src + +** =frf_save.m= - Save Data :PROPERTIES: :header-args: :tangle matlab/frf_save.m :END: @@ -856,10 +910,10 @@ And we load the data on the Workspace: #+begin_src matlab data = SimulinkRealTime.utils.getFileScopeData('data/data.dat').data; -Va = data(:, 1); % Excitation Voltage (input of PD200) [V] -Vs = data(:, 2); % Measured voltage (force sensor) [V] -de = data(:, 3); % Measurment displacement (encoder) [m] -da = data(:, 4); % Measurement displacement (attocube) [m] +da = data(:, 1); % Excitation Voltage (input of PD200) [V] +de = data(:, 2); % Measured voltage (force sensor) [V] +Vs = data(:, 3); % Measurment displacement (encoder) [m] +Va = data(:, 4); % Measurement displacement (attocube) [m] t = data(:, end); % Time [s] #+end_src @@ -867,10 +921,347 @@ And we save this to a =mat= file: #+begin_src matlab apa_number = 1; -save(sprintf('mat/frf_data_%i.mat', apa_number), 't', 'Va', 'Vs', 'de', 'da'); +save(sprintf('mat/frf_data_%i_huddle.mat', apa_number), 't', 'Va', 'Vs', 'de', 'da'); #+end_src -** Analysis +** Measurements on APA 1 +*** Introduction :ignore: +Measurements are first performed on the APA number 1. + +*** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no +addpath('./matlab/mat/'); +addpath('./matlab/src/'); +addpath('./matlab/'); +#+end_src + +#+begin_src matlab :eval no +addpath('./mat/'); +addpath('./src/'); +#+end_src + +*** Huddle Test +#+begin_src matlab +load(sprintf('frf_data_%i_huddle.mat', 1), 't', 'Va', 'Vs', 'de', 'da'); +#+end_src + +#+begin_src matlab :exports none +figure; +tiledlayout(1, 2, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +hold on; +plot(t, da, 'DisplayName', '$d_a$ - Attocube') +plot(t, de, 'DisplayName', '$d_e$ - Encoder') +hold off; +xlabel('Time [s]'); +ylabel('Displacement [m]'); +legend('location', 'northeast') + +ax2 = nexttile; +hold on; +plot(t, Vs, 'DisplayName', '$V_s$ - Force Sensor') +hold off; +xlabel('Time [s]'); +ylabel('Voltage [V]'); +legend('location', 'northeast') +#+end_src + +#+begin_src matlab +%% Parameter for Spectral analysis +Ts = (t(end) - t(1))/(length(t)-1); +Fs = 1/Ts; + +win = hanning(ceil(10*Fs)); % Hannning Windows +#+end_src + +#+begin_src matlab +[phh_da, f] = pwelch(da - mean(da), win, [], [], 1/Ts); +[phh_de, ~] = pwelch(de - mean(de), win, [], [], 1/Ts); +[phh_Vs, ~] = pwelch(Vs - mean(Vs), win, [], [], 1/Ts); +#+end_src + +#+begin_src matlab :exports none +figure; +tiledlayout(1, 2, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +hold on; +plot(f, phh_da, 'DisplayName', '$d_a$ - Attocube') +plot(f, phh_de, 'DisplayName', '$d_e$ - Encoder') +hold off; +xlabel('Time [s]'); ylabel('ASD [$m/\sqrt{Hz}$]'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +legend('location', 'northeast') +xlim([5e-1, 5e3]); + +ax2 = nexttile; +hold on; +plot(f, phh_Vs, 'DisplayName', '$V_s$ - Force Sensor') +hold off; +xlabel('Time [s]'); ylabel('ASD [$V/\sqrt{Hz}$]'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +legend('location', 'northeast') +xlim([5e-1, 5e3]); +#+end_src + +*** First identification with Noise +#+begin_src matlab +load(sprintf('mat/frf_data_%i_noise.mat', 1), 't', 'Va', 'Vs', 'da', 'de') +#+end_src + +#+begin_src matlab +[pxx_da, f] = pwelch(da, win, [], [], 1/Ts); +[pxx_de, ~] = pwelch(de, win, [], [], 1/Ts); +[pxx_Vs, ~] = pwelch(Vs, win, [], [], 1/Ts); +#+end_src + +#+begin_src matlab :exports none +figure; +tiledlayout(1, 2, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +hold on; +plot(f, sqrt(phh_da), 'DisplayName', 'Huddle') +plot(f, sqrt(pxx_da), 'DisplayName', 'Noise') +hold off; +xlabel('Time [s]'); ylabel('ASD Attocube [$m/\sqrt{Hz}$]'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +legend('location', 'northeast') + +ax2 = nexttile; +hold on; +plot(f, sqrt(phh_Vs), 'DisplayName', 'Huddle') +plot(f, sqrt(pxx_Vs), 'DisplayName', 'Noise') +hold off; +xlabel('Time [s]'); ylabel('ASD [$V/\sqrt{Hz}$]'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +legend('location', 'northeast') + +linkaxes([ax1,ax2],'x'); +xlim([5e-1, 5e3]); +#+end_src + +#+begin_src matlab +[G_dvf, f] = tfestimate(Va, de, win, [], [], 1/Ts); +[G_d, ~] = tfestimate(Va, da, win, [], [], 1/Ts); +[G_iff, ~] = tfestimate(Va, Vs, win, [], [], 1/Ts); + +[coh_dvf, ~] = mscohere(Va, de, win, [], [], 1/Ts); +[coh_d, ~] = mscohere(Va, da, win, [], [], 1/Ts); +[coh_iff, ~] = mscohere(Va, Vs, win, [], [], 1/Ts); +#+end_src + +#+begin_src matlab :exports none +%% +figure; +hold on; +plot(f, coh_dvf); +plot(f, coh_d); +plot(f, coh_iff); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlim([1, 5e3]); ylim([0, 1]); +#+end_src + +#+begin_src matlab :exports none +%% +figure; +tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +hold on; +plot(f, abs(G_d), 'DisplayName', 'Attocube'); +plot(f, abs(G_dvf), 'DisplayName', 'Encoder'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-8, 1e-3]); +legend('location', 'northeast'); + +ax2 = nexttile; +hold on; +plot(f, 180/pi*angle(G_d)); +plot(f, 180/pi*angle(G_dvf)); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([5e-1, 5e3]); +#+end_src + +#+begin_src matlab :exports none +%% +figure; +tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +plot(f, abs(G_iff)); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; + +ax2 = nexttile; +plot(f, 180/pi*angle(G_iff)); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([1, 2e3]); +#+end_src + +*** Second identification with Sweep +#+begin_src matlab +load(sprintf('mat/frf_data_%i_sweep.mat', 1), 't', 'Va', 'Vs', 'da', 'de') +#+end_src + +#+begin_src matlab +[pxx_da, f] = pwelch(da, win, [], [], 1/Ts); +[pxx_de, ~] = pwelch(de, win, [], [], 1/Ts); +[pxx_Vs, ~] = pwelch(Vs, win, [], [], 1/Ts); +#+end_src + +#+begin_src matlab :exports none +figure; +tiledlayout(1, 2, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +hold on; +plot(f, sqrt(phh_da), 'DisplayName', 'Huddle') +plot(f, sqrt(pxx_da), 'DisplayName', 'Noise') +hold off; +xlabel('Time [s]'); ylabel('ASD Attocube [$m/\sqrt{Hz}$]'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +legend('location', 'northeast') + +ax2 = nexttile; +hold on; +plot(f, sqrt(phh_Vs), 'DisplayName', 'Huddle') +plot(f, sqrt(pxx_Vs), 'DisplayName', 'Noise') +hold off; +xlabel('Time [s]'); ylabel('ASD [$V/\sqrt{Hz}$]'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +legend('location', 'northeast') + +linkaxes([ax1,ax2],'x'); +xlim([1e1, 2e3]); +#+end_src + +#+begin_src matlab +[G_dvf, f] = tfestimate(Va, de, win, [], [], 1/Ts); +[G_d, ~] = tfestimate(Va, da, win, [], [], 1/Ts); +[G_iff, ~] = tfestimate(Va, Vs, win, [], [], 1/Ts); + +[coh_dvf, ~] = mscohere(Va, de, win, [], [], 1/Ts); +[coh_d, ~] = mscohere(Va, da, win, [], [], 1/Ts); +[coh_iff, ~] = mscohere(Va, Vs, win, [], [], 1/Ts); +#+end_src + +#+begin_src matlab :exports none +%% +figure; +hold on; +plot(f, coh_dvf); +plot(f, coh_d); +plot(f, coh_iff); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlim([10, 2e3]); ylim([0, 1]); +#+end_src + +#+begin_src matlab :exports none +%% +figure; +tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +hold on; +plot(f, abs(G_d), 'DisplayName', 'Attocube'); +plot(f, abs(G_dvf), 'DisplayName', 'Encoder'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-8, 1e-3]); +legend('location', 'northeast'); + +ax2 = nexttile; +hold on; +plot(f, 180/pi*angle(G_d)); +plot(f, 180/pi*angle(G_dvf)); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +#+end_src + +#+begin_src matlab :exports none +%% +figure; +tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +plot(f, abs(G_iff)); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; + +ax2 = nexttile; +plot(f, 180/pi*angle(G_iff)); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +#+end_src + +*** Extract Parameters + +Quasi static gain between $d$ and $V_a$: +#+begin_src matlab +g_d_Va = mean(abs(G_dvf(f > 10 & f < 15))); +#+end_src + +#+begin_src matlab :results value replace :exports results +sprintf('g_d_Va = %.1e [m/V]', g_d_Va) +#+end_src + +#+RESULTS: +: g_d_Va = 1.7e-05 [m/V] + +Quasi static gain between $V_s$ and $V_a$: +#+begin_src matlab +g_Vs_Va = mean(abs(G_iff(f > 10 & f < 15))); +#+end_src + +#+begin_src matlab :results value replace :exports results +sprintf('g_Vs_Va = %.1e [V/V]', g_Vs_Va) +#+end_src + +#+RESULTS: +: g_Vs_Va = 5.7e-01 [V/V] + +** Comparison of all APA :PROPERTIES: :header-args: :tangle matlab/frf_analyze.m :END: @@ -3038,5 +3429,106 @@ t_exc = args.Ts*[0:1:length(V_exc)-1]; U_exc = [t_exc; V_exc]; #+end_src +** =generateSinIncreasingAmpl=: Generate Sinus with increasing amplitude +:PROPERTIES: +:header-args:matlab+: :tangle ./matlab/src/generateSinIncreasingAmpl.m +:header-args:matlab+: :comments none :mkdirp yes :eval no +:END: +<> + +*** Function description +:PROPERTIES: +:UNNUMBERED: t +:END: + +#+begin_src matlab +function [U_exc] = generateSinIncreasingAmpl(args) +% generateSinIncreasingAmpl - Generate Sinus with increasing amplitude +% +% Syntax: [U_exc] = generateSinIncreasingAmpl(args) +% +% Inputs: +% - args - Optinal arguments: +% - Ts - Sampling Time - [s] +% - V_mean - Mean value of the excitation voltage - [V] +% - sin_ampls - Excitation Amplitudes - [V] +% - sin_freq - Excitation Frequency - [Hz] +% - sin_num - Number of period for each amplitude - [-] +% - t_start - Time at which the excitation begins - [s] +% - smooth_ends - 'true' or 'false': smooth transition between 0 and V_mean - [-] +#+end_src + +*** Optional Parameters +:PROPERTIES: +:UNNUMBERED: t +:END: + +#+begin_src matlab +arguments + args.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e-4 + args.V_mean (1,1) double {mustBeNumeric} = 0 + args.sin_ampls double {mustBeNumeric, mustBePositive} = [0.1, 0.2, 0.3] + args.sin_period (1,1) double {mustBeNumeric, mustBePositive} = 1 + args.sin_num (1,1) double {mustBeNumeric, mustBePositive, mustBeInteger} = 3 + args.t_start (1,1) double {mustBeNumeric, mustBePositive} = 5 + args.smooth_ends logical {mustBeNumericOrLogical} = true +end +#+end_src + +*** Sinus excitation +:PROPERTIES: +:UNNUMBERED: t +:END: + +#+begin_src matlab +t_noise = 0:args.Ts:args.sin_period*args.sin_num; +sin_exc = []; +#+end_src + +#+begin_src matlab +for sin_ampl = args.sin_ampls + sin_exc = [sin_exc, args.V_mean + sin_ampl*sin(2*pi/args.sin_period*t_noise)]; +end +#+end_src + +*** Smooth Ends +:PROPERTIES: +:UNNUMBERED: t +:END: + +#+begin_src matlab +t_smooth_start = args.Ts:args.Ts:args.t_start; + +V_smooth_start = zeros(size(t_smooth_start)); +V_smooth_end = zeros(size(t_smooth_start)); + +if args.smooth_ends + Vd_max = args.V_mean/(0.7*args.t_start); + + V_d = zeros(size(t_smooth_start)); + V_d(t_smooth_start < 0.2*args.t_start) = t_smooth_start(t_smooth_start < 0.2*args.t_start)*Vd_max/(0.2*args.t_start); + V_d(t_smooth_start > 0.2*args.t_start & t_smooth_start < 0.7*args.t_start) = Vd_max; + V_d(t_smooth_start > 0.7*args.t_start & t_smooth_start < 0.9*args.t_start) = Vd_max - (t_smooth_start(t_smooth_start > 0.7*args.t_start & t_smooth_start < 0.9*args.t_start) - 0.7*args.t_start)*Vd_max/(0.2*args.t_start); + + V_smooth_start = cumtrapz(V_d)*args.Ts; + + V_smooth_end = args.V_mean - V_smooth_start; +end +#+end_src + +*** Combine Excitation signals +:PROPERTIES: +:UNNUMBERED: t +:END: + +#+begin_src matlab +V_exc = [V_smooth_start, sin_exc, V_smooth_end]; +t_exc = args.Ts*[0:1:length(V_exc)-1]; +#+end_src + +#+begin_src matlab +U_exc = [t_exc; V_exc]; +#+end_src + * Bibliography :ignore: #+latex: \printbibliography