Jump to content
OMRON Forums

Id/IqMeas: Moving average filter


Recommended Posts

We are using the Power PMAC configured for direct PWM control of Geo Drives, and are looking for ways to reduce electrically induced torque ripple, possibly by filtering current feedback.


A similar issue was previously discussed in a now closed thread, however attempted with a background plc routine: http://forums.deltatau.com/showthread.php?tid=756


Our phase routines are executed at 16kHz, with the servo loop at 1kHz. This means we have effectively 16 current samples between each new IqCmd, however, any processing of current feedback values degrades performance of the current loop by the latency factor introduced (<16 samples).


If we implement a moving average filter on the direct & quadrature axis feedback currents (<16 samples), this could/should assist in removing random noise, while minimally impacting the servo step response.


Implementing the moving average filter on the current feedback effectively means that phase commutation must be performed manually in the phase routine, as IdMeas & IqMeas will not be used directly in closing the current loop.


Any thoughts on this approach? I imagine that for the relative short moving average length, any gains may be insignificant or not worth the custom phase routine development.

Link to comment
Share on other sites

  • Replies 3
  • Created
  • Last Reply

Top Posters In This Topic

If you want to calculate a moving average filter of your phase current feedback readings, the best way is to do it in a user-written phase for Motor 0. Motor[0].PhaseCtrl would be set to 1 to enable this task for the virtual motor. This algorithm would calculate the running average and leave the averaged values in two consecutive registers in the user shared memory buffer, e.g. Sys.Idata[256] and Sys.Idata[257]. Of course the values from which the average is computed could also be stored in this buffer.


Then for your real motor, you would set Motor[x].pAdc to the address of the first register (averaged Phase A), e.g. Motor[x].pAdc = Sys.Idata[256].a. You can use the standard algorithm this way.


Of course there is an inevitable trade-off between noise reduction and time delay.


Some users who want great smoothness of motion are disabling the current loop completely and running the motor in "voltage mode". This mode is enabled by setting bit 3 (value 8) of Motor[x].PhaseMode to 1. (Requires V2.1 or newer firmware). This is described in the User's Manual. You lose a little responsiveness, but you should find smoother operation.

Link to comment
Share on other sites

Sounds good. We shall create a phase routine assigned to the enabled virtual motor, and experiment with the number of averaging samples.


We would likely go for effective "voltage mode" control, however, accurate torque control is critical for our application. What we could do is reduce the forward path gain pair relative to Ipbgain, which would bring performance closer to that of voltage mode control.


Also, just to confirm (apologies for the slight inquiry deviation), given that any filtering effectively delays the current feedback, Motor[x].AdvGain should likely be nonzero & defined as a function of the filter number of samples. According to the manual, this would normally only be done for commutation frequencies exceeding 1kHz.



Link to comment
Share on other sites

This topic is now closed to further replies.

  • Create New...