Jump to content
OMRON Forums

Linear Motor Control


Cassiano90

Recommended Posts

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,

Planar_problem.thumb.png.e1d88159a327749980c504962c2e054a.png

Hand_moving.thumb.png.b9dc97ec8076e92814b1cc6e55d034d1.png

Link to comment
Share on other sites

  • Replies 2
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

"Had anybody done this before, or saw something like this?"

Not sure what exactly do you mean.

 

But, I assume that you gathered this data when moving the motor by hand? And it seems like the actual position lags for ~1 sec.

Something in the wiring or input of the halls is not right since state 2 is missing. Why were you looking at the halls anyway?

Link to comment
Share on other sites

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,

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

×
×
  • Create New...