Showing results for 
Search instead for 
Did you mean: 

Any suggestions on increasing motor speed resolution?

Senior II

I am operating a low inertia BLDC Motor with the STM32 FOC Motor control library. I have modified the code to add an outermost loop that provides phase lock control to an external reference.

The one limitation I have is that I think the inner speed loop has a speed resolution that is too coarse to achieve the phase accuracy I need.

As example, for an RPM of 1800 the revolution is 30Hz. In the STM32 code using speed unit _001HZ, the 30Hz speed reference is 3000. I believe I need a resolution 3-4 times greater such that 30Hz is commanded with speed command 10000 for example.

Are there any suggestions on how I might achieve this? Somehow I need to change the calculation of the speed to have a greater resolution. My maximum speed is not more than 2400rpm so I would not be limited by the 16-bit limit of speed magnitude variable.

With the 5.Y.4 code release I can now at least look at all source code and see how things work. I would greatly appreciate all pointers or suggestions.



Quentin Ch
Associate III

Hello, I may be facing the same issue while trying to drive a BLDC at low speed (<100RMP).

Did you find a solution ?

Senior II

How many pole-pairs does the motor have? What PWM frequency are you using? What closed loop bandwidth are you trying to achieve? Let me know and I'll give some thought to it,


Quentin Ch
Associate III

Hi, wow, thanks for your deep interest !

My motor:

  • 4-pole pairs
  • 24V motor
  • Nominal speed 3000 RPM
  • Nominal current 13.5A
  • 3 Hall sensors

I set PWM frequency to 30 kHz (the motor profiler told me Rs = 0.1 Ohms and Ls = 0.16 mH, what is quite "low inductance", so I increased the default 16kHz PWM frequency)

If by closed-loop bandwidth you mean the max rate of change in the input I need to accept, I would say something like 100 RPM/s, while for now I'm just trying to maintain a constant low speed for experimenting (target speed typically 50RPM ie below 0.83Hz)

In MCSDK, I left the PID cutoff frequency to the default 6000 rad/s, in case it is related.

Note that my motor is connected to a gearbox with lots of friction... But I expect the PID to overcome this friction after some time (when the integral term has increased enough)

NB: After thinking, I think that the speed estimation from Hall sensors is of too low resolution for this target speed, even before looking at the resolution used in the computation...

Senior II

I think the use of Hall devices for speed control is your problem. At 50rpm with 4 pole-pair your electircal frequency is only about 3.3Hz (your Hall rate). For this rate I think your closed loop BW would need to be less than 0.3Hz to be stable but at that low rate you don't update often enough to overcome randomness in friction. Sensorless control won't work at these low speeds because the bemf estimation is not accurate enough, especially with friction.