diff --git a/Readme.md b/Readme.md index 304a3e8..e450ae8 100644 --- a/Readme.md +++ b/Readme.md @@ -5,6 +5,11 @@ Various motor documents Parker stage ------------ - encoder is incremental encoder +25mm or 50mm travel stage +Stall Current Continuous 0.8 +Peak Current Amps RMS 2.4 (->sqrt(2)*2.4=3.39A_peak) +Resistance Ohms 8.8 +Inductance mH 2.4 Mecapion rot stage @@ -23,37 +28,377 @@ http://www.inmoco.co.uk/Upload/product/1037_DD_Series_Motors_79.pdf - Rated Current 1.46 Arms - Max Current 4.38 Arms -Test servo motor ----------------- -``` -QBL 4208-41-04-006 -No. of Pole 8 -No. of Phase 3 -Rated Voltage 24V -Rated Phase Current 1.79A -Rated Speed 4000RPM + +************************ + +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 -Hall sensors are setup to be used as encoder: -encctrl=7 # x4 quadrature decode CCW -encctrl=3 # x4 quadrature decode CW -encctrl=11# x6 Hall-format decode CW -encctrl=15# x6 Hall-format decode CCW +Open Loop +--------- +20mm = 1003994 enc_step +20mm = 1'000'000 enc_step -> 20nm/enc step +1 pole= 600'000 enc_step -> 12mm -Gate3[$gate].Chan[$chan].EncCtrl = $encctrl -//================ encoder table ========================== -EncTable[$tbl].type = 1 -EncTable[$tbl].pEnc = Gate3[$gate].Chan[$chan].ServoCapt.a -EncTable[$tbl].pEnc1 = Sys.pushm -EncTable[$tbl].index1 = 0 -EncTable[$tbl].index2 = 0 -EncTable[$tbl].index3 = 0 -EncTable[$tbl].index4 = 0 -EncTable[$tbl].index5 = 0 -EncTable[$tbl].ScaleFactor = 1/256 -``` + +>>>>>>>>>> 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= 600'000 enc_step =12mm + +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<<< +servoSf : motorusteps/userUnits + +!encoder_inc(enc=1,tbl=1,mot=1,encctrl=7,posSf=12000./600000) +!motor(mot=1,dirCur=0,contCur=500,peakCur=2400,timeAtPeak=1,IiGain=1,IpfGain=0,IpbGain=2,JogSpeed=6.,numPhase=3,invDir=True,servoSf=2048/12000.) + +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 + + +>>> 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 + + + +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=95,PhaseFindingTime=22) +!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 + + +************* +>>> 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) + +#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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +> + +> + diff --git a/cfg/mx-stage.cfg b/cfg/mx-stage.cfg index 6c84ce8..e468994 100644 --- a/cfg/mx-stage.cfg +++ b/cfg/mx-stage.cfg @@ -19,7 +19,7 @@ //-------- !encoder_sim(enc=1,tbl=1,mot=1) -!encoder_inc(enc=1,tbl=9,mot=9,encctrl=11) //encctrl=15 Hall sensor encoder +!encoder_inc(enc=1,tbl=9,mot=9,encctrl=15) //encctrl=11 Hall sensor encoder !encoder_inc(enc=2,tbl=10,mot=10,posSf=1.) // incremental encoder //real limits in closed loop (does not work with simulated encoder)