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:
- In section 2: the integral force feedback is used
- In section 3: the direct velocity feedback is used
- In section 4: inertial control is used
For each of the active damping technique, we will:
- Look at the damped plant
- Simulate tomography experiments
- Compare the sensitivity from disturbances
The disturbances are:
- Ground motion
- Motion errors of all the stages
1 Undamped System
All the files (data and Matlab scripts) are accessible here.
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();
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, 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.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
2 Integral Force Feedback
All the files (data and Matlab scripts) are accessible here.
Integral Force Feedback is applied on the simscape model.
2.1 Control Design
2.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 6).
2.1.2 Control Design
2.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');
2.2 Tomography Experiment
2.2.1 Initialize the Simulation
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');
2.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_iff = En; Eg_iff = Eg; save('./active_damping/mat/tomo_exp.mat', 'En_iff', 'Eg_iff', '-append');
2.2.3 Compare with Undamped system
2.3 Conclusion
Integral Force Feedback:
- Robust (guaranteed stability)
- Acceptable Damping
- Increase the sensitivity to disturbances at low frequencies
3 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.
3.1 Control Design
3.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 10).
3.1.2 Control Design
3.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');
3.2 Tomography Experiment
3.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');
3.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');
3.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)));
3.3 Conclusion
Direct Velocity Feedback:
4 Inertial Control
All the files (data and Matlab scripts) are accessible here.
In Inertial Control, a feedback is applied between the measured absolute velocity of the platform to the actuator force input.
4.1 Control Design
4.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 14).
4.1.2 Control Design
4.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');
4.2 Tomography Experiment
4.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');
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_ine = En; Eg_ine = Eg; save('./active_damping/mat/tomo_exp.mat', 'En_ine', 'Eg_ine', '-append');
4.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)));
4.3 Conclusion
Inertial Control:
5 Comparison
5.1 Load the plants
load('./active_damping/mat/plants.mat', 'G', 'G_iff', 'G_ine', 'G_dvf');
5.2 Sensitivity to Disturbance
5.3 Damped Plant
5.4 Tomography Experiment
load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff', 'En_dvf', 'En_ine'); t = linspace(0, 3, length(En(:,1)));
rms(sqrt(En(:, 1).^2 + En(:, 2).^2 + En(:, 3).^2)) rms(sqrt(En_ine(:, 1).^2 + En_ine(:, 2).^2 + En_ine(:, 3).^2)) rms(sqrt(En_dvf(:, 1).^2 + En_dvf(:, 2).^2 + En_dvf(:, 3).^2)) rms(sqrt(En_iff(:, 1).^2 + En_iff(:, 2).^2 + En_iff(:, 3).^2))
5.4.1 Frequency Domain
Ts = t(1); % Sample Time for the Data [s] n_av = 8; han_win = hanning(ceil(length(En(:, 1))/n_av)); [pdx, f] = pwelch(Ern(:, 1), han_win, [], [], 1/Ts);
6 Useful Functions
6.1 prepareTomographyExperiment
This Matlab function is accessible here.
6.1.1 Function Description
function [] = prepareTomographyExperiment(args)
6.1.2 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
6.1.3 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');