I am trying to control a 3-phase BLDC motor. I have already done 6-step commutation, which works fine. Now I am going for sinusoidal control. I have studied more about sinusoidal control in BLDC and got some idea.

  • I created a sine look up table for 360° using 127.5 + 127.5(sin x) for 0 < x < 2·π rad
  • My table size is 28 = 256
  • Table: {127,.....255......127......0......127}
  • By using the table I get a good sine wave, and I also generated 3 sine waves which are phase shifted 120° from each other.

enter image description here

enter image description here

I am struggling how to interface this sine LUT with Hall sensor angles. I know that by using PLL logic we can achieve this.

Could someone explain Hall sensor synchronization with sine LUT?


enter image description here

In the above image, yellow= input PWM to FET & green = phase A to GND.

The output wave looks OK but the motor consumes more than 10 A at 15 Hz speed. Any guess why it is like that?

  • \$\begingroup\$ Usually it is done with FOC + SVPWM, else you have nowhere to use the feedback. \$\endgroup\$ Jan 29, 2020 at 8:40
  • \$\begingroup\$ Before going for FOC and space vector, i like to control using SPWM(sinusoidal commutation). \$\endgroup\$
    – Bud
    Jan 29, 2020 at 10:11
  • \$\begingroup\$ @bud Make a timer triggered/reset by the hall sensor edges. Use the timer and the assumption the RPM between current and previous cycle is the same to interpolate rotor position. Use this to simulate an encoder position signal. \$\endgroup\$
    – DKNguyen
    Jan 29, 2020 at 14:10
  • \$\begingroup\$ Do it open loop, at this point it doesn't matter. Make a ramping setpoint up/down, if the motor stalls, then you will notice it. \$\endgroup\$ Jan 29, 2020 at 14:24
  • \$\begingroup\$ @dknguyen , actually i used timer to calculate rpm using hall sensor signal. But my doubt is how to synchronization the rpm data with sin LUT table (spwm). could you give a example or small logic code so that understand even better. \$\endgroup\$
    – Bud
    Jan 29, 2020 at 17:10

1 Answer 1


You're on the right track. It looks like your PWM is implemented correctly. I do recommend writing an SVM PWM modulation routine, as you will need it down the line. You should also try and get your motor to spin open loop using either sinusoidal PWM or SVM PWM. It should spin smoothly without drawing a significant amount of current.

With respect to your hall sensor, you have a few problems to sort out. If you're using the low-res 3 phase type of encoder, you'll have to figure out a way to interpolate it based on your estimated motor RPM to get a continuous angle. This probably won't work terribly well at slow speeds.

Once you have a continuous rotor angle estimation, you'll likely have some nonzero offset angle between your true electrical/rotor angle and the angle you're pulling from your encoder. If this offset is large, your motor will spin inefficiently. If it's too large, it won't spin at all. You're going to need to figure out some way of taking this offset out.

Finally, the simplest way to put these components together is with inverse park + inverse clarke (i.e. SVM PWM...) transforms. If you have a PMBLDC motor, set your D term to 0, set your Q term to some fixed value, and use your encoder angle for theta. This is essentially the same as running a brushed dc motor with a fixed supply voltage; if you have the correct relationship between your encoder angle and your rotor angle, your motor will spin.

  • \$\begingroup\$ You can also do an inverse park + inverse clarke transform with a fixed Q term, zero D term, and a linearly increasing injected value of theta; this is the same as open loop commutation, and could be a useful debugging step \$\endgroup\$
    – Ocanath
    Jan 29, 2020 at 18:52
  • \$\begingroup\$ Open loop in the sense, by driving the motor with 3 sin wave (120 degree shifted each other) with getting the knowledge of Hall sensor (RPM data). Right? \$\endgroup\$
    – Bud
    Jan 31, 2020 at 6:34
  • \$\begingroup\$ yep, or with 3 svm voltage waveforms and no knowledge of the sensor data. bonus points if you are generating those waveforms from inverse park \$\endgroup\$
    – Ocanath
    Jan 31, 2020 at 13:39
  • \$\begingroup\$ Yes i done in open loop configuration, and the output waveform is attached in the edited content. But still my motor sucks more than 10 amp. And what is inverse park basically. \$\endgroup\$
    – Bud
    Feb 1, 2020 at 5:35
  • \$\begingroup\$ lower your equivalent phase voltage when you're doing open loop commutation, your current draw will go down. As for inverse park, that answer is too large to put in a comment. If you're still confused after researching it a bit, post another question to SE \$\endgroup\$
    – Ocanath
    Feb 2, 2020 at 19:25

Your Answer

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

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