Bldc motor becomes weak over time

Hi there, im having a strange issue. Im running 12 bldc motors and 2 of them have an intermittent problem where they are becoming weak over time and not able to hit their position mark because they loose torque. also in their closed loop i can physically move them much easier than the others, they are also getting hot. after a power cycle they get back to normal.

Ive attached the code I write to them on startup from a teensy in case thats of use. I did change the
motor.config.current_control_bandwidth from 500 that I had it set at up to 1000 and that seemed to help. (i had originally changed it to 500 to make the high pitch noise less audible.

any help would be appreciated, I think after homing they are running in trap traj mode.

my tuning the motors was a little brute force…so perhaps it is that they arent tuned well? They are able normally to move fast to correct positions with no vibration.


firmware 5.1.1

Serial3 << "w axis" << axis << ".motor.config.pole_pairs " << 11 << '\n';
Serial3 << "w axis" << axis << ".encoder.config.cpr " << 4000.0f << '\n';
Serial3 << "w axis" << axis << ".motor.config.calibration_current " << 5.0f << '\n';
Serial3 << "w axis" << axis << ".motor.config.current_lim " << 8.0f << '\n';
Serial3 << "w axis" << axis << ".min_endstop.config.enabled " << true << '\n';
Serial3 << "w axis" << axis << ".max_endstop.config.enabled " << true << '\n';
Serial3 << "w axis" << axis << ".min_endstop.config.debounce_ms " << 50.0f << '\n';
Serial3 << "w axis" << axis << ".max_endstop.config.debounce_ms " << 50.0f << '\n';
Serial3 << "w axis" << axis << ".min_endstop.config.is_active_high " << true << '\n';
Serial3 << "w axis" << axis << ".max_endstop.config.is_active_high " << true << '\n';    
Serial3 << "w axis" << axis << ".controller.config.homing_speed " << 4.0f << '\n';
Serial3 << "w axis" << axis << ".min_endstop.config.offset " << -0.20f << '\n';
Serial3 << "w axis" << axis << ".controller.config.pos_gain " << 30.0f << '\n';

Serial3 << "w axis" << axis << ".controller.config.vel_limit_tolerance " << 3.0f << '\n';
Serial3 << "w axis" << axis << ".controller.config.vel_gain " << 1.0f / 10.0f << '\n';              
Serial3 << "w axis" << axis << ".controller.config.vel_integrator_gain " << 1.0f / 10000.0f << '\n';
Serial3 << "w axis" << axis << ".controller.config.vel_ramp_rate " << 500.0f << "\n";
Serial3 << "w axis" << axis << ".motor.config.current_control_bandwidth " << 1500.0f << '\n';

Serial3 << "w axis" << axis << ".controller.config.input_mode " << 5 << '\n';

Hi, I found that happens when the encoder ring around the shaft would slip. It would slowly lose the shaft rotation position and send current to the wrong phase. I believe if the controller was missing encoder pulses electrically the same thing would result. I would start by making sure the encoder sleeve is really tight on the motor shaft.

1 Like

@Matthew_Remington thanks for the reply. I think you might be right with your diagnosis. It would explain why it was only affecting 2 of the 12 also. Thanks for replying quickly. I am now gluing the encoder magnets in place. If this solves the issue I will let you know (for any future people wanting to problem solve this).


That seems to have done the trick! Thanks for your help in diagnosing this issue. I initially thought that it wasnt that because the motor was still driving the slider to the correct position but with no power, but I think the magnet must just have slipped a tiny amount.

1 Like

Great to hear! Yah I think it only takes a little bit of slip depending on how many poles the motor has.

This is almost always caused by encoder slippage or noise.

EDIT: Ah, I see you fixed it. Good :slight_smile:

Yes it is fixed! Thanks. But thanks for not simply deleting your reply! As actually over a very long period of time they slightly heat up (and not due to use i think). So I think that there might be a very tiny amount of noise on the encoder lines… but that will be a problem for another day, as it doesnt affect performance for me. My project (im using 12 odrives) will finally launch in 2 days at Mutek Montreal (an electronic music festival). And im excited to share my project with the community

Tight. If they’re heating up too much you can do a couple things:

  1. Lower the gains
  2. Reduce the encoder bandwidth (to increase velocity filtering)
  3. Try the “anti-hunt” or “gain scheduling” feature, which automatically reduces the gains as the motor gets close to its target, to prevent it from vibrating and heating up.


I have also the problem, that the motor gets weak after a while. I checked the encoder. It is fixed properly to the shaft. Rebooting the ODrive without rest period (no time to cool down for anything) and searching the index (axis is pre calibrated), the motor again holds its position with strength. After a time the motor gets weak again. The anticogging feature for this axis is activated.

What can I do to search for the cause of this behaviour?

Until now I didn’t recognize a temperature increase of the motor. There is only a spindle mounted to the motor.
<axis>.controller.config.pos_gain = 70.0
<axis>.controller.config.vel_gain = 0.16
<axis>.controller.config.vel_integrator_gain = 0.32

Firmware: 0.5.2 (but its shown as 0.5.1)
Motor: Dual Shaft Motor - D5065 270kv
Encoder: 8192 CPR Encoder with ODrive Cable

Hi Dirk, I recommend the ferrite rings from the shop to eliminate electrical noise: