UP | HOME

Active Damping applied on the Simscape Model

Table of Contents

First, in section 1, we will looked at the undamped system.

Then, we will compare three active damping techniques:

For each of the active damping technique, we will:

The disturbances are:

1 Undamped System

We first look at the undamped system. The performance of this undamped system will be compared with the damped system using various techniques.

1.1 Identification of the dynamics for Active Damping

1.1.1 Initialize the Simulation

We initialize all the stages with the default parameters.

initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc();
initializeMirror();

The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.

initializeNanoHexapod('actuator', 'piezo');
initializeSample('mass', 50);

We set the references to zero.

initializeReferences();
initializeDisturbances('enable', false);

And all the controllers are set to 0.

K = tf(zeros(6));
save('./mat/controllers.mat', 'K', '-append');
K_ine = tf(zeros(6));
save('./mat/controllers.mat', 'K_ine', '-append');
K_iff = tf(zeros(6));
save('./mat/controllers.mat', 'K_iff', '-append');
K_dvf = tf(zeros(6));
save('./mat/controllers.mat', 'K_dvf', '-append');

1.1.2 Identification

First, we identify the dynamics of the system using the linearize function.

%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;

%% Name of the Simulink File
mdl = 'sim_nass_active_damping';

%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Fnl'],           1, 'openinput');              io_i = io_i + 1;
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm');  io_i = io_i + 1;

%% Run the linearization
G = linearize(mdl, io, 0.5, options);
G.InputName  = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
                'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
                'Vnlm1', 'Vnlm2', 'Vnlm3', 'Vnlm4', 'Vnlm5', 'Vnlm6'};

We then create transfer functions corresponding to the active damping plants.

G_iff = minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}));
G_dvf = minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}));
G_ine = minreal(G({'Vnlm1', 'Vnlm2', 'Vnlm3', 'Vnlm4', 'Vnlm5', 'Vnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}));

And we save them for further analysis.

save('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');

1.1.3 Obtained Plants for Active Damping

load('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');

nass_active_damping_iff_plant.png

Figure 1: G_iff: IFF Plant (png, pdf)

nass_active_damping_ine_plant.png

Figure 2: G_dvf: Plant for Direct Velocity Feedback (png, pdf)

nass_active_damping_inertial_plant.png

Figure 3: G_ine: Inertial Feedback Plant (png, pdf)

1.2 Tomography Experiment

1.2.1 Simulation

We initialize elements for the tomography experiment.

prepareTomographyExperiment();

We change the simulation stop time.

load('mat/conf_simscape.mat');
set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

save('./active_damping/mat/tomo_exp.mat', 'En', 'Eg', '-append');

1.2.2 Results

We load the results of tomography experiments.

load('./active_damping/mat/tomo_exp.mat', 'En');
t = linspace(0, 3, length(En(:,1)));

nass_act_damp_undamped_sim_tomo_trans.png

Figure 4: Position Error during tomography experiment - Translations (png, pdf)

nass_act_damp_undamped_sim_tomo_rot.png

Figure 5: Position Error during tomography experiment - Rotations (png, pdf)

2 Variability of the system dynamics for Active Damping

The goal of this section is to study how the dynamics of the Active Damping plants are changing with the experimental conditions. These experimental conditions are:

  • The mass of the sample (section 2.1)
  • The spindle angle with a null rotating speed (section 2.2)
  • The spindle rotation speed (section 2.3)
  • The tilt angle (section 2.4)
  • The scans of the translation stage (section 2.5)

For the identification of the dynamics, the system is simulation for \(\approx 0.5s\) before the linearization is performed. This is done in order for the transient phase to be over.

2.1 Variation of the Sample Mass

For all the identifications, the disturbances are disabled and no controller are used.

We identify the dynamics for the following sample mass.

masses = [1, 10, 50]; % [kg]

act_damp_variability_iff_sample_mass.png

Figure 6: Variability of the IFF plant with the Sample Mass (png, pdf)

act_damp_variability_dvf_sample_mass.png

Figure 7: Variability of the DVF plant with the Sample Mass (png, pdf)

act_damp_variability_ine_sample_mass.png

Figure 8: Variability of the Inertial plant with the Sample Mass (png, pdf)

2.2 Variation of the Spindle Angle

We identify the dynamics for the following Spindle angles.

Rz_amplitudes = [0, pi/4, pi/2, pi]; % [rad]

act_damp_variability_iff_spindle_angle.png

Figure 9: Variability of the IFF plant with the Spindle Angle (png, pdf)

act_damp_variability_dvf_spindle_angle.png

Figure 10: Variability of the DVF plant with the Spindle Angle (png, pdf)

act_damp_variability_ine_spindle_angle.png

Figure 11: Variability of the Inertial plant with the Spindle Angle (png, pdf)

2.3 Variation of the Spindle Rotation Speed

We identify the dynamics for the following Spindle rotation periods.

Rz_periods = [60, 6, 2, 1]; % [s]

The identification of the dynamics is done at the same Spindle angle position.

2.3.1 Dynamics of the Active Damping plants

act_damp_variability_iff_spindle_speed.png

Figure 12: Variability of the IFF plant with the Spindle rotation speed (png, pdf)

act_damp_variability_iff_spindle_speed_zoom.png

Figure 13: Variability of the IFF plant with the Spindle rotation speed (png, pdf)

act_damp_variability_dvf_spindle_speed.png

Figure 14: Variability of the DVF plant with the Spindle rotation speed (png, pdf)

act_damp_variability_dvf_spindle_speed_zoom.png

Figure 15: Variability of the DVF plant with the Spindle rotation speed (png, pdf)

act_damp_variability_ine_spindle_speed.png

Figure 16: Variability of the Inertial plant with the Spindle rotation speed (png, pdf)

act_damp_variability_ine_spindle_speed_zoom.png

Figure 17: Variability of the Inertial plant with the Spindle rotation speed (png, pdf)

2.3.2 Variation of the poles and zeros with the Spindle rotation frequency

campbell_diagram_spindle_rotation.png

Figure 18: Evolution of the pole with respect to the spindle rotation speed (png, pdf)

variation_zeros_active_damping_plants.png

Figure 19: Evolution of the zero with respect to the spindle rotation speed (png, pdf)

2.4 Variation of the Tilt Angle

We identify the dynamics for the following Tilt stage angles.

Ry_amplitudes = [-3*pi/180, 3*pi/180]; % [rad]

act_damp_variability_iff_tilt_angle.png

Figure 20: Variability of the IFF plant with the Tilt stage Angle (png, pdf)

act_damp_variability_dvf_tilt_angle.png

Figure 21: Variability of the DVF plant with the Tilt Angle (png, pdf)

act_damp_variability_ine_tilt_angle.png

Figure 22: Variability of the Inertial plant with the Tilt Angle (png, pdf)

2.5 Scans of the Translation Stage

We want here to verify if the dynamics used for Active damping is varying when using the translation stage for scans.

We initialize the translation stage reference to be a sinus with an amplitude of 5mm and a period of 1s (Figure 23).

initializeReferences('Dy_type', 'sinusoidal', ...
                     'Dy_amplitude', 5e-3, ... % [m]
                     'Dy_period', 1); % [s]

ty_scanning_reference_sinus.png

Figure 23: Reference path for the translation stage (png, pdf)

We identify the dynamics at different positions (times) when scanning with the Translation stage.

t_lin = [0.5, 0.75, 1, 1.25];

act_damp_variability_iff_ty_scans.png

Figure 24: Variability of the IFF plant at different Ty scan positions (png, pdf)

act_damp_variability_dvf_ty_scans.png

Figure 25: Variability of the DVF plant at different Ty scan positions (png, pdf)

act_damp_variability_ine_ty_scans.png

Figure 26: Variability of the Inertial plant at different Ty scan positions (png, pdf)

2.6 Conclusion

Table 1: Conclusion on the variability of the system dynamics for active damping
  Change of Dynamics
Sample Mass Large
Spindle Angle Small
Spindle Rotation Speed First resonance is split in two resonances
Tilt Angle Negligible
Translation Stage scans Negligible

Also, for the Inertial Sensor, a RHP zero may appear when the spindle is rotating fast.

When using either a force sensor or a relative motion sensor for active damping, the only “parameter” that induce a large change for the dynamics to be controlled is the sample mass. Thus, the developed damping techniques should be robust to variations of the sample mass.

3 Integral Force Feedback

All the files (data and Matlab scripts) are accessible here.

Integral Force Feedback is applied on the simscape model.

3.1 Control Design

3.1.1 Plant

Let’s load the previously indentified undamped plant:

load('./active_damping/mat/undamped_plants.mat', 'G_iff');

Let’s look at the transfer function from actuator forces in the nano-hexapod to the force sensor in the nano-hexapod legs for all 6 pairs of actuator/sensor (figure 27).

iff_plant.png

Figure 27: Transfer function from forces applied in the legs to force sensor (png, pdf)

3.1.2 Control Design

The controller for each pair of actuator/sensor is:

K_iff = 1000/s;

The corresponding loop gains are shown in figure 28.

iff_open_loop.png

Figure 28: Loop Gain for the Integral Force Feedback (png, pdf)

3.1.3 Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture.

K_iff = -K_iff*eye(6);

We save the controller for further analysis.

save('./active_damping/mat/K_iff.mat', 'K_iff');

3.1.4 IFF with High Pass Filter

w_hpf = 2*pi*10; % Cut-off frequency for the high pass filter [rad/s]

K_iff = 2*pi*200/s * (s/w_hpf)/(s/w_hpf + 1);

The corresponding loop gains are shown in figure 29.

iff_hpf_open_loop.png

Figure 29: Loop Gain for the Integral Force Feedback with an High pass filter (png, pdf)

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture.

K_iff = -K_iff*eye(6);

We save the controller for further analysis.

save('./active_damping/mat/K_iff_hpf.mat', 'K_iff');

3.2 Tomography Experiment

3.2.1 Simulation with IFF Controller

We initialize elements for the tomography experiment.

prepareTomographyExperiment();

We set the IFF controller.

load('./active_damping/mat/K_iff.mat', 'K_iff');
save('./mat/controllers.mat', 'K_iff', '-append');

We change the simulation stop time.

load('mat/conf_simscape.mat');
set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

En_iff = En;
Eg_iff = Eg;
save('./active_damping/mat/tomo_exp.mat', 'En_iff', 'Eg_iff', '-append');

3.2.2 Simulation with IFF Controller with added High Pass Filter

We initialize elements for the tomography experiment.

prepareTomographyExperiment();

We set the IFF controller with the High Pass Filter.

load('./active_damping/mat/K_iff_hpf.mat', 'K_iff');
save('./mat/controllers.mat', 'K_iff', '-append');

We change the simulation stop time.

load('mat/conf_simscape.mat');
set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

En_iff_hpf = En;
Eg_iff_hpf = Eg;
save('./active_damping/mat/tomo_exp.mat', 'En_iff_hpf', 'Eg_iff_hpf', '-append');

3.2.3 Compare with Undamped system

We load the results of tomography experiments.

load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff', 'En_iff_hpf');
t = linspace(0, 3, length(En(:,1)));

nass_act_damp_iff_sim_tomo_xy.png

Figure 30: Position Error during tomography experiment - XY Motion (png, pdf)

nass_act_damp_iff_sim_tomo_trans.png

Figure 31: Position Error during tomography experiment - Translations (png, pdf)

nass_act_damp_iff_sim_tomo_rot.png

Figure 32: Position Error during tomography experiment - Rotations (png, pdf)

3.3 Conclusion

Integral Force Feedback:

  • Robust (guaranteed stability)
  • Acceptable Damping
  • Increase the sensitivity to disturbances at low frequencies

4 Direct Velocity Feedback

All the files (data and Matlab scripts) are accessible here.

In the Direct Velocity Feedback (DVF), a derivative feedback is applied between the measured actuator displacement to the actuator force input. The actuator displacement can be measured with a capacitive sensor for instance.

4.1 Control Design

4.1.1 Plant

Let’s load the undamped plant:

load('./active_damping/mat/undamped_plants.mat', 'G_dvf');

Let’s look at the transfer function from actuator forces in the nano-hexapod to the measured displacement of the actuator for all 6 pairs of actuator/sensor (figure 33).

dvf_plant.png

Figure 33: Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

4.1.2 Control Design

The Direct Velocity Feedback is defined below. A Low pass Filter is added to make the controller transfer function proper.

K_dvf = s*20000/(1 + s/2/pi/10000);

The obtained loop gains are shown in figure 34.

dvf_open_loop.png

Figure 34: Loop Gain for the Integral Force Feedback (png, pdf)

4.1.3 Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture.

K_dvf = -K_dvf*eye(6);

We save the controller for further analysis.

save('./active_damping/mat/K_dvf.mat', 'K_dvf');

4.2 Tomography Experiment

4.2.1 Initialize the Simulation

We initialize elements for the tomography experiment.

prepareTomographyExperiment();

We set the DVF controller.

load('./active_damping/mat/K_dvf.mat', 'K_dvf');
save('./mat/controllers.mat', 'K_dvf', '-append');

4.2.2 Simulation

We change the simulation stop time.

load('mat/conf_simscape.mat');
set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

En_dvf = En;
Eg_dvf = Eg;
save('./active_damping/mat/tomo_exp.mat', 'En_dvf', 'Eg_dvf', '-append');

4.2.3 Compare with Undamped system

We load the results of tomography experiments.

load('./active_damping/mat/tomo_exp.mat', 'En', 'En_dvf');
t = linspace(0, 3, length(En(:,1)));

nass_act_damp_dvf_sim_tomo_xy.png

Figure 35: Position Error during tomography experiment - XY Motion (png, pdf)

nass_act_damp_dvf_sim_tomo_trans.png

Figure 36: Position Error during tomography experiment - Translations (png, pdf)

nass_act_damp_dvf_sim_tomo_rot.png

Figure 37: Position Error during tomography experiment - Rotations (png, pdf)

4.3 Conclusion

Direct Velocity Feedback:

5 Inertial Control

All the files (data and Matlab scripts) are accessible here.

In Inertial Control, a feedback is applied between the measured absolute motion (velocity or acceleration) of the platform to the actuator force input.

5.1 Control Design

5.1.1 Plant

Let’s load the undamped plant:

load('./active_damping/mat/undamped_plants.mat', 'G_ine');

Let’s look at the transfer function from actuator forces in the nano-hexapod to the measured velocity of the nano-hexapod platform in the direction of the corresponding actuator for all 6 pairs of actuator/sensor (figure 38).

ine_plant.png

Figure 38: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

5.1.2 Control Design

The controller is defined below and the obtained loop gain is shown in figure 39.

K_ine = 1e4/(1+s/(2*pi*100));

ine_open_loop_gain.png

Figure 39: Loop Gain for Inertial Control (png, pdf)

5.1.3 Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture.

K_ine = -K_ine*eye(6);

We save the controller for further analysis.

save('./active_damping/mat/K_ine.mat', 'K_ine');

5.2 Tomography Experiment

5.2.1 Initialize the Simulation

We initialize elements for the tomography experiment.

prepareTomographyExperiment();

We set the Inertial controller.

load('./active_damping/mat/K_ine.mat', 'K_ine');
save('./mat/controllers.mat', 'K_ine', '-append');

5.2.2 Simulation

We change the simulation stop time.

load('mat/conf_simscape.mat');
set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

En_ine = En;
Eg_ine = Eg;
save('./active_damping/mat/tomo_exp.mat', 'En_ine', 'Eg_ine', '-append');

5.2.3 Compare with Undamped system

We load the results of tomography experiments.

load('./active_damping/mat/tomo_exp.mat', 'En', 'En_ine');
t = linspace(0, 3, length(En_ine(:,1)));

nass_act_damp_ine_sim_tomo_xy.png

Figure 40: Position Error during tomography experiment - XY Motion (png, pdf)

nass_act_damp_ine_sim_tomo_trans.png

Figure 41: Position Error during tomography experiment - Translations (png, pdf)

nass_act_damp_ine_sim_tomo_rot.png

Figure 42: Position Error during tomography experiment - Rotations (png, pdf)

5.3 Conclusion

Inertial Control:

6 Comparison

6.1 Load the plants

load('./active_damping/mat/plants.mat', 'G', 'G_iff', 'G_ine', 'G_dvf');

6.2 Sensitivity to Disturbance

sensitivity_comp_ground_motion_z.png

Figure 43: Sensitivity to ground motion in the Z direction on the Z motion error (png, pdf)

sensitivity_comp_direct_forces_z.png

Figure 44: Compliance in the Z direction: Sensitivity of direct forces applied on the sample in the Z direction on the Z motion error (png, pdf)

sensitivity_comp_spindle_z.png

Figure 45: Sensitivity to forces applied in the Z direction by the Spindle on the Z motion error (png, pdf)

sensitivity_comp_ty_z.png

Figure 46: Sensitivity to forces applied in the Z direction by the Y translation stage on the Z motion error (png, pdf)

sensitivity_comp_ty_x.png

Figure 47: Sensitivity to forces applied in the X direction by the Y translation stage on the X motion error (png, pdf)

6.3 Damped Plant

plant_comp_damping_z.png

Figure 48: Plant for the \(z\) direction for different active damping technique used (png, pdf)

plant_comp_damping_x.png

Figure 49: Plant for the \(x\) direction for different active damping technique used (png, pdf)

plant_comp_damping_coupling.png

Figure 50: Comparison of one off-diagonal plant for different damping technique applied (png, pdf)

6.4 Tomography Experiment

6.4.1 Load the Simulation Data

load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff_hpf', 'En_dvf', 'En_ine');
En_iff = En_iff_hpf;
t = linspace(0, 3, length(En(:,1)));

6.4.2 Frequency Domain Analysis

Window used for pwelch function.

n_av = 8;
han_win = hanning(ceil(length(En(:, 1))/n_av));

act_damp_tomo_exp_comp_psd_trans.png

Figure 51: PSD of the translation errors in the X direction for applied Active Damping techniques (png, pdf)

act_damp_tomo_exp_comp_psd_rot.png

Figure 52: PSD of the rotation errors in the X direction for applied Active Damping techniques (png, pdf)

act_damp_tomo_exp_comp_cps_trans.png

Figure 53: CPS of the translation errors in the X direction for applied Active Damping techniques (png, pdf)

act_damp_tomo_exp_comp_cps_rot.png

Figure 54: CPS of the rotation errors in the X direction for applied Active Damping techniques (png, pdf)

7 Useful Functions

7.1 prepareTomographyExperiment

This Matlab function is accessible here.

Function Description

function [] = prepareTomographyExperiment(args)

Optional Parameters

arguments
    args.nass_actuator       char   {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
    args.sample_mass   (1,1) double {mustBeNumeric, mustBePositive} = 50
    args.Ry_period     (1,1) double {mustBeNumeric, mustBePositive} = 1
end

Initialize the Simulation

We initialize all the stages with the default parameters.

initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc();
initializeMirror();

The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.

initializeNanoHexapod('actuator', args.nass_actuator);
initializeSample('mass', args.sample_mass);

We set the references to zero.

initializeReferences('Rz_type', 'rotating', 'Rz_period', args.Ry_period);

And all the controllers are set to 0.

K = tf(zeros(6));
save('./mat/controllers.mat', 'K', '-append');
K_ine = tf(zeros(6));
save('./mat/controllers.mat', 'K_ine', '-append');
K_iff = tf(zeros(6));
save('./mat/controllers.mat', 'K_iff', '-append');
K_dvf = tf(zeros(6));
save('./mat/controllers.mat', 'K_dvf', '-append');

Author: Dehaeze Thomas

Created: 2020-02-04 mar. 16:13