Jump to content
OMRON Forums

Cassiano90

Members
  • Posts

    2
  • Joined

  • Last visited

Posts posted by Cassiano90

  1. 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,

  2. 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

×
×
  • Create New...