test-bench-apa/index.org

24 KiB

Test Bench APA95ML

Introduction   ignore

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/setup_picture.png
Picture of the Setup
/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/setup_zoom.png
Zoom on the APA

Setup

Parameters

  Ts = 1e-4;

Filter White Noise

  Glpf = 1/(1 + s/2/pi/500);

  Gz = c2d(Glpf, Ts, 'tustin');

Run Experiment and Save Data

Load Data

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

Save Data

  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');

Huddle Test

Time Domain Data

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/huddle_test_time_domain.png

Measurement of the Mass displacement during Huddle Test

PSD of Measurement Noise

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

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/huddle_test_pdf.png

Amplitude Spectral Density of the Displacement during Huddle Test

Transfer Function Estimation using the DAC as the driver

Introduction   ignore

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

Time Domain Data

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_10V_time_domain.png

Time domain signals during the test

Comparison of the PSD with Huddle Test

  Ts = t(end)/(length(t)-1);
  Fs = 1/Ts;

  win = hanning(ceil(1*Fs));
  [pxx, f] = pwelch(y, win, [], [], Fs);
  [pht, ~] = pwelch(ht.y, win, [], [], Fs);

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_10V_pdf_comp_huddle.png

Comparison of the ASD for the identification test and the huddle test

Compute TF estimate and Coherence

  Ts = t(end)/(length(t)-1);
  Fs = 1/Ts;
  win = hann(ceil(1/Ts));

  [tf_est, f] = tfestimate(u, -y, win, [], [], 1/Ts);
  [co_est, ~] = mscohere(  u, -y, win, [], [], 1/Ts);

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_10V_coh.png

Coherence

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_10V_tf.png

Estimation of the transfer function from input voltage to displacement

Comparison with the FEM model

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

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_comp_fem.png

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

Conclusion   ignore

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.

Transfer Function Estimation using the PI Amplifier

Load Data

  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]

  ht.u  = 10*(ht.u  - mean(ht.u));
  ht.y  = ht.y  - mean(ht.y);

Comparison of the PSD with Huddle Test

  Ts = t(end)/(length(t)-1);
  Fs = 1/Ts;

  win = hanning(ceil(1*Fs));
  [pxx, f] = pwelch(y, win, [], [], Fs);
  [pht, ~] = pwelch(ht.y, win, [], [], Fs);

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_PI_pdf_comp_huddle.png

Comparison of the ASD for the identification test and the huddle test

Compute TF estimate and Coherence

  Ts = t(end)/(length(t)-1);
  Fs = 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);

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_PI_coh.png

Coherence

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_PI_tf.png

Estimation of the transfer function from input voltage to displacement

Comparison with the FEM model

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

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/apa95ml_5kg_pi_comp_fem.png

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

Transfer function from force actuator to force sensor

Introduction   ignore

Two measurements are performed:

  • Speedgoat DAC => Voltage Amplifier (x20) => 1 Piezo Stack => … => 2 Stacks as Force Sensor (parallel) => Speedgoat ADC
  • Speedgoat DAC => Voltage Amplifier (x20) => 2 Piezo Stacks (parallel) => … => 1 Stack as Force Sensor => Speedgoat ADC

The obtained dynamics from force actuator to force sensor are compare with the FEM model.

Load Data   ignore

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');

Adjust gain   ignore

Let's use the amplifier gain to obtain the true voltage applied to the actuator stack(s)

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]

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);

Compute TF estimate and Coherence   ignore

The transfer function from input voltage to output voltage are computed and shown in Figure fig:bode_plot_force_sensor_voltage_comp_fem.

  Ts = a_ss.t(end)/(length(a_ss.t)-1);
  Fs = 1/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_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);

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/bode_plot_force_sensor_voltage_comp_fem.png

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

System Identification

  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);

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/iff_plant_identification_apa95ml.png

Identification of the IFF plant

Integral Force Feedback

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/root_locus_iff_apa95ml_identification.png

Root Locus for IFF

IFF Tests

Load Data

  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));

  [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_of, ~] = tfestimate(iff_of.u, iff_of.y, win, [], [], 1/Ts);
  [co_iff_of, ~] = mscohere(iff_of.u, iff_of.y, win, [], [], 1/Ts);
  figure;

  hold on;
  plot(f, co_iff_of, '-', 'DisplayName', 'g=0')
  plot(f, co_iff_g10, '-', 'DisplayName', 'g=10')
  plot(f, co_iff_g100, '-', 'DisplayName', 'g=100')
  set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
  ylabel('Coherence'); xlabel('Frequency [Hz]');
  hold off;
  legend();
  xlim([60, 600])

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/iff_first_test_coherence.png

Coherence
  figure;
  ax1 = subplot(2, 1, 1);
  hold on;
  plot(f, abs(tf_iff_of), '-', 'DisplayName', 'g=0')
  plot(f, abs(tf_iff_g10), '-', 'DisplayName', 'g=10')
  plot(f, abs(tf_iff_g100), '-', 'DisplayName', 'g=100')
  set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
  ylabel('Amplitude'); xlabel('Frequency [Hz]');
  hold off;
  legend();

  ax2 = subplot(2, 1, 2);
  hold on;
  plot(f, 180/pi*angle(-tf_iff_of), '-')
  plot(f, 180/pi*angle(-tf_iff_g10), '-')
  plot(f, 180/pi*angle(-tf_iff_g100), '-')
  set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
  ylabel('Phase'); xlabel('Frequency [Hz]');
  hold off;

  linkaxes([ax1,ax2], 'x');
  xlim([60, 600]);

/tdehaeze/test-bench-apa/media/commit/610bc525be022b4610b16373c262cd732c16175b/figs/iff_first_test_bode_plot.png

Bode plot for different values of IFF gain