148 KiB
Active Damping applied on the Simscape Model
- Introduction
- Undamped System
- Integral Force Feedback
- Direct Velocity Feedback
- Inertial Control
- Variability of the system dynamics for Active Damping
- Comparison
- Useful Functions
Introduction ignore
First, in section sec:undamped_system, we will looked at the undamped system.
Then, we will compare three active damping techniques:
- In section sec:iff: the integral force feedback is used
- In section sec:dvf: the direct velocity feedback is used
- In section sec:ine: 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
Undamped System
<<sec:undamped_system>>
ZIP file containing the data and matlab files ignore
All the files (data and Matlab scripts) are accessible here.
Introduction ignore
We first look at the undamped system. The performance of this undamped system will be compared with the damped system using various techniques.
Identification of the dynamics for Active Damping
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');
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');
Obtained Plants for Active Damping
load('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Tomography Experiment
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');
Results
We load the results of tomography experiments.
load('./active_damping/mat/tomo_exp.mat', 'En');
t = linspace(0, 3, length(En(:,1)));
<<plt-matlab>>
<<plt-matlab>>
Integral Force Feedback
<<sec:iff>>
ZIP file containing the data and matlab files ignore
All the files (data and Matlab scripts) are accessible here.
Introduction ignore
Integral Force Feedback is applied on the simscape model.
Control Design
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 fig:iff_plant).
<<plt-matlab>>
Control Design
The controller for each pair of actuator/sensor is:
K_iff = 1000/s;
The corresponding loop gains are shown in figure fig:iff_open_loop.
<<plt-matlab>>
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');
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 fig:iff_hpf_open_loop.
<<plt-matlab>>
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');
Tomography Experiment
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');
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');
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)));
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Conclusion
Integral Force Feedback:
- Robust (guaranteed stability)
- Acceptable Damping
- Increase the sensitivity to disturbances at low frequencies
Direct Velocity Feedback
<<sec:dvf>>
ZIP file containing the data and matlab files ignore
All the files (data and Matlab scripts) are accessible here.
Introduction ignore
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.
Control Design
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 fig:dvf_plant).
<<plt-matlab>>
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 fig:dvf_open_loop.
<<plt-matlab>>
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');
Tomography Experiment
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');
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');
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)));
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Conclusion
Direct Velocity Feedback:
Inertial Control
<<sec:ine>>
ZIP file containing the data and matlab files ignore
All the files (data and Matlab scripts) are accessible here.
Introduction ignore
In Inertial Control, a feedback is applied between the measured absolute motion (velocity or acceleration) of the platform to the actuator force input.
Control Design
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 fig:ine_plant).
<<plt-matlab>>
Control Design
The controller is defined below and the obtained loop gain is shown in figure fig:ine_open_loop_gain.
K_ine = 1e4/(1+s/(2*pi*100));
<<plt-matlab>>
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');
Tomography Experiment
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');
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');
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)));
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Conclusion
Inertial Control:
Variability of the system dynamics for Active Damping
<<sec:act_damp_variability_plant>>
ZIP file containing the data and matlab files ignore
All the files (data and Matlab scripts) are accessible here.
Introduction ignore
Variation of the Sample Mass
Introduction ignore
For all the identifications, the disturbances are disabled and no controller are used.
Identification ignore
We identify the dynamics for the following sample mass.
masses = [1, 10, 50]; % [kg]
Plots ignore
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Variation of the Spindle Angle
Introduction ignore
Identification ignore
We identify the dynamics for the following Spindle angles.
Rz_amplitudes = [0, pi/4, pi/2, pi]; % [rad]
Plots ignore
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Variation of the Spindle Rotation Speed
Introduction ignore
Identification ignore
We identify the dynamics for the following Spindle rotation periods.
Rz_periods = [60, 10, 1]; % [s]
The goal is to identify the dynamics:
- after the transient phase
- at the same spindle angle
Gw = {zeros(length(Rz_periods))};
Gw_iff = {zeros(length(Rz_periods))};
Gw_dvf = {zeros(length(Rz_periods))};
Gw_ine = {zeros(length(Rz_periods))};
for i = 1:length(Rz_periods)
initializeReferences('Rz_type', 'rotating', ...
'Rz_period', Rz_periods(i), ... % Rotation period [s]
'Rz_amplitude', -0.5*(2*pi/Rz_periods(i))); % Angle offset [rad]
load('mat/nass_references.mat', 'Rz'); % We load the reference for the Spindle
[~, i_end] = min(abs(Rz.signals.values)); % Obtain the indice where the spindle angle is zero
t_sim = Rz.time(i_end) % Simulation time before identification [s]
%% Run the linearization
G = linearize(mdl, io, t_sim, 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'};
Gw(i) = {G};
Gw_iff(i) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Gw_dvf(i) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Gw_ine(i) = {minreal(G({'Vnlm1', 'Vnlm2', 'Vnlm3', 'Vnlm4', 'Vnlm5', 'Vnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
end
Plots ignore
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Variation of the Tilt Angle
Introduction ignore
Identification ignore
We identify the dynamics for the following Tilt stage angles.
Ry_amplitudes = [0, 20*pi/180]; % [rad]
Plots ignore
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Conclusion
Comparison
<<sec:comparison>>
Introduction ignore
Load the plants
load('./active_damping/mat/plants.mat', 'G', 'G_iff', 'G_ine', 'G_dvf');
Sensitivity to Disturbance
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Damped Plant
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Tomography Experiment
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)));
Frequency Domain Analysis
Window used for pwelch
function.
n_av = 8;
han_win = hanning(ceil(length(En(:, 1))/n_av));
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Useful Functions
prepareTomographyExperiment
<<sec: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');