diff --git a/figs/IMG_20200716_174810.jpg b/figs/IMG_20200716_174810.jpg new file mode 100644 index 0000000..e672121 Binary files /dev/null and b/figs/IMG_20200716_174810.jpg differ diff --git a/figs/IMG_20200720_091821.jpg b/figs/IMG_20200720_091821.jpg new file mode 100644 index 0000000..27b19c8 Binary files /dev/null and b/figs/IMG_20200720_091821.jpg differ diff --git a/figs/apa95ml_5kg_PI_tf.pdf b/figs/apa95ml_5kg_PI_tf.pdf index 9841f66..d0334c6 100644 Binary files a/figs/apa95ml_5kg_PI_tf.pdf and b/figs/apa95ml_5kg_PI_tf.pdf differ diff --git a/figs/apa95ml_5kg_PI_tf.png b/figs/apa95ml_5kg_PI_tf.png index 226ab54..08550ec 100644 Binary files a/figs/apa95ml_5kg_PI_tf.png and b/figs/apa95ml_5kg_PI_tf.png differ diff --git a/figs/apa95ml_5kg_pi_comp_fem.pdf b/figs/apa95ml_5kg_pi_comp_fem.pdf index a7aeefc..8d5e752 100644 Binary files a/figs/apa95ml_5kg_pi_comp_fem.pdf and b/figs/apa95ml_5kg_pi_comp_fem.pdf differ diff --git a/figs/apa95ml_5kg_pi_comp_fem.png b/figs/apa95ml_5kg_pi_comp_fem.png index 4e92574..6d6ede1 100644 Binary files a/figs/apa95ml_5kg_pi_comp_fem.png and b/figs/apa95ml_5kg_pi_comp_fem.png differ diff --git a/figs/exp_frf_identified_tf.pdf b/figs/exp_frf_identified_tf.pdf new file mode 100644 index 0000000..0f748f2 Binary files /dev/null and b/figs/exp_frf_identified_tf.pdf differ diff --git a/figs/exp_frf_identified_tf.png b/figs/exp_frf_identified_tf.png new file mode 100644 index 0000000..91e4198 Binary files /dev/null and b/figs/exp_frf_identified_tf.png differ diff --git a/index.html b/index.html index 40e37ce..9b6af1f 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Test Bench APA95ML @@ -27,50 +27,50 @@

Table of Contents

@@ -78,90 +78,90 @@
-
+

setup_picture.png

Figure 1: Picture of the Setup

-
+

setup_zoom.png

Figure 2: Zoom on the APA

-
-

1 Setup

+
+

1 Setup

-
-

1.1 Parameters

+
+

1.1 Parameters

-
Ts = 1e-4;
+
Ts = 1e-4;
 
-
-

1.2 Filter White Noise

+
+

1.2 Filter White Noise

-
Glpf = 1/(1 + s/2/pi/500);
+
Glpf = 1/(1 + s/2/pi/500);
 
-Gz = c2d(Glpf, Ts, 'tustin');
+Gz = c2d(Glpf, Ts, 'tustin');
 
-
-

2 Run Experiment and Save Data

+
+

2 Run Experiment and Save Data

-
-

2.1 Load Data

+
+

2.1 Load Data

-
data = SimulinkRealTime.utils.getFileScopeData('data/apa95ml.dat').data;
+
data = SimulinkRealTime.utils.getFileScopeData('data/apa95ml.dat').data;
 
-
-

2.2 Save Data

+
+

2.2 Save Data

-
u = data(:, 1); % Input Voltage [V]
-y = data(:, 2); % Output Displacement [m]
-t = data(:, 3); % Time [s]
+
u = data(:, 1); % Input Voltage [V]
+y = data(:, 2); % Output Displacement [m]
+t = data(:, 3); % Time [s]
 
-
save('./mat/huddle_test.mat', 't', 'u', 'y', 'Glpf');
+
save('./mat/huddle_test.mat', 't', 'u', 'y', 'Glpf');
 
-
-

3 Huddle Test

+
+

3 Huddle Test

-
-

3.1 Time Domain Data

+
+

3.1 Time Domain Data

-
+

huddle_test_time_domain.png

Figure 3: Measurement of the Mass displacement during Huddle Test

@@ -169,24 +169,24 @@ t = data(:, 3); % Time [s]
-
-

3.2 PSD of Measurement Noise

+
+

3.2 PSD of Measurement Noise

-
Ts = t(end)/(length(t)-1);
-Fs = 1/Ts;
+
Ts = t(end)/(length(t)-1);
+Fs = 1/Ts;
 
-win = hanning(ceil(1*Fs));
+win = hanning(ceil(1*Fs));
 
-
[pxx, f] = pwelch(y(1000:end), win, [], [], Fs);
+
[pxx, f] = pwelch(y(1000:end), win, [], [], Fs);
 
-
+

huddle_test_pdf.png

Figure 4: Amplitude Spectral Density of the Displacement during Huddle Test

@@ -195,10 +195,10 @@ win = hanning(ceil(1*Fs));
-
-

4 Transfer Function Estimation using the DAC as the driver

+
+

4 Transfer Function Estimation using the DAC as the driver

-
+

Results presented in this sections are wrong as the ADC cannot deliver enought current to the piezoelectric actuator.

@@ -206,11 +206,11 @@ Results presented in this sections are wrong as the ADC cannot deliver enought c
-
-

4.1 Time Domain Data

+
+

4.1 Time Domain Data

-
+

apa95ml_5kg_10V_time_domain.png

Figure 5: Time domain signals during the test

@@ -218,25 +218,25 @@ Results presented in this sections are wrong as the ADC cannot deliver enought c
-
-

4.2 Comparison of the PSD with Huddle Test

+
+

4.2 Comparison of the PSD with Huddle Test

-
Ts = t(end)/(length(t)-1);
-Fs = 1/Ts;
+
Ts = t(end)/(length(t)-1);
+Fs = 1/Ts;
 
-win = hanning(ceil(1*Fs));
+win = hanning(ceil(1*Fs));
 
[pxx, f] = pwelch(y, win, [], [], Fs);
-[pht, ~] = pwelch(ht.y, win, [], [], Fs);
+[pht, ~] = pwelch(ht.y, win, [], [], Fs);
 
-
+

apa95ml_5kg_10V_pdf_comp_huddle.png

Figure 6: Comparison of the ASD for the identification test and the huddle test

@@ -244,32 +244,32 @@ win = hanning(ceil(1*Fs));
-
-

4.3 Compute TF estimate and Coherence

+
+

4.3 Compute TF estimate and Coherence

-
Ts = t(end)/(length(t)-1);
-Fs = 1/Ts;
+
Ts = t(end)/(length(t)-1);
+Fs = 1/Ts;
 
-
win = hann(ceil(1/Ts));
+
win = hann(ceil(1/Ts));
 
-[tf_est, f] = tfestimate(u, -y, win, [], [], 1/Ts);
-[co_est, ~] = mscohere(  u, -y, win, [], [], 1/Ts);
+[tf_est, f] = tfestimate(u, -y, win, [], [], 1/Ts);
+[co_est, ~] = mscohere(  u, -y, win, [], [], 1/Ts);
 
-
+

apa95ml_5kg_10V_coh.png

Figure 7: Coherence

-
+

apa95ml_5kg_10V_tf.png

Figure 8: Estimation of the transfer function from input voltage to displacement

@@ -277,16 +277,16 @@ Fs = 1/Ts;
-
-

4.4 Comparison with the FEM model

+
+

4.4 Comparison with the FEM model

-
load('mat/fem_model_5kg.mat', 'Ghm');
+
load('mat/fem_model_5kg.mat', 'Ghm');
 
-
+

apa95ml_5kg_comp_fem.png

Figure 9: Comparison of the identified transfer function and the one estimated from the FE model

@@ -295,7 +295,7 @@ Fs = 1/Ts;
-
+

The problem comes from the fact that the piezo is driven directly by the DAC that cannot deliver enought current. In the next section, a current amplifier is used. @@ -305,50 +305,50 @@ In the next section, a current amplifier is used.

-
-

5 Transfer Function Estimation using the PI Amplifier

+
+

5 Transfer Function Estimation using the PI Amplifier

-
-

5.1 Load Data

+
+

5.1 Load Data

-
ht = load('./mat/huddle_test.mat', 't', 'u', 'y');
-load('./mat/apa95ml_5kg_Amp_E505.mat', 't', 'u', 'um', 'y');
+
ht = load('./mat/huddle_test.mat', 't', 'u', 'y');
+load('./mat/apa95ml_5kg_Amp_E505.mat', 't', 'u', 'um', 'y');
 
-
u  = 10*(u  - mean(u)); % Input Voltage of Piezo [V]
-um = 10*(um - mean(um)); % Monitor [V]
-y  = y  - mean(y); % Mass displacement [m]
+
u  = 10*(u  - mean(u)); % Input Voltage of Piezo [V]
+um = 10*(um - mean(um)); % Monitor [V]
+y  = y  - mean(y); % Mass displacement [m]
 
-ht.u  = 10*(ht.u  - mean(ht.u));
-ht.y  = ht.y  - mean(ht.y);
+ht.u  = 10*(ht.u  - mean(ht.u));
+ht.y  = ht.y  - mean(ht.y);
 
-
-

5.2 Comparison of the PSD with Huddle Test

+
+

5.2 Comparison of the PSD with Huddle Test

-
Ts = t(end)/(length(t)-1);
-Fs = 1/Ts;
+
Ts = t(end)/(length(t)-1);
+Fs = 1/Ts;
 
-win = hanning(ceil(1*Fs));
+win = hanning(ceil(1*Fs));
 
[pxx, f] = pwelch(y, win, [], [], Fs);
-[pht, ~] = pwelch(ht.y, win, [], [], Fs);
+[pht, ~] = pwelch(ht.y, win, [], [], Fs);
 
-
+

apa95ml_5kg_PI_pdf_comp_huddle.png

Figure 10: Comparison of the ASD for the identification test and the huddle test

@@ -356,33 +356,33 @@ win = hanning(ceil(1*Fs));
-
-

5.3 Compute TF estimate and Coherence

+
+

5.3 Compute TF estimate and Coherence

-
Ts = t(end)/(length(t)-1);
-Fs = 1/Ts;
+
Ts = t(end)/(length(t)-1);
+Fs = 1/Ts;
 
-
win = hann(ceil(1/Ts));
+
win = hann(ceil(1/Ts));
 
-[tf_est, f] = tfestimate(u,  -y, win, [], [], 1/Ts);
-[tf_um , ~] = tfestimate(um, -y, win, [], [], 1/Ts);
-[co_est, ~] = mscohere(  um, -y, win, [], [], 1/Ts);
+[tf_est, f] = tfestimate(u,  -y, win, [], [], 1/Ts);
+[tf_um , ~] = tfestimate(um, -y, win, [], [], 1/Ts);
+[co_est, ~] = mscohere(  um, -y, win, [], [], 1/Ts);
 
-
+

apa95ml_5kg_PI_coh.png

Figure 11: Coherence

-
+

apa95ml_5kg_PI_tf.png

Figure 12: Estimation of the transfer function from input voltage to displacement

@@ -390,16 +390,16 @@ Fs = 1/Ts;
-
-

5.4 Comparison with the FEM model

+
+

5.4 Comparison with the FEM model

-
load('mat/fem_model_5kg.mat', 'G');
+
load('mat/fem_model_5kg.mat', 'G');
 
-
+

apa95ml_5kg_pi_comp_fem.png

Figure 13: Comparison of the identified transfer function and the one estimated from the FE model

@@ -408,8 +408,8 @@ Fs = 1/Ts;
-
-

6 Transfer function from force actuator to force sensor

+
+

6 Transfer function from force actuator to force sensor

Two measurements are performed: @@ -426,9 +426,9 @@ The obtained dynamics from force actuator to force sensor are compare with the F The data are loaded:

-
a_ss = load('mat/apa95ml_5kg_1a_2s.mat', 't', 'u', 'y', 'v');
-aa_s = load('mat/apa95ml_5kg_2a_1s.mat', 't', 'u', 'y', 'v');
-load('mat/G_force_sensor_5kg.mat', 'G');
+
a_ss = load('mat/apa95ml_5kg_1a_2s.mat', 't', 'u', 'y', 'v');
+aa_s = load('mat/apa95ml_5kg_2a_1s.mat', 't', 'u', 'y', 'v');
+load('mat/G_force_sensor_5kg.mat', 'G');
 

@@ -439,11 +439,11 @@ Let’s use the amplifier gain to obtain the true voltage applied to the act The parameters of the piezoelectric stacks are defined below:

-
d33 = 3e-10; % Strain constant [m/V]
-n = 80; % Number of layers per stack
-eT = 1.6e-8; % Permittivity under constant stress [F/m]
-sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
-ka = 235e6; % Stack stiffness [N/m]
+
d33 = 3e-10; % Strain constant [m/V]
+n = 80; % Number of layers per stack
+eT = 1.6e-8; % Permittivity under constant stress [F/m]
+sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
+ka = 235e6; % Stack stiffness [N/m]
 
@@ -451,51 +451,51 @@ ka = 235e6; % Stack stiffness [N/m] From the FEM, we construct the transfer function from DAC voltage to ADC voltage.

-
Gfem_aa_s = exp(-s/1e4)*20*(2*d33*n*ka)*(G(3,1)+G(3,2))*d33/(eT*sD*n);
-Gfem_a_ss = exp(-s/1e4)*20*(  d33*n*ka)*(G(3,1)+G(2,1))*d33/(eT*sD*n);
+
Gfem_aa_s = exp(-s/1e4)*20*(2*d33*n*ka)*(G(3,1)+G(3,2))*d33/(eT*sD*n);
+Gfem_a_ss = exp(-s/1e4)*20*(  d33*n*ka)*(G(3,1)+G(2,1))*d33/(eT*sD*n);
 

-The transfer function from input voltage to output voltage are computed and shown in Figure 14. +The transfer function from input voltage to output voltage are computed and shown in Figure 14.

-
Ts = a_ss.t(end)/(length(a_ss.t)-1);
-Fs = 1/Ts;
+
Ts = a_ss.t(end)/(length(a_ss.t)-1);
+Fs = 1/Ts;
 
-win = hann(ceil(10/Ts));
+win = hann(ceil(10/Ts));
 
-[tf_a_ss,  f] = tfestimate(a_ss.u, a_ss.v, win, [], [], 1/Ts);
-[coh_a_ss, ~] = mscohere(  a_ss.u, a_ss.v, win, [], [], 1/Ts);
+[tf_a_ss,  f] = tfestimate(a_ss.u, a_ss.v, win, [], [], 1/Ts);
+[coh_a_ss, ~] = mscohere(  a_ss.u, a_ss.v, win, [], [], 1/Ts);
 
-[tf_aa_s,  f] = tfestimate(aa_s.u, aa_s.v, win, [], [], 1/Ts);
-[coh_aa_s, ~] = mscohere(  aa_s.u, aa_s.v, win, [], [], 1/Ts);
+[tf_aa_s,  f] = tfestimate(aa_s.u, aa_s.v, win, [], [], 1/Ts);
+[coh_aa_s, ~] = mscohere(  aa_s.u, aa_s.v, win, [], [], 1/Ts);
 
-
+

bode_plot_force_sensor_voltage_comp_fem.png

Figure 14: Comparison of the identified dynamics from voltage output to voltage input and the FEM

-
-

6.1 System Identification

+
+

6.1 System Identification

-
w_z = 2*pi*111; % Zeros frequency [rad/s]
-w_p = 2*pi*255; % Pole frequency [rad/s]
+
w_z = 2*pi*111; % Zeros frequency [rad/s]
+w_p = 2*pi*255; % Pole frequency [rad/s]
 xi_z = 0.05;
 xi_p = 0.015;
 G_inf = 2;
 
-Gi = G_inf*(s^2 - 2*xi_z*w_z*s + w_z^2)/(s^2 + 2*xi_p*w_p*s + w_p^2);
+Gi = G_inf*(s^2 - 2*xi_z*w_z*s + w_z^2)/(s^2 + 2*xi_p*w_p*s + w_p^2);
 
-
+

iff_plant_identification_apa95ml.png

Figure 15: Identification of the IFF plant

@@ -504,11 +504,11 @@ Gi = G_inf*(s^2 - 2*xi_z*w_z*s + w_z^2)/(s^2 + 2*xi_p*w_p*s + w_p^2);
-
-

6.2 Integral Force Feedback

+
+

6.2 Integral Force Feedback

-
+

root_locus_iff_apa95ml_identification.png

Figure 16: Root Locus for IFF

@@ -517,37 +517,37 @@ Gi = G_inf*(s^2 - 2*xi_z*w_z*s + w_z^2)/(s^2 + 2*xi_p*w_p*s + w_p^2);
-
-

7 IFF Tests

+
+

7 IFF Tests

-
-

7.1 First tests with few gains

+
+

7.1 First tests with few gains

-
iff_g10 = load('./mat/apa95ml_iff_g10_res.mat', 'u', 't', 'y', 'v');
-iff_g100 = load('./mat/apa95ml_iff_g100_res.mat', 'u', 't', 'y', 'v');
-iff_of = load('./mat/apa95ml_iff_off_res.mat', 'u', 't', 'y', 'v');
+
iff_g10 = load('./mat/apa95ml_iff_g10_res.mat', 'u', 't', 'y', 'v');
+iff_g100 = load('./mat/apa95ml_iff_g100_res.mat', 'u', 't', 'y', 'v');
+iff_of = load('./mat/apa95ml_iff_off_res.mat', 'u', 't', 'y', 'v');
 
-
Ts = 1e-4;
-win = hann(ceil(10/Ts));
+
Ts = 1e-4;
+win = hann(ceil(10/Ts));
 
-[tf_iff_g10, f] = tfestimate(iff_g10.u, iff_g10.y, win, [], [], 1/Ts);
-[co_iff_g10, ~] = mscohere(iff_g10.u, iff_g10.y, win, [], [], 1/Ts);
+[tf_iff_g10, f] = tfestimate(iff_g10.u, iff_g10.y, win, [], [], 1/Ts);
+[co_iff_g10, ~] = mscohere(iff_g10.u, iff_g10.y, win, [], [], 1/Ts);
 
-[tf_iff_g100, f] = tfestimate(iff_g100.u, iff_g100.y, win, [], [], 1/Ts);
-[co_iff_g100, ~] = mscohere(iff_g100.u, iff_g100.y, win, [], [], 1/Ts);
+[tf_iff_g100, f] = tfestimate(iff_g100.u, iff_g100.y, win, [], [], 1/Ts);
+[co_iff_g100, ~] = mscohere(iff_g100.u, iff_g100.y, win, [], [], 1/Ts);
 
-[tf_iff_of, ~] = tfestimate(iff_of.u, iff_of.y, win, [], [], 1/Ts);
-[co_iff_of, ~] = mscohere(iff_of.u, iff_of.y, win, [], [], 1/Ts);
+[tf_iff_of, ~] = tfestimate(iff_of.u, iff_of.y, win, [], [], 1/Ts);
+[co_iff_of, ~] = mscohere(iff_of.u, iff_of.y, win, [], [], 1/Ts);
 
-
+

iff_first_test_coherence.png

Figure 17: Coherence

@@ -555,7 +555,7 @@ win = hann(ceil(10/Ts)); -
+

iff_first_test_bode_plot.png

Figure 18: Bode plot for different values of IFF gain

@@ -563,17 +563,17 @@ win = hann(ceil(10/Ts));
-
-

7.2 Second test with many Gains

+
+

7.2 Second test with many Gains

-
load('./mat/apa95ml_iff_test.mat', 'results');
+
load('./mat/apa95ml_iff_test.mat', 'results');
 
-
Ts = 1e-4;
-win = hann(ceil(10/Ts));
+
Ts = 1e-4;
+win = hann(ceil(10/Ts));
 
@@ -582,18 +582,18 @@ win = hann(ceil(10/Ts)); co_iff = {zeros(1, length(results))}; g_iff = [0, 1, 5, 10, 50, 100]; -for i=1:length(results) - [tf_est, f] = tfestimate(results{i}.u, results{i}.y, win, [], [], 1/Ts); - [co_est, ~] = mscohere(results{i}.u, results{i}.y, win, [], [], 1/Ts); +for i=1:length(results) + [tf_est, f] = tfestimate(results{i}.u, results{i}.y, win, [], [], 1/Ts); + [co_est, ~] = mscohere(results{i}.u, results{i}.y, win, [], [], 1/Ts); - tf_iff(i) = {tf_est}; - co_iff(i) = {co_est}; -end + tf_iff(i) = {tf_est}; + co_iff(i) = {co_est}; +end
-
+

iff_results_bode_plots.png

@@ -601,27 +601,27 @@ end
G_id = {zeros(1,length(results))};
 
-f_start = 70; % [Hz]
-f_end = 500; % [Hz]
+f_start = 70; % [Hz]
+f_end = 500; % [Hz]
 
-for i = 1:length(results)
-    tf_id = tf_iff{i}(sum(f<f_start):length(f)-sum(f>f_end));
-    f_id = f(sum(f<f_start):length(f)-sum(f>f_end));
+for i = 1:length(results)
+    tf_id = tf_iff{i}(sum(f<f_start):length(f)-sum(f>f_end));
+    f_id = f(sum(f<f_start):length(f)-sum(f>f_end));
 
-    gfr = idfrd(tf_id, 2*pi*f_id, Ts);
-    G_id(i) = {procest(gfr,'P2UDZ')};
-end
+    gfr = idfrd(tf_id, 2*pi*f_id, Ts);
+    G_id(i) = {procest(gfr,'P2UDZ')};
+end
 
-
+

iff_results_bode_plots_identification.png

-
+

iff_results_root_locus.png

@@ -631,7 +631,7 @@ end

Author: Dehaeze Thomas

-

Created: 2020-08-21 ven. 15:26

+

Created: 2020-11-03 mar. 10:11

diff --git a/index.org b/index.org index cb64c74..b677101 100644 --- a/index.org +++ b/index.org @@ -680,7 +680,7 @@ The transfer function from input voltage to output voltage are computed and show plot(real(pole(Gi)), imag(pole(Gi)), 'kx'); plot(real(tzero(Gi)), imag(tzero(Gi)), 'ko'); for i = 1:length(gains) - cl_poles = pole(feedback(Gi, (gains(i)/s))); + cl_poles = pole(feedback(Gi, (gains(i)/(s + 2*2*pi)*s/(s + 0.5*2*pi)))); plot(real(cl_poles), imag(cl_poles), 'k.'); end ylim([0, 1800]); diff --git a/mat/G_force_sensor_5kg.mat b/mat/G_force_sensor_5kg.mat new file mode 100644 index 0000000..5bfa3cf Binary files /dev/null and b/mat/G_force_sensor_5kg.mat differ diff --git a/mat/fem_model_5kg.mat b/mat/fem_model_5kg.mat index 8d6d744..51083ce 100644 Binary files a/mat/fem_model_5kg.mat and b/mat/fem_model_5kg.mat differ diff --git a/mat/fem_model_Gf_5kg.mat b/mat/fem_model_Gf_5kg.mat new file mode 100644 index 0000000..c96b7a0 Binary files /dev/null and b/mat/fem_model_Gf_5kg.mat differ