1
\$\begingroup\$

I am trying to build a BLDC motor controller using field oriented control. The motor I am going to use is equipped with hall sensors as well as with an incremental encoder that has 512 steps. I have implemented a SVPWM and the Clarke and Park transformations. However I encounter one problem. For correct commutation, the field oriented control needs to know the rotor position. However, at startup, the encoder does not give a correct position, because it is just an incremental encoder. On the other hand, if I use the hall sensors for startup, the rotor angle may be wrong up to 30 degrees, so I wonder what possibilities there are to properly align the encoder counts with the actual rotor position. One approach could be to force one voltage vector, wait until the motor has moved to that position and then initialise the encoder counter to that position. But this has the disadvantage that the motor needs to move shortly for the initialisation.

What are better options to initialise the encoder?

Further, the encoder gives the mechanical position. I assume, for the field oriented control, the electrical position is required, so I need to know the electrical position. How should I convert the encoder posotion (mechanical! 0 to 511 counts for 360°) to the electrical angle? just multiply with the number of poles? don't I lose some resolution of the encoder by doing that?

\$\endgroup\$
1
  • \$\begingroup\$ "But this has the disadvantage that the motor needs to move shortly for the initialisation." - if that is a problem then you need a better encoder. But why is it a problem? \$\endgroup\$ Sep 19, 2021 at 2:44

1 Answer 1

1
\$\begingroup\$

Motor controllers implement typically a "commutation phase" upon power-up. That is - blindly applying gradual and small coil current and establishing the angle. You may do it by moving between two electrical vector angles - applying gradually rising current to coil "A" while you observe the encoder moving (until you reach the steady position or your conservative current limit) and repeating for an adjacent coil "B". That way you can split the difference caused by mechanical friction. Then you establish your base angle and reset your incremental encoder coordinates accordingly.

The caveat here is that this may be done only when the system can tolerate some (small but random) move at the power up when you are aligning your phase.

There are many more sophisticated implementations but this seems to be the common principle.

\$\endgroup\$
1
  • \$\begingroup\$ thanks, this method is simple and does work. However it seems unsuitable to me if an initial rotor movement is not possible or not allowed. So what other methods are there that are possible to implement? I will be using a STM32 microcontroller, so no really sophisticated, fancy, ultra-high speed DSP performance is available. \$\endgroup\$
    – T. Pluess
    Sep 19, 2021 at 15:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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