Cassiano90
-
Posts
2 -
Joined
-
Last visited
Content Type
Profiles
Forums
Events
Downloads
Posts posted by Cassiano90
-
-
Hi all,
I'm using power brick LV to control a Aerotech planar stage 300DL (https://www.aerotech.com/product-catalog/stages/linear-x-y-stages/planardl.aspx) drived by the linear motor BLMC-142-A (https://www.aerotech.com/product-catalog/motors/linear-motor/blmc-series.aspx?p=%2fproduct-catalog%2fmotors%2flinear-motor.aspx%3f), 2 in parallel for each axes. The encoder is an RGSZ scale of 20um with an x1000 interpolation factor interface. I'm using the code bellow to configure e control the stage, but, even after the manual phasing procedure I can't move it more than a few milimeters, it's like the stage hits a hardstop(see figure attached), and the current limit kill the motor. Moving it by hand or by the Aerotech controler I can easily move the 300mm range. We already tryied to change the commutation direction and current limits but all lead to the same problem.
// Granite Z Linear brushless
Sys.WpKey = $AAAAAAAA
//Amp mode
BrickLV.Chan[0].TwoPhaseMode = 0 // Motor #7 amp output mode, 3-phase, brushless
BrickLV.Chan[0].I2tWarnOnly = 0 // Motor #7 Amp I2T action, kill motor & display fault
//Pwmsf
Motor[1].PwmSf = -0.95 * 16384
// I2T
GLOBAL Ch1MaxAdc = 33.85; // Max ADC reading [A peak] -–User Input
GLOBAL Ch1RmsPeakCur = 12; // RMS Peak Current [A rms] -–User Input
GLOBAL Ch1RmsContCur = 5; // RMS Continuous Current [A rms] --User Input(colocar 10% a mais)
GLOBAL Ch1TimeAtPeak = 1; // Time Allowed at peak [sec] --User Input
Motor[1].MaxDac = Ch1RmsPeakCur * 40132.44 / Ch1MaxAdc
Motor[1].I2TSet = Ch1RmsContCur * 40132.44 / Ch1MaxAdc
Motor[1].I2tTrip = (POW(Motor[1].MaxDac,2) - POW(Motor[1].I2TSet,2)) * Ch1TimeAtPeak
// Encoder - [counts]
Gate3[0].EncClockDiv = 2 //Set the encoder clock as 100/(2^(ClockDiv)) MHz
Gate3[0].Chan[0].EncCtrl = 3 // 3: x4 quadrature decode CW. 7: x4 quadrature decode CCW
EncTable[1].type = 1
EncTable[1].pEnc = PowerBrick[0].Chan[0].ServoCapt.a
EncTable[1].pEnc1 = Sys.Pushm
EncTable[1].index1 = 0
EncTable[1].index2 = 0
EncTable[1].index3 = 0
EncTable[1].index4 = 0
EncTable[1].index5 = 0
EncTable[1].ScaleFactor = 1 / (256)
Motor[1].pEncLoss = Gate3[0].Chan[0].Status.a // Points to the Channel
Motor[1].EncLossBit = 30 // bit 28: Loss Status; bit 30: Count Error
Motor[1].EncLossLevel = 1 // High true fault
Motor[1].EncLossLimit = 0
// Ongoing phase
GLOBAL RESMtr1 = 0.00002; // RES is the linear encoder resolution (a.k.a. pitch) in the same unit as the ECL (e.g. 1 µm = 0.001 mm)
GLOBAL ECLMtr1 = 25; // ECL is the linear motor electrical cycle length or magnetic pitch (e.g. 60.96 mm)
Motor[1].pPhaseEnc = PowerBrick[0].Chan[0].PhaseCapt.a
//Motor[1].PhaseEncLeftshift = 0
//Motor[1].PhaseEncRightshift = 0
Motor[1].PhasePosSf = 2048 * RESMtr1 / (256 * ECLMtr1)
// phasing
Motor[1].pAbsPhasePos = PowerBrick[0].Chan[0].Status.a
Motor[1].AbsPhasePosFormat = $0400030C // always for hall 120 spacing
Motor[1].AbsPhasePosSF = 2048 / 12 // 2048/12: if the PowerBrick[1].Chan[3].UVW transition is from 1 to 3. -2048/12: if the PowerBrick[1].Chan[3].UVW transition is from 3 to 1
Motor[1].AbsPhasePosOffset = 688 // is the phase position at that transition. Plot Motor[8].PhasePos and PowerBrick[1].Chan[3].UVW to get this point. Must manually phase the motor before
// Motor 8
Motor[1].ServoCtrl = 1
Motor[1].pEnc = EncTable[1].a
Motor[1].pEnc2 = EncTable[1].a
Motor[1].pLimits = PowerBrick[0].Chan[0].Status.a
Motor[1].AdcMask = $FFFC0000
Motor[1].AmpFaultLevel = 1
Motor[1].PhaseCtrl = 4
Motor[1].phaseMode=0
Motor[1].PhaseOffset = -683
// Motor 8 dynamic gains plus notch and low pass filters
Motor[1].IiGain=0.5
Motor[1].IpfGain=0
Motor[1].IpbGain=0.5
Motor[1].Servo.Kp=0.9
Motor[1].Servo.Kvfb=10
Motor[1].Servo.Kafb=0
Motor[1].Servo.Kvifb = 0
Motor[1].Servo.Ki = 1e-5
Motor[1].Servo.Kvff=0
Motor[1].Servo.Kviff=0
Motor[1].Servo.Kaff=0
Motor[1].Servo.Kfff=0
// Motor 8 speed and accel
Motor[1].FatalFeLimit = 200000 // max pos err: 1mm = 200.000 encoder counts
Motor[1].WarnFeLimit = Motor[1].FatalFeLimit/2
Motor[1].Servo.MaxPosErr= Motor[1].FatalFeLimit*5
Motor[1].MaxSpeed = 200 //4200
Motor[1].JogSpeed = 50//4200/3 // max speed: 21 mm/sec = 4200 counts / msec
Motor[1].JogTa = 1000
Motor[1].JogTs = 100
Motor[1].AbortTa = 5
Motor[1].AbortTs = 1
Motor[1].InPosBand = 50
Had anybody done this before, or saw something like this?
Thanks,
Linear Motor Control
in Power PMAC
Posted
Hi Richard, thanks for the reply!
The first image is the motor been moved by the delta tau controller, in the second image I'm moving the stage by hands.
I was looking at the halls because, the position that the stage stops, is always the same. I was trying to correlate to some phase transition. I will do a double check at the wirings anyway.
Regards,