diff --git a/figs/apa300ml_meas_freq_bending_x.pdf b/figs/apa300ml_meas_freq_bending_x.pdf new file mode 100644 index 0000000..a911506 Binary files /dev/null and b/figs/apa300ml_meas_freq_bending_x.pdf differ diff --git a/figs/apa300ml_meas_freq_bending_x.png b/figs/apa300ml_meas_freq_bending_x.png new file mode 100644 index 0000000..60c094c Binary files /dev/null and b/figs/apa300ml_meas_freq_bending_x.png differ diff --git a/figs/apa300ml_meas_freq_bending_y.pdf b/figs/apa300ml_meas_freq_bending_y.pdf new file mode 100644 index 0000000..d4f71ff Binary files /dev/null and b/figs/apa300ml_meas_freq_bending_y.pdf differ diff --git a/figs/apa300ml_meas_freq_bending_y.png b/figs/apa300ml_meas_freq_bending_y.png new file mode 100644 index 0000000..80b3e5e Binary files /dev/null and b/figs/apa300ml_meas_freq_bending_y.png differ diff --git a/figs/apa300ml_meas_freq_compare.pdf b/figs/apa300ml_meas_freq_compare.pdf new file mode 100644 index 0000000..18c3b8b Binary files /dev/null and b/figs/apa300ml_meas_freq_compare.pdf differ diff --git a/figs/apa300ml_meas_freq_compare.png b/figs/apa300ml_meas_freq_compare.png new file mode 100644 index 0000000..bf5ad3c Binary files /dev/null and b/figs/apa300ml_meas_freq_compare.png differ diff --git a/figs/apa300ml_meas_freq_torsion_z.pdf b/figs/apa300ml_meas_freq_torsion_z.pdf new file mode 100644 index 0000000..c0e0713 Binary files /dev/null and b/figs/apa300ml_meas_freq_torsion_z.pdf differ diff --git a/figs/apa300ml_meas_freq_torsion_z.png b/figs/apa300ml_meas_freq_torsion_z.png new file mode 100644 index 0000000..da225ed Binary files /dev/null and b/figs/apa300ml_meas_freq_torsion_z.png differ diff --git a/figs/measurement_setup_X_bending.png b/figs/measurement_setup_X_bending.png new file mode 100644 index 0000000..378e5d6 Binary files /dev/null and b/figs/measurement_setup_X_bending.png differ diff --git a/figs/measurement_setup_Y_bending.png b/figs/measurement_setup_Y_bending.png new file mode 100644 index 0000000..a43ed10 Binary files /dev/null and b/figs/measurement_setup_Y_bending.png differ diff --git a/figs/measurement_setup_torsion.png b/figs/measurement_setup_torsion.png new file mode 100644 index 0000000..172c686 Binary files /dev/null and b/figs/measurement_setup_torsion.png differ diff --git a/figs/measurement_setup_torsion_bis.png b/figs/measurement_setup_torsion_bis.png new file mode 100644 index 0000000..e3220fa Binary files /dev/null and b/figs/measurement_setup_torsion_bis.png differ diff --git a/figs/mode_bending_x.gif b/figs/mode_bending_x.gif new file mode 100644 index 0000000..cd94406 Binary files /dev/null and b/figs/mode_bending_x.gif differ diff --git a/figs/mode_bending_x.png b/figs/mode_bending_x.png new file mode 100644 index 0000000..583edb6 Binary files /dev/null and b/figs/mode_bending_x.png differ diff --git a/figs/mode_bending_y.gif b/figs/mode_bending_y.gif new file mode 100644 index 0000000..114f05c Binary files /dev/null and b/figs/mode_bending_y.gif differ diff --git a/figs/mode_bending_y.png b/figs/mode_bending_y.png new file mode 100644 index 0000000..8841f69 Binary files /dev/null and b/figs/mode_bending_y.png differ diff --git a/figs/mode_torsion_z.gif b/figs/mode_torsion_z.gif new file mode 100644 index 0000000..10a41ec Binary files /dev/null and b/figs/mode_torsion_z.gif differ diff --git a/figs/mode_torsion_z.png b/figs/mode_torsion_z.png new file mode 100644 index 0000000..708935a Binary files /dev/null and b/figs/mode_torsion_z.png differ diff --git a/matlab/mat/apa300ml_bending_X_top.mat b/matlab/mat/apa300ml_bending_X_top.mat new file mode 100644 index 0000000..6c575fe Binary files /dev/null and b/matlab/mat/apa300ml_bending_X_top.mat differ diff --git a/matlab/mat/apa300ml_bending_Y_top.mat b/matlab/mat/apa300ml_bending_Y_top.mat new file mode 100644 index 0000000..23aa23e Binary files /dev/null and b/matlab/mat/apa300ml_bending_Y_top.mat differ diff --git a/matlab/mat/apa300ml_torsion_left.mat b/matlab/mat/apa300ml_torsion_left.mat new file mode 100644 index 0000000..4ac831f Binary files /dev/null and b/matlab/mat/apa300ml_torsion_left.mat differ diff --git a/matlab/mat/apa300ml_torsion_right.mat b/matlab/mat/apa300ml_torsion_right.mat new file mode 100644 index 0000000..fc016f2 Binary files /dev/null and b/matlab/mat/apa300ml_torsion_right.mat differ diff --git a/matlab/mat/apa300ml_torsion_top.mat b/matlab/mat/apa300ml_torsion_top.mat new file mode 100644 index 0000000..02b9ec8 Binary files /dev/null and b/matlab/mat/apa300ml_torsion_top.mat differ diff --git a/test-bench-apa300ml.html b/test-bench-apa300ml.html index 8b2d306..37277d5 100644 --- a/test-bench-apa300ml.html +++ b/test-bench-apa300ml.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Amplifier Piezoelectric Actuator APA300ML - Test Bench @@ -39,40 +39,95 @@

Table of Contents

@@ -97,21 +152,21 @@ This include: -
+

apa300ML.png

Figure 1: Picture of the APA300ML

-
-

1 Model of an Amplified Piezoelectric Actuator and Sensor

+
+

1 Model of an Amplified Piezoelectric Actuator and Sensor

-Consider a schematic of the Amplified Piezoelectric Actuator in Figure 2. +Consider a schematic of the Amplified Piezoelectric Actuator in Figure 2.

-
+

apa_model_schematic.png

Figure 2: Amplified Piezoelectric Actuator Schematic

@@ -136,11 +191,11 @@ We wish here to experimental measure \(g_a\) and \(g_s\).

-The block-diagram model of the piezoelectric actuator is then as shown in Figure 3. +The block-diagram model of the piezoelectric actuator is then as shown in Figure 3.

-
+

apa-model-simscape-schematic.png

Figure 3: Model of the APA with Simscape/Simulink

@@ -148,30 +203,30 @@ The block-diagram model of the piezoelectric actuator is then as shown in Figure
-
-

2 Geometrical Measurements

+
+

2 Geometrical Measurements

-The received APA are shown in Figure 4. +The received APA are shown in Figure 4.

-
+

IMG_20210224_143500.jpg

Figure 4: Received APA

-
-

2.1 Measurement Setup

+
+

2.1 Measurement Setup

-The flatness corresponding to the two interface planes are measured as shown in Figure 5. +The flatness corresponding to the two interface planes are measured as shown in Figure 5.

-
+

IMG_20210224_143809.jpg

Figure 5: Measurement Setup

@@ -179,8 +234,8 @@ The flatness corresponding to the two interface planes are measured as shown in
-
-

2.2 Measurement Results

+
+

2.2 Measurement Results

The height (Z) measurements at the 8 locations (4 points by plane) are defined below. @@ -226,10 +281,10 @@ Finally, the flatness is estimated by fitting a plane through the 8 points using

-The obtained flatness are shown in Table 1. +The obtained flatness are shown in Table 1.

- +
@@ -284,10 +339,10 @@ The obtained flatness are shown in Table 1. -
-

3 Electrical Measurements

+
+

3 Electrical Measurements

-
+

The capacitance of the stacks is measure with the LCR-800 Meter (doc)

@@ -295,7 +350,7 @@ The capacitance of the stacks is measure with the +
Table 1: Estimated flatness
@@ -367,7 +422,7 @@ The excitation frequency is set to be 1kHz.
Table 2: Capacitance measured with the LCR meter. The excitation signal is a sinus at 1kHz
-
+

There is clearly a problem with APA300ML number 3

@@ -376,12 +431,12 @@ There is clearly a problem with APA300ML number 3
-
-

4 Stiffness measurement

+
+

4 Stiffness measurement

-
-

4.1 APA test

+
+

4.1 APA test

load('meas_stiff_apa_1_x.mat', 't', 'F', 'd');
@@ -447,22 +502,22 @@ plot(F_l, F_l*fit_l(1) +
 
-
-

5 Stroke measurement

+
+

5 Stroke measurement

We here wish to estimate the stroke of the APA.

-To do so, one side of the APA is fixed, and a displacement probe is located on the other side as shown in Figure 7. +To do so, one side of the APA is fixed, and a displacement probe is located on the other side as shown in Figure 7.

Then, a voltage is applied on either one or two stacks using a DAC and a voltage amplifier.

-
+

Here are the documentation of the equipment used for this test bench:

@@ -475,92 +530,92 @@ Here are the documentation of the equipment used for this test bench:
-
+

CE0EF55E-07B7-461B-8CDB-98590F68D15B.jpeg

Figure 7: Bench to measured the APA stroke

-
-

5.1 Voltage applied on one stack

+
+

5.1 Voltage applied on one stack

Let’s first look at the relation between the voltage applied to one stack to the displacement of the APA as measured by the displacement probe.

-The applied voltage is shown in Figure 8. +The applied voltage is shown in Figure 8.

-
+

apa_stroke_voltage_time.png

Figure 8: Applied voltage as a function of time

-The obtained displacement is shown in Figure 9. +The obtained displacement is shown in Figure 9. The displacement is set to zero at initial time when the voltage applied is -20V.

-
+

apa_stroke_time_1s.png

Figure 9: Displacement as a function of time for all the APA300ML

-Finally, the displacement is shown as a function of the applied voltage in Figure 10. +Finally, the displacement is shown as a function of the applied voltage in Figure 10. We can clearly see that there is a problem with the APA 3. Also, there is a large hysteresis.

-
+

apa_d_vs_V_1s.png

Figure 10: Displacement as a function of the applied voltage

-
+

-We can clearly see from Figure 10 that there is a problem with the APA number 3. +We can clearly see from Figure 10 that there is a problem with the APA number 3.

-
-

5.2 Voltage applied on two stacks

+
+

5.2 Voltage applied on two stacks

Now look at the relation between the voltage applied to the two other stacks to the displacement of the APA as measured by the displacement probe.

-The obtained displacement is shown in Figure 11. +The obtained displacement is shown in Figure 11. The displacement is set to zero at initial time when the voltage applied is -20V.

-
+

apa_stroke_time_2s.png

Figure 11: Displacement as a function of time for all the APA300ML

-Finally, the displacement is shown as a function of the applied voltage in Figure 12. +Finally, the displacement is shown as a function of the applied voltage in Figure 12. We can clearly see that there is a problem with the APA 3. Also, there is a large hysteresis.

-
+

apa_d_vs_V_2s.png

Figure 12: Displacement as a function of the applied voltage

@@ -568,25 +623,25 @@ Also, there is a large hysteresis.
-
-

5.3 Voltage applied on all three stacks

+
+

5.3 Voltage applied on all three stacks

-Finally, we can combine the two measurements to estimate the relation between the displacement and the voltage applied to the three stacks (Figure 13). +Finally, we can combine the two measurements to estimate the relation between the displacement and the voltage applied to the three stacks (Figure 13).

-
+

apa_d_vs_V_3s.png

Figure 13: Displacement as a function of the applied voltage

-The obtained maximum stroke for all the APA are summarized in Table 3. +The obtained maximum stroke for all the APA are summarized in Table 3.

- +
@@ -641,10 +696,10 @@ The obtained maximum stroke for all the APA are summarized in Table -

6 Test-Bench Description

+
+

6 Test-Bench Description

-
+

Here are the documentation of the equipment used for this test bench:

@@ -659,7 +714,7 @@ Here are the documentation of the equipment used for this test bench:
-
+

test_bench_apa_alone.png

Figure 14: Schematic of the Test Bench

@@ -667,12 +722,12 @@ Here are the documentation of the equipment used for this test bench:
-
-

7 Measurement Procedure

+
+

7 Measurement Procedure

-
-

7.1 Stroke Measurement

+
+

7.1 Stroke Measurement

Using the PD200 amplifier, output a voltage: @@ -700,8 +755,8 @@ Conclude on the obtained stroke.

-
-

7.2 Stiffness Measurement

+
+

7.2 Stiffness Measurement

Add some (known) weight \(\delta m g\) on the suspended mass and measure the deflection \(\delta d\). @@ -721,8 +776,8 @@ Then the obtained stiffness is:

-
-

7.3 Hysteresis measurement

+
+

7.3 Hysteresis measurement

Supply a quasi static sinusoidal excitation \(V_a\) at different voltages. @@ -741,7 +796,7 @@ Then, \(d\) is plotted as a function of \(V_a\) for all the amplitudes.

-
+

expected_hysteresis.png

Figure 15: Expected Hysteresis (poel10_explor_activ_hard_mount_vibrat)

@@ -749,8 +804,8 @@ Then, \(d\) is plotted as a function of \(V_a\) for all the amplitudes.
-
-

7.4 Piezoelectric Actuator Constant

+
+

7.4 Piezoelectric Actuator Constant

Using the measurement test-bench, it is rather easy the determine the static gain between the applied voltage \(V_a\) to the induced displacement \(d\). @@ -777,8 +832,8 @@ From the two gains, it is then easy to determine \(g_a\):

-
-

7.5 Piezoelectric Sensor Constant

+
+

7.5 Piezoelectric Sensor Constant

From a quasi static excitation of the piezoelectric stack, measure the gain from \(V_a\) to \(V_s\): @@ -817,8 +872,8 @@ This external force can be some weight added, or a piezo in parallel.

-
-

7.6 Capacitance Measurement

+
+

7.6 Capacitance Measurement

Measure the capacitance of the 3 stacks individually using a precise multi-meter. @@ -826,8 +881,8 @@ Measure the capacitance of the 3 stacks individually using a precise multi-meter

-
-

7.7 Dynamical Behavior

+
+

7.7 Dynamical Behavior

Perform a system identification from \(V_a\) to the measured displacement \(d\) by the interferometer and by the encoder, and to the generated voltage \(V_s\). @@ -843,8 +898,8 @@ This can also be performed with and without the encoder fixed to the APA.

-
-

7.8 Compare the results obtained for all 7 APA300ML

+
+

7.8 Compare the results obtained for all 7 APA300ML

Compare all the obtained parameters for all the test APA. @@ -853,8 +908,684 @@ Compare all the obtained parameters for all the test APA.

-
-

8 Measurement Results

+
+

8 Measurement Results

+
+ +
+

9 Test Bench APA300ML - Simscape Model

+
+
+
+

9.1 Introduction

+
+
+

9.2 Nano Hexapod object

+
+
+
n_hexapod = struct();
+
+
+
+ +
+

9.2.1 APA - 2 DoF

+
+
+
n_hexapod.actuator = struct();
+
+n_hexapod.actuator.type = 1;
+
+n_hexapod.actuator.k  = ones(6,1)*0.35e6; % [N/m]
+n_hexapod.actuator.ke = ones(6,1)*1.5e6; % [N/m]
+n_hexapod.actuator.ka = ones(6,1)*43e6; % [N/m]
+
+n_hexapod.actuator.c  = ones(6,1)*3e1; % [N/(m/s)]
+n_hexapod.actuator.ce = ones(6,1)*1e1; % [N/(m/s)]
+n_hexapod.actuator.ca = ones(6,1)*1e1; % [N/(m/s)]
+
+n_hexapod.actuator.Leq = ones(6,1)*0.056; % [m]
+
+n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V]
+n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m]
+
+
+
+
+ +
+

9.2.2 APA - Flexible Frame

+
+
+
n_hexapod.actuator.type = 2;
+
+n_hexapod.actuator.K = readmatrix('APA300ML_b_mat_K.CSV'); % Stiffness Matrix
+n_hexapod.actuator.M = readmatrix('APA300ML_b_mat_M.CSV'); % Mass Matrix
+n_hexapod.actuator.xi = 0.01; % Damping ratio
+n_hexapod.actuator.P = extractNodes('APA300ML_b_out_nodes_3D.txt'); % Node coordinates [m]
+
+n_hexapod.actuator.ks = 235e6; % Stiffness of one stack [N/m]
+n_hexapod.actuator.cs = 1e1; % Stiffness of one stack [N/m]
+
+n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V]
+n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m]
+
+
+
+
+ +
+

9.2.3 APA - Fully Flexible

+
+
+
n_hexapod.actuator.type = 3;
+
+n_hexapod.actuator.K = readmatrix('APA300ML_full_mat_K.CSV'); % Stiffness Matrix
+n_hexapod.actuator.M = readmatrix('APA300ML_full_mat_M.CSV'); % Mass Matrix
+n_hexapod.actuator.xi = 0.01; % Damping ratio
+n_hexapod.actuator.P = extractNodes('APA300ML_full_out_nodes_3D.txt'); % Node coordiantes [m]
+
+n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V]
+n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m]
+
+
+
+
+
+ +
+

9.3 Identification

+
+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'test_bench_apa300ml';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/Va'],  1, 'openinput');  io_i = io_i + 1; % Actuator Voltage
+io(io_i) = linio([mdl, '/Vs'],  1, 'openoutput'); io_i = io_i + 1; % Sensor Voltage
+io(io_i) = linio([mdl, '/dL'],  1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs
+io(io_i) = linio([mdl, '/z'],   1, 'openoutput'); io_i = io_i + 1; % Vertical Motion
+
+%% Run the linearization
+Ga = linearize(mdl, io, 0.0, options);
+Ga.InputName  = {'Va'};
+Ga.OutputName = {'Vs', 'dL', 'z'};
+
+
+
+
+ +
+

9.4 Compare 2-DoF with flexible

+
+
+
+

9.4.1 APA - 2 DoF

+
+
+
n_hexapod = struct();
+
+n_hexapod.actuator = struct();
+
+n_hexapod.actuator.type = 1;
+
+n_hexapod.actuator.k  = ones(6,1)*0.35e6; % [N/m]
+n_hexapod.actuator.ke = ones(6,1)*1.5e6; % [N/m]
+n_hexapod.actuator.ka = ones(6,1)*43e6; % [N/m]
+
+n_hexapod.actuator.c  = ones(6,1)*3e1; % [N/(m/s)]
+n_hexapod.actuator.ce = ones(6,1)*1e1; % [N/(m/s)]
+n_hexapod.actuator.ca = ones(6,1)*1e1; % [N/(m/s)]
+
+n_hexapod.actuator.Leq = ones(6,1)*0.056; % [m]
+
+n_hexapod.actuator.Ga = ones(6,1)*-2.15; % Actuator gain [N/V]
+n_hexapod.actuator.Gs = ones(6,1)*2.305e-08; % Sensor gain [V/m]
+
+
+ +
+
G_2dof = linearize(mdl, io, 0.0, options);
+G_2dof.InputName  = {'Va'};
+G_2dof.OutputName = {'Vs', 'dL', 'z'};
+
+
+
+
+ +
+

9.4.2 APA - Fully Flexible

+
+
+
n_hexapod = struct();
+
+n_hexapod.actuator.type = 3;
+
+n_hexapod.actuator.K = readmatrix('APA300ML_full_mat_K.CSV'); % Stiffness Matrix
+n_hexapod.actuator.M = readmatrix('APA300ML_full_mat_M.CSV'); % Mass Matrix
+n_hexapod.actuator.xi = 0.01; % Damping ratio
+n_hexapod.actuator.P = extractNodes('APA300ML_full_out_nodes_3D.txt'); % Node coordiantes [m]
+
+n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V]
+n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m]
+
+
+ +
+
G_flex = linearize(mdl, io, 0.0, options);
+G_flex.InputName  = {'Va'};
+G_flex.OutputName = {'Vs', 'dL', 'z'};
+
+
+
+
+ +
+

9.4.3 Comparison

+
+
+
+ +
+

10 Test Bench Struts - Simscape Model

+
+
+
+

10.1 Introduction

+
+
+

10.2 Nano Hexapod object

+
+
+
n_hexapod = struct();
+
+
+
+ +
+

10.2.1 Flexible Joint - Bot

+
+
+
n_hexapod.flex_bot = struct();
+
+n_hexapod.flex_bot.type = 1; % 1: 2dof / 2: 3dof / 3: 4dof
+
+n_hexapod.flex_bot.kRx = ones(6,1)*5; % X bending stiffness [Nm/rad]
+n_hexapod.flex_bot.kRy = ones(6,1)*5; % Y bending stiffness [Nm/rad]
+n_hexapod.flex_bot.kRz = ones(6,1)*260; % Torsionnal stiffness [Nm/rad]
+n_hexapod.flex_bot.kz  = ones(6,1)*1e8; % Axial stiffness [N/m]
+
+n_hexapod.flex_bot.cRx = ones(6,1)*0.1; % [Nm/(rad/s)]
+n_hexapod.flex_bot.cRy = ones(6,1)*0.1; % [Nm/(rad/s)]
+n_hexapod.flex_bot.cRz = ones(6,1)*0.1; % [Nm/(rad/s)]
+n_hexapod.flex_bot.cz  = ones(6,1)*1e2; %[N/(m/s)]
+
+
+
+
+ +
+

10.2.2 Flexible Joint - Top

+
+
+
n_hexapod.flex_top = struct();
+
+n_hexapod.flex_top.type = 2; % 1: 2dof / 2: 3dof / 3: 4dof
+
+n_hexapod.flex_top.kRx = ones(6,1)*5; % X bending stiffness [Nm/rad]
+n_hexapod.flex_top.kRy = ones(6,1)*5; % Y bending stiffness [Nm/rad]
+n_hexapod.flex_top.kRz = ones(6,1)*260; % Torsionnal stiffness [Nm/rad]
+n_hexapod.flex_top.kz  = ones(6,1)*1e8; % Axial stiffness [N/m]
+
+n_hexapod.flex_top.cRx = ones(6,1)*0.1; % [Nm/(rad/s)]
+n_hexapod.flex_top.cRy = ones(6,1)*0.1; % [Nm/(rad/s)]
+n_hexapod.flex_top.cRz = ones(6,1)*0.1; % [Nm/(rad/s)]
+n_hexapod.flex_top.cz  = ones(6,1)*1e2; %[N/(m/s)]
+
+
+
+
+ +
+

10.2.3 APA - 2 DoF

+
+
+
n_hexapod.actuator = struct();
+
+n_hexapod.actuator.type = 1;
+
+n_hexapod.actuator.k  = ones(6,1)*0.35e6; % [N/m]
+n_hexapod.actuator.ke = ones(6,1)*1.5e6; % [N/m]
+n_hexapod.actuator.ka = ones(6,1)*43e6; % [N/m]
+
+n_hexapod.actuator.c  = ones(6,1)*3e1; % [N/(m/s)]
+n_hexapod.actuator.ce = ones(6,1)*1e1; % [N/(m/s)]
+n_hexapod.actuator.ca = ones(6,1)*1e1; % [N/(m/s)]
+
+n_hexapod.actuator.Leq = ones(6,1)*0.056; % [m]
+
+n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V]
+n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m]
+
+
+
+
+ +
+

10.2.4 APA - Flexible Frame

+
+
+
n_hexapod.actuator.type = 2;
+
+n_hexapod.actuator.K = readmatrix('APA300ML_b_mat_K.CSV'); % Stiffness Matrix
+n_hexapod.actuator.M = readmatrix('APA300ML_b_mat_M.CSV'); % Mass Matrix
+n_hexapod.actuator.xi = 0.01; % Damping ratio
+n_hexapod.actuator.P = extractNodes('APA300ML_b_out_nodes_3D.txt'); % Node coordinates [m]
+
+n_hexapod.actuator.ks = 235e6; % Stiffness of one stack [N/m]
+n_hexapod.actuator.cs = 1e1; % Stiffness of one stack [N/m]
+
+n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V]
+n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m]
+
+
+
+
+ +
+

10.2.5 APA - Fully Flexible

+
+
+
n_hexapod.actuator.type = 3;
+
+n_hexapod.actuator.K = readmatrix('APA300ML_full_mat_K.CSV'); % Stiffness Matrix
+n_hexapod.actuator.M = readmatrix('APA300ML_full_mat_M.CSV'); % Mass Matrix
+n_hexapod.actuator.xi = 0.01; % Damping ratio
+n_hexapod.actuator.P = extractNodes('APA300ML_full_out_nodes_3D.txt'); % Node coordiantes [m]
+
+n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V]
+n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m]
+
+
+
+
+
+ + +
+

10.3 Identification

+
+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'test_bench_struts';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/Va'],  1, 'openinput');  io_i = io_i + 1; % Actuator Voltage
+io(io_i) = linio([mdl, '/Vs'],  1, 'openoutput'); io_i = io_i + 1; % Sensor Voltage
+io(io_i) = linio([mdl, '/dL'],  1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs
+io(io_i) = linio([mdl, '/z'],   1, 'openoutput'); io_i = io_i + 1; % Vertical Motion
+
+%% Run the linearization
+Gs = linearize(mdl, io, 0.0, options);
+Gs.InputName  = {'Va'};
+Gs.OutputName = {'Vs', 'dL', 'z'};
+
+
+
+
+ +
+

10.4 Compare flexible joints

+
+
+
+

10.4.1 Perfect

+
+
+
n_hexapod.flex_bot.type = 1; % 1: 2dof / 2: 3dof / 3: 4dof
+n_hexapod.flex_top.type = 2; % 1: 2dof / 2: 3dof / 3: 4dof
+
+
+ +
+
Gp = linearize(mdl, io, 0.0, options);
+Gp.InputName  = {'Va'};
+Gp.OutputName = {'Vs', 'dL', 'z'};
+
+
+
+
+ +
+

10.4.2 Top Flexible

+
+
+
n_hexapod.flex_bot.type = 1; % 1: 2dof / 2: 3dof / 3: 4dof
+n_hexapod.flex_top.type = 3; % 1: 2dof / 2: 3dof / 3: 4dof
+
+
+ +
+
Gt = linearize(mdl, io, 0.0, options);
+Gt.InputName  = {'Va'};
+Gt.OutputName = {'Vs', 'dL', 'z'};
+
+
+
+
+ +
+

10.4.3 Bottom Flexible

+
+
+
n_hexapod.flex_bot.type = 3; % 1: 2dof / 2: 3dof / 3: 4dof
+n_hexapod.flex_top.type = 2; % 1: 2dof / 2: 3dof / 3: 4dof
+
+
+ +
+
Gb = linearize(mdl, io, 0.0, options);
+Gb.InputName  = {'Va'};
+Gb.OutputName = {'Vs', 'dL', 'z'};
+
+
+
+
+ +
+

10.4.4 Both Flexible

+
+
+
n_hexapod.flex_bot.type = 3; % 1: 2dof / 2: 3dof / 3: 4dof
+n_hexapod.flex_top.type = 3; % 1: 2dof / 2: 3dof / 3: 4dof
+
+
+ +
+
Gf = linearize(mdl, io, 0.0, options);
+Gf.InputName  = {'Va'};
+Gf.OutputName = {'Vs', 'dL', 'z'};
+
+
+
+
+ +
+

10.4.5 Comparison

+
+
+
+
+

11 Resonance frequencies - APA300ML

+
+
+
+

11.1 Introduction

+
+

+Three main resonances are foreseen to be problematic for the control of the APA300ML: +

+
+ + +
+

mode_bending_x.gif +

+

Figure 16: X-bending mode (189Hz)

+
+ + +
+

mode_bending_y.gif +

+

Figure 17: Y-bending mode (285Hz)

+
+ + +
+

mode_torsion_z.gif +

+

Figure 18: Z-torsion mode (400Hz)

+
+ +

+These modes are present when flexible joints are fixed to the ends of the APA300ML. +

+ +

+In this section, we try to find the resonance frequency of these modes when one end of the APA is fixed and the other is free. +

+
+
+ +
+

11.2 Setup

+
+

+The measurement setup is shown in Figure 19. +A Laser vibrometer is measuring the difference of motion of two points. +The APA is excited with an instrumented hammer and the transfer function from the hammer to the measured rotation is computed. +

+ +
+
    +
  • Laser Doppler Vibrometer Polytec OFV512
  • +
  • Instrumented hammer
  • +
+ +
+ + +
+

measurement_setup_torsion.png +

+

Figure 19: Measurement setup with a Laser Doppler Vibrometer and one instrumental hammer

+
+
+
+ +
+

11.3 Bending - X

+
+

+The setup to measure the X-bending motion is shown in Figure 20. +The APA is excited with an instrumented hammer having a solid metallic tip. +The impact point is on the back-side of the APA aligned with the top measurement point. +

+ + +
+

measurement_setup_X_bending.png +

+

Figure 20: X-Bending measurement setup

+
+ +

+The data is loaded. +

+
+
bending_X = load('apa300ml_bending_X_top.mat')
+
+
+ +
+
Ts = bending_X.Track1_X_Resolution; % Sampling frequency [Hz]
+
+
+ +

+The transfer function from the input force to the output “rotation” (difference between the two measured distances). +

+
+
win = hann(ceil(1/Ts));
+[G_bending_X, f]  = tfestimate(bending_X.Track1, bending_X.Track2, win, [], [], 1/Ts);
+
+
+ +

+The result is shown in Figure 21. +

+ +

+The can clearly observe a nice peak at 280Hz, and then peaks at the odd “harmonics” (third “harmonic” at 840Hz, and fifth “harmonic” at 1400Hz). +

+ +
+

apa300ml_meas_freq_bending_x.png +

+

Figure 21: Obtained FRF for the X-bending

+
+
+
+ +
+

11.4 Bending - Y

+
+

+The setup to measure the Y-bending is shown in Figure 22. +

+ +

+The impact point of the instrumented hammer is located on the back surface of the top interface (on the back of the 2 measurements points). +

+ + +
+

measurement_setup_Y_bending.png +

+

Figure 22: Y-Bending measurement setup

+
+ +

+The data is loaded, and the transfer function from the force to the measured rotation is computed. +

+
+
bending_Y = load('apa300ml_bending_Y_top.mat')
+[G_bending_Y, ~]  = tfestimate(bending_Y.Track1, bending_Y.Track2, win, [], [], 1/Ts);
+
+
+ +

+The results are shown in Figure 23. +The main resonance is at 412Hz, and we also see the third “harmonic” at 1220Hz. +

+ + +
+

apa300ml_meas_freq_bending_y.png +

+

Figure 23: Obtained FRF for the Y-bending

+
+
+
+ +
+

11.5 Torsion - Z

+
+

+Finally, we measure the Z-torsion resonance as shown in Figure 24. +

+ +

+The excitation is shown on the other side of the APA, on the side to excite the torsion motion. +

+ + +
+

measurement_setup_torsion_bis.png +

+

Figure 24: Z-Torsion measurement setup

+
+ +

+The data is loaded, and the transfer function computed. +

+
+
torsion = load('apa300ml_torsion_left.mat')
+[G_torsion, ~]  = tfestimate(torsion_left.Track1, torsion_left.Track2, win, [], [], 1/Ts);
+
+
+ +

+The results are shown in Figure 25. +We observe a first peak at 267Hz, which corresponds to the X-bending mode that was measured at 280Hz. +And then a second peak at 415Hz, which corresponds to the X-bending mode that was measured at 412Hz. +The mode in pure torsion is probably at higher frequency (peak around 1kHz?). +

+ +
+

apa300ml_meas_freq_torsion_z.png +

+

Figure 25: Obtained FRF for the Z-torsion

+
+
+
+ +
+

11.6 Compare

+
+

+The three measurements are shown in Figure 26. +

+ +
+

apa300ml_meas_freq_compare.png +

+

Figure 26: Obtained FRF - Comparison

+
+
+
+ +
+

11.7 Conclusion

+
+
Table 3: Measured maximum stroke
+ + +++ ++ + + + + + + + + + + + + + + + + + + + + + + +
Table 4: Measured frequency of the modes
ModeMeasured Frequency
X-Bending280Hz
Y-Bending410Hz
Z-Torsion?
+
+

Bibliography

@@ -864,7 +1595,7 @@ Compare all the obtained parameters for all the test APA.

Author: Dehaeze Thomas

-

Created: 2021-03-16 mar. 14:30

+

Created: 2021-05-06 jeu. 16:16

diff --git a/test-bench-apa300ml.org b/test-bench-apa300ml.org index 4bb5f76..5add76e 100644 --- a/test-bench-apa300ml.org +++ b/test-bench-apa300ml.org @@ -1612,5 +1612,872 @@ It is the expected behavior as shown in the Figure [[fig:souleille18_results]] ( #+caption: Results obtained in cite:souleille18_concep_activ_mount_space_applic [[file:figs/souleille18_results.png]] -* Bibliography :ignore: +* Test Bench APA300ML - Simscape Model +** Introduction +** 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/test_bench_apa300ml/'); +#+end_src + +#+begin_src matlab :eval no +addpath('test_bench_apa300ml/'); +#+end_src + +#+begin_src matlab +open('test_bench_apa300ml.slx') +#+end_src + +** Nano Hexapod object +#+begin_src matlab +n_hexapod = struct(); +#+end_src + +*** APA - 2 DoF +#+begin_src matlab +n_hexapod.actuator = struct(); + +n_hexapod.actuator.type = 1; + +n_hexapod.actuator.k = ones(6,1)*0.35e6; % [N/m] +n_hexapod.actuator.ke = ones(6,1)*1.5e6; % [N/m] +n_hexapod.actuator.ka = ones(6,1)*43e6; % [N/m] + +n_hexapod.actuator.c = ones(6,1)*3e1; % [N/(m/s)] +n_hexapod.actuator.ce = ones(6,1)*1e1; % [N/(m/s)] +n_hexapod.actuator.ca = ones(6,1)*1e1; % [N/(m/s)] + +n_hexapod.actuator.Leq = ones(6,1)*0.056; % [m] + +n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V] +n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m] +#+end_src + +*** APA - Flexible Frame +#+begin_src matlab +n_hexapod.actuator.type = 2; + +n_hexapod.actuator.K = readmatrix('APA300ML_b_mat_K.CSV'); % Stiffness Matrix +n_hexapod.actuator.M = readmatrix('APA300ML_b_mat_M.CSV'); % Mass Matrix +n_hexapod.actuator.xi = 0.01; % Damping ratio +n_hexapod.actuator.P = extractNodes('APA300ML_b_out_nodes_3D.txt'); % Node coordinates [m] + +n_hexapod.actuator.ks = 235e6; % Stiffness of one stack [N/m] +n_hexapod.actuator.cs = 1e1; % Stiffness of one stack [N/m] + +n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V] +n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m] +#+end_src + +*** APA - Fully Flexible +#+begin_src matlab +n_hexapod.actuator.type = 3; + +n_hexapod.actuator.K = readmatrix('APA300ML_full_mat_K.CSV'); % Stiffness Matrix +n_hexapod.actuator.M = readmatrix('APA300ML_full_mat_M.CSV'); % Mass Matrix +n_hexapod.actuator.xi = 0.01; % Damping ratio +n_hexapod.actuator.P = extractNodes('APA300ML_full_out_nodes_3D.txt'); % Node coordiantes [m] + +n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V] +n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m] +#+end_src + +** Identification +#+begin_src matlab +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'test_bench_apa300ml'; + +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/Va'], 1, 'openinput'); io_i = io_i + 1; % Actuator Voltage +io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1; % Sensor Voltage +io(io_i) = linio([mdl, '/dL'], 1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs +io(io_i) = linio([mdl, '/z'], 1, 'openoutput'); io_i = io_i + 1; % Vertical Motion + +%% Run the linearization +Ga = linearize(mdl, io, 0.0, options); +Ga.InputName = {'Va'}; +Ga.OutputName = {'Vs', 'dL', 'z'}; +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(1, 3, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(Ga('Vs', 'Va'), freqs, 'Hz'))), 'DisplayName', '') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('Vs', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(1, 3, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(Ga('dL', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Encoder') +plot(freqs, abs(squeeze(freqresp(Ga('z', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Interferometer') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('dL', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('z', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +** Compare 2-DoF with flexible +*** APA - 2 DoF +#+begin_src matlab +n_hexapod = struct(); + +n_hexapod.actuator = struct(); + +n_hexapod.actuator.type = 1; + +n_hexapod.actuator.k = ones(6,1)*0.35e6; % [N/m] +n_hexapod.actuator.ke = ones(6,1)*1.5e6; % [N/m] +n_hexapod.actuator.ka = ones(6,1)*43e6; % [N/m] + +n_hexapod.actuator.c = ones(6,1)*3e1; % [N/(m/s)] +n_hexapod.actuator.ce = ones(6,1)*1e1; % [N/(m/s)] +n_hexapod.actuator.ca = ones(6,1)*1e1; % [N/(m/s)] + +n_hexapod.actuator.Leq = ones(6,1)*0.056; % [m] + +n_hexapod.actuator.Ga = ones(6,1)*-2.15; % Actuator gain [N/V] +n_hexapod.actuator.Gs = ones(6,1)*2.305e-08; % Sensor gain [V/m] +#+end_src + +#+begin_src matlab +G_2dof = linearize(mdl, io, 0.0, options); +G_2dof.InputName = {'Va'}; +G_2dof.OutputName = {'Vs', 'dL', 'z'}; +#+end_src + +*** APA - Fully Flexible +#+begin_src matlab +n_hexapod = struct(); + +n_hexapod.actuator.type = 3; + +n_hexapod.actuator.K = readmatrix('APA300ML_full_mat_K.CSV'); % Stiffness Matrix +n_hexapod.actuator.M = readmatrix('APA300ML_full_mat_M.CSV'); % Mass Matrix +n_hexapod.actuator.xi = 0.01; % Damping ratio +n_hexapod.actuator.P = extractNodes('APA300ML_full_out_nodes_3D.txt'); % Node coordiantes [m] + +n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V] +n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m] +#+end_src + +#+begin_src matlab +G_flex = linearize(mdl, io, 0.0, options); +G_flex.InputName = {'Va'}; +G_flex.OutputName = {'Vs', 'dL', 'z'}; +#+end_src + +*** Comparison + +#+begin_src matlab :exports none +freqs = logspace(1, 4, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(G_2dof('Vs', 'Va'), freqs, 'Hz'))), 'DisplayName', '$G_a$') +plot(freqs, abs(squeeze(freqresp(G_flex('Vs', 'Va'), freqs, 'Hz'))), 'DisplayName', '$G_s$') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(G_2dof('Vs', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(G_flex('Vs', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(1, 4, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(G_2dof('dL', 'Va'), freqs, 'Hz'))), 'DisplayName', '$G_a$') +plot(freqs, abs(squeeze(freqresp(G_flex('dL', 'Va'), freqs, 'Hz'))), 'DisplayName', '$G_s$') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_L/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(G_2dof('dL', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(G_flex('dL', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(1, 4, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(G_2dof('z', 'Va'), freqs, 'Hz'))), 'DisplayName', '$G_a$') +plot(freqs, abs(squeeze(freqresp(G_flex('z', 'Va'), freqs, 'Hz'))), 'DisplayName', '$G_s$') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $z/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(G_2dof('z', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(G_flex('z', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +* Test Bench Struts - Simscape Model +** Introduction +** 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/'); +addpath('matlab/test_bench_struts/'); +addpath('matlab/png/'); +#+end_src + +#+begin_src matlab :eval no +addpath('test_bench_struts/'); +addpath('png/'); +#+end_src + +#+begin_src matlab +open('test_bench_struts.slx') +#+end_src + +** Nano Hexapod object +#+begin_src matlab +n_hexapod = struct(); +#+end_src + +*** Flexible Joint - Bot +#+begin_src matlab +n_hexapod.flex_bot = struct(); + +n_hexapod.flex_bot.type = 1; % 1: 2dof / 2: 3dof / 3: 4dof + +n_hexapod.flex_bot.kRx = ones(6,1)*5; % X bending stiffness [Nm/rad] +n_hexapod.flex_bot.kRy = ones(6,1)*5; % Y bending stiffness [Nm/rad] +n_hexapod.flex_bot.kRz = ones(6,1)*260; % Torsionnal stiffness [Nm/rad] +n_hexapod.flex_bot.kz = ones(6,1)*1e8; % Axial stiffness [N/m] + +n_hexapod.flex_bot.cRx = ones(6,1)*0.1; % [Nm/(rad/s)] +n_hexapod.flex_bot.cRy = ones(6,1)*0.1; % [Nm/(rad/s)] +n_hexapod.flex_bot.cRz = ones(6,1)*0.1; % [Nm/(rad/s)] +n_hexapod.flex_bot.cz = ones(6,1)*1e2; %[N/(m/s)] +#+end_src + +*** Flexible Joint - Top +#+begin_src matlab +n_hexapod.flex_top = struct(); + +n_hexapod.flex_top.type = 2; % 1: 2dof / 2: 3dof / 3: 4dof + +n_hexapod.flex_top.kRx = ones(6,1)*5; % X bending stiffness [Nm/rad] +n_hexapod.flex_top.kRy = ones(6,1)*5; % Y bending stiffness [Nm/rad] +n_hexapod.flex_top.kRz = ones(6,1)*260; % Torsionnal stiffness [Nm/rad] +n_hexapod.flex_top.kz = ones(6,1)*1e8; % Axial stiffness [N/m] + +n_hexapod.flex_top.cRx = ones(6,1)*0.1; % [Nm/(rad/s)] +n_hexapod.flex_top.cRy = ones(6,1)*0.1; % [Nm/(rad/s)] +n_hexapod.flex_top.cRz = ones(6,1)*0.1; % [Nm/(rad/s)] +n_hexapod.flex_top.cz = ones(6,1)*1e2; %[N/(m/s)] +#+end_src + +*** APA - 2 DoF +#+begin_src matlab +n_hexapod.actuator = struct(); + +n_hexapod.actuator.type = 1; + +n_hexapod.actuator.k = ones(6,1)*0.35e6; % [N/m] +n_hexapod.actuator.ke = ones(6,1)*1.5e6; % [N/m] +n_hexapod.actuator.ka = ones(6,1)*43e6; % [N/m] + +n_hexapod.actuator.c = ones(6,1)*3e1; % [N/(m/s)] +n_hexapod.actuator.ce = ones(6,1)*1e1; % [N/(m/s)] +n_hexapod.actuator.ca = ones(6,1)*1e1; % [N/(m/s)] + +n_hexapod.actuator.Leq = ones(6,1)*0.056; % [m] + +n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V] +n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m] +#+end_src + +*** APA - Flexible Frame +#+begin_src matlab +n_hexapod.actuator.type = 2; + +n_hexapod.actuator.K = readmatrix('APA300ML_b_mat_K.CSV'); % Stiffness Matrix +n_hexapod.actuator.M = readmatrix('APA300ML_b_mat_M.CSV'); % Mass Matrix +n_hexapod.actuator.xi = 0.01; % Damping ratio +n_hexapod.actuator.P = extractNodes('APA300ML_b_out_nodes_3D.txt'); % Node coordinates [m] + +n_hexapod.actuator.ks = 235e6; % Stiffness of one stack [N/m] +n_hexapod.actuator.cs = 1e1; % Stiffness of one stack [N/m] + +n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V] +n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m] +#+end_src + +*** APA - Fully Flexible +#+begin_src matlab +n_hexapod.actuator.type = 3; + +n_hexapod.actuator.K = readmatrix('APA300ML_full_mat_K.CSV'); % Stiffness Matrix +n_hexapod.actuator.M = readmatrix('APA300ML_full_mat_M.CSV'); % Mass Matrix +n_hexapod.actuator.xi = 0.01; % Damping ratio +n_hexapod.actuator.P = extractNodes('APA300ML_full_out_nodes_3D.txt'); % Node coordiantes [m] + +n_hexapod.actuator.Ga = ones(6,1)*1; % Actuator gain [N/V] +n_hexapod.actuator.Gs = ones(6,1)*1; % Sensor gain [V/m] +#+end_src + + +** Identification +#+begin_src matlab +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'test_bench_struts'; + +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/Va'], 1, 'openinput'); io_i = io_i + 1; % Actuator Voltage +io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1; % Sensor Voltage +io(io_i) = linio([mdl, '/dL'], 1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs +io(io_i) = linio([mdl, '/z'], 1, 'openoutput'); io_i = io_i + 1; % Vertical Motion + +%% Run the linearization +Gs = linearize(mdl, io, 0.0, options); +Gs.InputName = {'Va'}; +Gs.OutputName = {'Vs', 'dL', 'z'}; +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(1, 3, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(Gs('Vs', 'Va'), freqs, 'Hz'))), 'DisplayName', '') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs('Vs', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(1, 4, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(Gs('dL', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Encoder') +plot(freqs, abs(squeeze(freqresp(Gs('z', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Interferometer') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs('dL', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs('z', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +** Compare flexible joints +*** Perfect +#+begin_src matlab +n_hexapod.flex_bot.type = 1; % 1: 2dof / 2: 3dof / 3: 4dof +n_hexapod.flex_top.type = 2; % 1: 2dof / 2: 3dof / 3: 4dof +#+end_src + +#+begin_src matlab +Gp = linearize(mdl, io, 0.0, options); +Gp.InputName = {'Va'}; +Gp.OutputName = {'Vs', 'dL', 'z'}; +#+end_src + +*** Top Flexible +#+begin_src matlab +n_hexapod.flex_bot.type = 1; % 1: 2dof / 2: 3dof / 3: 4dof +n_hexapod.flex_top.type = 3; % 1: 2dof / 2: 3dof / 3: 4dof +#+end_src + +#+begin_src matlab +Gt = linearize(mdl, io, 0.0, options); +Gt.InputName = {'Va'}; +Gt.OutputName = {'Vs', 'dL', 'z'}; +#+end_src + +*** Bottom Flexible +#+begin_src matlab +n_hexapod.flex_bot.type = 3; % 1: 2dof / 2: 3dof / 3: 4dof +n_hexapod.flex_top.type = 2; % 1: 2dof / 2: 3dof / 3: 4dof +#+end_src + +#+begin_src matlab +Gb = linearize(mdl, io, 0.0, options); +Gb.InputName = {'Va'}; +Gb.OutputName = {'Vs', 'dL', 'z'}; +#+end_src + +*** Both Flexible +#+begin_src matlab +n_hexapod.flex_bot.type = 3; % 1: 2dof / 2: 3dof / 3: 4dof +n_hexapod.flex_top.type = 3; % 1: 2dof / 2: 3dof / 3: 4dof +#+end_src + +#+begin_src matlab +Gf = linearize(mdl, io, 0.0, options); +Gf.InputName = {'Va'}; +Gf.OutputName = {'Vs', 'dL', 'z'}; +#+end_src + +*** Comparison +#+begin_src matlab :exports none +freqs = logspace(1, 4, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(Gp('Vs', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Perfect') +plot(freqs, abs(squeeze(freqresp(Gt('Vs', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Top') +plot(freqs, abs(squeeze(freqresp(Gb('Vs', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Bot') +plot(freqs, abs(squeeze(freqresp(Gf('Vs', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Flex') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(Gp('Vs', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gt('Vs', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gb('Vs', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Vs', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(1, 4, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(Gp('dL', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Perfect') +plot(freqs, abs(squeeze(freqresp(Gt('dL', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Top') +plot(freqs, abs(squeeze(freqresp(Gb('dL', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Bot') +plot(freqs, abs(squeeze(freqresp(Gf('dL', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Flex') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_L/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(Gp('dL', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gt('dL', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gb('dL', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('dL', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(1, 4, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(Gp('z', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Perfect') +plot(freqs, abs(squeeze(freqresp(Gt('z', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Top') +plot(freqs, abs(squeeze(freqresp(Gb('z', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Bot') +plot(freqs, abs(squeeze(freqresp(Gf('z', 'Va'), freqs, 'Hz'))), 'DisplayName', 'Flex') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $z/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +plot(freqs, 180/pi*angle(squeeze(freqresp(Gp('z', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gt('z', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gb('z', 'Va'), freqs, 'Hz')))) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('z', 'Va'), freqs, 'Hz')))) +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]) + +linkaxes([ax1,ax2],'x'); +#+end_src + +* Resonance frequencies - APA300ML +** Introduction + +Three main resonances are foreseen to be problematic for the control of the APA300ML: +- Mode in X-bending at 189Hz (Figure [[fig:mode_bending_x]]) +- Mode in Y-bending at 285Hz (Figure [[fig:mode_bending_y]]) +- Mode in Z-torsion at 400Hz (Figure [[fig:mode_torsion_z]]) + +#+name: fig:mode_bending_x +#+caption: X-bending mode (189Hz) +#+attr_latex: :width 0.9\linewidth +[[file:figs/mode_bending_x.gif]] + +#+name: fig:mode_bending_y +#+caption: Y-bending mode (285Hz) +#+attr_latex: :width 0.9\linewidth +[[file:figs/mode_bending_y.gif]] + +#+name: fig:mode_torsion_z +#+caption: Z-torsion mode (400Hz) +#+attr_latex: :width 0.9\linewidth +[[file:figs/mode_torsion_z.gif]] + +These modes are present when flexible joints are fixed to the ends of the APA300ML. + +In this section, we try to find the resonance frequency of these modes when one end of the APA is fixed and the other is free. + +** 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/'); +addpath('matlab/mat/'); +#+end_src + +#+begin_src matlab :eval no +addpath('mat/'); +#+end_src + +** Setup + +The measurement setup is shown in Figure [[fig:measurement_setup_torsion]]. +A Laser vibrometer is measuring the difference of motion of two points. +The APA is excited with an instrumented hammer and the transfer function from the hammer to the measured rotation is computed. + +#+begin_note +- Laser Doppler Vibrometer Polytec OFV512 +- Instrumented hammer +#+end_note + +#+name: fig:measurement_setup_torsion +#+caption: Measurement setup with a Laser Doppler Vibrometer and one instrumental hammer +#+attr_latex: :width 0.7\linewidth +[[file:figs/measurement_setup_torsion.png]] + +** Bending - X + +The setup to measure the X-bending motion is shown in Figure [[fig:measurement_setup_X_bending]]. +The APA is excited with an instrumented hammer having a solid metallic tip. +The impact point is on the back-side of the APA aligned with the top measurement point. + +#+name: fig:measurement_setup_X_bending +#+caption: X-Bending measurement setup +#+attr_latex: :width 0.7\linewidth +[[file:figs/measurement_setup_X_bending.png]] + +The data is loaded. +#+begin_src matlab +bending_X = load('apa300ml_bending_X_top.mat') +#+end_src + +#+begin_src matlab +Ts = bending_X.Track1_X_Resolution; % Sampling frequency [Hz] +#+end_src + +The transfer function from the input force to the output "rotation" (difference between the two measured distances). +#+begin_src matlab +win = hann(ceil(1/Ts)); +[G_bending_X, f] = tfestimate(bending_X.Track1, bending_X.Track2, win, [], [], 1/Ts); +#+end_src + +The result is shown in Figure [[fig:apa300ml_meas_freq_bending_x]]. + +The can clearly observe a nice peak at 280Hz, and then peaks at the odd "harmonics" (third "harmonic" at 840Hz, and fifth "harmonic" at 1400Hz). +#+begin_src matlab :exports none +figure; +hold on; +plot(f, abs(G_bending_X), 'k-'); +hold off; +set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude'); +xlim([50, 2e3]); ylim([1e-5, 2e-1]); +text(280, 5.5e-2,{'280Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +text(840, 2.0e-3,{'840Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +text(1400, 7.0e-3,{'1400Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/apa300ml_meas_freq_bending_x.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:apa300ml_meas_freq_bending_x +#+caption: Obtained FRF for the X-bending +#+RESULTS: +[[file:figs/apa300ml_meas_freq_bending_x.png]] + +** Bending - Y + +The setup to measure the Y-bending is shown in Figure [[fig:measurement_setup_Y_bending]]. + +The impact point of the instrumented hammer is located on the back surface of the top interface (on the back of the 2 measurements points). + +#+name: fig:measurement_setup_Y_bending +#+caption: Y-Bending measurement setup +#+attr_latex: :width 0.7\linewidth +[[file:figs/measurement_setup_Y_bending.png]] + +The data is loaded, and the transfer function from the force to the measured rotation is computed. +#+begin_src matlab +bending_Y = load('apa300ml_bending_Y_top.mat') +[G_bending_Y, ~] = tfestimate(bending_Y.Track1, bending_Y.Track2, win, [], [], 1/Ts); +#+end_src + +The results are shown in Figure [[fig:apa300ml_meas_freq_bending_y]]. +The main resonance is at 412Hz, and we also see the third "harmonic" at 1220Hz. + +#+begin_src matlab :exports none +figure; +hold on; +plot(f, abs(G_bending_Y), 'k-'); +hold off; +set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude'); +xlim([50, 2e3]); ylim([1e-5, 3e-2]) +text(412, 1.5e-2,{'412Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +text(1218, 1.5e-2,{'1220Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/apa300ml_meas_freq_bending_y.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:apa300ml_meas_freq_bending_y +#+caption: Obtained FRF for the Y-bending +#+RESULTS: +[[file:figs/apa300ml_meas_freq_bending_y.png]] + +** Torsion - Z + +Finally, we measure the Z-torsion resonance as shown in Figure [[fig:measurement_setup_torsion_bis]]. + +The excitation is shown on the other side of the APA, on the side to excite the torsion motion. + +#+name: fig:measurement_setup_torsion_bis +#+caption: Z-Torsion measurement setup +#+attr_latex: :width 0.7\linewidth +[[file:figs/measurement_setup_torsion_bis.png]] + +The data is loaded, and the transfer function computed. +#+begin_src matlab +torsion = load('apa300ml_torsion_left.mat') +[G_torsion, ~] = tfestimate(torsion_left.Track1, torsion_left.Track2, win, [], [], 1/Ts); +#+end_src + +The results are shown in Figure [[fig:apa300ml_meas_freq_torsion_z]]. +We observe a first peak at 267Hz, which corresponds to the X-bending mode that was measured at 280Hz. +And then a second peak at 415Hz, which corresponds to the X-bending mode that was measured at 412Hz. +The mode in pure torsion is probably at higher frequency (peak around 1kHz?). +#+begin_src matlab :exports none +figure; +hold on; +plot(f, abs(G_torsion), 'k-'); +hold off; +set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude'); +xlim([50, 2e3]); ylim([1e-5, 2e-2]) +text(415, 4.3e-3,{'415Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +text(267, 8e-4,{'267Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/apa300ml_meas_freq_torsion_z.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:apa300ml_meas_freq_torsion_z +#+caption: Obtained FRF for the Z-torsion +#+RESULTS: +[[file:figs/apa300ml_meas_freq_torsion_z.png]] + +** Compare +The three measurements are shown in Figure [[fig:apa300ml_meas_freq_compare]]. +#+begin_src matlab :exports none +figure; +hold on; +plot(f, abs(G_torsion), 'DisplayName', 'Torsion'); +plot(f, abs(G_bending_X), 'DisplayName', 'Bending - X'); +plot(f, abs(G_bending_Y), 'DisplayName', 'Bending - Y'); +hold off; +set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude'); +xlim([50, 2e3]); ylim([1e-5, 1e-1]); +legend('location', 'southeast'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/apa300ml_meas_freq_compare.pdf', 'width', 'full', 'height', 'tall'); +#+end_src + +#+name: fig:apa300ml_meas_freq_compare +#+caption: Obtained FRF - Comparison +#+RESULTS: +[[file:figs/apa300ml_meas_freq_compare.png]] + +** Conclusion + +#+name: tab:apa300ml_measured_modes_freq +#+caption: Measured frequency of the modes +#+attr_latex: :environment tabularx :width 0.3\linewidth :align lX +#+attr_latex: :center t :booktabs t :float t +| Mode | Measured Frequency | +|-----------+--------------------| +| X-Bending | 280Hz | +| Y-Bending | 410Hz | +| Z-Torsion | ? | + +* Bibliography :ignore: #+latex: \printbibliography