Increasing BLDC current draw

Hi all,
I’m currently using the ODrive Micro to drive a Tmotor AT2304 1800KV brushless drone motor, using the onboard encoder.

The setup and calibration processes all went smoothly. Motor calibration and basic control seem to be working fine.
However, I’ve run into an issue:

  • No matter what I try, I can’t seem to get the **current draw above ~0.5A
  • The motor has a peak current draw for around 10A, so I was expecting to be able to push it harder
  • Velocity and Postion control all spins correctly, but torque/output feels very limited
  • When I block the motor, it stalls and never draws more than 0.5A. (My soft and hard current limit is set to 6 and 7 respectively.) I expected the board to continue pumping up the current until the limit.

Has anyone encountered this before? Could this be a configuration issue or do I need to tweak something in my setup to allow higher current?

Any advice, pointers, or things I should check would be greatly appreciated

Thanks in advance!

Hi! This definitely sounds like it could be a configuration issue, could you run odrivetool backup-config config.json and then post the resulting config.json here?

Hi, sorry for the delay. Here is the config file

{
“can.config.baud_rate”: 0,
“can.config.data_baud_rate”: 10000000,
“can.config.tx_brs”: 0,
“can.config.protocol”: 0,
“config.enable_uart_a”: false,
“config.uart_a_baudrate”: 115200,
“config.usb_cdc_protocol”: 3,
“config.uart0_protocol”: 3,
“config.max_regen_current”: 0.0,
“config.dc_bus_undervoltage_trip_level”: 6.0,
“config.dc_bus_overvoltage_trip_level”: 12.0,
“config.dc_max_positive_current”: 7.0,
“config.dc_max_negative_current”: -Infinity,
“config.user_config_0”: 0,
“config.user_config_1”: 0,
“config.user_config_2”: 0,
“config.user_config_3”: 0,
“config.user_config_4”: 0,
“config.user_config_5”: 0,
“config.user_config_6”: 0,
“config.user_config_7”: 0,
“config.gpio0_mode”: 17,
“config.gpio1_mode”: 17,
“config.gpio2_mode”: 17,
“config.gpio3_mode”: 17,
“config.gpio4_mode”: 17,
“config.gpio5_mode”: 17,
“config.gpio6_mode”: 17,
“config.gpio7_mode”: 17,
“config.gpio5_analog_mapping.endpoint”: null,
“config.gpio5_analog_mapping.min”: 0.0,
“config.gpio5_analog_mapping.max”: 0.0,
“config.gpio6_analog_mapping.endpoint”: null,
“config.gpio6_analog_mapping.min”: 0.0,
“config.gpio6_analog_mapping.max”: 0.0,
“config.inverter0.current_soft_max”: 7.0,
“config.inverter0.current_hard_max”: 7.900000095367432,
“config.inverter0.temp_limit_lower”: 135.0,
“config.inverter0.temp_limit_upper”: 145.0,
“config.inverter0.mod_magn_max”: 0.6781481504440308,
“config.inverter0.shunt_conductance”: 1.0,
“config.inverter0.drv_config”: 5913173802956800,
“axis0.config.startup_max_wait_for_ready”: 3.0,
“axis0.config.startup_motor_calibration”: false,
“axis0.config.startup_encoder_index_search”: false,
“axis0.config.startup_encoder_offset_calibration”: false,
“axis0.config.startup_closed_loop_control”: false,
“axis0.config.startup_homing”: false,
“axis0.config.init_torque”: 0.0,
“axis0.config.init_vel”: 0.0,
“axis0.config.init_pos”: NaN,
“axis0.config.enable_step_dir”: false,
“axis0.config.step_dir_always_on”: false,
“axis0.config.calib_range”: 0.019999999552965164,
“axis0.config.calib_scan_distance”: 8.0,
“axis0.config.calib_scan_vel”: 2.0,
“axis0.config.index_search_at_target_vel_only”: false,
“axis0.config.watchdog_timeout”: 0.0,
“axis0.config.enable_watchdog”: false,
“axis0.config.step_gpio_pin”: 10,
“axis0.config.dir_gpio_pin”: 11,
“axis0.config.error_gpio_pin”: 8,
“axis0.config.enable_error_gpio”: false,
“axis0.config.calibration_lockin.current”: 3.0,
“axis0.config.calibration_lockin.ramp_time”: 0.4000000059604645,
“axis0.config.calibration_lockin.ramp_distance”: 0.5,
“axis0.config.calibration_lockin.accel”: 3.183098793029785,
“axis0.config.calibration_lockin.vel”: 6.36619758605957,
“axis0.config.sensorless_ramp.initial_pos”: 0.0,
“axis0.config.sensorless_ramp.current”: 3.0,
“axis0.config.sensorless_ramp.ramp_time”: 0.4000000059604645,
“axis0.config.sensorless_ramp.ramp_distance”: 0.5,
“axis0.config.sensorless_ramp.accel”: 31.83098793029785,
“axis0.config.sensorless_ramp.vel”: 63.6619758605957,
“axis0.config.sensorless_ramp.finish_distance”: 15.915493965148926,
“axis0.config.sensorless_ramp.finish_on_vel”: true,
“axis0.config.sensorless_ramp.finish_on_distance”: false,
“axis0.config.general_lockin.initial_pos”: 0.0,
“axis0.config.general_lockin.current”: 3.0,
“axis0.config.general_lockin.ramp_time”: 0.4000000059604645,
“axis0.config.general_lockin.ramp_distance”: 3.1415927410125732,
“axis0.config.general_lockin.accel”: 20.0,
“axis0.config.general_lockin.vel”: 40.0,
“axis0.config.general_lockin.finish_distance”: 100.0,
“axis0.config.general_lockin.finish_on_vel”: false,
“axis0.config.general_lockin.finish_on_distance”: false,
“axis0.config.can.node_id”: 63,
“axis0.config.can.version_msg_rate_ms”: 0,
“axis0.config.can.heartbeat_msg_rate_ms”: 100,
“axis0.config.can.encoder_msg_rate_ms”: 10,
“axis0.config.can.iq_msg_rate_ms”: 0,
“axis0.config.can.error_msg_rate_ms”: 0,
“axis0.config.can.temperature_msg_rate_ms”: 0,
“axis0.config.can.bus_voltage_msg_rate_ms”: 0,
“axis0.config.can.torques_msg_rate_ms”: 0,
“axis0.config.can.powers_msg_rate_ms”: 0,
“axis0.config.can.input_vel_scale”: 1000,
“axis0.config.can.input_torque_scale”: 1000,
“axis0.config.load_encoder”: 13,
“axis0.config.commutation_encoder”: 13,
“axis0.config.encoder_bandwidth”: 1000.0,
“axis0.config.commutation_encoder_bandwidth”: NaN,
“axis0.config.I_bus_hard_min”: -Infinity,
“axis0.config.I_bus_hard_max”: Infinity,
“axis0.config.I_bus_soft_min”: -Infinity,
“axis0.config.I_bus_soft_max”: Infinity,
“axis0.config.P_bus_soft_min”: -Infinity,
“axis0.config.P_bus_soft_max”: Infinity,
“axis0.config.torque_soft_min”: -Infinity,
“axis0.config.torque_soft_max”: Infinity,
“axis0.config.motor.motor_type”: 0,
“axis0.config.motor.pole_pairs”: 7,
“axis0.config.motor.phase_resistance”: 0.06813886761665344,
“axis0.config.motor.phase_inductance”: 2.7075184334535152e-05,
“axis0.config.motor.phase_resistance_valid”: true,
“axis0.config.motor.phase_inductance_valid”: true,
“axis0.config.motor.torque_constant”: 0.0045944442972540855,
“axis0.config.motor.direction”: -1.0,
“axis0.config.motor.current_control_bandwidth”: 1000.0,
“axis0.config.motor.wL_FF_enable”: false,
“axis0.config.motor.bEMF_FF_enable”: false,
“axis0.config.motor.dI_dt_FF_enable”: false,
“axis0.config.motor.ff_pm_flux_linkage”: 0.0,
“axis0.config.motor.ff_pm_flux_linkage_valid”: false,
“axis0.config.motor.motor_model_l_d”: 0.0,
“axis0.config.motor.motor_model_l_q”: 0.0,
“axis0.config.motor.motor_model_l_dq_valid”: false,
“axis0.config.motor.calibration_current”: 2.0,
“axis0.config.motor.resistance_calib_max_voltage”: 1.0,
“axis0.config.motor.current_soft_max”: 6.0,
“axis0.config.motor.current_hard_max”: 8.0,
“axis0.config.motor.current_slew_rate_limit”: 10000.0,
“axis0.config.motor.fw_enable”: false,
“axis0.config.motor.fw_mod_setpoint”: 0.6103333234786987,
“axis0.config.motor.fw_fb_bandwidth”: 500.0,
“axis0.config.motor.acim_gain_min_flux”: 10.0,
“axis0.config.motor.acim_autoflux_enable”: false,
“axis0.config.motor.acim_autoflux_min_Id”: 10.0,
“axis0.config.motor.acim_autoflux_attack_gain”: 10.0,
“axis0.config.motor.acim_autoflux_decay_gain”: 1.0,
“axis0.config.motor.acim_nominal_slip_vel”: 2.3399999141693115,
“axis0.config.motor.sensorless_observer_gain”: 1000.0,
“axis0.config.motor.sensorless_pll_bandwidth”: 1000.0,
“axis0.config.motor.sensorless_pm_flux_linkage”: 0.0,
“axis0.config.motor.sensorless_pm_flux_linkage_valid”: false,
“axis0.config.motor.power_torque_report_filter_bandwidth”: 8000.0,
“axis0.config.anticogging.enabled”: false,
“axis0.config.anticogging.max_torque”: 0.15000000596046448,
“axis0.config.anticogging.calib_start_vel”: 1.0,
“axis0.config.anticogging.calib_end_vel”: 0.15000000596046448,
“axis0.config.anticogging.calib_coarse_tuning_duration”: 60.0,
“axis0.config.anticogging.calib_fine_tuning_duration”: 120.0,
“axis0.config.anticogging.calib_fine_dist_scale”: 1.0,
“axis0.config.anticogging.calib_coarse_integrator_gain”: 10.0,
“axis0.config.anticogging.calib_bidirectional”: true,
“axis0.config.off_axis_k”: 1.0,
“axis0.config.off_axis_k_commutation”: 1.0,
“axis0.config.harmonic_compensation.calib_vel”: 8.0,
“axis0.config.harmonic_compensation.calib_settling_delay”: 2.0,
“axis0.config.harmonic_compensation.calib_turns”: 8,
“axis0.config.harmonic_compensation.cosx_coef”: 0.0,
“axis0.config.harmonic_compensation.sinx_coef”: 0.0,
“axis0.config.harmonic_compensation.cos2x_coef”: 0.0,
“axis0.config.harmonic_compensation.sin2x_coef”: 0.0,
“axis0.config.harmonic_compensation_commutation.calib_vel”: 8.0,
“axis0.config.harmonic_compensation_commutation.calib_settling_delay”: 2.0,
“axis0.config.harmonic_compensation_commutation.calib_turns”: 8,
“axis0.config.harmonic_compensation_commutation.cosx_coef”: 0.0,
“axis0.config.harmonic_compensation_commutation.sinx_coef”: 0.0,
“axis0.config.harmonic_compensation_commutation.cos2x_coef”: 0.0,
“axis0.config.harmonic_compensation_commutation.sin2x_coef”: 0.0,
“axis0.controller.config.enable_vel_limit”: true,
“axis0.controller.config.enable_torque_mode_vel_limit”: true,
“axis0.controller.config.enable_gain_scheduling”: false,
“axis0.controller.config.gain_scheduling_width”: 0.0010000000474974513,
“axis0.controller.config.enable_overspeed_error”: true,
“axis0.controller.config.control_mode”: 2,
“axis0.controller.config.input_mode”: 2,
“axis0.controller.config.pos_gain”: 20.0,
“axis0.controller.config.vel_gain”: 0.006040795240551233,
“axis0.controller.config.vel_integrator_gain”: 0.025599999353289604,
“axis0.controller.config.vel_integrator_limit”: Infinity,
“axis0.controller.config.vel_limit”: 100.0,
“axis0.controller.config.vel_limit_tolerance”: 2.0,
“axis0.controller.config.vel_ramp_rate”: 10.0,
“axis0.controller.config.torque_ramp_rate”: 0.009999999776482582,
“axis0.controller.config.circular_setpoints”: false,
“axis0.controller.config.circular_setpoint_range”: 1.0,
“axis0.controller.config.absolute_setpoints”: false,
“axis0.controller.config.use_commutation_vel”: false,
“axis0.controller.config.use_load_encoder_for_commutation_vel”: false,
“axis0.controller.config.commutation_vel_scale”: 1.0,
“axis0.controller.config.steps_per_circular_range”: 1024,
“axis0.controller.config.homing_speed”: 0.25,
“axis0.controller.config.inertia”: 0.0,
“axis0.controller.config.input_filter_bandwidth”: 20.0,
“axis0.controller.config.spinout_mechanical_power_bandwidth”: 20.0,
“axis0.controller.config.spinout_electrical_power_bandwidth”: 20.0,
“axis0.controller.config.spinout_mechanical_power_threshold”: -10.0,
“axis0.controller.config.spinout_electrical_power_threshold”: 10.0,
“axis0.trap_traj.config.vel_limit”: 2.0,
“axis0.trap_traj.config.accel_limit”: 10.0,
“axis0.trap_traj.config.decel_limit”: 0.5,
“axis0.min_endstop.config.gpio_num”: 0,
“axis0.min_endstop.config.enabled”: false,
“axis0.min_endstop.config.offset”: 0.0,
“axis0.min_endstop.config.is_active_high”: false,
“axis0.min_endstop.config.debounce_ms”: 50,
“axis0.max_endstop.config.gpio_num”: 0,
“axis0.max_endstop.config.enabled”: false,
“axis0.max_endstop.config.offset”: 0.0,
“axis0.max_endstop.config.is_active_high”: false,
“axis0.max_endstop.config.debounce_ms”: 50,
“axis0.enable_pin.config.gpio_num”: 65535,
“axis0.enable_pin.config.enabled”: false,
“axis0.enable_pin.config.offset”: 0.0,
“axis0.enable_pin.config.is_active_high”: false,
“axis0.enable_pin.config.debounce_ms”: 50,
“axis0.mechanical_brake.config.gpio_num”: 0,
“axis0.mechanical_brake.config.is_active_low”: true,
“axis0.pos_vel_mapper.config.circular”: false,
“axis0.pos_vel_mapper.config.circular_output_range”: 1.0,
“axis0.pos_vel_mapper.config.scale”: 1.0,
“axis0.pos_vel_mapper.config.offset_valid”: false,
“axis0.pos_vel_mapper.config.offset”: 0.0,
“axis0.pos_vel_mapper.config.approx_init_pos_valid”: false,
“axis0.pos_vel_mapper.config.approx_init_pos”: 0.0,
“axis0.pos_vel_mapper.config.index_offset_valid”: false,
“axis0.pos_vel_mapper.config.index_offset”: 0.0,
“axis0.pos_vel_mapper.config.use_index_gpio”: false,
“axis0.pos_vel_mapper.config.passive_index_search”: false,
“axis0.pos_vel_mapper.config.index_gpio”: 4,
“axis0.pos_vel_mapper.config.use_endstop”: false,
“axis0.commutation_mapper.config.circular”: true,
“axis0.commutation_mapper.config.circular_output_range”: 1.0,
“axis0.commutation_mapper.config.scale”: -7.0,
“axis0.commutation_mapper.config.offset_valid”: true,
“axis0.commutation_mapper.config.offset”: 2.911003589630127,
“axis0.commutation_mapper.config.approx_init_pos_valid”: false,
“axis0.commutation_mapper.config.approx_init_pos”: 0.0,
“axis0.commutation_mapper.config.index_offset_valid”: false,
“axis0.commutation_mapper.config.index_offset”: 0.0,
“axis0.commutation_mapper.config.use_index_gpio”: false,
“axis0.commutation_mapper.config.passive_index_search”: false,
“axis0.commutation_mapper.config.index_gpio”: 4,
“axis0.commutation_mapper.config.use_endstop”: false,
“axis0.interpolator.config.dynamic”: true,
“axis0.motor.motor_thermistor.config.gpio_pin”: 1,
“axis0.motor.motor_thermistor.config.mode”: 1,
“axis0.motor.motor_thermistor.config.r_ref”: 0.0,
“axis0.motor.motor_thermistor.config.t_ref”: 25.0,
“axis0.motor.motor_thermistor.config.beta”: 0.0,
“axis0.motor.motor_thermistor.config.a”: 3.9082999229431152,
“axis0.motor.motor_thermistor.config.b”: -0.0005774999735876918,
“axis0.motor.motor_thermistor.config.temp_limit_lower”: 100.0,
“axis0.motor.motor_thermistor.config.temp_limit_upper”: 120.0,
“axis0.motor.motor_thermistor.config.enabled”: false,
“inc_encoder0.config.enabled”: false,
“inc_encoder0.config.filter”: 0,
“inc_encoder0.config.cpr”: 8192,
“hall_encoder0.config.enabled”: false,
“hall_encoder0.config.hall_polarity”: 0,
“hall_encoder0.config.hall_polarity_calibrated”: false,
“hall_encoder0.config.ignore_illegal_hall_state”: false,
“hall_encoder0.config.edges_calibrated”: false,
“hall_encoder0.config.edge0”: NaN,
“hall_encoder0.config.edge1”: NaN,
“hall_encoder0.config.edge2”: NaN,
“hall_encoder0.config.edge3”: NaN,
“hall_encoder0.config.edge4”: NaN,
“hall_encoder0.config.edge5”: NaN,
“spi_encoder0.config.ncs_gpio”: 0,
“spi_encoder0.config.mode”: 0,
“spi_encoder0.config.delay”: 0.0,
“spi_encoder0.config.max_error_rate”: 0.004999999888241291,
“spi_encoder0.config.baudrate”: 1687500,
“spi_encoder0.config.biss_c_bits”: 18,
“spi_encoder0.config.biss_c_multiturn_bits”: 0,
“spi_encoder1.config.ncs_gpio”: 0,
“spi_encoder1.config.mode”: 0,
“spi_encoder1.config.delay”: 0.0,
“spi_encoder1.config.max_error_rate”: 0.004999999888241291,
“spi_encoder1.config.baudrate”: 1687500,
“spi_encoder1.config.biss_c_bits”: 18,
“spi_encoder1.config.biss_c_multiturn_bits”: 0
}

Hi! Config all looks correct. But I just realized something. When you say “current draw above ~0.5A”, how exactly are you measuring this? Are your reading off Iq_measured from the ODrive, ibus from the ODrive, or are you looking at e.g. the current drawn from your power supply or some external ammeter?

Hi, I am currently powering the odrive through my benchtop Power supply. The reading from my power supply does not go above 0.5A even though I set it to 10A max.
Regarding the Iq_measured, it has been reporting a negative 6A reading on the web UI. May I ask what might be causing the negative current reading?

Thank you so much for your time

So, power supply current and motor current are different. Specifically, the (absolute value of) motor current will always be greater than the power supply current – sometimes much so. It seems here that the actual motor current is around 6A, it’s just that the current being drawn from the supply is 0.5A – this is totally normal and expected! There’s a good blog post about that here.

Negative current just means that it’s producing torque in the opposite direction of the encoder direction. So whatever direction of encoder rotation makes pos_estimate increase (and vel_estimate positive), the ODrive applying positive current will make the motor output torque in that direction. Negative current just means torque in the opposite direction.

Thank you so much for the insight! Seems like everything is working as intended then.
Really appreciate you taking your time in helping out with the community. Thank you!

Absolutely, glad I could help! Please let me know if there’s anything else :slight_smile:

Hi sorry for bothering again. May I please seek your consultation in an error I am getting.
I have been testing out the positional controls and at higher speeds, I am getting DC_BUS_OVERVOLTAGE errors. I have tried lowering the powersupply voltage but the controller still throws out the error even below the trip level.

Any pointers would be greatly appreciated. Thank you!



Guessing this is while decelerating? If you don’t have anything on the bus that can absorb the regenerated energy, the bus voltage will rise. You can give some more headroom by just raising dc_bus_overvoltage_trip_level, up to a safe level for your power supply (usually with a bench power supply, this is around the maximum output voltage). You can also set I_bus_soft_min to 0 to prevent the Micro from regenerating any power back to the bus, though it’ll affect performance while decelerating the motor.

The “correct” solution here is to use a battery or a regen clamp, which absorbs and stores or dissipates (respectively) the regenerated energy.

You can also use trajectory control to control the acceleration/deceleration – usually that’s the recommended solution if you’re commanding point-to-point movements.

Hi, thank you so much for taking your time to help me. Silly question but may I ask if the max current of the micro is referring to the bus current or the phase current? I am getting the current limit violation when running at higher speeds. I currently have the soft limit set to 4A. On the website the max free air current is rated 3.5A. Is it alright for me to increase the current soft limit to 10A on the micro without the board burning?

Not a silly question - phase current. You can increase the current as much as you want, but the Micro will limit current to 7A max, and as the board heats up, it’ll reduce the output current. Usually you can peak at 7A for a few seconds, and around 4A in free air is the most you’ll be able to push continuously.