diff --git a/data/APA300ML/APA300ML_test_bench.slx b/data/APA300ML/APA300ML_test_bench.slx index ab1daa2..7ac65b9 100644 Binary files a/data/APA300ML/APA300ML_test_bench.slx and b/data/APA300ML/APA300ML_test_bench.slx differ diff --git a/figs/apa300ml_ansys.jpg b/figs/apa300ml_ansys.jpg new file mode 100755 index 0000000..afeb594 Binary files /dev/null and b/figs/apa300ml_ansys.jpg differ diff --git a/figs/apa300ml_dvf_plant.pdf b/figs/apa300ml_dvf_plant.pdf new file mode 100644 index 0000000..3ccb0ac Binary files /dev/null and b/figs/apa300ml_dvf_plant.pdf differ diff --git a/figs/apa300ml_dvf_plant.png b/figs/apa300ml_dvf_plant.png new file mode 100644 index 0000000..6a013a3 Binary files /dev/null and b/figs/apa300ml_dvf_plant.png differ diff --git a/figs/apa300ml_dvf_root_locus.pdf b/figs/apa300ml_dvf_root_locus.pdf new file mode 100644 index 0000000..7f59327 Binary files /dev/null and b/figs/apa300ml_dvf_root_locus.pdf differ diff --git a/figs/apa300ml_dvf_root_locus.png b/figs/apa300ml_dvf_root_locus.png new file mode 100644 index 0000000..2cd3d7c Binary files /dev/null and b/figs/apa300ml_dvf_root_locus.png differ diff --git a/figs/apa300ml_iff_plant.pdf b/figs/apa300ml_iff_plant.pdf new file mode 100644 index 0000000..2f6eafa Binary files /dev/null and b/figs/apa300ml_iff_plant.pdf differ diff --git a/figs/apa300ml_iff_plant.png b/figs/apa300ml_iff_plant.png new file mode 100644 index 0000000..906a13b Binary files /dev/null and b/figs/apa300ml_iff_plant.png differ diff --git a/figs/apa300ml_iff_root_locus.pdf b/figs/apa300ml_iff_root_locus.pdf new file mode 100644 index 0000000..b9a2d24 Binary files /dev/null and b/figs/apa300ml_iff_root_locus.pdf differ diff --git a/figs/apa300ml_iff_root_locus.png b/figs/apa300ml_iff_root_locus.png new file mode 100644 index 0000000..8bcb9f3 Binary files /dev/null and b/figs/apa300ml_iff_root_locus.png differ diff --git a/figs/apa300ml_plant_dynamics.pdf b/figs/apa300ml_plant_dynamics.pdf new file mode 100644 index 0000000..8993e0c Binary files /dev/null and b/figs/apa300ml_plant_dynamics.pdf differ diff --git a/figs/apa300ml_plant_dynamics.png b/figs/apa300ml_plant_dynamics.png new file mode 100644 index 0000000..5712c5f Binary files /dev/null and b/figs/apa300ml_plant_dynamics.png differ diff --git a/figs/apa300ml_resonance.pdf b/figs/apa300ml_resonance.pdf new file mode 100644 index 0000000..6a97872 Binary files /dev/null and b/figs/apa300ml_resonance.pdf differ diff --git a/figs/apa300ml_resonance.png b/figs/apa300ml_resonance.png new file mode 100644 index 0000000..f4b8747 Binary files /dev/null and b/figs/apa300ml_resonance.png differ diff --git a/index.html b/index.html index 39840bf..539057a 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Finite Element Model with Simscape @@ -34,30 +34,60 @@

Table of Contents

-
-

1 Amplified Piezoelectric Actuator - 3D elements

+
+

1 Amplified Piezoelectric Actuator - 3D elements

The idea here is to: @@ -71,8 +101,8 @@ The idea here is to:

-
-

1.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

+
+

1.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

We first extract the stiffness and mass matrices. @@ -91,6 +121,21 @@ Then, we extract the coordinates of the interface nodes.

+
+
save('./mat/piezo_amplified_3d.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
+
+
+
+
+ +
+

1.2 Output parameters

+
+
+
load('./mat/piezo_amplified_3d.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
+
+
+ @@ -123,7 +168,7 @@ Then, we extract the coordinates of the interface nodes.
-
+

amplified_piezo_interface_nodes.png

Figure 1: Interface Nodes for the Amplified Piezo Actuator

@@ -581,9 +626,71 @@ Using K, M and int_xyz, we can use the -
-

1.2 Identification of the Dynamics

-
+
+

1.3 Piezoelectric parameters

+
+

+Parameters for the APA95ML: +

+ +
+
d33 = 3e-10; % Strain constant [m/V]
+n = 80; % Number of layers per stack
+eT = 1.6e-7; % Permittivity under constant stress [F/m]
+sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
+ka = 235e6; % Stack stiffness [N/m]
+C = 5e-6; % Stack capactiance [F]
+
+
+ +
+
na = 2; % Number of stacks used as actuator
+ns = 1; % Number of stacks used as force sensor
+
+
+ +

+The ratio of the developed force to applied voltage is \(d_{33} n k_a\) in [N/V]. +We denote this constant by \(g_a\) and: +\[ F_a = g_a V_a, \quad g_a = d_{33} n k_a \] +

+
+
d33*(na*n)*(ka/(na + ns)) % [N/V]
+
+
+ +
+3.76
+
+ + +

+From (Fleming and Leang 2014) (page 123), the relation between relative displacement and generated voltage is: +\[ V_s = \frac{d_{33}}{\epsilon^T s^D n} \Delta h \] +where: +

+
    +
  • \(V_s\): measured voltage [V]
  • +
  • \(d_{33}\): strain constant [m/V]
  • +
  • \(\epsilon^T\): permittivity under constant stress [F/m]
  • +
  • \(s^D\): elastic compliance under constant electric displacement [m^2/N]
  • +
  • \(n\): number of layers
  • +
  • \(\Delta h\): relative displacement [m]
  • +
+
+
1e-6*d33/(eT*sD*ns*n) % [V/um]
+
+
+ +
+1.1719
+
+
+
+ +
+

1.4 Identification of the Dynamics

+

The flexible element is imported using the Reduced Order Flexible Solid simscape block.

@@ -601,7 +708,7 @@ One mass is fixed at one end of the piezo-electric stack actuator, the other end We first set the mass to be zero.

-
m = 0;
+
m = 0.01;
 
@@ -617,7 +724,7 @@ clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1; -Gh = linearize(mdl, io); +Gh = -linearize(mdl, io);
@@ -625,7 +732,7 @@ Gh = linearize(mdl, io); Then, we add 10Kg of mass:

-
m = 10;
+
m = 5;
 
@@ -634,7 +741,7 @@ And the dynamics is identified.

-The two identified dynamics are compared in Figure 2. +The two identified dynamics are compared in Figure 2.

%% Name of the Simulink File
@@ -645,12 +752,12 @@ clear io; io_i = 1;
 io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
 io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
 
-Ghm = linearize(mdl, io);
+Ghm = -linearize(mdl, io);
 
-
+

dynamics_act_disp_comp_mass.png

Figure 2: Dynamics from \(F\) to \(d\) without a payload and with a 10kg payload

@@ -658,9 +765,9 @@ Ghm = linearize(mdl, io);
-
-

1.3 Comparison with Ansys

-
+
+

1.5 Comparison with Ansys

+

Let’s import the results from an Harmonic response analysis in Ansys.

@@ -671,11 +778,11 @@ Gresp10 = readtable('FEA_HarmResponse_10kg.txt');

-The obtained dynamics from the Simscape model and from the Ansys analysis are compare in Figure 3. +The obtained dynamics from the Simscape model and from the Ansys analysis are compare in Figure 3.

-
+

dynamics_force_disp_comp_anasys.png

Figure 3: Comparison of the obtained dynamics using Simscape with the harmonic response analysis using Ansys

@@ -683,15 +790,15 @@ The obtained dynamics from the Simscape model and from the Ansys analysis are co
-
-

1.4 Force Sensor

-
+
+

1.6 Force Sensor

+

The dynamics is identified from internal forces applied between nodes 3 and 11 to the relative displacement of nodes 11 and 13.

-The obtained dynamics is shown in Figure 4. +The obtained dynamics is shown in Figure 4.

@@ -731,7 +838,7 @@ Gfm = linearize(mdl, io);
-
+

dynamics_force_force_sensor_comp_mass.png

Figure 4: Dynamics from \(F\) to \(F_m\) for \(m=0\) and \(m = 10kg\)

@@ -739,9 +846,9 @@ Gfm = linearize(mdl, io);
-
-

1.5 Distributed Actuator

-
+
+

1.7 Distributed Actuator

+
m = 0;
 
@@ -789,9 +896,9 @@ Gdm = linearize(mdl, io);
-
-

1.6 Distributed Actuator and Force Sensor

-
+
+

1.8 Distributed Actuator and Force Sensor

+
m = 0;
 
@@ -829,19 +936,1383 @@ Gfdm = linearize(mdl, io);
+ +
+

1.9 Dynamics from input voltage to displacement

+
+
+
m = 5;
+
-
-

2 Integral Force Feedback with Amplified Piezo

-
+

+And the dynamics is identified. +

+ +

+The two identified dynamics are compared in Figure 2. +

+
+
%% Name of the Simulink File
+mdl = 'piezo_amplified_3d';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/V'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
+
+G = -linearize(mdl, io);
+
-
-

2.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

+ +
+
save('../test-bench-apa/mat/fem_model_5kg.mat', 'G')
+
+
+
+
+ +
+

1.10 Dynamics from input voltage to output voltage

+
+
+
m = 5;
+
+
+ +
+
%% Name of the Simulink File
+mdl = 'piezo_amplified_3d';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/Va'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1;
+
+G = -linearize(mdl, io);
+
+
+
+
+
+ +
+

2 APA300ML

+
+ +
+

apa300ml_ansys.jpg +

+

Figure 5: Ansys FEM of the APA300ML

+
+
+ +
+

2.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

We first extract the stiffness and mass matrices.

+
K = extractMatrix('mat_K-48modes-7MDoF.matrix');
+M = extractMatrix('mat_M-48modes-7MDoF.matrix');
+
+
+ +
+
K = extractMatrix('mat_K-80modes-7MDoF.matrix');
+M = extractMatrix('mat_M-80modes-7MDoF.matrix');
+
+
+ +

+Then, we extract the coordinates of the interface nodes. +

+
+
[int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('Nodes_MDoF_NLIST_MLIST.txt');
+
+
+ +
+
save('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
+
+
+
+
+ +
+

2.2 Output parameters

+
+
+
load('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
+
+
+ + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + +
Total number of Nodes7
Number of interface Nodes7
Number of Modes6
Size of M and K matrices48
+ + + + +++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 4: Coordinates of the interface nodes
Node iNode Numberx [m]y [m]z [m]
1.053917.00.0-0.0150.0
2.053918.00.00.0150.0
3.053919.0-0.03250.00.0
4.053920.0-0.01250.00.0
5.053921.0-0.00750.00.0
6.053922.00.01250.00.0
7.053923.00.03250.00.0
+ + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 5: First 10x10 elements of the Stiffness matrix
200000000.030000.050000.0200.0-100.0-300000.010000000.0-6000.020000.0-60.0
30000.07000000.010000.030.0-30.0-70.07000.0-500000.03000.0-10.0
50000.010000.030000000.0200000.0-200.0-100.020000.0-2000.02000000.0-9000.0
200.030.0200000.01000.0-0.8-0.450.0-69000.0-30.0
-100.0-30.0-200.0-0.810000.00.2-40.010.020.0-0.05
-300000.0-70.0-100.0-0.40.2900.0-30000.010.0-40.00.1
10000000.07000.020000.050.0-40.0-30000.0200000000.0-50000.030000.0-50.0
-6000.0-500000.0-2000.0-610.010.0-50000.07000000.0-4000.08
20000.03000.02000000.09000.020.0-40.030000.0-4000.030000000.0-200000.0
-60.0-10.0-9000.0-30.0-0.050.1-50.08-200000.01000.0
+ + + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 6: First 10x10 elements of the Mass matrix
0.017e-06-5e-06-6e-083e-09-5e-05-0.0005-2e-07-3e-061e-08
7e-060.0094e-076e-09-4e-09-3e-08-2e-076e-055e-07-1e-09
-5e-064e-070.012e-052e-083e-08-2e-06-1e-07-0.00029e-07
-6e-086e-092e-053e-071e-103e-10-7e-092e-10-9e-073e-09
3e-09-4e-092e-081e-101e-07-3e-126e-09-2e-10-3e-099e-12
-5e-05-3e-083e-083e-10-3e-126e-071e-06-3e-092e-08-7e-11
-0.0005-2e-07-2e-06-7e-096e-091e-060.01-8e-06-2e-069e-09
-2e-076e-05-1e-072e-10-2e-10-3e-09-8e-060.0091e-072e-09
-3e-065e-07-0.0002-9e-07-3e-092e-08-2e-061e-070.01-2e-05
1e-08-1e-099e-073e-099e-12-7e-119e-092e-09-2e-053e-07
+ +

+Using K, M and int_xyz, we can use the Reduced Order Flexible Solid simscape block. +

+
+
+ +
+

2.3 Piezoelectric parameters

+
+

+Parameters for the APA95ML: +

+ +
+
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]
+C = 5e-6; % Stack capactiance [F]
+
+
+ +
+
na = 3; % Number of stacks used as actuator
+ns = 0; % Number of stacks used as force sensor
+
+
+ +

+The ratio of the developed force to applied voltage is \(d_{33} n k_a\) in [N/V]. +We denote this constant by \(g_a\) and: +\[ F_a = g_a V_a, \quad g_a = d_{33} n k_a \] +

+
+
d33*(na*n)*(ka/(na + ns)) % [N/V]
+
+
+ +
+1.88
+
+ + +

+From (Fleming and Leang 2014) (page 123), the relation between relative displacement and generated voltage is: +\[ V_s = \frac{d_{33}}{\epsilon^T s^D n} \Delta h \] +where: +

+
    +
  • \(V_s\): measured voltage [V]
  • +
  • \(d_{33}\): strain constant [m/V]
  • +
  • \(\epsilon^T\): permittivity under constant stress [F/m]
  • +
  • \(s^D\): elastic compliance under constant electric displacement [m^2/N]
  • +
  • \(n\): number of layers
  • +
  • \(\Delta h\): relative displacement [m]
  • +
+
+
1e-6*d33/(eT*sD*ns*n) % [V/um]
+
+
+ +
+5.8594
+
+
+
+ +
+

2.4 Identification of the APA Characteristics

+
+
+
+

2.4.1 Stiffness

+
+

+The transfer function from vertical external force to the relative vertical displacement is identified. +

+ +

+The inverse of its DC gain is the axial stiffness of the APA: +

+
+
1e-6/dcgain(G) % [N/um]
+
+
+ +
+1.8634
+
+ + +

+The specified stiffness in the datasheet is \(k = 1.8\, [N/\mu m]\). +

+
+
+ +
+

2.4.2 Resonance Frequency

+
+

+The resonance frequency is specified to be between 650Hz and 840Hz. +This is also the case for the FEM model (Figure 6). +

+ + +
+

apa300ml_resonance.png +

+

Figure 6: First resonance is around 800Hz

+
+
+
+ +
+

2.4.3 Amplification factor

+
+

+The amplification factor is the ratio of the axial displacement to the stack displacement. +

+ +

+The ratio of the two displacement is computed from the FEM model. +

+
+
-dcgain(G(1,1))./dcgain(G(2,1))
+
+
+ +
+4.936
+
+ + +

+If we take the ratio of the piezo height and length (approximation of the amplification factor): +

+
+
75/15
+
+
+ +
+5
+
+
+
+ +
+

2.4.4 Stroke

+
+

+Estimation of the actuator stroke: +\[ \Delta H = A n \Delta L \] +with: +

+
    +
  • \(\Delta H\) Axial Stroke of the APA
  • +
  • \(A\) Amplification factor (5 for the APA300ML)
  • +
  • \(n\) Number of stack used
  • +
  • \(\Delta L\) Stroke of the stack (0.1% of its length)
  • +
+ +
+
1e6 * 5 * 3 * 20e-3 * 0.1e-2
+
+
+ +
+300
+
+ + +

+This is exactly the specified stroke in the data-sheet. +

+
+
+
+ +
+

2.5 Identification of the Dynamics

+
+

+The flexible element is imported using the Reduced Order Flexible Solid simscape block. +

+ +

+To model the actuator, an Internal Force block is added between the nodes 3 and 12. +A Relative Motion Sensor block is added between the nodes 1 and 2 to measure the displacement and the amplified piezo. +

+ +

+One mass is fixed at one end of the piezo-electric stack actuator, the other end is fixed to the world frame. +

+ +

+We first set the mass to be zero. +The dynamics is identified from the applied force to the measured relative displacement. +The same dynamics is identified for a payload mass of 10Kg. +

+
+
m = 10;
+
+
+ + +
+

apa300ml_plant_dynamics.png +

+

Figure 7: Transfer function from forces applied by the stack to the axial displacement of the APA

+
+
+
+ +
+

2.6 IFF

+
+

+Let’s use 2 stacks as actuators and 1 stack as force sensor. +

+ +

+The transfer function from actuator to sensors is identified and shown in Figure 8. +

+ +
+

apa300ml_iff_plant.png +

+

Figure 8: Transfer function from actuator to force sensor

+
+ +

+For root locus corresponding to IFF is shown in Figure 9. +

+ + +
+

apa300ml_iff_root_locus.png +

+

Figure 9: Root Locus for IFF

+
+
+
+ +
+

2.7 DVF

+
+

+Now the dynamics from the stack actuator to the relative motion sensor is identified and shown in Figure 10. +

+ +
+

apa300ml_dvf_plant.png +

+

Figure 10: Transfer function from stack actuator to relative motion sensor

+
+ +

+The root locus for DVF is shown in Figure 11. +

+ + +
+

apa300ml_dvf_root_locus.png +

+

Figure 11: Root Locus for Direct Velocity Feedback

+
+
+
+
+ +
+

3 Flexible Joint

+
+
+
+

3.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

+
+

+We first extract the stiffness and mass matrices. +

+
+
K = extractMatrix('mat_K_6modes_2MDoF.matrix');
+M = extractMatrix('mat_M_6modes_2MDoF.matrix');
+
+
+ +

+Then, we extract the coordinates of the interface nodes. +

+
+
[int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt');
+
+
+ +
+
save('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
+
+
+
+
+ +
+

3.2 Output parameters

+
+
+
load('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
+
+
+ + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + +
Total number of Nodes2
Number of interface Nodes2
Number of Modes6
Size of M and K matrices18
+ + + + +++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 7: Coordinates of the interface nodes
Node iNode Numberx [m]y [m]z [m]
1.0181278.00.00.00.0
2.0181279.00.00.0-0.0
+ + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 8: First 10x10 elements of the Stiffness matrix
11200000.0195.02220.0-0.719-265.01.59-11200000.0-213.0-2220.00.147
195.011400000.01290.0-148.0-0.1882.41-212.0-11400000.0-1290.0148.0
2220.01290.0119000000.01.311.491.79-2220.0-1290.0-119000000.0-1.31
-0.719-148.01.3133.00.000488-0.0009770.141148.0-1.31-33.0
-265.0-0.1881.490.00048833.00.00293266.00.154-1.490.00026
1.592.411.79-0.0009770.00293236.0-1.32-2.55-1.790.000379
-11200000.0-212.0-2220.00.141266.0-1.3211400000.024600.01640.0120.0
-213.0-11400000.0-1290.0148.00.154-2.5524600.011400000.01290.0-72.0
-2220.0-1290.0-119000000.0-1.31-1.49-1.791640.01290.0119000000.01.32
0.147148.0-1.31-33.00.000260.000379120.0-72.01.3234.7
+ + + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 9: First 10x10 elements of the Mass matrix
0.021e-09-4e-08-1e-100.0002-3e-110.0045e-087e-081e-10
1e-090.02-3e-07-0.0002-1e-10-2e-092e-080.0043e-071e-05
-4e-08-3e-070.027e-10-2e-091e-093e-077e-080.0031e-09
-1e-10-0.00027e-104e-06-1e-12-6e-132e-10-7e-06-8e-10-1e-09
0.0002-1e-10-2e-09-1e-123e-062e-139e-064e-112e-09-3e-13
-3e-11-2e-091e-09-6e-132e-134e-078e-119e-10-1e-092e-12
0.0042e-083e-072e-109e-068e-110.02-7e-08-3e-07-2e-10
5e-080.0047e-08-7e-064e-119e-10-7e-080.01-4e-080.0002
7e-083e-070.003-8e-102e-09-1e-09-3e-07-4e-080.02-1e-09
1e-101e-051e-09-1e-09-3e-132e-12-2e-100.0002-1e-092e-06
+ +

+Using K, M and int_xyz, we can use the Reduced Order Flexible Solid simscape block. +

+
+
+ +
+

3.3 Flexible Joint Characteristics

+
+ + + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaracteristicValueEstimation by Francois
Axial Stiffness [N/um]11960
Bending Stiffness [Nm/rad]3315
Bending Stiffness [Nm/rad]3315
Torsion Stiffness [Nm/rad]23620
+
+
+ +
+

3.4 Identification

+
+
+
m = 10;
+
+
+ +

+The dynamics is identified from the applied force to the measured relative displacement. +

+
+
%% Name of the Simulink File
+mdl = 'flexor_ID16';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/T'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1;
+
+G = linearize(mdl, io);
+
+
+ + + + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaracteristicValueIdentification
Axial Stiffness Dz [N/um]119119
Bending Stiffness Rx [Nm/rad]3334
Bending Stiffness Ry [Nm/rad]33126
Torsion Stiffness Rz [Nm/rad]236238
+
+
+
+ +
+

4 Integral Force Feedback with Amplified Piezo

+
+
+
+

4.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

+
+

+We first extract the stiffness and mass matrices. +

+
K = extractMatrix('piezo_amplified_IFF_K.txt');
 M = extractMatrix('piezo_amplified_IFF_M.txt');
 
@@ -857,11 +2328,11 @@ Then, we extract the coordinates of the interface nodes.
-
-

2.2 IFF Plant

-
+
+

4.2 IFF Plant

+

-The transfer function from the force actuator to the force sensor is identified and shown in Figure 5. +The transfer function from the force actuator to the force sensor is identified and shown in Figure 12.

@@ -898,19 +2369,19 @@ Gf = linearize(mdl, io);
-
+

piezo_amplified_iff_plant.png

-

Figure 5: IFF Plant

+

Figure 12: IFF Plant

-
-

2.3 IFF controller

-
+
+

4.3 IFF controller

+

-The controller is defined and the loop gain is shown in Figure 6. +The controller is defined and the loop gain is shown in Figure 13.

Kiff = -1e12/s;
@@ -918,17 +2389,17 @@ The controller is defined and the loop gain is shown in Figure 
+

piezo_amplified_iff_loop_gain.png

-

Figure 6: IFF Loop Gain

+

Figure 13: IFF Loop Gain

-
-

2.4 Closed Loop System

-
+
+

4.4 Closed Loop System

+

Author: Dehaeze Thomas

-

Created: 2020-06-15 lun. 09:13

+

Created: 2020-08-03 lun. 15:33

diff --git a/index.org b/index.org index 348a277..fd65c7f 100644 --- a/index.org +++ b/index.org @@ -664,6 +664,12 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ #+end_src * APA300ML +** Introduction :ignore: + +#+name: fig:apa300ml_ansys +#+caption: Ansys FEM of the APA300ML +[[file:figs/apa300ml_ansys.jpg]] + ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) <> @@ -715,8 +721,8 @@ Then, we extract the coordinates of the interface nodes. #+RESULTS: | Total number of Nodes | 7 | | Number of interface Nodes | 7 | -| Number of Modes | 38 | -| Size of M and K matrices | 80 | +| Number of Modes | 6 | +| Size of M and K matrices | 48 | #+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) data2orgtable([[1:length(int_i)]', int_i, int_xyz], {}, {'Node i', 'Node Number', 'x [m]', 'y [m]', 'z [m]'}, ' %f '); @@ -814,6 +820,112 @@ where: #+RESULTS: : 5.8594 +** Identification of the APA Characteristics +*** Stiffness +#+begin_src matlab :exports none + m = 0.001; +#+end_src + +The transfer function from vertical external force to the relative vertical displacement is identified. + +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'APA300ML_test_bench'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Fd'], 1, 'openinput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1; + + G = linearize(mdl, io); +#+end_src + +The inverse of its DC gain is the axial stiffness of the APA: +#+begin_src matlab :results replace value + 1e-6/dcgain(G) % [N/um] +#+end_src + +#+RESULTS: +: 1.8634 + +The specified stiffness in the datasheet is $k = 1.8\, [N/\mu m]$. + +*** Resonance Frequency +The resonance frequency is specified to be between 650Hz and 840Hz. +This is also the case for the FEM model (Figure [[fig:apa300ml_resonance]]). + +#+begin_src matlab :exports none + freqs = logspace(2, 4, 5000); + + figure; + hold on; + plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); ylabel('Amplitude'); + hold off; +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/apa300ml_resonance.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:apa300ml_resonance +#+caption: First resonance is around 800Hz +#+RESULTS: +[[file:figs/apa300ml_resonance.png]] + +*** Amplification factor +The amplification factor is the ratio of the axial displacement to the stack displacement. + +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'APA300ML_test_bench'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/d'], 1, 'openoutput'); io_i = io_i + 1; + + G = linearize(mdl, io); +#+end_src + +The ratio of the two displacement is computed from the FEM model. +#+begin_src matlab :results replace value + -dcgain(G(1,1))./dcgain(G(2,1)) +#+end_src + +#+RESULTS: +: 4.936 + +If we take the ratio of the piezo height and length (approximation of the amplification factor): +#+begin_src matlab :results replace value + 75/15 +#+end_src + +#+RESULTS: +: 5 + +*** Stroke + +Estimation of the actuator stroke: +\[ \Delta H = A n \Delta L \] +with: +- $\Delta H$ Axial Stroke of the APA +- $A$ Amplification factor (5 for the APA300ML) +- $n$ Number of stack used +- $\Delta L$ Stroke of the stack (0.1% of its length) + +#+begin_src matlab :results replace value + 1e6 * 5 * 3 * 20e-3 * 0.1e-2 +#+end_src + +#+RESULTS: +: 300 + +This is exactly the specified stroke in the data-sheet. + ** Identification of the Dynamics The flexible element is imported using the =Reduced Order Flexible Solid= simscape block. @@ -823,12 +935,12 @@ A =Relative Motion Sensor= block is added between the nodes 1 and 2 to measure t One mass is fixed at one end of the piezo-electric stack actuator, the other end is fixed to the world frame. We first set the mass to be zero. -#+begin_src matlab +#+begin_src matlab :exports none m = 0.01; #+end_src The dynamics is identified from the applied force to the measured relative displacement. -#+begin_src matlab +#+begin_src matlab :exports none %% Name of the Simulink File mdl = 'APA300ML_test_bench'; @@ -840,15 +952,12 @@ The dynamics is identified from the applied force to the measured relative displ Gh = -linearize(mdl, io); #+end_src -Then, we add 10Kg of mass: +The same dynamics is identified for a payload mass of 10Kg. #+begin_src matlab m = 10; #+end_src -And the dynamics is identified. - -The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]]. -#+begin_src matlab +#+begin_src matlab :exports none %% Name of the Simulink File mdl = 'APA300ML_test_bench'; @@ -890,16 +999,24 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ legend('location', 'southwest'); #+end_src +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/apa300ml_plant_dynamics.pdf', 'width', 'full', 'height', 'full'); +#+end_src + +#+name: fig:apa300ml_plant_dynamics +#+caption: Transfer function from forces applied by the stack to the axial displacement of the APA +#+RESULTS: +[[file:figs/apa300ml_plant_dynamics.png]] + ** IFF -Then, we add 10Kg of mass: -#+begin_src matlab +Let's use 2 stacks as actuators and 1 stack as force sensor. + +The transfer function from actuator to sensors is identified and shown in Figure [[fig:apa300ml_iff_plant]]. +#+begin_src matlab :exports none m = 10; #+end_src -And the dynamics is identified. - -The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]]. -#+begin_src matlab +#+begin_src matlab :exports none %% Name of the Simulink File mdl = 'APA300ML_test_bench'; @@ -908,7 +1025,7 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ io(io_i) = linio([mdl, '/Va'], 1, 'openinput'); io_i = io_i + 1; io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1; - G = -linearize(mdl, io); + Giff = -linearize(mdl, io); #+end_src #+begin_src matlab :exports none @@ -918,7 +1035,7 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ ax1 = subplot(2,1,1); hold on; - plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz'))), '-'); + plot(freqs, abs(squeeze(freqresp(Giff, freqs, 'Hz'))), '-'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude'); set(gca, 'XTickLabel',[]); @@ -926,26 +1043,37 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ ax2 = subplot(2,1,2); hold on; - plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G, freqs, 'Hz')))), '-'); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Giff, freqs, 'Hz')))), '-'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); yticks(-360:90:360); - ylim([-360 0]); + ylim([-180 180]); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); hold off; linkaxes([ax1,ax2],'x'); xlim([freqs(1), freqs(end)]); #+end_src -#+begin_src matlab +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/apa300ml_iff_plant.pdf', 'width', 'full', 'height', 'full'); +#+end_src + +#+name: fig:apa300ml_iff_plant +#+caption: Transfer function from actuator to force sensor +#+RESULTS: +[[file:figs/apa300ml_iff_plant.png]] + +For root locus corresponding to IFF is shown in Figure [[fig:apa300ml_iff_root_locus]]. + +#+begin_src matlab :exports none figure; gains = logspace(0, 5, 500); hold on; - plot(real(pole(G)), imag(pole(G)), 'kx'); - plot(real(tzero(G)), imag(tzero(G)), 'ko'); + plot(real(pole(Giff)), imag(pole(Giff)), 'kx'); + plot(real(tzero(Giff)), imag(tzero(Giff)), 'ko'); for k = 1:length(gains) - cl_poles = pole(feedback(G, gains(k)/s)); + cl_poles = pole(feedback(Giff, gains(k)/s)); plot(real(cl_poles), imag(cl_poles), 'k.'); end hold off; @@ -955,15 +1083,22 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ xlabel('Real Part'); ylabel('Imaginary Part'); #+end_src +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/apa300ml_iff_root_locus.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:apa300ml_iff_root_locus +#+caption: Root Locus for IFF +#+RESULTS: +[[file:figs/apa300ml_iff_root_locus.png]] + ** DVF -#+begin_src matlab +Now the dynamics from the stack actuator to the relative motion sensor is identified and shown in Figure [[fig:apa300ml_dvf_plant]]. +#+begin_src matlab :exports none m = 10; #+end_src -And the dynamics is identified. - -The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_mass]]. -#+begin_src matlab +#+begin_src matlab :exports none %% Name of the Simulink File mdl = 'APA300ML_test_bench'; @@ -1000,7 +1135,18 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ xlim([freqs(1), freqs(end)]); #+end_src -#+begin_src matlab +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/apa300ml_dvf_plant.pdf', 'width', 'full', 'height', 'full'); +#+end_src + +#+name: fig:apa300ml_dvf_plant +#+caption: Transfer function from stack actuator to relative motion sensor +#+RESULTS: +[[file:figs/apa300ml_dvf_plant.png]] + +The root locus for DVF is shown in Figure [[fig:apa300ml_dvf_root_locus]]. + +#+begin_src matlab :exports none figure; gains = logspace(0, 5, 500); @@ -1019,7 +1165,16 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ xlabel('Real Part'); ylabel('Imaginary Part'); #+end_src -** Sensor Fusion +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/apa300ml_dvf_root_locus.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:apa300ml_dvf_root_locus +#+caption: Root Locus for Direct Velocity Feedback +#+RESULTS: +[[file:figs/apa300ml_dvf_root_locus.png]] + +** TODO Sensor Fusion :noexport: - [ ] What is the goal of that? Special control properties, lower the sensor noise? Use the relative motion sensor at low frequency and the force sensor at high frequency. @@ -1203,6 +1358,12 @@ Root locus #+end_src * Flexible Joint +** Introduction :ignore: + +#+name: fig:flexor_id16_screenshot +#+caption: Flexor studied +[[file:figs/flexor_id16_screenshot.png]] + ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) <> @@ -1302,16 +1463,16 @@ Using =K=, =M= and =int_xyz=, we can use the =Reduced Order Flexible Solid= sims ** Flexible Joint Characteristics #+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) - data2orgtable([1e-6*K(3,3), K(4,4), K(5,5), K(6,6)]', {'Axial Stiffness [N/um]', 'Bending Stiffness [Nm/rad]', 'Bending Stiffness [Nm/rad]', 'Torsion Stiffness [Nm/rad]'}, {'*Caracteristic*', '*Value*'}, ' %0.f '); + data2orgtable([1e-6*K(3,3), K(4,4), K(5,5), K(6,6); 60, 15, 15, 20]', {'Axial Stiffness [N/um]', 'Bending Stiffness [Nm/rad]', 'Bending Stiffness [Nm/rad]', 'Torsion Stiffness [Nm/rad]'}, {'*Caracteristic*', '*Value*', '*Estimation by Francois*'}, ' %0.f '); #+end_src #+RESULTS: -| *Caracteristic* | *Value* | -|----------------------------+---------| -| Axial Stiffness [N/um] | 119 | -| Bending Stiffness [Nm/rad] | 33 | -| Bending Stiffness [Nm/rad] | 33 | -| Torsion Stiffness [Nm/rad] | 236 | +| *Caracteristic* | *Value* | *Estimation by Francois* | +|----------------------------+---------+--------------------------| +| Axial Stiffness [N/um] | 119 | 60 | +| Bending Stiffness [Nm/rad] | 33 | 15 | +| Bending Stiffness [Nm/rad] | 33 | 15 | +| Torsion Stiffness [Nm/rad] | 236 | 20 | ** Identification #+begin_src matlab