Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
AbsPosSf power on problems
#1
Hi all!

I am working on a project that should take the mean value of two 26 bits absolute renishaw encoders. I get some power-on postion problems with this mean operation, scale factors and etc. I will separate it into topics:

1. Incorrect sum when try to get the raw serial registers into EncTable

I had an incorrect value of the sum when I point to serial encoder raw register. The register values are:

Acc84B[0].Chan[3].SerialEncDataA=3510848
Acc84B[0].Chan[3].SerialEncDataB=196609
Acc84B[1].Chan[0].SerialEncDataA=10368788
Acc84B[1].Chan[0].SerialEncDataB=196608

Doing the correct calculations, we have to do SerialEncDataA+(SerialEncDataB & 3)(remember that it is a 26 bit encoder) and I shoud get 20288064 on Acc84B[0].Chan[3] and 10368788 on Acc84B[1].Chan[0]. My EncTable:

//****************************************************************************************
// Serial encoder settings
Acc84B[0].Chan[3].SerialEncCmd = $21149A
Acc84B[1].Chan[0].SerialEncCmd = $21149A

//Average
EncTable[17].type = 8
EncTable[17].pEnc = Acc84B[0].Chan[3].SerialEncDataA.a
EncTable[17].pEnc1 = Acc84B[1].Chan[0].SerialEncDataA.a
EncTable[17].index1 = 0
EncTable[17].index2 = 8
EncTable[17].index3 = 0
EncTable[17].index4 = 0
EncTable[17].MaxDelta = 0
EncTable[17].ScaleFactor = 1

Should give me the sum 30656852. First strange thing is that my EncTable[17].PrevEnc return me -2897581 on watch window (Disconsider eventually LSB variations, my encoder has 1 nm resolution and it is very sensible). This value is negative, which makes me think that ther is an representation issue.

The power-on position has problems to, here is the code snippet fo power-on:

//****************************************************************************************
// PowerOn Position
Motor[7].PowerOnMode = 6
Motor[7].pAbsPos = EncTable[17].PrevEnc.a
Motor[7].pAbsPos2 = Sys.Pushm
Motor[7].AbsPosFormat = $00001A00
Motor[7].AbsPosSF = 1

And the position on position window is 64211285 (Disconsider eventually LSB variations, my encoder has 1 nm resolution and it is very sensible). I did save and $$$ to get the power-on position.

2. Most significant register does not read by EncTable

I tryed change the bits operation, set index2 as 0 and put the bit displacement on scale factor as 1/256, as follows:

//****************************************************************************************
// Serial encoder settings
Acc84B[0].Chan[3].SerialEncCmd = $21149A
Acc84B[1].Chan[0].SerialEncCmd = $21149A

//Average
EncTable[17].type = 8
EncTable[17].pEnc = Acc84B[0].Chan[3].SerialEncDataA.a
EncTable[17].pEnc1 = Acc84B[1].Chan[0].SerialEncDataA.a
EncTable[17].index1 = 0
EncTable[17].index2 = 0
EncTable[17].index3 = 0
EncTable[17].index4 = 0
EncTable[17].MaxDelta = 0
EncTable[17].ScaleFactor = 1/256

The power-on position settings should now point to start bit 8, as follows:

//****************************************************************************************
// PowerOn Position
Motor[7].PowerOnMode = 6
Motor[7].pAbsPos = EncTable[17].PrevEnc.a
Motor[7].pAbsPos2 = Sys.Pushm
Motor[7].AbsPosFormat = $00001A08
Motor[7].AbsPosSF = 1

Doing save and $$$ with those settings I get 13879645 (Disconsider eventually LSB variations, my encoder has 1 nm resolution and it is very sensible), which is the sum of Acc84B[0].Chan[3].SerialEncDataA with Acc84B[1].Chan[0].SerialEncDataA (the less significant ones). This makes me think that this summation is ignoring the most significant registers SerialEncDataB.

3. Type 2 EncTables and scale factor problem

Due to those problems I tried to use type 2 EncTable to automatic concatenate the both SerialEncData registers into a 32 bit register. So, my EncTable now looks like that:

//****************************************************************************************
// Serial encoder settings
Acc84B[0].Chan[3].SerialEncCmd = $21149A
Acc84B[1].Chan[0].SerialEncCmd = $21149A

EncTable[27].type = 2
EncTable[27].pEnc = Acc84B[0].Chan[3].SerialEncDataA.a
EncTable[27].pEnc1 = Acc84B[0].Chan[3].SerialEncDataB.a
EncTable[27].index1 = 0
EncTable[27].index2 = 0
EncTable[27].index3 = 0
EncTable[27].index4 = 0
EncTable[27].MaxDelta = 0
EncTable[27].ScaleFactor = 1


EncTable[37].type = 2
EncTable[37].pEnc = Acc84B[1].Chan[0].SerialEncDataA.a
EncTable[37].pEnc1 = Acc84B[1].Chan[0].SerialEncDataB.a
EncTable[37].index1 = 0
EncTable[37].index2 = 0
EncTable[37].index3 = 0
EncTable[37].index4 = 0
EncTable[37].MaxDelta = 0
EncTable[37].ScaleFactor = 1

//Average
EncTable[17].type = 8
EncTable[17].pEnc = EncTable[27].PrevEnc.a
EncTable[17].pEnc1 = EncTable[37].PrevEnc.a
EncTable[17].index1 = 0
EncTable[17].index2 = 0
EncTable[17].index3 = 0
EncTable[17].index4 = 0
EncTable[17].MaxDelta = 0
EncTable[17].ScaleFactor = 1

and my power-on position settings are:

//****************************************************************************************
// PowerOn Position
Motor[PIEZO_MOTOR].PowerOnMode = 6
Motor[PIEZO_MOTOR].pAbsPos = EncTable[17].PrevEnc.a
Motor[PIEZO_MOTOR].pAbsPos2 = Sys.Pushm
Motor[PIEZO_MOTOR].AbsPosFormat = $00002000
Motor[PIEZO_MOTOR].AbsPosSF = 1

Now I get the correct answer for summation. Since I have to take the average between those two encoders, I did, on EncTable settings:

EncTable[17].ScaleFactor = 1/2

and on Power-on settings:

Motor[7].AbsPosSF = 1/2

Indeed, I get 15328431.5. But things get weired when I try to manipulate scale factors. If I set EncTable scale factor as

EncTable[17].ScaleFactor = 1

The result return to 30656852 as power-on position. The software manual says:

"It is a 32-bit integer value that has not been multiplied by the saved setup element EncTable[n].ScaleFactor."

About EncTable[n].PrevEnc. So modifying EncTable scale factor should not affect power-on position, in theory. But it is changing. Other problem is that the AbsPosSf does not affect the power-on position, only EncTable scale factor. If I set

EncTable[17].ScaleFactor = 1/2

and

Motor[7].AbsPosSF = 2 or 3 or 100

The result after save and $$$ is always the same: 15328431.5.

I am using firmware 2.5.0.4, but this happens to 2.4.0.180 too. I did the same tests downgrading the firmware and the results were always the same.

Thank you
George
Reply
#2
1. Incorrect sum when try to get the raw serial registers into EncTable.

Quote:Acc84B[0].Chan[3].SerialEncDataA=3510848
Acc84B[0].Chan[3].SerialEncDataB=196609
Acc84B[1].Chan[0].SerialEncDataA=10368788
Acc84B[1].Chan[0].SerialEncDataB=196608

Doing the correct calculations, we have to do SerialEncDataA+(SerialEncDataB & 3)(remember that it is a 26 bit encoder) and I shoud get 20288064 on Acc84B[0].Chan[3] and 10368788 on Acc84B[1].Chan[0]. My EncTable:
I am a bit confused here. The first 24 bits of your position are in SerialEncDataA with the remaining 2 bits in SerialEncDataB. This means calculating your total position would be require left shifting SerialEncDataB like:
SerialEncDataA+(SerialEncDataB & $3) << 24

Quote:EncTable[17].type = 8
EncTable[17].pEnc = Acc84B[0].Chan[3].SerialEncDataA.a
EncTable[17].pEnc1 = Acc84B[1].Chan[0].SerialEncDataA.a
EncTable[17].index1 = 0
EncTable[17].index2 = 8
EncTable[17].index3 = 0
EncTable[17].index4 = 0
EncTable[17].MaxDelta = 0
EncTable[17].ScaleFactor = 1

I see a couple issues with shifting here.
Symmetry: The way index 1 and 2 work for the first source is how index 3 and 4 work for the second source. So you will need to shift both numbers the same amount.
MSB: To handle roll over correctly, the most significant bit of your position should be bit number 31.
SerialEncDataA has values in the high 24 bits of a 32 bit register when viewed by the firmware or in C (the low 24 bits when viewed in script). This means if we right shift 8 bits to clear any garbage data, we will want to left shift afterwards.

Code:
EncTable[17].type = 8
EncTable[17].pEnc = Acc84B[0].Chan[3].SerialEncDataA.a
EncTable[17].pEnc1 = Acc84B[1].Chan[0].SerialEncDataA.a
EncTable[17].index1 = 8
EncTable[17].index2 = 8
EncTable[17].index3 = 8
EncTable[17].index4 = 8
EncTable[17].MaxDelta = 0
EncTable[17].ScaleFactor = 1/256
Alternatively, index 1-4 can all be left at 0 as there is no garbage data to remove.

Quote:The power-on position has problems to, here is the code snippet fo power-on:
Motor[7].PowerOnMode = 6
Motor[7].pAbsPos = EncTable[17].PrevEnc.a
Motor[7].pAbsPos2 = Sys.Pushm
Motor[7].AbsPosFormat = $00001A00
Motor[7].AbsPosSF = 1
Try Motor[7].AbsPosFormat = $00001A08
I'm not sure going through the encoder conversion table and using power on mode is a good idea to read initial position, but nothing is going wrong with using the method for me.

I can take a look at the rest of the question later, hoping this is a good start for you.
Reply
#3
Quote:2. Most significant register does not read by EncTable
This makes me think that this summation is ignoring the most significant registers SerialEncDataB.

Yes, 100%. The encoder table is only reading SerialEncDataA

Quote:3. Type 2 EncTables and scale factor problem

EncTable[27].type = 2
EncTable[37].type = 2
EncTable[17].type = 8
Not a big deal, but I believe the ECT entry that is type 8 should be the highest index. When enctable 17 runs, 27 and 37 have not yet run that cycle and must use positions from last servo period.

Quote:About EncTable[n].PrevEnc. So modifying EncTable scale factor should not affect power-on position, in theory. But it is changing. Other problem is that the AbsPosSf does not affect the power-on position, only EncTable scale factor. If I set

EncTable[17].ScaleFactor = 1/2

and

Motor[7].AbsPosSF = 2 or 3 or 100

The result after save and $$$ is always the same: 15328431.5.
I can't replicate this result. Can you check the value of Motor[7].AbsPosSF in the terminal after save and $$$? It may be reverting back to the value in global includes files that run at boot.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)