From 0b677bdd23e04964a4ed3881f212dd6443908834 Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Mon, 4 Mar 2019 16:24:01 +0100 Subject: [PATCH] documentation --- MXfastStageDoc/MXfastStage.tex | 279 +++++++++++++++++++-------------- MXfastStageDoc/Scratch.tex | 8 + MXfastStageDoc/myBib.bib | 7 + matlab/DeltaTauSim.slx | Bin 43150 -> 43111 bytes 4 files changed, 176 insertions(+), 118 deletions(-) diff --git a/MXfastStageDoc/MXfastStage.tex b/MXfastStageDoc/MXfastStage.tex index 063d28b..4d5aa08 100644 --- a/MXfastStageDoc/MXfastStage.tex +++ b/MXfastStageDoc/MXfastStage.tex @@ -32,19 +32,21 @@ This document describes the tuning and modeling process of the ESB-MX fast stages. \section{Measurements} -The tool used to record data of the fast stages is the bode plots is MXTuning.py, a script specially developed to record system responses. The main call to collect all data was:\\ +The tool used to record data of the fast stages, to plot bode diagrams and to do further analysis is MXTuning.py. The main call to collect all data is:\\ \verb|./MXTuning.py --dir MXTuning/19_01_29 --mode 64|\\ -The used frequencies are: 20 kHz phase loop, 5 kHz servo loop, 6.25MHz AdcAmp. This results in 50us phase time and 0.2ms servo time.\\ + +The used frequencies on the DeltaTau are: 20 kHz phase loop, 5 kHz servo loop, 6.25MHz AdcAmp. This results in 50us phase time and 0.2ms servo time.\\ According to the amplifier specs \cite[19]{PMAClv} a DAC Value of $32737=2^{15}$ corresponds to 33.85A current. So 1 \verb|curr_bit| is $33.85/32737A =1.034mA$.\\ -\cite[245-259]{PMACusr} Shows how the PwmSf works and is explained with some calculation examples.\\ -This is set in the gpasciiCommander templates: +\cite[245-259]{PMACusr} shows how the PwmSf parameter works and is explained with some calculation examples.\\ + +The settings of the PwmSf is done in the templates of gpasciiCommander: \begin{verbatim} PwmSf=15134.8909 # =.95*16384. PMAC3-style DSPGATE3 ASIC is being used for the output, the counter moves between +/- 16384. PwmSf is typically set to 95% of 16384 \end{verbatim} -Nerverless the documentation is confusing. Therefore PwmSf will be measured to convert idCmd bits values to idVolts bits in section \ref{sec:measCurStep} +Nevertheless the documentation is confusing. Therefore PwmSf is measured to convert idCmd bits values to idVolts bits in section \ref{sec:measCurStep}\\ The Parker stages are configured to contCur=800mA ,peakCur=2400mA. Specs of the D11 stage are 0.8Amp RMS (producing 4N force) and 2.4Amp RMS peak.\\ It should be save to use the higher DC value of 0.92Amp and 2.8Amp instead of the RMS value. @@ -56,15 +58,16 @@ It should be save to use the higher DC value of 0.92Amp and 2.8Amp instead of th \includegraphics[scale=.5]{/home/zamofing_t/Documents/doc-ext/DeltaTau/UsrMan257.png} The current step looks similar for both motors. The transfer function is: $k \cdot {w_0}^2/({w_0}^2+2 \cdot damp \cdot w_0 \cdot s+s^2)$\\ -rise time $(0\rightarrow 100\%)$ ca. 0.4ms\\ -rise time: \url{https://nptel.ac.in/courses/101108056/module7/lecture20.pdf}\\ -$\rightarrow$ \verb|1/(w0*np.sqrt(1-0.75**2))*(np.pi/2+np.arcsin(0.75))|\\ +the rise rise time $(0\rightarrow 100\%)$ is ca. 0.4ms\\ +(rise time: \url{https://nptel.ac.in/courses/101108056/module7/lecture20.pdf}\\ +$\rightarrow$ \verb|1/(w0*np.sqrt(1-0.75**2))*(np.pi/2+np.arcsin(0.75))|)\\ + The loop parameters are:\\ IiGain=5, IpfGain=8, IpbGain=8 In steady state an idCmd=idMeas=406. results in aprox. idVolts=7400\\ -This has been measured precisly from gathered data \verb|chirp_all_1a.npz| +This has been measured precisely from gathered data \verb|chirp_all_1a.npz| at frequencies from 10 to 220 Hz. The images have been generated with \verb|./MXTuning.py --dir MXTuning/19_01_29 --mode 128|.\\ @@ -72,28 +75,29 @@ The images have been generated with The overall aplification $iqCmd \rightarrow iqVolts$ is approx. 18.2. \begin{figure}[h!] -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/iqCmd_TF0.eps} -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/iqCmd_TF1.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/iqCmd_TF0.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/iqCmd_TF1.eps} \caption{IqCmd->IqMeas of motor 1 (bode same for both motors)} \end{figure} \begin{figure}[h!] -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/iqCmd_TF2.eps} -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/iqCmd_TF3.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/iqCmd_TF2.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/iqCmd_TF3.eps} \caption{IqCmd->IqVolts of motor 1 (bode same for both motors)} \end{figure} \FloatBarrier \subsection{Measure Open Loop} -The frequency response has been measured with chirps at different amplitudes and frequency regions. The yellow line is averaged measurement data. The black line is the approximated model. The diagram shows \verb|curr_bits| (ca.1mA) to \verb|ActPos| (in um) transfer function.\\ +The frequency response has been measured with chirps at different amplitudes and frequency regimes. The yellow line is averaged measurement data. The black line is the approximated model. The diagram shows \verb|curr_bits| (ca.1mA) to \verb|ActPos| (in um) transfer function.\\ The images have been generated with -\verb|./MXTuning.py --dir MXTuning/19_01_29 --mode 32|.\\ +\verb|./MXTuning.py --dir MXTuning/19_01_29 --mode 64|.\\ \begin{figure}[h] +\vspace{-1cm} \includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/bode_model_plot0.eps} \includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/bode_model_plot2.eps} -\caption{open loop of motor 1 and 2} +\vspace{-1cm}\caption{open loop of motor 1 and 2} \label{fig:mot_open} \end{figure} @@ -118,10 +122,10 @@ resonances 60Hz,142Hz,414Hz,231Hz\\ } } -The bode plot drops as expected at approx. 40dB/dec. (due to $F=m\ddot{x}$) +The bode plot drops as expected at approx. 40dB/dec. (due to the equation $F=m\ddot{x}$)\\ Here a example to roughly calculate at which frequency the motor moves 1um at 2A current:\\ -1curr\_bits is approx. 1mA. At 0dB 1mA moves a sine of 1um.\\ +1\texttt{curr\_bits} is approx. 1mA. Hence at 0dB 1mA moves a sine of 1um.\\ 10dB=factor 10, 20dB=factor 100, 30dB=factor 1000, 3dB $\approx$ factor 2\\ A factor 2000 is $1000 \cdot 2 =30dB+3dB=33dB$. Out of the bode plot we can read approx.:\\ @@ -143,17 +147,20 @@ Therefore the whole current is used to overcome the friction and the bode amplit \subsection{Closed Loop} -\subsubsection{Deltatau schematics} +\subsubsection{DeltaTau schematics} \includegraphics[scale=.7]{/home/zamofing_t/Documents/doc-ext/DeltaTau/UsrMan290.png} \\ -Closed loops have been measured with the following control loop settings. +For now only features of the basic PID loop are used: \verb|Kp, Kvfb, Ki, Kvff, Kaff, MaxInt|.\\ +These values have been tweaked as it is recommended by various DeltaTau turorials. But this twearing is just based on trial and error and not on regulation theory.\\ +The settings so far are: \begin{verbatim} motor_servo(mot=1,Kp=25,Kvfb=400,Ki=0.02,Kvff=350,Kaff=5000,MaxInt=1000) motor_servo(mot=2,Kp=22,Kvfb=350,Ki=0.02,Kvff=240,Kaff=1500,MaxInt=1000) \end{verbatim} +With these setting the 'chirp sine closed loop' bode diagrams have been measured. \subsubsection{chirp sine closed loop} @@ -163,89 +170,60 @@ shows chirp plot with the input(blue) and the output(green) and its bode plots. The parameters for that chirp is:\\ \verb| amp: 5, minFrq: 10, maxFrq: 220, ts: 0.0002, tSec: 20| - - \begin{figure}[h!] -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_1b0.eps} -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_1b1.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_1b0.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm, scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_1b1.eps} \caption{DesPos->ActPos of motor 1} \label{fig:mot1_chirp} \end{figure} +\vspace{2cm} \begin{figure}[h!] -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_2b0.eps} -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_2b1.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_2b0.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_2b1.eps} \caption{DesPos->ActPos of motor 2} \label{fig:mot2_chirp} \end{figure} \begin{figure}[h!] -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_1b2.eps} -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_1b3.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_1b2.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_1b3.eps} \caption{DesPos->IqCmd of motor 1} \label{fig:mot1_chirp_cmd} \end{figure} \begin{figure}[h!] -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_2b2.eps} -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_2b3.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_2b2.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/chirp_all_2b3.eps} \caption{DesPos->IqCmd of motor 2} \label{fig:mot2_chirp_cmd} \end{figure} +\begin{tcolorbox}[colback=yellow!5!white,colframe=yellow!75!black,colbacktitle=yellow!50,coltitle=black,title=Conclusion] Moving 5um with frequencies from 10 to 220Hz\\ $\rightarrow$ at frequencies above 200 Hz, the current increses up to 2 amps, and the the following error kicks in\\ -$\rightarrow$ The closed loop response becomes bad above 20Hz (motor 1 ca. -10\%, motor 2 +5\% )\\ +$\rightarrow$ the closed loop response becomes bad above 20Hz (motor 1 ca. -10\%, motor 2 +5\% )\\ +$\rightarrow$ improvements at that level without regulation theory background is based on luck. +\end{tcolorbox} + \FloatBarrier -\subsubsection{Friction} \label{sec:friction} +\subsubsection{using advanced DeltaTau Servo Loop} -To measure the friction, the stage is moved at slow speed from -+lim to -lim. The current is proportional to the force. -Additionally the friction is measured depending on the stage positions and motion directions. This is measured at different speed to see if at these velocities the viscose friction is visible. - -\begin{figure}[h!] -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/friction10.eps} -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/friction11.eps} -\caption{position dependant friction of motor 1} -\label{fig:mot1_frict} -\end{figure} - -\begin{figure}[h!] -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/friction20.eps} -\includegraphics[scale=.45]{../python/MXTuning/19_01_29/img/friction21.eps} -\caption{position dependant friction of motor 2} -\label{fig:mot2_frict} -\end{figure} - -Data recording is done with: \verb|./MXTuning.py --dir MXTuning/19_01_29 --mode 16|.\\ -The function parameters are: \verb|pMin=-10000, pMax=10000, speed=(5,10,20,30,60), cnt=2, period=10|. -The recorded data moves from -10000um to 10000um at speed of 5 to 60 mm/s.\\ - -Avg current forward: 111.7 Avg current backward: -105.3\\ -Avg current forward: 95.3 Avg current backward: -130.7\\ - -These values should be used for the $K_{fff}$ parameter of the Servo loop:\\ - -Motor 1,2: $K_{fff}\approx100$\\ - -\FloatBarrier -\subsubsection{using advanced Deltatau Servo Loop} - -For now only following settings of the servo loop are used:Kp, Kvfb, Ki, Kvff, Kaff, MaxInt.\\ -The standard PID servo loop (figure\ref{fig:deltatau_std_ctrl}) has some additional features, that were not yet used, especially the polynomial filters. +The standard PID servo loop (figure\ref{fig:deltatau_std_ctrl}) has some additional features, that were not yet used, especially the polynomial filters and nonlinear components as backlash and friction compensation. \begin{figure}[h!] \center -\includegraphics[scale=.2]{/home/zamofing_t/Documents/doc-ext/DeltaTau/ServoBlockDiag.png} -\caption{position dependant friction of motor 2} +\includegraphics[trim=0cm 2cm 0cm 1cm,scale=.2]{/home/zamofing_t/Documents/doc-ext/DeltaTau/ServoBlockDiag.png} +\caption{position dependent friction of motor 2} \label{fig:deltatau_std_ctrl} \end{figure} -\cite[293]{PMACusr} shows details about the standard servo loop but unfortunately there are errors in documentation and the explanations are not really helpful. Hopefully the implementation is correct.\\ +\cite[293]{PMACusr} shows details about the standard servo loop but unfortunately there are errors in documentation and the explanations are barely helpful.\\ -\textbf{Polynomial Filters:} +\paragraph{Polynomial Filters:} + There are no information in the documentation how these filters should be set. \begin{description} \item[A:] $Ka_0+Ka_1z^{-1}+\ldots+Ka_1z^{-7}$ \item[B:] $Kb_0+Kb_1z^{-1}+\ldots+Kb_1z^{-7}$ @@ -260,24 +238,57 @@ if \texttt{Motor[x].Servo.SwPoly7} is set to its default value of 0, these only If this element is set to 1, these execute as full 7th-order polynomials. Filters E and F are always 2nd-order polynomials.\\ -The flat amplitude in figure \ref{fig:mot_open} at low frequencies is mostly the result of the static and viscose friction and not of a linear mechanical spring and element as one could suggest out of the bode plot.\\ - +\paragraph{$\mathbf{K_{fff}}$:} The Value of $K_{fff}$ is used to compensate the non linear static friction. It can be estimated out of the bode plot at low frequencies. It is a non linear element, because it only depends on the sign if the velocity.\\ +\paragraph{$\mathbf{K_{vff}}$:} $K_{vff}$ is used to compensate the linear viscose friction.\\ -\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black,colbacktitle=red!50,coltitle=black,title=TODO] -Make simulations in MATLAB. Set C/D filter to compensate resonance and the current loop.\\ -This sshould be mostly the inverse of the figures: \ref{fig:mot1_chirp} and \ref{fig:mot2_chirp}.\\ -Use $K_{fff}$ -\end{tcolorbox} +\paragraph{$\mathbf{K_{aff}}$:} +On a friction free and error free plant a pure feed forward control in open loop would only need the parameter $K_{aff}$ to be set. The value of $K_{aff}$ can be calculated out of the bode diagram.\\ + +\subsubsection{Friction} \label{sec:friction} +The flat amplitude in figure \ref{fig:mot_open} at low frequencies is mostly the result of the static and viscose friction and not of a linear mechanical spring and element as one could suggest out of the bode plot.\\ +To measure the friction, the stage is moved at slow speed from ++lim to -lim. The current is proportional to the force. +Additionally the friction is measured depending on the stage positions and motion directions. This is measured at different speed to see if at these velocities the viscose friction is visible. +\begin{figure}[h!] +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/friction10.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/friction11.eps} +\caption{position dependant friction of motor 1} +\label{fig:mot1_frict} +\end{figure} + +\begin{figure}[h!] +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/friction20.eps} +\includegraphics[trim=0cm 1.5cm 0cm 1cm,scale=.45]{../python/MXTuning/19_01_29/img/friction21.eps} +\caption{position dependant friction of motor 2} +\label{fig:mot2_frict} +\end{figure} + +The recorded data moves from -10000um to 10000um at speed of 5 to 60 mm/s.\\ +Data recording is done with: \verb|./MXTuning.py --dir MXTuning/19_01_29 --mode 16|.\\ +The function parameters are: \verb|pMin=-10000, pMax=10000, speed=(5,10,20,30,60), cnt=2, period=10|.\\ + +Avg current forward: 111.7 Avg current backward: -105.3\\ +Avg current forward: 95.3 Avg current backward: -130.7\\ + +Hence a value of $K_{fff}\approx100$ should used to compensate friction.\\ +Tests with the motors showed that this value will overcompensate and best results are achived with values of $K_{fff}\approx10$\\ + +\FloatBarrier \newpage \section{Modeling the system} + +The goal of this section is to make a mathematical model of the stage. Out of the bode diagram and the physical knowledge, the system consists of a current regulation loop and a mechanical setup with resonance frequencies. + \subsection{Electrical model} +The electrical model is derived from the knowledge that the motor consists of a resistance and a inductance. Further the control structure in the DeltaTau is known (section \ref{sec:measCurStep}). + \label{sec:mdlElec} \begin{figure}[h!] \centering @@ -293,8 +304,8 @@ Solving in Laplace space:\\ $iqVolts=(R+Ls)\cdot iqMeas$\\ $s \cdot iqMeas =\frac{1}{L}iqVolts - \frac{R}{L}iqMeas$\\ -Transferfunction open loop of $G_1(s)=iqVolts \rightarrow iqCmd$ -\\ +Transferfunction open loop of $G_1(s)=iqVolts \rightarrow iqCmd$\\ + using Masons rule: \url{https://en.wikipedia.org/wiki/Mason's_gain_formula}: @@ -332,16 +343,16 @@ d=1\\ \] To use real values we have to consider: The values -$IiGain=5, IpfGain=8, IpbGain=8$ for the Deltatau are in z-domain.\\ +$IiGain=5, IpfGain=8, IpbGain=8$ for the DeltaTau are in z-domain.\\ Therefore for the continous domain they have to be scaled: $Ii=IiGain/ts \quad Ipf=IpfGain \quad Ipb=IpbGain$ with $ts=50\mu s$ (20kHz)\\ -The overall aplification $iqCmd \rightarrow iqVolts$ measured in section \ref{sec:measCurStep} is approx. 18.2. +The overall amplification $iqCmd \rightarrow iqVolts$ measured in section \ref{sec:measCurStep} is approx. 18.2. The resistance of the stage is 8.8 $\Omega$\\ The inductance of the stage is 2.4 mH.\\ -Nevertheless simulations with \verb|current_loop.slx| showed, that the current loop only works in the discrete domain. In continous domain neither the amplification nor the shape mached.\\ +Nevertheless simulations with \verb|current_loop.slx| showed, that the current loop only works in the discrete domain. In continous domain neither the amplification nor the shape matched.\\ Therefore the only approach is to use the second order transfer function as approximated in section \ref{sec:measCurStep}.\\ A further test is to 'turn of' the current loop. This can be done by setting:$IiGain=0, IpfGain=1, IpbGain=-1$. @@ -380,7 +391,7 @@ mass $m=m_1+m_2+\ldots+m_n$\\ damping: $d=d_1+d_2+\ldots+d_n$\\ springs: $k=k_1+k_2+\ldots+k_n$\\ -\eqref{mech1} shows the mechanical differential equations: +Eq.\eqref{eq:mech1} shows the mechanical differential equations: \begin{equation} \begin{aligned} @@ -401,7 +412,7 @@ springs: $k=k_1+k_2+\ldots+k_n$\\ \end{aligned}\label{eq:mech2} \end{equation} -\eqref{eq:mech2} are the general input output equations in matrix form with x and A defines as \eqref{eq:mech3}: +Eq.\eqref{eq:mech2} are the general input output equations in matrix form with x and A defines as eq.\eqref{eq:mech3}: \begin{equation} \mathbf{x}= @@ -451,23 +462,32 @@ B=\begin{bmatrix} \label{eq:mech3} \end{equation} -\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black,colbacktitle=red!50,coltitle=black,title=TODO] -$k_1=0$ The non linear friction has to be compensate outside of the control loop.\\ -$d_1$ seems to be negligable (section \ref{sec:stageData}).\\ -But the system is not observable. $\rightarrow$ Perhaps the integrators of the system can be removed. having only $\mathbf{x}=[ \dot{x}_1 \dot{x}_2 \dot{x}_3 \dot{x}_4]$ as the state vector + + +\begin{tcolorbox}[colback=yellow!5!white,colframe=yellow!75!black,colbacktitle=yellow!50,coltitle=black,title=Conclusion] +$k_1=0$: There is nothing like a spring that brings the system to a neutral position. The reason of the flat bode diagram at low frequencies is the friction. This non linear friction has to be compensate outside of the control loop. ($K_{fff}$)\\ + +$d_1$ seems to be negligible (section \ref{sec:stageData}).\\ + +The system is neither observable nor controllable. +$\rightarrow$ Perhaps the integrators of the system can be removed. having only $\mathbf{x}=[ \dot{x}_1 \dot{x}_2 \dot{x}_3 \dot{x}_4]$ as the state vector.\\ + +But all that resonance frequency stuff seems hardly controllable. Therefore the only way to have good control seems to avoid any resonance frequency.\\ + +Neverless that model helped a lot to understand the whole system and to build good suited models in MATLAB. \end{tcolorbox} \subsection{Stage data} \label{sec:stageData} -This data comes from datasheets and construction information \cite{DynParker}. +This data comes from datasheets \cite{ParkerStage} and construction information \cite{DynParker}. \begin{tabular}{|r|l|} \hline Stage Y mass& 340g \\ Stage X mass& 950g \\ Interferometer mirrors & 51g (additional)\\ -Aluminun (instead ABS) & 42g (additional)\\ +Aluminum (instead ABS) & 42g (additional)\\ \hline \end{tabular} @@ -475,7 +495,7 @@ Aluminun (instead ABS) & 42g (additional)\\ \begin{tabular}{|r|c|l|} \hline -Continous force && 5.51N \\ +Continuous force && 5.51N \\ Peak force && 12N \\ Static friction && 1N\\ Viscose damping && 0.5N$\cdot$s/m\\ @@ -487,9 +507,9 @@ Inductance &L& 2.4mH\\ \vspace{1pc} -The data sheet for the current are quite confusing (sine, trap, rms). But lets check the motor Konstant Km.\\ +The data sheet for the current are quite confusing (sine, trap, rms). But lets check the motor constant Km.\\ The data sheet says:\\ -Stall Current Continous 0.92A (trap, DC), Stall force Continous 4N +Stall Current Continuous 0.92A (trap, DC), Stall force Continuous 4N \[ U=R\cdot I \qquad P=U \cdot I \quad \rightarrow \quad P=R \cdot I^2\\ \] @@ -498,7 +518,7 @@ $1.46N \cdot \sqrt{7.44} = 3.98 N$\\ Lets have a look at the viscose damping:\\ our speed is roughly 50$\mu$m/10ms. this is 5mm/s. The damping force at that speed is: $0.5\frac{Ns}{m}\cdot 5\frac{mm}{s}=2\cdot10^{-3}N$. -The used current for that force is negligable, and theerefore the viscose damopling is negligable. +The used current for that force is negligible, and therefore the viscose damping is negligible. @@ -513,15 +533,19 @@ The goal is to build an optimal state space model of the plant with following in \end{figure} -\verb|full_bode_mot[1|2].mat| is generated from \verb|MXTuning.py| in function \verb|bode_model_plot()|. It contains the bode data of real measurements and approximated transfer functions. +\verb#full_bode_mot[1|2].mat# is generated from \verb|MXTuning.py| in function \verb|bode_model_plot()|. It contains the bode data of real measurements and approximated transfer functions. -\verb|identifyFxFyStage.m| reads the python data \verb|full_bode_mot[1|2].mat| and build motor objects with transfer functions and state space models. +\verb|identifyFxFyStage.m| reads the python data \verb#full_bode_mot[1|2].mat# and build motor objects with transfer functions and state space models. The approximated transfer functions can be tweaked and edited with: e.g. \verb|controlSystemDesigner('bode',1,mot1.tf_xx)| to enhance the model. The full transfer function is then split in individual parts that are put back into \verb|MXTuning.py|.\\ -the transfer functions for each two motors are separated atomic transfer function as stated in table \ref{tab:trfFunc1}\\ -tfc = transfer function current, tfp = transfer function position. Consecutive letters are simplified transfer functions. tf[1-9]=transfer function resonance. +the transfer functions for each two motors are separated atomic transfer function as stated in table \ref{tab:trfFunc1} :\\ +\-\hspace{2em}tfc = transfer function current\\ +\-\hspace{2em}tfp = transfer function position\\ +\-\hspace{2em}tf[1-9]=transfer function for resonance\\ +\-\hspace{2em}Consecutive letters are simplified transfer functions (tfd,tfq). + \begin{table}[h!] \center @@ -551,7 +575,7 @@ tf4 & mechanical resonance tf & & f=[23 The black line on figure \ref{fig:mot_open} shows the concatenate transfer function $tfc \cdot tfp \cdot tf1 \cdot tf2 \cdot tf3 \cdot tf4$.\\ \vspace{1pc} -\fbox{\parbox[t]{15cm}{The current loop frequency from the MATLAB identification looks different than the used one. Matlab identifies $w_0=8727rad/sec = f0=1389Hz$ but to match the bode plot a value of half frequency need to be taken:$f_0=694$. The reason could be discretization and time delay because the servo loop is processed after the phase loop.}} +\fbox{\parbox[t]{15cm}{The current loop frequency from the MATLAB identification looks different than the used one. MATLAB identifies $w_0=8727rad/sec = f0=1389Hz$ but to match the bode plot a value of half frequency need to be taken:$f_0=694$. The reason could be discretization and time delay because the servo loop is processed after the phase loop.}} \vspace{1pc} \section{Simulink/MATLAB simulations} @@ -602,7 +626,7 @@ Therefore for better regulation quality more sophisticated controllers as state A standard PID controller uses feedback to detect errors between the desired position and the actual position and applies corrective commands to compensate for those errors. Although PID control is the most common type of industrial controller, it does have limitations. The idea of a state space controller with observer is to have a model of the plant which follows all internal states of the real plant. All these internal states of the model can then be used states to build an optimal controller. -opposite to the PID cpntroller which is a ‘black-box design’, the state space controller with observer is a ‘white box design’. (Figure \ref{fig:observer1})\\ +opposite to the PID controller which is a ‘black-box design’, the state space controller with observer is a ‘white box design’. (Figure \ref{fig:observer1})\\ \begin{figure}[h!] \centering @@ -611,13 +635,13 @@ opposite to the PID cpntroller which is a ‘black-box design’, the state spa \end{figure} -To implement a state space controller with observer the model has to be observable and controllable. The full model of the tranfer function $tfc \cdot tfp \cdot tf1 \cdot tf2 \cdot tf3 \cdot tf4$ is not controllable due to the various resonance frequencies. Therefore for the observer design the state space model has to be simplified. (see simplified transfer function in table \ref{tab:trfFunc1}\\ +To implement a state space controller with observer the model has to be observable and controllable. The full model of the transfer function $tfc \cdot tfp \cdot tf1 \cdot tf2 \cdot tf3 \cdot tf4$ is not controllable due to the various resonance frequencies. Therefore for the observer design the state space model has to be simplified. (see simplified transfer function in table \ref{tab:trfFunc1})\\ Figure \ref{fig:mdl_bode1} shows the bode plots of the best model to the most simplified model:\\ \begin{tabular}{ll} -plant & best model tranfer function: $tfc \cdot tfp \cdot tf1 \cdot tf2 \cdot tf3 \cdot tf4$\\ +plant & best model transfer function: $tfc \cdot tfp \cdot tf1 \cdot tf2 \cdot tf3 \cdot tf4$\\ mdlcp & main mechanical with second order current loop: $tfc \cdot tfp$\\ mdldp & main mechanical with $PT_1$ current loop (first order): $tfd \cdot tfp$\\ mdlp & main mechanical (incl. 'viscose friction'): $tfp$\\ @@ -706,12 +730,12 @@ With an additional prefilter resonance and reductions can be suppressed a bit.\\ The system was simulated with 5kHz servo loop frequency. -Higher servo loop frequency does not help, because a continious state space controller behaves not relevantly better than a sampled state space controller at 5kHz.\\ +Higher servo loop frequency does not help, because a continuous state space controller behaves not relevantly better than a sampled state space controller at 5kHz.\\ -Now the controller must be implemented on deltatau to check the performance on the real stage. +Now the controller must be implemented on DeltaTau to check the performance on the real stage. \FloatBarrier -\subsection{Implementing state space controller on Deltatau} +\subsection{Implementing state space controller on DeltaTau} In MATLAB the function \verb|StateSpaceControlDesign()| produces files \verb%/tmp/ssc[1|2].mat%.\\ @@ -719,7 +743,7 @@ The servo loop code is generated with: \verb|MXTuning.py –mode 256|.\\ This python code reads \verb%/tmp/ssc[1|2].mat% and substitutes part of \verb%usr_code/usrcode_template.[h|c]% to build the servo loop code \verb%usr_code/usrcode.[h|c]%.\\ -Finally the real time servo code is compliled and installed on the DeltaTau with:\\ +Finally the real time servo code is compiled and installed on the DeltaTau with:\\ \verb|/epics_ioc_modules/ESB_MX/python/usr_code$ make install|\\ @@ -736,7 +760,7 @@ The \verb|make install| process consists of many sub parts:\\ - generate observer date in MATLAB with \verb|StateSpaceControlDesign()|\\ - generate code in python with \verb|MXTuning.py|\\ - compile the code with \verb|MXTuning.py| (make all)\\ -- upload the module to Deltatau (make install)\\ +- upload the module to DeltaTau (make install)\\ - activate the user servo loop (make install)\\ Here the full process: @@ -785,10 +809,12 @@ Motor[1].Ctrl =UserAlgo.ServoCtrlAddr[1] \FloatBarrier \subsection{The reality of the state space controller} -The state space controller assumes that the system is observable and controlable. The bode plot shows a flat amplitude at low frequencies, which makes the feeling, that the system is observable and controlable. But in fact the reason of that flat amplitude is friction (section \ref{sec:friction}). The viscode damping is negligable.\\ -This results to the fact that the stage consists of really 2 integrators and behaves without friction roughly like $F=m \cdot \ddot{x}$. But an integrator $\frac{1}{s}$ is neighter observable nor controlable. Therefore we have to check, how to implement an optimal controller for such a system.\\ +The state space controller assumes that the system is observable and controllable. The bode plot shows a flat amplitude at low frequencies, which makes the feeling, that the system is observable and controllable. But in fact the reason of that flat amplitude is friction (section \ref{sec:friction}).\\ +This results to the fact that the stage consists of really 2 integrators and behaves without friction roughly like $F=m \cdot \ddot{x}$. But an integrator $\frac{1}{s}$ is neither observable nor controllable. Therefore we have to check, how to implement an optimal controller for such a system. A state space observer controller seems not to be appropriate in stat case.\\ +\subsubsection{Theoretical approach for $\frac{1}{s^2}$ plant} + A controller consists of a feed forward H(s) and a feed back G(s) path. @@ -802,36 +828,53 @@ A controller consists of a feed forward H(s) and a feed back G(s) path. Assume a plant consists of a integrator $\frac{1}{s}$ the overall transfer functions are $\frac{y}{u}=\frac{\frac{H}{s}+\frac{G}{s}}{1+\frac{G}{s}}=\frac{H+G}{s+G}$ and $\frac{y}{e}=\frac{\frac{G}{s}}{1+\frac{G}{s}}=\frac{G}{s+G}$. Setting H(s)=s and G(s)=k results in a overall transfer function of $\frac{y}{u}=\frac{s+G}{s+G}=1$ and $\frac{y}{e}=\frac{k}{s+k}$. So the output follows the input and k defines how fast errors will be compensated.\\ -Simulating a single integrator plant in MATLAB works. But with 2 integrators the system is unstable because of the two derivate elements. With a discrete differentiator it becomes stable again. In fact a derivate element is a very critical element, because it can create instability and adds a lot of noise. But in this case it is acceptable, because is acts on the trajectory and not on the feedback loop. The only thing that has to be granted is that the trajectory is twice differentiable. This is the case with limited jirk or with the pvt motion. A step response should be avoided and not used to tweak the parameters.\\ +Simulating a single integrator plant in MATLAB works. But with 2 integrators the system is unstable because of the two derivate elements. With a discrete differentiator it becomes stable again. In fact a derivate element is a very critical element, because it can create instability and adds a lot of noise. But in this case it is acceptable, because is acts on the trajectory and not on the feedback loop. The only thing that has to be granted is that the trajectory is twice differentiable. This is the case with limited jerk or with the pvt motion. A step response should be avoided and not used to tweak the parameters.\\ \includegraphics[scale=.45]{FF_FB_ctrl.png} The optimal parameters for a pure feed forward systems are calculated -in equation \ref{eq:calc_Kaff}. +in equation \ref{eq:calc_Kaff}: \def\ccdot{\negthinspace\cdot\negthinspace} \begin{equation} \begin{aligned} &DesPosFB=DesVelFF=0,\quad posErrFB=velErrFB=accErrFB=0\\ -&\text{Motor 1: 19.8Hz 0dB, Ts=5kHz=.2ms,}\quad +&\text{Motor 1: 19.8Hz$\hat{=}$0dB, Ts=5kHz=.2ms,}\quad k=(19.8 \ccdot 2 \ccdot \pi)^2\\ &Kaff = 1/(Ts \ccdot Ts \ccdot k) = 1/((19.8 \ccdot 2 \ccdot \pi)^2/5000^2) = 1615.2\\ -&\text{Motor 2:11.84Hz 0dB, Ts=5kHz=.2ms,}\quad +&\text{Motor 2:11.84Hz$\hat{=}$0dB, Ts=5kHz=.2ms,}\quad k=(11.84 \ccdot 2 \ccdot \pi)^2\\ &Kaff = 1/(Ts \ccdot Ts \ccdot k) = 1/((11.84 \ccdot 2 \ccdot \pi)^2/5000^2) = 4517.28\\ \end{aligned}\label{eq:calc_Kaff} \end{equation} -To correct errors, posErrFB is increased. But in a discrete system, the regulation becomes instable, because the actPos always lags the desPos for one sample. To avoid instability, a fiter can attenuate this problem.\\ +To correct errors, posErrFB is increased. But in a discrete system, the regulation becomes instable, because the actPos always lags the desPos for one sample. To avoid instability, a filter can attenuate this problem.\\ The Standard Delta Tau controller (figure \ref{fig:deltatau_std_ctrl}), shows a very similar feed forward and feedback loop structure with additional filters. So after all the measurements, we can calculate the optimal Kfff and Kaff values. Kp and Ki values will attenuate the errors. Kvff=Kvfb makes the system stable at higher Kp values, but setting the filter B seems to be more appropriate.\\ +Now that we had some experimental experiences the focus is to use regulation theory knowledge to find the best parameters.\\ -MATLAB simulations \verb|(tool: DeltaTauOptimizer.m)| and real test showed similar behaviour and the following error could be reduced roughly by factor 2 with first tests.\\ +\subsubsection{Controller with pole placement} -This should be good enough for the beam time in March 2019 but further improvements still should be possible. +As a full observer controller is not possible, the goal is to implement a controller with pole placement with a simplified plant model. The simplified motion (tfq) with simplified current (tfd) loop has all the needed states directly as measurement values or as calculated values in the default DeltaTau servo controller. The used states are: position, velocity, acceleration(proportional to measured current). With these states a pole placement controller can be implemented. The calculated values are: Kp Kvfb and Kafb. The result is a quite good looking controller.\\ +Additional feed forward gains follows the trajectory even better by setting of these values: +\begin{itemize} +\setlength\itemsep{0em} +\item optimize Kfff by tests to roughly 10 +\item Kvff=Kvfb +\item Kaff as caldulated in equation \ref{eq:calc_Kaff}. +\item Ki value will attenuate the static error, but also make the dynamic regulation worse +\end{itemize} +MATLAB simulations \verb|(tool: DeltaTauOptimizer.m)| and real test showed similar behaviour and the following error could be reduced roughly by factor 2. (Appendix \ref{ax:optimize}). Further the behavior at higher frequencies (50Hz, 100Hz FEL repetition rate) is much better.\\ + +Further improvements could be done with filters to shape the bode diagram. But first of all lets focus on the induced frequencies from the trajectory: The trajectory contains frequencies of half of the FEL repetition rate. so e.g. 0-50Hz at a FEL rate of 100 Hz. (section \ref{sec:trajPlan}). Therefore to follow the trajectory only frequencies below 50Hz are relevant. In this regime the bode plot looks very good. Only at higher frequencies the bode plot looks worse, mainly because of the impact of the resonance frequencies. Therefore filters in the feed forward path would make no sense. Only filters in the closed loop can enhance the regulation quality.\\ + +Therefore in the figure \ref{fig:deltatau_std_ctrl} the filter $\frac{C}{D}$ is the main filter that can enhance the regulation quality. Up to now, this was not achived, because the regulation seems to be stronger than the effect of the filter.\\ + +For the time being, these regulation parameters should be good enough for the beam time in March 2019 but still some further minor improvements should be possible.\\ + % Motor 2:11.84Hz 0dB % Kaff = 1/((11.84*2*np.pi)**2/5000/5000) = 4517.278506241804 @@ -848,7 +891,7 @@ This should be good enough for the beam time in March 2019 but further improveme \vspace{1pc} \begin{appendix} -\section{Appendix} +\section{Appendix}\label{ax:optimize} \begin{verbatim} amp: 5, minFrq: 10, maxFrq: 220, ts: 0.0002, tSec: 20 @@ -892,7 +935,7 @@ shot average error x 0.865708 um, y 0.965126 um, 1.49323 um \texttt{helicalscan.py} & functions for helical scan motion (motion program, coordinate transformation, calibration)\\ \texttt{shapepath.py} & functions for x,y-scan motion (trajectory planing, motion program)\\ -\texttt{ShapePathAnalyser.py} & interactive analyse tool of recorded x,y-scan motion\\ +\texttt{ShapePathAnalyser.py} & interactive analyze tool of recorded x,y-scan motion\\ \\ \texttt{identifyFxFyStage.m}& read python data and build motor objects. plot bode\\ \texttt{simFxFyStage.m}& build a pb structure which contains current (Jan 2019) Powerbrick controller settings\\ diff --git a/MXfastStageDoc/Scratch.tex b/MXfastStageDoc/Scratch.tex index 4de9b08..7fb7faf 100644 --- a/MXfastStageDoc/Scratch.tex +++ b/MXfastStageDoc/Scratch.tex @@ -6,6 +6,14 @@ Here is still work to do... \end{tcolorbox} +\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black,colbacktitle=red!50,coltitle=black,title=TODO] +Make simulations in MATLAB. Set C/D filter to compensate resonance and the current loop.\\ +This sshould be mostly the inverse of the figures: \ref{fig:mot1_chirp} and \ref{fig:mot2_chirp}.\\ +Use $K_{fff}$ +\end{tcolorbox} + + + \begin{verbatim} clear; clear global; diff --git a/MXfastStageDoc/myBib.bib b/MXfastStageDoc/myBib.bib index c87969b..cc91a4a 100644 --- a/MXfastStageDoc/myBib.bib +++ b/MXfastStageDoc/myBib.bib @@ -27,6 +27,13 @@ year = {2015}, url = {Power Brick LV User Manual.pdf}, } +@online{ParkerStage, +author = {Parker Automation}, +title = {MX80L Precision Grade Product Manual No. 100-5326-01}, +year = {2010}, +url = {http://www.parkermotion.com/manuals/mx80/MX80LManualRev6.pdf}, +} + biblio: '', @TechReport{DynParker, author = {Wayne Glettig }, diff --git a/matlab/DeltaTauSim.slx b/matlab/DeltaTauSim.slx index d48de449ded2b890b4b890ffb19664eb4546474c..cc3786ed082f2c4871072e497d109c0741529188 100644 GIT binary patch delta 19942 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 E02<}#CjbBd