Add analysis about amplified piezo
This commit is contained in:
parent
20af78bb8a
commit
04c2ee06dc
377
docs/amplified_piezoelectric_stack.html
Normal file
377
docs/amplified_piezoelectric_stack.html
Normal file
@ -0,0 +1,377 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
|
<head>
|
||||||
|
<!-- 2020-05-20 mer. 15:49 -->
|
||||||
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
|
<title>Amplified Piezoelectric Stack Actuator</title>
|
||||||
|
<meta name="generator" content="Org mode" />
|
||||||
|
<meta name="author" content="Dehaeze Thomas" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
||||||
|
<script src="./js/jquery.min.js"></script>
|
||||||
|
<script src="./js/bootstrap.min.js"></script>
|
||||||
|
<script src="./js/jquery.stickytableheaders.min.js"></script>
|
||||||
|
<script src="./js/readtheorg.js"></script>
|
||||||
|
<script>MathJax = {
|
||||||
|
tex: {
|
||||||
|
tags: 'ams',
|
||||||
|
macros: {bm: ["\\boldsymbol{#1}",1],}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="org-div-home-and-up">
|
||||||
|
<a accesskey="h" href="./index.html"> UP </a>
|
||||||
|
|
|
||||||
|
<a accesskey="H" href="./index.html"> HOME </a>
|
||||||
|
</div><div id="content">
|
||||||
|
<h1 class="title">Amplified Piezoelectric Stack Actuator</h1>
|
||||||
|
<div id="table-of-contents">
|
||||||
|
<h2>Table of Contents</h2>
|
||||||
|
<div id="text-table-of-contents">
|
||||||
|
<ul>
|
||||||
|
<li><a href="#org996fd7c">1. Simplified Model</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#org47cc3c4">1.1. Parameters</a></li>
|
||||||
|
<li><a href="#org3b3c7ac">1.2. Identification</a></li>
|
||||||
|
<li><a href="#org97f356d">1.3. Root Locus</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#orgf1a765f">2. Rotating X-Y platform</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#org0dc544d">2.1. Parameters</a></li>
|
||||||
|
<li><a href="#org08e3567">2.2. Identification</a></li>
|
||||||
|
<li><a href="#orgbba342e">2.3. Root Locus</a></li>
|
||||||
|
<li><a href="#org069f401">2.4. Analysis</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The presented model is based on <a class='org-ref-reference' href="#souleille18_concep_activ_mount_space_applic">souleille18_concep_activ_mount_space_applic</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The model represents the amplified piezo APA100M from Cedrat-Technologies (Figure <a href="#orgb707bbd">1</a>).
|
||||||
|
The parameters are shown in the table below.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="orgb707bbd" class="figure">
|
||||||
|
<p><img src="./figs/souleille18_model_piezo.png" alt="souleille18_model_piezo.png" />
|
||||||
|
</p>
|
||||||
|
<p><span class="figure-number">Figure 1: </span>Picture of an APA100M from Cedrat Technologies. Simplified model of a one DoF payload mounted on such isolator</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
||||||
|
<caption class="t-above"><span class="table-number">Table 1:</span> Parameters used for the model of the APA 100M</caption>
|
||||||
|
|
||||||
|
<colgroup>
|
||||||
|
<col class="org-left" />
|
||||||
|
|
||||||
|
<col class="org-left" />
|
||||||
|
|
||||||
|
<col class="org-left" />
|
||||||
|
</colgroup>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col" class="org-left"> </th>
|
||||||
|
<th scope="col" class="org-left">Value</th>
|
||||||
|
<th scope="col" class="org-left">Meaning</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="org-left">\(m\)</td>
|
||||||
|
<td class="org-left">\(1\,[kg]\)</td>
|
||||||
|
<td class="org-left">Payload mass</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td class="org-left">\(k_e\)</td>
|
||||||
|
<td class="org-left">\(4.8\,[N/\mu m]\)</td>
|
||||||
|
<td class="org-left">Stiffness used to adjust the pole of the isolator</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td class="org-left">\(k_1\)</td>
|
||||||
|
<td class="org-left">\(0.96\,[N/\mu m]\)</td>
|
||||||
|
<td class="org-left">Stiffness of the metallic suspension when the stack is removed</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td class="org-left">\(k_a\)</td>
|
||||||
|
<td class="org-left">\(65\,[N/\mu m]\)</td>
|
||||||
|
<td class="org-left">Stiffness of the actuator</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td class="org-left">\(c_1\)</td>
|
||||||
|
<td class="org-left">\(10\,[N/(m/s)]\)</td>
|
||||||
|
<td class="org-left">Added viscous damping</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div id="outline-container-org996fd7c" class="outline-2">
|
||||||
|
<h2 id="org996fd7c"><span class="section-number-2">1</span> Simplified Model</h2>
|
||||||
|
<div class="outline-text-2" id="text-1">
|
||||||
|
</div>
|
||||||
|
<div id="outline-container-org47cc3c4" class="outline-3">
|
||||||
|
<h3 id="org47cc3c4"><span class="section-number-3">1.1</span> Parameters</h3>
|
||||||
|
<div class="outline-text-3" id="text-1-1">
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">m = 1; % [kg]
|
||||||
|
|
||||||
|
ke = 4.8e6; % [N/m]
|
||||||
|
ce = 5; % [N/(m/s)]
|
||||||
|
me = 0.001; % [kg]
|
||||||
|
|
||||||
|
k1 = 0.96e6; % [N/m]
|
||||||
|
c1 = 10; % [N/(m/s)]
|
||||||
|
|
||||||
|
ka = 65e6; % [N/m]
|
||||||
|
ca = 5; % [N/(m/s)]
|
||||||
|
ma = 0.001; % [kg]
|
||||||
|
|
||||||
|
h = 0.2; % [m]
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
IFF Controller:
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">Kiff = -8000/s;
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-org3b3c7ac" class="outline-3">
|
||||||
|
<h3 id="org3b3c7ac"><span class="section-number-3">1.2</span> Identification</h3>
|
||||||
|
<div class="outline-text-3" id="text-1-2">
|
||||||
|
<p>
|
||||||
|
Identification in open-loop.
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">%% Name of the Simulink File
|
||||||
|
mdl = 'amplified_piezo_model';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion
|
||||||
|
io(io_i) = linio([mdl, '/f'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
|
io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % External Force
|
||||||
|
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 3, 'openoutput'); io_i = io_i + 1; % Force Sensors
|
||||||
|
io(io_i) = linio([mdl, '/x1'], 1, 'openoutput'); io_i = io_i + 1; % Mass displacement
|
||||||
|
|
||||||
|
G = linearize(mdl, io, 0);
|
||||||
|
G.InputName = {'w', 'f', 'F'};
|
||||||
|
G.OutputName = {'Fs', 'x1'};
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Identification in closed-loop.
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">%% Name of the Simulink File
|
||||||
|
mdl = 'amplified_piezo_model';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/w'], 1, 'input'); io_i = io_i + 1; % Base Motion
|
||||||
|
io(io_i) = linio([mdl, '/f'], 1, 'input'); io_i = io_i + 1; % Actuator Inputs
|
||||||
|
io(io_i) = linio([mdl, '/F'], 1, 'input'); io_i = io_i + 1; % External Force
|
||||||
|
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 3, 'output'); io_i = io_i + 1; % Force Sensors
|
||||||
|
io(io_i) = linio([mdl, '/x1'], 1, 'output'); io_i = io_i + 1; % Mass displacement
|
||||||
|
|
||||||
|
Giff = linearize(mdl, io, 0);
|
||||||
|
Giff.InputName = {'w', 'f', 'F'};
|
||||||
|
Giff.OutputName = {'Fs', 'x1'};
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="org55d1535" class="figure">
|
||||||
|
<p><img src="figs/amplified_piezo_tf_ol_and_cl.png" alt="amplified_piezo_tf_ol_and_cl.png" />
|
||||||
|
</p>
|
||||||
|
<p><span class="figure-number">Figure 2: </span>Matrix of transfer functions from input to output in open loop (blue) and closed loop (red)</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-org97f356d" class="outline-3">
|
||||||
|
<h3 id="org97f356d"><span class="section-number-3">1.3</span> Root Locus</h3>
|
||||||
|
<div class="outline-text-3" id="text-1-3">
|
||||||
|
|
||||||
|
<div id="org85cd6e5" class="figure">
|
||||||
|
<p><img src="figs/amplified_piezo_root_locus.png" alt="amplified_piezo_root_locus.png" />
|
||||||
|
</p>
|
||||||
|
<p><span class="figure-number">Figure 3: </span>Root Locus</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-orgf1a765f" class="outline-2">
|
||||||
|
<h2 id="orgf1a765f"><span class="section-number-2">2</span> Rotating X-Y platform</h2>
|
||||||
|
<div class="outline-text-2" id="text-2">
|
||||||
|
</div>
|
||||||
|
<div id="outline-container-org0dc544d" class="outline-3">
|
||||||
|
<h3 id="org0dc544d"><span class="section-number-3">2.1</span> Parameters</h3>
|
||||||
|
<div class="outline-text-3" id="text-2-1">
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">m = 1; % [kg]
|
||||||
|
|
||||||
|
ke = 4.8e6; % [N/m]
|
||||||
|
ce = 5; % [N/(m/s)]
|
||||||
|
me = 0.001; % [kg]
|
||||||
|
|
||||||
|
k1 = 0.96e6; % [N/m]
|
||||||
|
c1 = 10; % [N/(m/s)]
|
||||||
|
|
||||||
|
ka = 65e6; % [N/m]
|
||||||
|
ca = 5; % [N/(m/s)]
|
||||||
|
ma = 0.001; % [kg]
|
||||||
|
|
||||||
|
h = 0.2; % [m]
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">Kiff = tf(0);
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-org08e3567" class="outline-3">
|
||||||
|
<h3 id="org08e3567"><span class="section-number-3">2.2</span> Identification</h3>
|
||||||
|
<div class="outline-text-3" id="text-2-2">
|
||||||
|
<p>
|
||||||
|
Rotating speed in rad/s:
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">Ws = 2*pi*[0, 1, 10, 100];
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">Gs = {zeros(length(Ws), 1)};
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Identification in open-loop.
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">%% Name of the Simulink File
|
||||||
|
mdl = 'amplified_piezo_xy_rotating_stage';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/fx'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/fy'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 2, 'openoutput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
ws = Ws(i);
|
||||||
|
G = linearize(mdl, io, 0);
|
||||||
|
G.InputName = {'fx', 'fy'};
|
||||||
|
G.OutputName = {'Fsx', 'Fsy'};
|
||||||
|
Gs(i) = {G};
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="orga4fc975" class="figure">
|
||||||
|
<p><img src="figs/amplitifed_piezo_xy_rotation_plant_iff.png" alt="amplitifed_piezo_xy_rotation_plant_iff.png" />
|
||||||
|
</p>
|
||||||
|
<p><span class="figure-number">Figure 4: </span>Transfer function matrix from forces to force sensors for multiple rotation speed</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-orgbba342e" class="outline-3">
|
||||||
|
<h3 id="orgbba342e"><span class="section-number-3">2.3</span> Root Locus</h3>
|
||||||
|
<div class="outline-text-3" id="text-2-3">
|
||||||
|
|
||||||
|
<div id="orgccd3396" class="figure">
|
||||||
|
<p><img src="figs/amplified_piezo_xy_rotation_root_locus.png" alt="amplified_piezo_xy_rotation_root_locus.png" />
|
||||||
|
</p>
|
||||||
|
<p><span class="figure-number">Figure 5: </span>Root locus for 3 rotating speed</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-org069f401" class="outline-3">
|
||||||
|
<h3 id="org069f401"><span class="section-number-3">2.4</span> Analysis</h3>
|
||||||
|
<div class="outline-text-3" id="text-2-4">
|
||||||
|
<p>
|
||||||
|
The negative stiffness induced by the rotation is equal to \(m \omega_0^2\).
|
||||||
|
Thus, the maximum rotation speed where IFF can be applied is:
|
||||||
|
\[ \omega_\text{max} = \sqrt{\frac{k_1}{m}} \approx 156\,[Hz] \]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Let’s verify that.
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">Ws = 2*pi*[140, 160];
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Identification
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">%% Name of the Simulink File
|
||||||
|
mdl = 'amplified_piezo_xy_rotating_stage';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/fx'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/fy'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 2, 'openoutput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
ws = Ws(i);
|
||||||
|
G = linearize(mdl, io, 0);
|
||||||
|
G.InputName = {'fx', 'fy'};
|
||||||
|
G.OutputName = {'Fsx', 'Fsy'};
|
||||||
|
Gs(i) = {G};
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="orgca23612" class="figure">
|
||||||
|
<p><img src="figs/amplified_piezo_xy_rotating_unstable_root_locus.png" alt="amplified_piezo_xy_rotating_unstable_root_locus.png" />
|
||||||
|
</p>
|
||||||
|
<p><span class="figure-number">Figure 6: </span>Root Locus for the two considered rotation speed. For the red curve, the system is unstable.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="postamble" class="status">
|
||||||
|
<p class="author">Author: Dehaeze Thomas</p>
|
||||||
|
<p class="date">Created: 2020-05-20 mer. 15:49</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
docs/figs/amplified_piezo_root_locus.pdf
Normal file
BIN
docs/figs/amplified_piezo_root_locus.pdf
Normal file
Binary file not shown.
BIN
docs/figs/amplified_piezo_root_locus.png
Normal file
BIN
docs/figs/amplified_piezo_root_locus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
3065
docs/figs/amplified_piezo_tf_ol_and_cl.pdf
Normal file
3065
docs/figs/amplified_piezo_tf_ol_and_cl.pdf
Normal file
File diff suppressed because it is too large
Load Diff
BIN
docs/figs/amplified_piezo_tf_ol_and_cl.png
Normal file
BIN
docs/figs/amplified_piezo_tf_ol_and_cl.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 170 KiB |
BIN
docs/figs/amplified_piezo_xy_rotating_unstable_root_locus.pdf
Normal file
BIN
docs/figs/amplified_piezo_xy_rotating_unstable_root_locus.pdf
Normal file
Binary file not shown.
BIN
docs/figs/amplified_piezo_xy_rotating_unstable_root_locus.png
Normal file
BIN
docs/figs/amplified_piezo_xy_rotating_unstable_root_locus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
BIN
docs/figs/amplified_piezo_xy_rotation_root_locus.pdf
Normal file
BIN
docs/figs/amplified_piezo_xy_rotation_root_locus.pdf
Normal file
Binary file not shown.
BIN
docs/figs/amplified_piezo_xy_rotation_root_locus.png
Normal file
BIN
docs/figs/amplified_piezo_xy_rotation_root_locus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
2440
docs/figs/amplitifed_piezo_xy_rotation_plant_iff.pdf
Normal file
2440
docs/figs/amplitifed_piezo_xy_rotation_plant_iff.pdf
Normal file
File diff suppressed because it is too large
Load Diff
BIN
docs/figs/amplitifed_piezo_xy_rotation_plant_iff.png
Normal file
BIN
docs/figs/amplitifed_piezo_xy_rotation_plant_iff.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 170 KiB |
BIN
docs/figs/souleille18_model_piezo.png
Normal file
BIN
docs/figs/souleille18_model_piezo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 191 KiB |
BIN
matlab/amplified_piezo_model.slx
Normal file
BIN
matlab/amplified_piezo_model.slx
Normal file
Binary file not shown.
BIN
matlab/amplified_piezo_xy_rotating_stage.slx
Normal file
BIN
matlab/amplified_piezo_xy_rotating_stage.slx
Normal file
Binary file not shown.
433
org/amplified_piezoelectric_stack.org
Normal file
433
org/amplified_piezoelectric_stack.org
Normal file
@ -0,0 +1,433 @@
|
|||||||
|
#+TITLE: Amplified Piezoelectric Stack Actuator
|
||||||
|
#+SETUPFILE: ./setup/org-setup-file.org
|
||||||
|
|
||||||
|
* Introduction :ignore:
|
||||||
|
The presented model is based on cite:souleille18_concep_activ_mount_space_applic.
|
||||||
|
|
||||||
|
The model represents the amplified piezo APA100M from Cedrat-Technologies (Figure [[fig:souleille18_model_piezo]]).
|
||||||
|
The parameters are shown in the table below.
|
||||||
|
|
||||||
|
#+name: fig:souleille18_model_piezo
|
||||||
|
#+caption: Picture of an APA100M from Cedrat Technologies. Simplified model of a one DoF payload mounted on such isolator
|
||||||
|
[[file:./figs/souleille18_model_piezo.png]]
|
||||||
|
|
||||||
|
#+caption: Parameters used for the model of the APA 100M
|
||||||
|
| | Value | Meaning |
|
||||||
|
|-------+-------------------+----------------------------------------------------------------|
|
||||||
|
| $m$ | $1\,[kg]$ | Payload mass |
|
||||||
|
| $k_e$ | $4.8\,[N/\mu m]$ | Stiffness used to adjust the pole of the isolator |
|
||||||
|
| $k_1$ | $0.96\,[N/\mu m]$ | Stiffness of the metallic suspension when the stack is removed |
|
||||||
|
| $k_a$ | $65\,[N/\mu m]$ | Stiffness of the actuator |
|
||||||
|
| $c_1$ | $10\,[N/(m/s)]$ | Added viscous damping |
|
||||||
|
|
||||||
|
* Simplified Model
|
||||||
|
** Matlab Init :noexport:ignore:
|
||||||
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
|
<<matlab-dir>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
|
<<matlab-init>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+BEGIN_SRC matlab
|
||||||
|
simulinkproject('../');
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
open 'amplified_piezo_model.slx'
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Parameters
|
||||||
|
#+begin_src matlab
|
||||||
|
m = 1; % [kg]
|
||||||
|
|
||||||
|
ke = 4.8e6; % [N/m]
|
||||||
|
ce = 5; % [N/(m/s)]
|
||||||
|
me = 0.001; % [kg]
|
||||||
|
|
||||||
|
k1 = 0.96e6; % [N/m]
|
||||||
|
c1 = 10; % [N/(m/s)]
|
||||||
|
|
||||||
|
ka = 65e6; % [N/m]
|
||||||
|
ca = 5; % [N/(m/s)]
|
||||||
|
ma = 0.001; % [kg]
|
||||||
|
|
||||||
|
h = 0.2; % [m]
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
IFF Controller:
|
||||||
|
#+begin_src matlab
|
||||||
|
Kiff = -8000/s;
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Identification
|
||||||
|
Identification in open-loop.
|
||||||
|
#+begin_src matlab
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'amplified_piezo_model';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion
|
||||||
|
io(io_i) = linio([mdl, '/f'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
|
io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % External Force
|
||||||
|
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 3, 'openoutput'); io_i = io_i + 1; % Force Sensors
|
||||||
|
io(io_i) = linio([mdl, '/x1'], 1, 'openoutput'); io_i = io_i + 1; % Mass displacement
|
||||||
|
|
||||||
|
G = linearize(mdl, io, 0);
|
||||||
|
G.InputName = {'w', 'f', 'F'};
|
||||||
|
G.OutputName = {'Fs', 'x1'};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Identification in closed-loop.
|
||||||
|
#+begin_src matlab
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'amplified_piezo_model';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/w'], 1, 'input'); io_i = io_i + 1; % Base Motion
|
||||||
|
io(io_i) = linio([mdl, '/f'], 1, 'input'); io_i = io_i + 1; % Actuator Inputs
|
||||||
|
io(io_i) = linio([mdl, '/F'], 1, 'input'); io_i = io_i + 1; % External Force
|
||||||
|
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 3, 'output'); io_i = io_i + 1; % Force Sensors
|
||||||
|
io(io_i) = linio([mdl, '/x1'], 1, 'output'); io_i = io_i + 1; % Mass displacement
|
||||||
|
|
||||||
|
Giff = linearize(mdl, io, 0);
|
||||||
|
Giff.InputName = {'w', 'f', 'F'};
|
||||||
|
Giff.OutputName = {'Fs', 'x1'};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
freqs = logspace(1, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 3, 1);
|
||||||
|
title('$\displaystyle \frac{x_1}{w}$')
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G('x1', 'w'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Giff('x1', 'w'), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/m]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax2 = subplot(2, 3, 2);
|
||||||
|
title('$\displaystyle \frac{x_1}{f}$')
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G('x1', 'f'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Giff('x1', 'f'), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax3 = subplot(2, 3, 3);
|
||||||
|
title('$\displaystyle \frac{x_1}{F}$')
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G('x1', 'F'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Giff('x1', 'F'), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax4 = subplot(2, 3, 4);
|
||||||
|
title('$\displaystyle \frac{F_s}{w}$')
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G('Fs', 'w'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Giff('Fs', 'w'), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/m]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax5 = subplot(2, 3, 5);
|
||||||
|
title('$\displaystyle \frac{F_s}{f}$')
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G('Fs', 'f'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Giff('Fs', 'f'), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax6 = subplot(2, 3, 6);
|
||||||
|
title('$\displaystyle \frac{F_s}{F}$')
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G('Fs', 'F'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Giff('Fs', 'F'), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2,ax3,ax4,ax5,ax6],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
|
exportFig('figs/amplified_piezo_tf_ol_and_cl.pdf', 'width', 'full', 'height', 'full');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+name: fig:amplified_piezo_tf_ol_and_cl
|
||||||
|
#+caption: Matrix of transfer functions from input to output in open loop (blue) and closed loop (red)
|
||||||
|
#+RESULTS:
|
||||||
|
[[file:figs/amplified_piezo_tf_ol_and_cl.png]]
|
||||||
|
|
||||||
|
** Root Locus
|
||||||
|
#+begin_src matlab :exports none :post
|
||||||
|
figure;
|
||||||
|
|
||||||
|
gains = logspace(1, 6, 500);
|
||||||
|
|
||||||
|
hold on;
|
||||||
|
plot(real(pole(G('Fs', 'f'))), imag(pole(G('Fs', 'f'))), 'kx');
|
||||||
|
plot(real(tzero(G('Fs', 'f'))), imag(tzero(G('Fs', 'f'))), 'ko');
|
||||||
|
for k = 1:length(gains)
|
||||||
|
cl_poles = pole(feedback(G('Fs', 'f'), -gains(k)/s));
|
||||||
|
plot(real(cl_poles), imag(cl_poles), 'k.');
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
axis square;
|
||||||
|
xlim([-2500, 100]); ylim([0, 2600]);
|
||||||
|
|
||||||
|
xlabel('Real Part'); ylabel('Imaginary Part');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
|
exportFig('figs/amplified_piezo_root_locus.pdf', 'width', 'wide', 'height', 'tall');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+name: fig:amplified_piezo_root_locus
|
||||||
|
#+caption: Root Locus
|
||||||
|
#+RESULTS:
|
||||||
|
[[file:figs/amplified_piezo_root_locus.png]]
|
||||||
|
|
||||||
|
* Rotating X-Y platform
|
||||||
|
** Matlab Init :noexport:ignore:
|
||||||
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
|
<<matlab-dir>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
|
<<matlab-init>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+BEGIN_SRC matlab
|
||||||
|
simulinkproject('../');
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
open 'amplified_piezo_xy_rotating_stage.slx'
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Parameters
|
||||||
|
#+begin_src matlab
|
||||||
|
m = 1; % [kg]
|
||||||
|
|
||||||
|
ke = 4.8e6; % [N/m]
|
||||||
|
ce = 5; % [N/(m/s)]
|
||||||
|
me = 0.001; % [kg]
|
||||||
|
|
||||||
|
k1 = 0.96e6; % [N/m]
|
||||||
|
c1 = 10; % [N/(m/s)]
|
||||||
|
|
||||||
|
ka = 65e6; % [N/m]
|
||||||
|
ca = 5; % [N/(m/s)]
|
||||||
|
ma = 0.001; % [kg]
|
||||||
|
|
||||||
|
h = 0.2; % [m]
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
Kiff = tf(0);
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Identification
|
||||||
|
Rotating speed in rad/s:
|
||||||
|
#+begin_src matlab
|
||||||
|
Ws = 2*pi*[0, 1, 10, 100];
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
Gs = {zeros(length(Ws), 1)};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Identification in open-loop.
|
||||||
|
#+begin_src matlab
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'amplified_piezo_xy_rotating_stage';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/fx'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/fy'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 2, 'openoutput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
ws = Ws(i);
|
||||||
|
G = linearize(mdl, io, 0);
|
||||||
|
G.InputName = {'fx', 'fy'};
|
||||||
|
G.OutputName = {'Fsx', 'Fsy'};
|
||||||
|
Gs(i) = {G};
|
||||||
|
end
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
freqs = logspace(1, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 2, 1);
|
||||||
|
title('$\displaystyle \frac{F_{s,x}}{f_x}$')
|
||||||
|
hold on;
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Gs{i}('Fsx', 'fx'), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/m]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax2 = subplot(2, 2, 2);
|
||||||
|
title('$\displaystyle \frac{F_{s,y}}{f_x}$')
|
||||||
|
hold on;
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Gs{i}('Fsy', 'fx'), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax3 = subplot(2, 2, 3);
|
||||||
|
title('$\displaystyle \frac{F_{s,x}}{f_y}$')
|
||||||
|
hold on;
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Gs{i}('Fsx', 'fy'), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax4 = subplot(2, 2, 4);
|
||||||
|
title('$\displaystyle \frac{F_{s,y}}{f_y}$')
|
||||||
|
hold on;
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
plot(freqs, abs(squeeze(freqresp(Gs{i}('Fsy', 'fy'), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/m]');xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2,ax3,ax4],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
|
exportFig('figs/amplitifed_piezo_xy_rotation_plant_iff.pdf', 'width', 'full', 'height', 'full');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+name: fig:amplitifed_piezo_xy_rotation_plant_iff
|
||||||
|
#+caption: Transfer function matrix from forces to force sensors for multiple rotation speed
|
||||||
|
#+RESULTS:
|
||||||
|
[[file:figs/amplitifed_piezo_xy_rotation_plant_iff.png]]
|
||||||
|
|
||||||
|
** Root Locus
|
||||||
|
#+begin_src matlab :exports none :post
|
||||||
|
figure;
|
||||||
|
|
||||||
|
gains = logspace(1, 6, 500);
|
||||||
|
|
||||||
|
hold on;
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
set(gca,'ColorOrderIndex',i);
|
||||||
|
plot(real(pole(Gs{i})), imag(pole(Gs{i})), 'x');
|
||||||
|
set(gca,'ColorOrderIndex',i);
|
||||||
|
plot(real(tzero(Gs{i})), imag(tzero(Gs{i})), 'o');
|
||||||
|
for k = 1:length(gains)
|
||||||
|
set(gca,'ColorOrderIndex',i);
|
||||||
|
cl_poles = pole(feedback(Gs{i}, -gains(k)/s*eye(2)));
|
||||||
|
plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
axis square;
|
||||||
|
xlim([-2900, 100]); ylim([0, 3000]);
|
||||||
|
|
||||||
|
xlabel('Real Part'); ylabel('Imaginary Part');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
|
exportFig('figs/amplified_piezo_xy_rotation_root_locus.pdf', 'width', 'tall', 'height', 'wide');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+name: fig:amplified_piezo_xy_rotation_root_locus
|
||||||
|
#+caption: Root locus for 3 rotating speed
|
||||||
|
#+RESULTS:
|
||||||
|
[[file:figs/amplified_piezo_xy_rotation_root_locus.png]]
|
||||||
|
|
||||||
|
** Analysis
|
||||||
|
The negative stiffness induced by the rotation is equal to $m \omega_0^2$.
|
||||||
|
Thus, the maximum rotation speed where IFF can be applied is:
|
||||||
|
\[ \omega_\text{max} = \sqrt{\frac{k_1}{m}} \approx 156\,[Hz] \]
|
||||||
|
|
||||||
|
Let's verify that.
|
||||||
|
#+begin_src matlab
|
||||||
|
Ws = 2*pi*[140, 160];
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
Gs = {zeros(length(Ws), 1)};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Identification
|
||||||
|
#+begin_src matlab
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'amplified_piezo_xy_rotating_stage';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/fx'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/fy'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Fs'], 2, 'openoutput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
ws = Ws(i);
|
||||||
|
G = linearize(mdl, io, 0);
|
||||||
|
G.InputName = {'fx', 'fy'};
|
||||||
|
G.OutputName = {'Fsx', 'Fsy'};
|
||||||
|
Gs(i) = {G};
|
||||||
|
end
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
figure;
|
||||||
|
|
||||||
|
gains = logspace(1, 6, 500);
|
||||||
|
|
||||||
|
hold on;
|
||||||
|
for i = 1:length(Ws)
|
||||||
|
set(gca,'ColorOrderIndex',i);
|
||||||
|
plot(real(pole(Gs{i})), imag(pole(Gs{i})), 'x');
|
||||||
|
set(gca,'ColorOrderIndex',i);
|
||||||
|
plot(real(tzero(Gs{i})), imag(tzero(Gs{i})), 'o');
|
||||||
|
for k = 1:length(gains)
|
||||||
|
set(gca,'ColorOrderIndex',i);
|
||||||
|
cl_poles = pole(feedback(Gs{i}, -gains(k)/s*eye(2)));
|
||||||
|
plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
axis square;
|
||||||
|
xlim([-100, 50]); ylim([0, 150]);
|
||||||
|
|
||||||
|
xlabel('Real Part'); ylabel('Imaginary Part');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
|
exportFig('figs/amplified_piezo_xy_rotating_unstable_root_locus.pdf', 'width', 'wide', 'height', 'tall');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+name: fig:amplified_piezo_xy_rotating_unstable_root_locus
|
||||||
|
#+caption: Root Locus for the two considered rotation speed. For the red curve, the system is unstable.
|
||||||
|
#+RESULTS:
|
||||||
|
[[file:figs/amplified_piezo_xy_rotating_unstable_root_locus.png]]
|
Loading…
Reference in New Issue
Block a user