I intend to control the position and speed of a BLDC motor (still to be selected) using field oriented control (FOC) and an Encoder to determine shaft position and speed.

From what I understand from FOC, the Id reference should be set to 0 as the and with Iq the torque is controlled. Iq can be set from a PI controller which works with the error signal between the reference shaft speed and the actual shaft speed.

What is still not clear to me is how could I control the position of the shaft? for example, moving from speed control (speed= 10sec/rev, position: don't care) to position control (speed= 0 rev/unittime, position 36°). Could this be done setting the reference speed to zero and adding a PI control (similar as with the speed) to control Id (instead of setting Id) to zero?

Thank you very much for your help. It is much appreciated

Edit: Something like this @user28910 @Gregory Kornblum? enter image description here

i.e. setting n_ref to zero and using pos_ref? and when speed control is desired, use n_ref but not adding the output of the PI controller what works with pos_ref and pos_real?

  • 1
    \$\begingroup\$ Are you developing a servo? Because if this is not your core business, buy other`s people servo. \$\endgroup\$
    – user76844
    Commented Feb 13, 2017 at 18:01

1 Answer 1


No, the direct-axis current Id is in the direction of the field, and is normally used to weaken the field for high speed operation or take advantage of the reluctance torque available in some motor designs.

To hold position you need to calculate a position error and using Iq adjust the torque so as to oppose changes from the reference position.

  • 2
    \$\begingroup\$ ...in other words to close position loop over current loop \$\endgroup\$
    – user76844
    Commented Feb 13, 2017 at 18:15
  • \$\begingroup\$ Hi user28910 and Gregory, thank you for the answers. I updated the main post with an image of how in understood. is that correct? Thanks in advance. \$\endgroup\$
    – gapsna
    Commented Feb 14, 2017 at 14:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.