OMRON Forums

# Scaling Motor Units

## Recommended Posts

Using a PowerBrickLV 5/15A

Hi, we realized that we do not reach the same accuracy when tuning a motor and scaling motor units to user units. It becomes worse as the the scaling increases. In the worst case we have ~26222 motor units per user unit. We assume that there are rounding errors causing the problem. Therefore we wondered if there is a function which allows us to work in raw motor units and get the position output in user units. Ideally we would also like to be able to input the acceleration and speed parameters in user units.

If it is not possible my workaround would be to have a plc running in the background which does the conversion, or is there maybe a best practice?

Best regards,

hannsx

• Replies 12
• Created

#### Posted Images

Are you adjusting your gains to compensate for changing your position scale factor? If you halve Motor[x].PosSf and Motor[x].Pos2Sf, then you should double all the servo loop gains besides Ki and Kfff.

It is generally a good idea to scale position units before tuning.

##### Share on other sites

I tried to tune the motors In scaled units. From earlier experiments I learned that the scaling of the servo-parameters is not always inverse to the scaling. But maybe it was because of my bad tuning. So do the equations give an exact inverse relationship between PosSf, Pos2Sf and the servo - parameters? I did not expect that because the equations usually turns into one with the servo-parameters showing up in the nominator and denominator and maybe not in a linear way.
##### Share on other sites

Both the scale factors PosSf and Pos2Sf, and the gain terms are simple multiplications. For example, if you have Pos2Sf=1.0 and Kvfb=400, if you change Pos2Sf to 0.001 and Kvfb to 400,000, you will get the same result.

The double-precision (64-bit) floating-point math used here has so much resolution and range that there are no numerical issues in doing this type of change.

##### Share on other sites

Both the scale factors PosSf and Pos2Sf, and the gain terms are simple multiplications. For example, if you have Pos2Sf=1.0 and Kvfb=400, if you change Pos2Sf to 0.001 and Kvfb to 400,000, you will get the same result.

The double-precision (64-bit) floating-point math used here has so much resolution and range that there are no numerical issues in doing this type of change.

Ok, thanks - that should make it a lot easier.

##### Share on other sites

• 1 month later...

I tried that now and I do not get the same Performance when I scale the motor units. I guess there is an error in the way I scale the parameters. This is my setup code. Let me know if you see any errors or flaws in it.

// ULT127-A-45-A-N-001

/////////////////////////////////////////////////////////////////////////////////

// Motor[4] // Brushless-Motor 9,440,000 cts/rev / 12 pole pairs ///////

/////////////////////////////////////////////////////////////////////////////////

Motor[4].pLimits = 0

Motor[4].LimitBits = 9

Motor[4].AmpFaultLevel = 1

Motor[4].PhaseCtrl = 4

Motor[4].PhaseOffset = 683

Motor[4].PwmSf = 0.95 * 16384

Motor[4].PosSf = 360/9440000

Motor[4].Pos2Sf = 360/9440000

global Mtr4ScaleFactor = Motor[4].PosSf

// Einstellungen fuer die Kommutierung

Motor[4].pPhaseEnc=PowerBrick[0].Chan[3].PhaseCapt.a

Motor[4].PhaseEncLeftshift = 0

Motor[4].PhaseEncRightshift = 0

Motor[4].PhasePosSf = 2048 / ( Mtr4CtsPerCommCycle * 256 )

PowerBrick[0].Chan[3].EncCtrl = 3

Motor[4].pAmpFault = PowerBrick[0].Chan[3].Status.a

Motor[4].MaxDac = Ch4PeakCur * 28378 / Ch4MaxAdc

Motor[4].I2tSet = Ch4ContCur * 28378 / Ch4MaxAdc

Motor[4].I2tTrip = ( pow(Motor[4].MaxDac,2) - pow(Motor[4].I2TSet,2) ) * Ch4TimeAtPeak

Motor[4].PhaseFindingDac = Motor[4].I2TSet / 2

Motor[4].PhaseFindingTime = Mtr4PhasingTime * 5

Motor[4].AbsPhasePosOffset = 2048 / 12000

Motor[4].IiGain = 3.2463031

Motor[4].IpfGain = 0

Motor[4].IpbGain = 46.935429

Motor[4].Servo.Kp = 1.8 / Mtr4ScaleFactor

Motor[4].Servo.Kvfb = 150 / Mtr4ScaleFactor

Motor[4].Servo.Ki = 0.0015 / Mtr4ScaleFactor

// Here I transform the values which I set in [sec] in the settings file

Motor[4].jogspeed= ( Mtr4JogSpeed * Mtr4ScaleFactor ) / ( 1000 )

Motor[4].JogTa= -( ( 1000 * 1000 ) / ( Mtr4Accel * Mtr4ScaleFactor ) )

Motor[4].JogTs= -( (1000 * 1000 * 1000) / ( Mtr4Jerk * Mtr4ScaleFactor ) )

Motor[4].MaxSpeed= ( Mtr4MaxJogSpeed * Mtr4ScaleFactor ) / 1000

Motor[4].InvAmax= ( 1000 * 1000 ) / ( Mtr4MaxAccel * Mtr4ScaleFactor )

Motor[4].InvDmax= ( 1000 * 1000 ) / ( Mtr4MaxAccel * Mtr4ScaleFactor )

Motor[4].InvJmax= ( 1000 * 1000 * 1000 ) / ( Mtr4MaxJerk * Mtr4ScaleFactor )

Motor[4].HomeVel = Motor[4].JogSpeed

Motor[4].WarnFeLimit=40000 * Mtr4ScaleFactor

Motor[4].FatalFeLimit=80000 * Mtr4ScaleFactor

Motor[4].FeFatal=1

Motor[4].Servo.MaxPosErr=40000 * Mtr4ScaleFactor

Motor[4].Servo.MaxInt=40000 * Mtr4ScaleFactor

Motor[4].InPosBand= 0.5 * Mtr4ScaleFactor

Motor[4].Servo.BreakPosErr = 0 * Mtr4ScaleFactor

Motor[4].Servo.Kbreak = 0

motor[4].servo.swzvint=0

##### Share on other sites

I believe this line is a mistake, the integral gain does not need to be scaled.

Motor[4].Servo.Ki = 0.0015 / Mtr4ScaleFactor

Are you using Motor[4].Servo.Kvff or Motor[4].Servo.Kaff?

##### Share on other sites

I believe this line is a mistake, the integral gain does not need to be scaled.

Motor[4].Servo.Ki = 0.0015 / Mtr4ScaleFactor

Are you using Motor[4].Servo.Kvff or Motor[4].Servo.Kaff?

Thank you for your tip, but it did not improve the performance. Before I thought I had to scale all parameters, I did not examine the Servo-Block-Diagram for it. I do not use either Kvff or Kaff.

##### Share on other sites

It looks like, if the motor worked in counts you should have the right information in your post (as long as ki is not scaled) to use it with the scale factor.

Can you share the project?

##### Share on other sites

It looks like, if the motor worked in counts you should have the right information in your post (as long as ki is not scaled) to use it with the scale factor.

Can you share the project?

Yes, of course. I cannot attach it as a zip-file. What kind of files can I attach? I would not want to attach each file byitself.

##### Share on other sites

• 2 weeks later...

I'm a little confused looking at this. It doesn't look like the working version with PosSf=1, it's applied to some places but not to the motor gains.

Does open loop work? PhasePosSf looks fishy to me for serial.

##### Share on other sites

• 2 months later...

I'm a little confused looking at this. It doesn't look like the working version with PosSf=1, it's applied to some places but not to the motor gains.

Does open loop work? PhasePosSf looks fishy to me for serial.

Hi, sorry for not answering. I see that my file looks confusing. In that file I also made the mistake of applying the scaling to the motor[x].ki value. However I corrected this and still had the same problem. So yes, open loop works and the motor moves, but it does not reach the same precision any more. I guess our requirements also are a bit out of the ordinary. We have an ultraprecise actuator for which one Encoder coutn equals 0.325nm. Then we want to operate it on micro meter scale and therefore want it to precise to 0.001 counts.

##### Share on other sites

This topic is now closed to further replies.

### Announcements

×
• Forums

• Events
• #### Browse

×
• Create New...