Files
PBSwissMX/logbook.md
2017-06-12 09:51:02 +02:00

891 lines
29 KiB
Markdown

Text that was in readme and not used any more is stored here
============================================================
*** 14.12.2016 ***
==================
Parker stage
============
Using IDE
---------
1 detect current sensor direction
Motor[1].PhaseOffset 683
Motor[1].PwmSf 2154
2 current bias
Motor[1].IaBias=0
Motor[1].IbBias=0
3 Voltage six step
Motor[1].PhaseOffset -683
Motor[1].PwmSf -2154
Motor[1].PhasePosSf=2048/(1*256*213333.3333)
4 Tune Current Loop (Mag=200, dur=50)
Motor[1].IiGain 10.5
Motor[1].IpfGain=0
Motor[1].IpbGain=14.7
5 Current six step
Motor[1].PhasePosSf=2048/(1*1*61440000.)
6 Phase ref search
Motor[1].PhaseFindingDac=160.95
Motor[1].PhaseFindingTime=50
Open Loop
---------
20mm = 1003994 enc_step
20mm = 1'000'000 enc_step -> 20nm/enc step
1 pole= 600'000 enc_step -> 12mm
>>>>>>>>>> DONT FORGET <<<<<<<<<<<
$$$***
!common()
>>> open loop with encoder counts <<<
!encoder_sim(enc=1,tbl=1,mot=1)
!encoder_inc(enc=1,tbl=9,mot=9,encctrl=7,posSf=1./1)
!motor(mot=1,dirCur=400,contCur=500,peakCur=2400,timeAtPeak=1,IiGain=1,IpfGain=0,IpbGain=2,JogSpeed=1.,numPhase=3,invDir=True)
#1j/
#1,9hmz
#1j:2048 -> moves one pole= 650'000 enc_step =13mm (Electrical Pitch in MX80 doc)
512= 90deg -> check phase *
* o x * o x
* * o o x x * * o o x x
* o* xo x * o* xo x
* o * x o x * o * x o x
* o x * o x * o x * o x
*------o------x-----*------o------x-----*------o------x-----*------o------x-----*------o------x-----*------o------x
* o x * o x * o x * o x * o x * o x
* o * x o x * o * x o x * o * x o x
* o* xo x * o* xo x * o* xo x
* * o o x x * * o o x x * * o o x x
* o x * o x * o x
0 512 1024 1536 2048
>>> scaling encoder etc to um <<<
!encoder_sim(enc=1,tbl=1,mot=1,posSf=12000./2048)
!encoder_inc(enc=1,tbl=9,mot=9,encctrl=7,posSf=12000./600000)
!motor(mot=1,dirCur=400,contCur=500,peakCur=2400,timeAtPeak=1,IiGain=1,IpfGain=0,IpbGain=2,JogSpeed=1.*12000./2048,numPhase=3,invDir=True)
JogSpeed=1.*12000./2048 6um/ms =6mm/s
>>> close the loop with inc-encoder <<<
servoSf : motorusteps/userUnits
!encoder_sim(enc=1,tbl=9,mot=9,posSf=12000./2048)
!encoder_inc(enc=1,tbl=1,mot=1,encctrl=7,posSf=12000./600000)
!motor(mot=1,dirCur=400,contCur=500,peakCur=2400,timeAtPeak=1,IiGain=1,IpfGain=0,IpbGain=2,JogSpeed=6.,numPhase=3,invDir=True,servoSf=2048/12000.)
>>> close the loop with inc-encoder removing direct current<<<
$$$***
!common()
!encoder_sim(enc=1,tbl=9,mot=9,posSf=12000./2048)
!encoder_inc(enc=1,tbl=1,mot=1,encctrl=7,posSf=12000./600000)
!motor(mot=1,dirCur=0,contCur=500,peakCur=800,timeAtPeak=1,IiGain=1,IpfGain=0,IpbGain=2,JogSpeed=6.,numPhase=3,invDir=True,servoSf=2048/12000.)
Motors are not moving, because no current will be set due to some wrong parameters.
But the servoloop is running and gives output:
ServoOut set value from 0.5099 to -0.5099 (= MaxPosErr*Kp) when moving at different position
Motor[1].Servo.MaxPosErr=1000.0169
Motor[1].Servo.Kp=0.000512
1000.0169*0.000512=0.5120086528
Motor[1].Servo.Kp=0.0007
Motor[1].Servo.MaxPosErr=1000.0169
1000.0169*0.0007=0.70001183
Now some elements have to be reconfigured:
SlipGain,PwmSf,PhaseMode,PhaseCtrl,PhasePosSf
Motor[1].pPhaseEnc = PowerBrick[0].Chan[0].PhaseCapt.a //is default
use configuration open loop with encoder counts
#1j/
Read PowerBrick[0].Chan[0].PhaseCapt 130559
move one pole (13mm)
Read PowerBrick[0].Chan[0].PhaseCapt 166599808
difference = 166599808-130559= 166469249
166469249/256 = 650270 =650000incr = 13mm
1 commutation cycle=163537664 PhaseCapt = 2048 com_cycl_units
PhasePosSf= 2048./166469249 = 1.2303e-05 or precise: 2048/(256*650000)=1.23077e-05
servoSf : motorusteps/userUnits
servoSf=2048/12000.,PhaseCtrl=4,SlipGain=0,PhasePosSf=1.23077e-05
*******************************
****** WORKS !!!!!!!!!!!! *****
** But positioning has very bad performance **
*******************************
// controlling speed/velocity on iqCmd and constant current(=torque) on idCmd
//precission +-1 step in steady state
$$$***
!common()
!encoder_inc(enc=1,tbl=1,mot=1,encctrl=7,posSf=12000./600000)
!motor(mot=1,dirCur=300,contCur=800,peakCur=2400,timeAtPeak=1,IiGain=1,IpfGain=0,IpbGain=2,JogSpeed=6.,numPhase=3,invDir=True,servoSf=2048/12000.)
// controlling torque(=current) on iqCmd and idCmd=0
//precission +-100 and more step in steady state
$$$***
!common()
!encoder_inc(enc=1,tbl=1,mot=1,encctrl=7,posSf=12000./600000)
!motor(mot=1,dirCur=0,contCur=800,peakCur=2400,timeAtPeak=1,IiGain=1,IpfGain=0,IpbGain=2,JogSpeed=6.,numPhase=3,invDir=True,servoSf=2048/12000.,PhaseCtrl=4,SlipGain=0,PhasePosSf=1.23077e-05,PhaseMode=0,PhaseFindingDac=200,PhaseFindingTime=22.586512)
#1out10
!!! HOLD BY HAND TO LIMIT THE SPEED !!!
Motor[1].Servo.Kp=1
Motor[1].InPosBand=0
Motor[1].Servo.BreakPosErr=0
#1j/
#1j:1000
*******************************
-> Tadejs input: use simulated encoder for the phasing
Motor[1].Servo.BreakPosErr=0
Motor[3].Servo.Kp=2000
///Motor[3].Servo.BreakPosErr=0
//Motor[3].Servo.Kp=2000
//#3out5
Testing IDE with QBL test motor
===============================
>>> close the loop with inc-encoder removing direct current<<<
-> the current/speed must be set with that PWM-scale factor
Motor idx 1 3
Motor[x].AdvGain 0.020479999 0
Motor[x].PhasePosSf 0 0.0160000000000000003
Motor[x].PhaseCtrl 6 4
Motor[x].PhaseMode 1 0
Motor[x].PwmSf -15134.891 4309
Motor[x].SlipGain 0.25 0
Motor[x].PhaseFindingDac 0 95.976563
Motor[x].PhaseFindingTime 0 22.586512
>>> origin setup by ide+ tweaks <<<
!encoder_inc(enc=3,tbl=3,mot=3,encctrl=7,posSf=1./2000)
!motor_servo(mot=3,ctrl='ServoCtrl',Kp=4.0424199*2000, Kvfb=160.43646*2000,Kvff=160.43646*2000,Kaff=3184.5818*2000)
!motor(mot=3,numPhase=3,servo=None, homing=None,dirCur=0,contCur=1790,peakCur=5400,timeAtPeak=1,IiGain=1.0628819,IpfGain=0,IpbGain=6.5684085,AdvGain=0,FatalFeLimit=2000,WarnFeLimit=1000,InPosBand=0,PhasePosSf=0.016,PhaseCtrl=4,PhaseMode=0,PwmSf=4309,SlipGain=0,PhaseFindingDac=95.976563,PhaseFindingTime=22.586512)
AdvGain
PhasePosSf 0 does not work at all -> must be calculated correctly as below
PhaseCtrl 6 not working. must be 4 for phase feedback and 6 for direct microstepping
PhaseMode 0,1 both are working, should be 0 for 3 phase
PwmSf 0 2000 4309 -> the higher, the more torque on error
SlipGain 0.25 squeezing
PhaseFindingDac 0 no change
PhaseFindingTime 0 no change
$$$***
!common()
!encoder_inc(enc=3,tbl=3,mot=3,encctrl=7,posSf=1./2000)
!motor_servo(mot=3,ctrl='ServoCtrl',Kp=4.0424199*2000, Kvfb=160.43646*2000,Kvff=160.43646*2000,Kaff=3184.5818*2000)
!motor(mot=3,numPhase=3,servo=None, homing=None,dirCur=0,contCur=1790,peakCur=5400,timeAtPeak=1,IiGain=1.0628819,IpfGain=0,IpbGain=6.5684085,AdvGain=0,FatalFeLimit=2000,WarnFeLimit=1000,InPosBand=0,PhasePosSf=0.016,PhaseCtrl=6,PhaseMode=1,PwmSf=1000,SlipGain=0,PhaseFindingDac=0,PhaseFindingTime=0)
!sh sleep 1
#3j/
!sh sleep 10
#3j:100
#3out10 sets directly the Motor[3].ServoOut value , sets to 10% of Motor[x].MaxDac
Motor[3].MaxDac=4526.9282
Out ServoOut iqCmd IqVolts
#3out100 -> 4526.9 set to 100 %of Motor[x].MaxDac
#3out50 -> 2263.46411 2263.4641
#3out10 -> 452.692822 452.69281
iqMeas=iqCmd if motor is blocked, when motor moves, iqCmd stays and iqMeas drops
PwmSf IqCmd iqMeas(when blocked)
Motor[3].PwmSf;Motor[3].IqCmd;Motor[3].IqMeas;Motor[3].IqVolts
PwmSf=500 IqCmd=2263.4641 IqMeas=232.44925 IqVolts=34406.398
PwmSf=1000 IqCmd=2263.4641 IqMeas=779.05316 IqVolts=34406.398
PwmSf=2000 IqCmd=2263.4641 IqMeas=1944.9929 IqVolts=34406.398
PwmSf=3000 IqCmd=2263.4641 IqMeas=2234.2734 IqVolts=34406.398
Motor[x].PhasePosSf scale factor to convert encoder position to phase position
Motor[3].pPhaseEnc=PowerBrick[0].Chan[2].PhaseCapt.a
Motor[3].PhaseEncLeftShift=0
Motor[3].PhaseEncRightShift=0
1 rev=2000*256 enc_steps (PowerBrick[0].Chan[2].PhaseCapt)
4 Pole magnet, 2000 enc_steps/rev
encoder configured to have 1 enc_step per revolution
PhasePosSf=0.016=1/62.5=32/2000= (4*2048)/(256*2000) = (numPoles*const)/(256*2000)
const=Power PMAC divides a commutation cycle into 2048 parts
Motor[3].PhasePos position of the phase: 0..2048 this does not change if the motor is blocked
>>>>>>find PhasePosSf <<<<<<<<<<<
$$$***
!common()
!encoder_sim(enc=3,tbl=3,mot=3)
!encoder_inc(enc=3,tbl=11,mot=11,encctrl=7,posSf=1./2000)
!motor(mot=3,numPhase=3, dirCur=500,contCur=1790,peakCur=2400,timeAtPeak=1,IiGain=1.0628819,IpfGain=0,IpbGain=6.5684085,AdvGain=0,FatalFeLimit=2000,WarnFeLimit=1000,InPosBand=0,PhasePosSf=0.0,PhaseCtrl=4,PhaseMode=0,SlipGain=0)
Do manually one revolution
feeling 4 pole changes -> 8 poles (locks on N-S S-N positions, moves on N-N S-S position)
Motor[3].pPhaseEnc -> Motor[3].pPhaseEnc=PowerBrick[0].Chan[2].PhaseCapt.a
PowerBrick[0].Chan[2].PhaseCapt after one revolution
1535488-1022464=513024=512000
Phase_step = change pole from N->S->N
1 Phase_step = 2048 Phase_uStep
512000 PhaseEnc_step == 4 pole changes = 4*2048 Phase_uStep
PhasePosSf=Phase_uStep/PhaseEnc_step=4*2048/512000==0.016
!encoder_inc(enc=3,tbl=3,mot=3,encctrl=7,posSf=1./2000)
!motor(mot=3,numPhase=3, dirCur=0,contCur=1790,peakCur=2400,timeAtPeak=1,IiGain=1.0628819,IpfGain=0,IpbGain=6.5684085,AdvGain=0,FatalFeLimit=2000,WarnFeLimit=1000,InPosBand=0,servoSf=2000./1,PhasePosSf=0.016,PhaseCtrl=4,PhaseMode=0,PwmSf=4309,SlipGain=0,PhaseFindingDac=95.976563,PhaseFindingTime=22.586512)
Motor[3].Servo.BreakPosErr=0
Motor[3].Servo.Kp=2000
#3out5
#3j/
PowerBrick[0].AdcAmpCtrl = $f00cfe00 $f00cfe00
PowerBrick[0].Chan[0].InCtrl = $47 $47
PowerBrick[0].Chan[0].OutCtrl = $f000001 $f000101
PowerBrick[1].AdcAmpCtrl = $f00cfe00 $f00cfe00
Motor[1].Servo.Kp = 4.0424199 4.0424199
Motor[1].Servo.Kvifb = 0 0
Motor[1].Servo.Kviff = 0 0
Motor[1].Servo.Kvfb = 160.43646 40.951927
Motor[1].Servo.Kvff = 160.43646 40.951927
Motor[1].Servo.Kafb = 0 0
Motor[1].Servo.Kaff = 3184.5818 207.48897
Motor[1].Servo.Ki = 2.6301687e-4 0.0010304153
Motor[1].Servo.Kfff = 0 0
Motor[1].PhasePosSf = 0.0160000000000000003 1.59999999999999993e-5
Motor[1].IiGain = 1.0628819 0.2278125
Motor[1].IpbGain = 6.5684085 0.0099999998
Motor[1].MotorTa = -10 -10
Motor[1].MotorTs = -50 -50
Motor[1].I2tSet = 1499.7477 418.92395
Motor[1].I2tTrip = 18220758 2632459
Motor[1].JogOffset = 0 0
Motor[1].AdcMask = $fffc0000 $fffc0000
Motor[1].PhaseOffset = 683 -683
Motor[1].Stime = 0 0
Motor[1].PwmSf = 4309 -2154
Motor[1].MaxDac = 4524.3784 1675.6958
Motor[1].PhaseFindingDac = 95.976563 0
Motor[1].PhaseFindingTime = 22.586512 1
Motor[1].TraceSize = 0 0
Motor[1].Control[0] = $14000100 $14000100
Motor[1].Control[1] = $0 $0
Node15[0].MasterNum = 255 255
Node15[1].MasterNum = 255 255
Node15[2].MasterNum = 255 255
Node15[3].MasterNum = 255 255
IDE Setup -> changed variables
------------------------------
*Command/Feedback(3)
Motor[3].pAbsPhasePos=0 // Encoder //12/9/2016 :8:51 AM - 129.129.144.138
Motor[3].AbsPhasePosFormat=0 // Encoder //12/9/2016 :8:51 AM - 129.129.144.138
Motor[3].AbsPhasePosSf=0 // Encoder //12/9/2016 :8:51 AM - 129.129.144.138
Motor[3].AbsPhasePosOffset=0 // Encoder //12/9/2016 :8:51 AM - 129.129.144.138
Motor[3].PhaseFindingTime=1 // Encoder //12/9/2016 :8:51 AM - 129.129.144.138
Motor[3].PhaseFindingDac=0 // Encoder //12/9/2016 :8:51 AM - 129.129.144.138
*Hardware Interface
Motor[3].pLimits=PowerBrick[0].Chan[2].Status.a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pEnc= EncTable[3].a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pEnc2= EncTable[3].a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].EncType= 5 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pDac=PowerBrick[0].Chan[2].Pwm[0].a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pAdc=PowerBrick[0].Chan[2].AdcAmp[0].a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pAmpEnable=PowerBrick[0].Chan[2].OutCtrl.a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].ServoCtrl = 1 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].PhaseCtrl = 4 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Gate3[0].Chan[2].PackIndata = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Gate3[0].Chan[2].PackOutdata = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].PhaseMode = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pPhaseEnc=PowerBrick[0].Chan[2].PhaseCapt.a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
BrickLV.Chan[2].TwoPhaseMode=0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].PhaseSplineCtrl = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pSineTable = Sys.SineTable[0].a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pVoltSineTable = Sys.SineTable[0].a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].PwmDbComp = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].PwmDbI = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
PowerBrick[0].Chan[2].OutputMode = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].PwmSf =7618.5 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].AmpEnableBit = 8 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].AmpFaultBit = 7 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].AmpFaultLevel = 1 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].pAmpFault=PowerBrick[0].Chan[2].Status.a // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].LimitBits = 9 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].DacShift=0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].AdcMask = $FFFC0000 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].ctrl=Sys.servoctrl // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].DtOverRotorTc = 0 // Hardware Interface //12/9/2016 0:8:53 AM - 129.129.144.138
Motor[3].IxCoupleGain = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].SlipGain = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].AdvGain = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].Stime = 0 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
Motor[3].PhaseOffset =-683 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
BrickLV.Reset = 1 // Hardware Interface //12/9/2016 :8:53 AM - 129.129.144.138
*** 16.1.2017 ***
==================
Parker stage current step response
----------------------------------
Motor[2].IiGain=0
Motor[2].IpfGain=1
Motor[2].IpbGain=-1
Current step: Magnitude 4000 bits
Phasing 0
Dwell 10 ms
Motor 2 Phase pos at hard limit (towards kable)
> Motor[2].PhasePos;#2$
Motor[2].PhasePos=1317.26495427904138
Motor[2].PhasePos=1286.11002741653601
Motor[2].PhasePos=1310.62328616849777
Motor[2].PhasePos=1310.62328616849686
Motor[2].PhasePos=1307.26431089312473
Motor[2].PhasePos=1323.77420922660667
Motor[2].PhasePos=1323.77735999583911
Motor[2].PhasePos=1331.42989161901664
Motor[2].PhasePos=1332.17854273394619
Use Motor[2].PhasePos=1330
Use Motor[3].PhasePos=150 (or 1200???)
*** 19.1.2017 ***
==================
Friction force of Parker stage
X(top stage): 1N max 0.1N min.. depends on the magnetic poles
#3out20 -> Force 2N
#3out30 -> Force 3N (changes in torque at poles)
Weight: ca 250g
Y(lower stage): 1N max 0.1N min.. depends on the magnetic poles
#2out20 -> Force 2.5N iqCmd=402
#2out30 -> Force 3N iqCmd=603 (changes in torque at poles)
Weight: ca 750g
*** 27.1.2017 ***
==================
Friction force of Parker stage: see blue logbook.
Calculate the current at a given force:
import numpy as np
import plt as matplotlib.pyplot
F=np.array([+300, +100, 0.,-50,-100,-150,-200,-250,-300])
i=np.array([+625, 214, 38.,-104,-207,-300,-400,-500,-600])
plt.plot(i,F,'.-')
average Motor[3].iqMeas -610.949923065
average Motor[3].iaMeas 432.573485303
average Motor[3].ibMeas -699.459308138
-> icMeas 432.573485303-699.459308138=-266.885822835
Check cur_bits to current
-------------------------
Block motor 4
set current to 10%: #4out10
Measure current with amp meter and ./move_record.py
Motor[4].PhasePos=313
gelb 293 mA
idCmd=0
average Motor[4].iqMeas 452.897308732
average Motor[4].iaMeas -274.830633873
average Motor[4].ibMeas 523.056988602
-> icMeas 248.226
rot 560 mA
average Motor[4].iqMeas 452.719438794
average Motor[4].iaMeas -264.325534893
average Motor[4].ibMeas 523.057788442
-> icMeas 258.73
schwarz 290mA
average Motor[4].iqMeas 453.042713114
average Motor[4].iaMeas -252.726254749
average Motor[4].ibMeas 523.302539492
-> icMeas 270.57
PhasePos=0 ia=-512 ib=260 ic=240
PhasePos=682 ia=250 ib=250 ic=500
PhasePos=1364 ia=320 ib=-500 ic=180
https://de.wikipedia.org/wiki/D/q-Transformation
ia=-sin(phi)*iq
ib=-sin(phi-120deg)*iq
ic=-sin(phi-240deg)*iq
...cant yet figure out the scaling...
Measuring position depenmdent friction(=current)
------------------------------------------------
./move_record.py cfg = {"sequencer": ['prog_1(host="SAROP11-CPPM-MOT6871",acq_per=10)', 'plot_1()']}
Avg current forward: 37.2596025196 Avg current backward: -68.9828819531
lut [[ 1.00000000e+03 -2.70746096e+01]
[ 1.31399384e+03 -3.76975094e+01]
[ 1.71398707e+03 -5.78253228e+01]
...
[ 2.57135808e+04 -1.09363816e+01]
[ 2.61135740e+04 -1.42231517e+01]
[ 2.65135673e+04 -1.19655511e+01]
[ 2.69135605e+04 -6.38521106e+01]]
Python to Matlab
----------------
import numpy as np, scipy.io
fn='/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/data/prog_1.npz'
fh=np.load(fn)
scipy.io.savemat(fn[:-3]+'mat',mdict=dict(fh.iteritems()))
compensate position depenmdent friction 1.2.2017
------------------------------------------------
Git tag: 3fafe53
gpasciiCommander --host SAROP11-CPPM-MOT6871 -i
!mx-stage()
&1 #1->0
&1 #2->0
#3$
an anschlag (kabel) bewegen
#3hmz
Motor[3].PhasePos=1200
#3j/
./move_record.py
abs average pos Error 2.1890901307
Motor[3].Servo.Kp=10
Motor[3].Servo.Kvfb=100
Motor[3].Servo.Kvff=100
abs average pos Error 1.89392140871
/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/src/usrServo/usrcode.c
line 100: c=0.f; //no friction compensation at all
abs average pos Error 1.82212631688
line 85: c=0.f; //do not use friction lut
abs average pos Error 1.47794399154
using friction lut:
abs average pos Error 0.893315213359
But if it is put vertically, the value becomes bad again.
check friction on vertical stage
average PosError to P3000 2.2.2017
----------------------------------
modify programm generated by ./move_record.py:
open prog 2
N0:
linearabs
X505.488Y7.15189
dwell10
pvt10abs
X505.488:2526.97Y7.15189:-85.15309999999999
X556.028:4937.42Y5.44883:-34.6476
...
X508.588:0Y954.585:0
X508.588Y954.585
dwell10
goto 0
close
modify user servo to average PosError to P3000 2.2.2017
tweak parameters:
Motor[3].Servo.Kp
Motor[3].Servo.Kvfb
Motor[3].Servo.Ki
Motor[3].Servo.Kvff
Motor[3].Servo.Kaff
Kp = 10 10 10 10 10 10 20
Kvfb = 220 220 220 220 220 220 220
Ki = 0.001 0.01 0.02 0.01 0 0 0.02
Kvff = 240 240 240 240 240 240 240
Kaff = 0 0 0 20 1500 1500 1500
1.3 .53 .43 0.52 1.88 0.7 0.1
A
A: Higher Ki than 0.02 do not help
Set Ki to 0 and seek optimal Kvff
Kvff =240 local minimum
Kvfb =220 local minimum
Kaff =1500 Kaff does not change the error amount, but makes the error smoother at 1500
Kp =20 average error becomes smaller
Motor[3].Servo.Kvff
commit after: 3fafe53
./move_record.py
>>>>>>>> abs average pos Error 0.353193239442 <<<<<<<
./shapepath.py gen_rand_points(n=400, scale=1000)
Random path at speed:
%100 average error x 1.32075 um, y 0.940694 um, 1.84578 um
%50 average error x 0.336186 um, y 0.259554 um, 0.478149 um
%25 average error x 0.177138 um, y 0.077619 um, 0.209937 um
./shapepath.py gen_grid_points(w=20,h=20,pitch=50,rnd=0.2)
Grid path at speed:
%100 average error x 0.363065 um, y 0.314149 um, 0.536246 um
%50 average error x 0.246374 um, y 0.0985771 um, 0.283925 um
%25 average error x 0.150303 um, y 0.0429124 um, 0.163468 um
Interferometer 11.4.2017
------------------------
adding to torqueCtrl lines:
!encoder_inc(enc=4,tbl=4,mot=4)# ,posSf=13000./650000)
!encoder_inc(enc=5,tbl=5,mot=5)# ,posSf=13000./650000)
gpasciiCommander --host SAR-CPPM-EXPMX1 -i
!mx-stage()
#1..3$
&1
#1..3j/
both interferometer works
homing and move:
#2..5p
-0.04000000000000008 0.0200000000000023 -298.8984375 39.890625
> #2j=10000;#3j=0000
#2j=10000;#3j=0000
> #2..5p
#2..5p
10000 2.380040609040179e-15 -500672.5625 4334.390625
> #2j=0000;#3j=0000
#2j=0000;#3j=0000
> #2j=0000;#3j=10000
#2j=0000;#3j=10000
> #2..5p
#2..5p
-0.02000000000000006 10000 -3559.06640625 -499752.609375
#2..5p
-0.08000000000000007 -0.003515624999636202 -0.5 7.2890625
#2j=10000
#2..5p
9999.980000000001 -0.01000000000021828 4290.96875 -500362.453125
#2j=0;#3j=10000
#2..5p
0 9999.992812500001 -499789.3984375 -3260.984375
Interferometer have 500000 counts per 10000um = 50 counts per um =20nm
at Motor[2].JogSpeed=10 the interferometer can not follow the motion.
It will not loose steps, but the maximum frequency is limiting during motion.
at Motor[2].JogSpeed=10 the interferometer and the encoder delivers similar values.
interfero_move_rec.py
self.gather={"MaxSamples":1000000, "Period":acq_per}
self.channels=channels=["Motor[3].ActPos","Motor[3].DesPos","Motor[3].PhasePos","Motor[3].idMeas","Motor[3].iqMeas"]
Gather.Enable=0
Gather.Items=6
Gather.MaxSamples=1000000
Gather.Period=10
Gather.Addr[0]=Motor[2].DesPos.a
Gather.Addr[1]=Motor[3].DesPos.a
Gather.Addr[2]=Motor[2].ActPos.a
Gather.Addr[3]=Motor[3].ActPos.a
Gather.Addr[4]=Motor[4].ActPos.a
Gather.Addr[5]=Motor[5].ActPos.a
open prog 2
linear abs
X0 Y0
dwell 10
Gather.Enable=2
X10000 Y0
dwell 100
X0 Y0
dwell 100
X0 Y10000
dwell 100
X0 Y0
dwell 1000
Gather.Enable=0
close
&1
b2r
download data with
PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1
cat /tmp/gather.txt
Motor[2].MaxSpeed=50
Motor[3].MaxSpeed=50
->gather50.txt
Motor[2].MaxSpeed=5
Motor[3].MaxSpeed=5
->gather5.txt
Motor[2].MaxSpeed=1
Motor[3].MaxSpeed=1
->gather1.txt
Changing encoder frequency on atto cube makes it run even at high speed
28. 4.2017 prepare for vibration measurement
--------------------------------------------
PPMAC=SAR-CPPM-EXPMX1
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX
PBInspect --host $PPMAC --cfg PBinspect.pbi
cd ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/src/usrServo
make
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host SAR-CPPM-EXPMX1 -i
!mx-stage()
#1..3$
&1
#1..3j/
#1j=360000 //360deg gegenuhrzeiger
#2j:100 //100 um right
#3j:100 //100 um up
move bottom left
#2,3$
Motor[2].PhasePos;Motor[3].PhasePos
Motor[2].PhasePos=310;Motor[3].PhasePos=1210
#2,3hmz
Motor[3].HomePos=Motor[3].HomePos+15000
Motor 2 vibriert mit 76ms =13.15 Hz
b2r
Load is now Alublock + mirrors
at 50 Hz peak to peak 200um
at 100Hz peak to Peak 50um
at 200Hz peak to Peak 13um
at 400Hz peak to Peak 1.5um
2. 5.2017 Vertical stage with load
----------------------------------
scale=0.83832 #np.sqrt(3)/2*32767/33.850/1000
Motor[3].I2tSet=670.65601
670.65601/0.83832 = 800.000
ohne Platte iqCmd = 625
Platte 133.2g iqCmd = 910
Platte 156.8g iqCmd = 965
Motor[3].IaMeas=-660
Motor[3].IbMeas=580
Motor[3].IqMeas=634.15991
Motor[3].IaMeas=-708
Motor[3].IbMeas=256
Motor[3].IaMeas=436 =520
Motor[3].IbMeas=-632 =-753
Motor[3].IqMeas=566.46863 = 675
Claude messungen:
Phase 1: 330mA
Phase 2: 125mA
Phase 3: 694mA
Stromzange: 650 mA
Interferometer 29.5.2017
------------------------
cd ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX;PBInspect --cfg PBinspect.pbi --host SAR-CPPM-EXPMX1
gpasciiCommander --host SAR-CPPM-EXPMX1 -i
!mx-stage()
#1..3$
&1
#1..3j/
zero to neative inc values
move motor 2,3 from 500 to 28500
#1..5hmz
read acquire statements and program at to of plot_interfero.py
Motor[2].MaxSpeed=30;Motor[3].MaxSpeed=30
Motor[2].MaxSpeed=10;Motor[3].MaxSpeed=10
PPMAC=SAR-CPPM-EXPMX1
PBGatherPlot -m24 -v7 --host $PPMAC --dat gather1.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather0.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather1.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather2.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather3.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather4.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather5.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather6.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather7.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather8.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather9.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather10.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather11.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather12.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather13.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather14.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather15.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather16.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather17.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather18.txt
b2r
!sh PBGatherPlot -m24 -v7 --host SAR-CPPM-EXPMX1 --dat ../data_interfero_spd10/gather19.txt
Konstantfeder 2.6.2017
----------------------
cd ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX;PBInspect --cfg PBinspect.pbi --host SAR-CPPM-EXPMX1
cd ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg/;gpasciiCommander --host SAR-CPPM-EXPMX1 -i
!mx-stage()
//#1..3$
//move bottom left
#2,3$
Motor[2].PhasePos;Motor[3].PhasePos
Motor[2].PhasePos=310;Motor[3].PhasePos=1210
#2,3hmz
Motor[2].HomePos=Motor[2].HomePos+5000
Motor[3].HomePos=Motor[3].HomePos+5000
&1
#1..3j/
#2..3j=0
L2=Motor[2].MaxDac
L3=Motor[3].MaxDac
Motor[2].MaxDac=500
#2j+
enable plc 1
Motor[2].HomeVel=2
Motor[3].HomeVel=2
#2,3$
Homing 12.6.2017
---------------
cd ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX;PBInspect --cfg PBinspect.pbi --host SAR-CPPM-EXPMX1
cd ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg/;gpasciiCommander --host SAR-CPPM-EXPMX1 -i
!mx-stage()
//!init()
//!init_limit()
enable plc 1