Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Motor[x].DesPos keeps 'drifting'
#1
Hello,
I am currently attempting to control a piezo-driver using the Powerbrick Controller. Now, since the piezo-driver accepts an analog signal of -2==> +10V, and also outputs an analog feedback signal between 0=> +10V I decided to use the following configuration:
- Powerbrick output: True DAC (single ended) with modified DacBias and MaxDac to keep within the -2 => +10V voltage range (same config as in page 145 of the Powerbrick Controller Manual)
- Powerbrick input: ADC (single ended) via X10 connector (same config as in page 76 of the Powerbrick Controller Manual)

After having set the configuration, I can freely output anything open loop (ex. #2out100), of which the ADC input shows a corresponding value holding constant while my command remains unchanged.

Sometimes (roughly 50% of the time) when I close the loop, I will have a drifting Motor[x].DesPos, despite not having commanded a movement. And since the motor is in closed loop, it will follow this 'drifting' trajectory indefinitely. I have included a screenshot of the 'drifting', here during a step move.
If Motor[x].DesPos is driftin, there could be three possible causes to this:
- Motor[x].Desired.Pos ==> NOT the source, holds constant
- Motor[x].ActiveMasterPos ==> NOT the source, holds constant
- Motor[x].CompDesPos ==> NOT the source, holds constant

Therefore this little problem leaves me abit stumped. Has anyone else encountered a similar problem?


Thanks in advance,
Christer


Attached Files Image(s)
   
Reply
#2
When the servo loop is open (amp enabled or disabled), PMAC copies the value of ActPos into DesPos every servo cycle (so there is no jump when the loop is closed again).

If the step move size exceeded your fatal following error limit, it could immediately have tripped the motor opening the loop.

With a piezo actuator, it appears you are trying to output a position command, but still close the position loop inside the PMAC. The dynamics of this are very unusual. Which PMAC servo algorithm are you using (Motor[x].Ctrl)?

I suspect your loop is open, and then you have a strange case of the desired position "chasing" the actual position each servo cycle.
Reply
#3
(04-15-2019, 04:48 PM)curtwilson Wrote: When the servo loop is open (amp enabled or disabled), PMAC copies the value of ActPos into DesPos every servo cycle (so there is no jump when the loop is closed again).

If the step move size exceeded your fatal following error limit, it could immediately have tripped the motor opening the loop.

With a piezo actuator, it appears you are trying to output a position command, but still close the position loop inside the PMAC. The dynamics of this are very unusual. Which PMAC servo algorithm are you using (Motor[x].Ctrl)?

I suspect your loop is open, and then you have a strange case of the desired position "chasing" the actual position each servo cycle.

Hi Curt and thanks for your response,
Yes, it would indeed seem that my 'closed-loop' configuration sometimes doesn't completely apply. The odd thing, is that sometimes it handles the closed-loop control just fine.
oh, and it seems that 'Motor[2].Ctrl=Sys.ServoCtrl'. I also included my configuration below. I am going to run a few more tests..


Code:
EncTable[2].pEnc = PowerBrick[0].Chan[2].AdcAmp[2].a;
EncTable[2].pEnc1 = Sys.pushm;
EncTable[2].index1 = 16;
EncTable[2].index2 = 16;
EncTable[2].index3 = 0;
EncTable[2].index4 = 0;
EncTable[2].index5 = 0;
EncTable[2].index6=0;
EncTable[2].ScaleFactor = 10000 / EXP2(16) / 32767;

Motor[2].pEnc = EncTable[2].a;
Motor[2].pEnc2 = EncTable[2].a;
Motor[2].PosSf = 1;
Motor[2].Pos2Sf = 1;
Motor[2].pAbsPos = PowerBrick[0].Chan[2].AdcAmp[2].a;
Motor[2].AbsPosFormat=$00002000;
Motor[2].AbsPosSf= 10000 / exp2(16) / 32767;
Motor[2].PowerOnMode= Motor[2].PowerOnMode | Bit2 | Bit1;


PowerBrick[0].DacStrobe = $7FFFE000;
PowerBrick[0].Chan[0].OutputMode |= 7;
PowerBrick[0].Chan[1].OutputMode |= 7;
PowerBrick[0].Chan[2].OutputMode |= 7;
PowerBrick[0].Chan[3].OutputMode |= 7;
PowerBrick[0].Chan[1].OutputPol = 0; // True DAC output on PBR CTRL can not be inversed.

Motor[2].Ctrl = Sys.ServoCtrl;
Motor[2].ServoCtrl = 1;
Motor[2].PhaseCtrl = 0;  
Motor[2].AdcMask = $FFF00000;
Motor[2].pAdc  =0;    
Motor[2].pDac = PowerBrick[0].Chan[1].Dac[0].a;
Motor[2].pLimits = 0;  
Motor[2].pAmpEnable=PowerBrick[0].Chan[1].OutCtrl.a;  
Motor[2].pAmpFault=PowerBrick[0].Chan[1].OutCtrl.a;
Motor[2].AmpFaultLevel = 1;
Motor[2].PwmSf = 32767;
Motor[2].MaxDac = 32767 * (6/10);
Motor[2].DacBias = 32767 * (4/10);
Motor[2].FaultMode = 0;
Motor[2].AmpEnableBit = 8;
Motor[2].AmpFaultBit = 7;
Motor[2].LimitBits = 9;
Reply
#4
A few basic questions about your configuration:

Does the analog PMAC output to the piezo driver represent a desired position? (This is true for most of the piezo drivers I have worked with.)

Assuming the answer to the first question is "yes" , does the piezo driver (attempt to) close the loop between the command value from the controller and the feedback value from the sensor? (Again, this is true for most of the piezo drivers I have worked with.)

If the answer to both of these questions is "yes", then you should not also be trying to close the loop in PMAC. For systems of this type, people set Motor[x].Ctrl=Sys.PosCtrl so PMAC outputs a (properly formatted) position command output and does not try to close the loop. In these systems, PMAC does (can) monitor the actual feedback value, but does not use it as an input to the feedback loop.

But PMAC does use the received actual position value to check for excessive following error, as in all servo algorithms. In the example you set, was the size of your step larger than the value of Motor[x].FatalFeLimit?
Reply
#5
(04-16-2019, 09:57 AM)curtwilson Wrote: Does the analog PMAC output to the piezo driver represent a desired position?...

Yes!

(04-16-2019, 09:57 AM)curtwilson Wrote: ...does the piezo driver (attempt to) close the loop between the command value from the controller and the feedback value from the sensor?...

Also yes!

Ok thanks for your input, I will try the Sys.PosCtrl configuration instead!

Edit1:
So I tried the Sys.PosCtrl config, but I still have the same error. The Motor[x].DesPos is still drifting (but now at least the motor isn't attempting to follow the reference trajectory)


Edit2:
So I have included two screenshots of the watch containing the three factors that can change DesPos (Desired.Pos, ActiveMasterPos, CompDesPos), with motor OFF (left) and motor ON (to the right, with drifts). This is a configuration using Sys.ServoCtrl
As one can see (in the second picture, to the right), when the motor is ON and DesPos is drifting, but NOT Desired.Pos. How come?


Attached Files Image(s)
       
Reply
#6
As I said before, I believe that your servo loop is open (Motor[x].ClosedLoop = 0). When this happens, PMAC copies the value of Motor[x].ActPos into Motor[x].DesPos.

I suspect that when you do a step move, you trip the fatal following error limit. What is the value of Motor[x].FatalFeLimit and how does it compare to your step size? Does the Motor[x].FeFatal status bit get set?

(You can use the motor status monitoring window in the IDE to see many of these bits.)

Does your piezo drive have an "amp enable" input?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)