From 4c676269fc9d4c11a854204ec439400f54247ceb Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Tue, 19 Feb 2019 10:18:30 +0100 Subject: [PATCH] mainly document changes --- .gitignore | 2 +- MXfastStageDoc/MXfastStage.tex | 52 +++++-- PBInspect1.pbi | 48 +------ matlab/docSim.slx | Bin 0 -> 23616 bytes matlab/sample.slx | Bin 28004 -> 27797 bytes matlab/simFxFyStage.m | 3 +- python/usr_code/Makefile | 4 +- python/usr_code/usrcode.c | 255 +++++++++++++++++++++++++++++++++ qt/ESB_MX_exp.ui | 42 ++++++ 9 files changed, 345 insertions(+), 61 deletions(-) create mode 100644 matlab/docSim.slx create mode 100644 python/usr_code/usrcode.c diff --git a/.gitignore b/.gitignore index b7319cf..fee4340 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ old/ Module.symvers modules.order -python/usr_code/usrcode.c +#python/usr_code/usrcode.c python/usr_code/usrcode.h python/usr_code/.tags python/usr_code/usr_code.layout diff --git a/MXfastStageDoc/MXfastStage.tex b/MXfastStageDoc/MXfastStage.tex index 613092b..cbf8653 100644 --- a/MXfastStageDoc/MXfastStage.tex +++ b/MXfastStageDoc/MXfastStage.tex @@ -234,10 +234,14 @@ Motor 1,2: $K_{fff}\approx100$\\ \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 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. +\begin{figure}[h!] +\center \includegraphics[scale=.2]{/home/zamofing_t/Documents/doc-ext/DeltaTau/ServoBlockDiag.png} -\\ +\caption{position dependant 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.\\ @@ -781,17 +785,43 @@ 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 also negligable.\\ -This results to the fact that $F=m \cdot \ddot{x}$ consists of really 2 integrators. But an integrator $\frac{1}{s}$ is neighter observable and 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 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.\\ A controller consists in a feed forward and a feed back transfer function. -The overall transfer functions y/u and y/e are: ... Setting H(s)=s results in a overall transfer function of y/u=... and y/e=... .\\ -Simulating all this in MATLAB results in unstable system because of the derivate, but with a discrete differentiator it becomes stable again.\\ -The optimal loop would be Kaff=(bode value of integrator), Kvff=Kvfb=Kafb=0. -Kp values is the speed to attenuate error values.\\ -This is stable as long as Kp=0. With a Kp value, the system starts to osscilate instable. Stability can be achived again with e.g. Kvff=Kvfb=...\\ +\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black,colbacktitle=red!50,coltitle=black,title=TODO] +Assume a plant consists of a integrator $\frac{1}{s}$ the overall transfer functions y/u and y/e are: ... Setting H(s)=s results in a overall transfer function of y/u=... and y/e=... .\\ +\end{tcolorbox} + +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.\\ + +\includegraphics[scale=.45]{FF_FB_ctrl.png} +The optimal parameters for a pure feed forward systems are calculated +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 +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 +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.\\ + +The Standard Delta Tau controller (figure \ref{fig:deltatau_std_ctrl}), shows avery 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 hither Kp values, but setting the filter B seems to be more appropriate.\\ + + + +% Motor 2:11.84Hz 0dB +% Kaff = 1/((11.84*2*np.pi)**2/5000/5000) = 4517.278506241804 -Looking at the Standard Delta Tau controller, one sees, that it has exactly the feed forward and feedback loop. 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 hither Kp values. % Motor 1: 19.8Hz 0dB % K=(19.8*2*np.pi)**2 diff --git a/PBInspect1.pbi b/PBInspect1.pbi index 34aa3ce..322c7cd 100644 --- a/PBInspect1.pbi +++ b/PBInspect1.pbi @@ -69,30 +69,6 @@ "Motor[2].idCmd", null ], - [ - "Motor[3].idCmd", - null - ], - [ - "Motor[4].idCmd", - null - ], - [ - "Motor[5].idCmd", - null - ], - [ - "Motor[6].idCmd", - null - ], - [ - "Motor[7].idCmd", - null - ], - [ - "Motor[8].idCmd", - null - ], [ "Motor[1].ServoOut", null @@ -102,31 +78,11 @@ null ], [ - "Motor[3].ServoOut", + "Motor[1].iqCmd", null ], [ - "Motor[4].ServoOut", - null - ], - [ - "Motor[5].ServoOut", - null - ], - [ - "Motor[6].ServoOut", - null - ], - [ - "Motor[7].ServoOut", - null - ], - [ - "Motor[8].ServoOut", - null - ], - [ - "Gate3[1].Chan[0].UserFlag", + "Motor[2].iqCmd", null ] ], diff --git a/matlab/docSim.slx b/matlab/docSim.slx new file mode 100644 index 0000000000000000000000000000000000000000..ae34cb90d2fd1db953e9d81fc10174314763df03 GIT binary patch literal 23616 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 VSGGt<#PGKy+)-!c$0-5n{{U*MBgg;% literal 0 HcmV?d00001 diff --git a/matlab/sample.slx b/matlab/sample.slx index 68f5ce11551ed2d10a8d010b626f280c462a2e55..bca619400d9503f47a3fdcce0c2d00d7b8685fd6 100644 GIT binary patch delta 13890 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 delta 14083 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 V4p{?Dt*C(j2NWoHoB#dh{{k1qaw`A; diff --git a/matlab/simFxFyStage.m b/matlab/simFxFyStage.m index d9af8a6..b8134f6 100644 --- a/matlab/simFxFyStage.m +++ b/matlab/simFxFyStage.m @@ -21,11 +21,12 @@ function [pb]=simFxFyStage(mot) else %!motor_servo(mot=2,ctrl='ServoCtrl',Kp=22,Kvfb=350,Ki=0.02,Kvff=240,Kaff=1500,MaxInt=1000) %!motor(mot=2,dirCur=0,contCur=800,peakCur=2400,timeAtPeak=1,IiGain=5,IpfGain=8,IpbGain=8,JogSpeed=10.,numPhase=3,invDir=True,servo=None,PhasePosSf=1./81250,PhaseFindingDac=100,PhaseFindingTime=50,SlipGain=0,AdvGain=0,PwmSf=10000,FatalFeLimit=200,WarnFeLimit=100,InPosBand=2,homing='enc-index') - %Kp=22;Kvfb=350;Ki=0.02;Kvff=240;Kaff=1500;MaxInt=1000; + %pb.Kp=22;Kvfb=350;Ki=0.02;Kvff=240;Kaff=1500;MaxInt=1000; pb.Kp=22;pb.Kvfb=350;pb.Ki=0.02;pb.Kvff=240;pb.Kaff=3500;pb.MaxInt=1000; %11.84Hz 0dB K=(11.84*2*np.pi)**2=5534.3 Ts=5kHz=.2ms %Kaff = 1/(Ts*Ts*K) = 1/((11.84*2*np.pi)**2/5000**2) = 4517.278506241803 %Kfff=100 + %pb.MaxInt=200 %200mA should be enought to fix static errors end pb.ss_plt=mot.ss_plt; pb.sel={3,[3]}; diff --git a/python/usr_code/Makefile b/python/usr_code/Makefile index 398d002..4810b39 100644 --- a/python/usr_code/Makefile +++ b/python/usr_code/Makefile @@ -122,8 +122,8 @@ Debug: all end;\ exit(0);" -usrcode.c: ../../matlab/ssc1.mat ../../matlab/ssc2.mat ../MXTuning.py - cd ..;./MXTuning.py -m512 +#usrcode.c: ../../matlab/ssc1.mat ../../matlab/ssc2.mat ../MXTuning.py +# cd ..;./MXTuning.py -m512 install: all scp usralgo.ko root@$(PPMAC):/tmp diff --git a/python/usr_code/usrcode.c b/python/usr_code/usrcode.c new file mode 100644 index 0000000..68a0d78 --- /dev/null +++ b/python/usr_code/usrcode.c @@ -0,0 +1,255 @@ +//--------------------------------------------------------------------------- +// Project PowerPMAC Firmware +// Delta Tau Data Systems, Inc. +// Copyright 2007. All Rights Reserved. +// +// SUBSYSTEM: User Servo Driver +// FILE: usrcode.c +// TEMPLATE AUTHOR: Henry Bausley +// +// OVERVIEW +// ~~~~~~~~ +// This file is where exportable user code can be placed. +// To make a function callable as a user servo do three steps +// +// 1.) Prototye the function user_func(void ,void ); +// 2.) Export the function EXPORT_SYMBOL(user_func); +// 3.) Make sure useralgo.ko has been loaded with projpp.ini +// +//-------------------------------------------------------------------------------- +#include "usrcode.h" +//---------------------------------------------------------------------------------- +// pp_proj.h is the C header for accessing PMAC Global, CSGlobal, Ptr vars +// _PPScriptMode_ for Pmac Script like access global & csglobal +// global Mypvar - access with "Mypvar" +// global Myparray(32) - access with "Myparray(i)" +// csglobal Myqvar - access with "Myqvar(i)" where "i" is Coord # +// csglobal Myqarray(16) - access with "Myqvar(i,j)" where "j" is index +// _EnumMode_ for Pmac enum data type checking on Set & Get global functions +// Example +// global Mypvar +// csglobal Myqvar +// "SetGlobalVar(Myqvar, data)" will give a compile error because its a csglobal var. +// "SetCSGlobalVar(Mypvar, data)" will give a compile error because its a global var. +//------------------------------------------------------------------------------------ +#define _PPScriptMode_ // uncomment for Pmac Script type access +// #define _EnumMode_ // uncomment for Pmac enum data type checking on Set & Get global functions + +#include "pp_proj.h" +#ifdef __KERNEL__ +// Kernal mode can't have paths with spaces and long names +//#include "../../PMACSC~1/GLOBAL~1/asharedwithcapp.pmh" +#else +//#include "../../PMAC Script Language/Global Includes/asharedwithcapp.pmh" +#endif + +extern struct SHM *pshm; // Pointer to shared memory +extern volatile unsigned *piom; // Pointer to I/O memory +extern void *pushm; // Pointer to user memory + +double obsvr_servo_ctrl_1(MotorData *Mptr) +{ + //x[n+1]=A*x[n]+B*u + //y=C*x[n]+D*x[n] + //u=[DesPos, IqMeas, ActVel, ActPos].T + //y=[obsvOut].T + + //double x[4]; //new state + //static double _x[4]={0,0,0,0}; //old state + + //input values + double DesPos=Mptr->DesPos; + double IqMeas=Mptr->IqMeas; + double ActVel=Mptr->ActVel; + double ActPos=Mptr->ActPos; + + //double obsvOut; // output values + double kpPosErr,iqCmd,iqCmdOrig; // output values + //double maxDac=Mptr->MaxDac; //other stuff + double desAcc,Kfff,posErr; + static double itg=0; //integrator + static double prevDesVel=0; //integrator + if (Mptr->ClosedLoop) + { + //Kp=25;Kvfb=400;Ki=0.02;Kvff=350;Kaff=5000;MaxInt=1000; + posErr=DesPos-ActPos; //should be equal to Mptr->PosError + kpPosErr=posErr*Mptr->Servo.Kp; + itg+=kpPosErr*Mptr->Servo.Ki; + if(itg>Mptr->Servo.MaxInt) + itg=Mptr->Servo.MaxInt; + else if(itg<-Mptr->Servo.MaxInt) + itg=-Mptr->Servo.MaxInt; + + desAcc=Mptr->DesVel-prevDesVel; + + if(Mptr->DesVel>0) + Kfff=Mptr->Servo.Kfff; + else + Kfff=-Mptr->Servo.Kfff; + + iqCmd= +kpPosErr + -Mptr->Servo.Kvfb*Mptr->ActVel + +Mptr->Servo.Kvff*Mptr->DesVel + +itg + +Mptr->Servo.Kaff*desAcc + +Kfff; + + prevDesVel=Mptr->DesVel; + iqCmdOrig=pshm->ServoCtrl(Mptr); + + //return iqCmd; + pshm->P[2010]=DesPos; + pshm->P[2011]=IqMeas; + pshm->P[2012]=ActVel; + pshm->P[2013]=ActPos; + //pshm->P[2014]=_x[0]; + //pshm->P[2015]=_x[1]; + pshm->P[2016]+=iqCmdOrig-iqCmd; + pshm->P[2017]=iqCmdOrig; + pshm->P[2018]=iqCmd; + + return iqCmd; + } + else + { + Mptr->Servo.Integrator=0.0; + return 0.0; + } +} + +double obsvr_servo_ctrl_2(MotorData *Mptr) +{ + //x[n+1]=A*x[n]+B*u + //y=C*x[n]+D*x[n] + //u=[DesPos, IqMeas, ActVel, ActPos].T + //y=[obsvOut].T + + //double x[4]; //new state + //static double _x[4]={0,0,0,0}; //old state + + //input values + double DesPos=Mptr->DesPos; + double IqMeas=Mptr->IqMeas; + double ActVel=Mptr->ActVel; + double ActPos=Mptr->ActPos; + + //double obsvOut; // output values + double kpPosErr,iqCmd,iqCmdOrig; // output values + //double maxDac=Mptr->MaxDac; //other stuff + double desAcc,Kfff,posErr; + static double itg=0; //integrator + static double prevDesVel=0; //integrator + if (Mptr->ClosedLoop) + { + //Kp=25;Kvfb=400;Ki=0.02;Kvff=350;Kaff=5000;MaxInt=1000; + posErr=DesPos-ActPos; //should be equal to Mptr->PosError + kpPosErr=posErr*Mptr->Servo.Kp; + itg+=kpPosErr*Mptr->Servo.Ki; + if(itg>Mptr->Servo.MaxInt) + itg=Mptr->Servo.MaxInt; + else if(itg<-Mptr->Servo.MaxInt) + itg=-Mptr->Servo.MaxInt; + + desAcc=Mptr->DesVel-prevDesVel; + + if(Mptr->DesVel>0) + Kfff=Mptr->Servo.Kfff; + else + Kfff=-Mptr->Servo.Kfff; + + iqCmd= +kpPosErr + -Mptr->Servo.Kvfb*Mptr->ActVel + +Mptr->Servo.Kvff*Mptr->DesVel + +itg + +Mptr->Servo.Kaff*desAcc + +Kfff; + + prevDesVel=Mptr->DesVel; + iqCmdOrig=pshm->ServoCtrl(Mptr); + + //return iqCmd; + pshm->P[2020]=DesPos; + pshm->P[2021]=IqMeas; + pshm->P[2022]=ActVel; + pshm->P[2023]=ActPos; + //pshm->P[2024]=_x[0]; + //pshm->P[2025]=_x[1]; + pshm->P[2026]+=iqCmdOrig-iqCmd; + pshm->P[2027]=iqCmdOrig; + pshm->P[2028]=iqCmd; + + return iqCmd; + } + else + { + Mptr->Servo.Integrator=0.0; + return 0.0; + } +} + +void user_phase_sample( struct MotorData *Mptr) +{ +} + +double usr_servo_sample(MotorData *Mptr) +{ + pshm->P[2000]=pshm->P[2000]*.9999+abs(Mptr->PosError)*0.0001; //lowpass of Position error + return pshm->ServoCtrl(Mptr); +} + +//double user_pid_ctrl( struct MotorData *Mptr) +//{ +// //double *p; +// //p = pushm; +// //return 0; +// double ctrl_out; +// if (Mptr->ClosedLoop) { +// // Compute PD terms +// ctrl_out=Mptr->Servo.Kp*Mptr->PosError-Mptr->Servo.Kvfb*Mptr->ActVel; +// Mptr->Servo.Integrator+=Mptr->PosError*Mptr->Servo.Ki; // I term +// ctrl_out+=Mptr->Servo.Integrator; +// // Combine +// if (ctrl_out>2000)ctrl_out=2000; +// if (ctrl_out<-2000)ctrl_out=-2000; +// return ctrl_out; +// } +// else { +// Mptr->Servo.Integrator=0.0; +// return 0.0; +// } +//} + +void CaptCompISR(void) +{ + unsigned *pUnsigned = pushm; + *pUnsigned = *pUnsigned + 1; +} + +double GetLocal(struct LocalData *Ldata,int m) +{ + return *(Ldata->L + Ldata->Lindex + m); +} + +void SetLocal(struct LocalData *Ldata,int m,double value) +{ + *(Ldata->L + Ldata->Lindex + m) = value; +} + +double *GetLocalPtr(struct LocalData *Ldata,int m) +{ + return (Ldata->L + Ldata->Lindex + m); +} + +double CfromScript(double cfrom_type, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, struct LocalData *Ldata) +{ + int icfrom_type = (int) cfrom_type; + double *C, *D, *L, *R, rtn; // C, D, R - only needed if doing Kinmatics + + C = GetCVarPtr(Ldata); // Only needed if doing Kinmatics + D = GetDVarPtr(Ldata); // Only needed if doing Kinmatics + L = GetLVarPtr(Ldata); // Only needed if using Ldata or Kinmatics + R = GetRVarPtr(Ldata); // Only needed if doing Kinmatics + rtn = -1.0; + return rtn; +} + diff --git a/qt/ESB_MX_exp.ui b/qt/ESB_MX_exp.ui index dd84f86..e33c9e4 100644 --- a/qt/ESB_MX_exp.ui +++ b/qt/ESB_MX_exp.ui @@ -451,6 +451,48 @@ P=$(P),M=MOT_GIR_W false;false;false;false;false;false;false;false;false;false;false;false;false;false;false;false + + + + 510 + 580 + 151 + 30 + + + + -ESB_MX EVR VME + + + + 0 + 0 + 0 + + + + + 89 + 126 + 225 + + + + EVR + + + G_EVR_main.ui + + + SYS=SAR-CVME-ESBMX1,DEVICE=EVR0,FF=VME-300 + + + caRowColMenu::Menu + + + false;false;false;false;false;false;false;false;false;false;false;false;false;false;false;false + +