Simscape Uniaxial Model
Table of Contents
The idea is to use the same model as the full Simscape Model but to restrict the motion only in the vertical direction.
This is done in order to more easily study the system and evaluate control techniques.
1 Undamped System
1.1 Init
We initialize all the stages with the default parameters. The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.
initializeGround(); initializeGranite(); initializeTy(); initializeRy(); initializeRz(); initializeMicroHexapod(); initializeAxisc(); initializeMirror(); initializeNanoHexapod(struct('actuator', 'piezo')); initializeSample(struct('mass', 50));
All the controllers are set to 0.
K = tf(0); save('./mat/controllers.mat', 'K', '-append'); K_iff = tf(0); save('./mat/controllers.mat', 'K_iff', '-append'); K_rmc = tf(0); save('./mat/controllers.mat', 'K_rmc', '-append'); K_dvf = tf(0); save('./mat/controllers.mat', 'K_dvf', '-append');
1.2 Identification
%% Options for Linearized options = linearizeOptions; options.SampleTime = 0; %% Name of the Simulink File mdl = 'sim_nano_station_uniaxial';
%% Input/Output definition io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion io(2) = linio([mdl, '/Fs'], 1, 'input'); % Force applied on the sample io(3) = linio([mdl, '/Fnl'], 1, 'input'); % Force applied by the NASS io(4) = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty io(5) = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz io(6) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample io(7) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs io(8) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs io(9) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute displacement of the granite io(10) = linio([mdl, '/Vlm'], 1, 'output'); % Measured absolute velocity of the top NASS platform
%% Run the linearization G = linearize(mdl, io, options); G.InputName = {'Dw', ... % Ground Motion [m] 'Fs', ... % Force Applied on Sample [N] 'Fn', ... % Force applied by NASS [N] 'Fty', ... % Parasitic Force Ty [N] 'Frz'}; % Parasitic Force Rz [N] G.OutputName = {'D', ... % Measured sample displacement x.r.t. granite [m] 'Fnm', ... % Force Sensor in NASS [N] 'Dnm', ... % Displacement Sensor in NASS [m] 'Dgm', ... % Asbolute displacement of Granite [m] 'Vlm'}; ... % Absolute Velocity of NASS [m/s]
1.3 Sensitivity to Disturbances
1.5 Save
save('./uniaxial/mat/plants.mat', 'G');
2 Integral Force Feedback
2.1 Control Design
load('./uniaxial/mat/plants.mat', 'G');
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.
The controller for each pair of actuator/sensor is:
K_iff = -1000/s;
2.2 Identification
Let's initialize the system prior to identification.
initializeGround(); initializeGranite(); initializeTy(); initializeRy(); initializeRz(); initializeMicroHexapod(); initializeAxisc(); initializeMirror(); initializeNanoHexapod(struct('actuator', 'piezo')); initializeSample(struct('mass', 50));
All the controllers are set to 0.
K = tf(0); save('./mat/controllers.mat', 'K', '-append'); K_iff = -K_iff; save('./mat/controllers.mat', 'K_iff', '-append'); K_rmc = tf(0); save('./mat/controllers.mat', 'K_rmc', '-append'); K_dvf = tf(0); save('./mat/controllers.mat', 'K_dvf', '-append');
%% Options for Linearized options = linearizeOptions; options.SampleTime = 0; %% Name of the Simulink File mdl = 'sim_nano_station_uniaxial';
%% Input/Output definition io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion io(2) = linio([mdl, '/Fs'], 1, 'input'); % Force applied on the sample io(3) = linio([mdl, '/Fnl'], 1, 'input'); % Force applied by the NASS io(4) = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty io(5) = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz io(6) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample io(7) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs io(8) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs io(9) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute displacement of the granite io(10) = linio([mdl, '/Vlm'], 1, 'output'); % Measured absolute velocity of the top NASS platform
%% Run the linearization G_iff = linearize(mdl, io, options); G_iff.InputName = {'Dw', ... % Ground Motion [m] 'Fs', ... % Force Applied on Sample [N] 'Fn', ... % Force applied by NASS [N] 'Fty', ... % Parasitic Force Ty [N] 'Frz'}; % Parasitic Force Rz [N] G_iff.OutputName = {'D', ... % Measured sample displacement x.r.t. granite [m] 'Fnm', ... % Force Sensor in NASS [N] 'Dnm', ... % Displacement Sensor in NASS [m] 'Dgm', ... % Asbolute displacement of Granite [m] 'Vlm'}; ... % Absolute Velocity of NASS [m/s]
2.3 Sensitivity to Disturbance
2.5 Save
save('./uniaxial/mat/plants.mat', 'G_iff', '-append');
2.6 Conclusion
Integral Force Feedback:
3 Relative Motion Control
In the Relative Motion Control (RMC), a derivative feedback is applied between the measured actuator displacement to the actuator force input.
3.1 Control Design
load('./uniaxial/mat/plants.mat', 'G');
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.
The Relative Motion Controller is defined below. A Low pass Filter is added to make the controller transfer function proper.
K_rmc = s*50000/(1 + s/2/pi/10000);
3.2 Identification
Let's initialize the system prior to identification.
initializeGround(); initializeGranite(); initializeTy(); initializeRy(); initializeRz(); initializeMicroHexapod(); initializeAxisc(); initializeMirror(); initializeNanoHexapod(struct('actuator', 'piezo')); initializeSample(struct('mass', 50));
And initialize the controllers.
K = tf(0); save('./mat/controllers.mat', 'K', '-append'); K_iff = tf(0); save('./mat/controllers.mat', 'K_iff', '-append'); K_rmc = -K_rmc; save('./mat/controllers.mat', 'K_rmc', '-append'); K_dvf = tf(0); save('./mat/controllers.mat', 'K_dvf', '-append');
%% Options for Linearized options = linearizeOptions; options.SampleTime = 0; %% Name of the Simulink File mdl = 'sim_nano_station_uniaxial';
%% Input/Output definition io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion io(2) = linio([mdl, '/Fs'], 1, 'input'); % Force applied on the sample io(3) = linio([mdl, '/Fnl'], 1, 'input'); % Force applied by the NASS io(4) = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty io(5) = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz io(6) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample io(7) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs io(8) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs io(9) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute displacement of the granite io(10) = linio([mdl, '/Vlm'], 1, 'output'); % Measured absolute velocity of the top NASS platform
%% Run the linearization G_rmc = linearize(mdl, io, options); G_rmc.InputName = {'Dw', ... % Ground Motion [m] 'Fs', ... % Force Applied on Sample [N] 'Fn', ... % Force applied by NASS [N] 'Fty', ... % Parasitic Force Ty [N] 'Frz'}; % Parasitic Force Rz [N] G_rmc.OutputName = {'D', ... % Measured sample displacement x.r.t. granite [m] 'Fnm', ... % Force Sensor in NASS [N] 'Dnm', ... % Displacement Sensor in NASS [m] 'Dgm', ... % Asbolute displacement of Granite [m] 'Vlm'}; ... % Absolute Velocity of NASS [m/s]
3.3 Sensitivity to Disturbance
3.5 Save
save('./uniaxial/mat/plants.mat', 'G_rmc', '-append');
3.6 Conclusion
Relative Motion Control:
4 Direct Velocity Feedback
In the Relative Motion Control (RMC), a feedback is applied between the measured velocity of the platform to the actuator force input.
4.1 Control Design
4.2 Identification
Let's initialize the system prior to identification.
initializeGround(); initializeGranite(); initializeTy(); initializeRy(); initializeRz(); initializeMicroHexapod(); initializeAxisc(); initializeMirror(); initializeNanoHexapod(struct('actuator', 'piezo')); initializeSample(struct('mass', 50));
And initialize the controllers.
K = tf(0); save('./mat/controllers.mat', 'K', '-append'); K_iff = tf(0); save('./mat/controllers.mat', 'K_iff', '-append'); K_rmc = tf(0); save('./mat/controllers.mat', 'K_rmc', '-append'); K_dvf = -K_dvf; save('./mat/controllers.mat', 'K_dvf', '-append');
%% Options for Linearized options = linearizeOptions; options.SampleTime = 0; %% Name of the Simulink File mdl = 'sim_nano_station_uniaxial';
%% Input/Output definition io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion io(2) = linio([mdl, '/Fs'], 1, 'input'); % Force applied on the sample io(3) = linio([mdl, '/Fnl'], 1, 'input'); % Force applied by the NASS io(4) = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty io(5) = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz io(6) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample io(7) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs io(8) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs io(9) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute displacement of the granite io(10) = linio([mdl, '/Vlm'], 1, 'output'); % Measured absolute velocity of the top NASS platform
%% Run the linearization G_dvf = linearize(mdl, io, options); G_dvf.InputName = {'Dw', ... % Ground Motion [m] 'Fs', ... % Force Applied on Sample [N] 'Fn', ... % Force applied by NASS [N] 'Fty', ... % Parasitic Force Ty [N] 'Frz'}; % Parasitic Force Rz [N] G_dvf.OutputName = {'D', ... % Measured sample displacement x.r.t. granite [m] 'Fnm', ... % Force Sensor in NASS [N] 'Dnm', ... % Displacement Sensor in NASS [m] 'Dgm', ... % Asbolute displacement of Granite [m] 'Vlm'}; ... % Absolute Velocity of NASS [m/s]
4.3 Sensitivity to Disturbance
4.5 Save
save('./uniaxial/mat/plants.mat', 'G_dvf', '-append');
4.6 Conclusion
Direct Velocity Feedback:
5 Comparison of Active Damping Techniques
5.1 Load the plants
load('./uniaxial/mat/plants.mat', 'G', 'G_iff', 'G_rmc', 'G_dvf');