Slotless BLDC Motor


I have got a Slotless BLDC motor. I am having issues getting it position controlled.
Can Odrive control a slotless BLDC?

The motor datasheet link is below:

Yes, there’s no problem just because the motor is slotless - in fact that should make it even easier to control, because the cogging torque is lower.
However, what encoder are you using? Hall sensors on their own are NOT sufficient for position control, especially if this is direct-drive (without a gearbox). This is not ODrive’s problem, just fundamental motion control.

Hall sensors only give you 6 pulses per motor pole-pair, so if you have a 5 pole-pair motor, that’s like having a 30ppr encoder. A direct-drive servo needs the highest resolution encoder you can find. 4000ppr works well, you can get that from magnetic encoders.

It is normal for any motor controller to vibrate at least +/- 1 encoder pulse. If you have a low-resolution encoder where one pulse equates to 15 degrees of motion, then you will have a lot of vibration :slight_smile:


Thank you @towen for your quick reply.

My motor calibrated successfully after I configured Pole pairs, and calibration current and voltage.
Also, I am using AMT102 Encoder by CUI. it is configured to spit 2048 cpr (512 ppr). as the motor rpm are ~17000.
Now the main issue I am facing is as follows:
1- Motor Calibration Process - (Successful)
2- Motor Closed loop start command - (Successful)
3- Motor vibrates +/- 1 pulse - (Stops when I touch the encoder shaft with my finger, may be damp its motion)
4- As I give command to move to new location - (Axis Error “ERROR_CONTROLLER_FAILED” , “ERROR_CONTROL_DEADLINE_MISSED”, “ERROR_OVERSPEED”.

Can you give any suggestion to resolve this issue?

I believe that this error is just an overspeed error- ignore the control_deadline_missed. It is caused by hitting the configured velocity limit, which itself is usually caused by controller instability or an unrealistic demand.

You could:

  1. Increase the vel_limit
  2. Reduce your controller gains
  3. Do not set the position demand using pos_setpoint= to move a lonbg distance. Set your trap_traj vel_limit to be below (e.g. half) the actual vel_limit, and use controller.move_to_pos() instead, to generate and follow trajectory to the new position