Odrive ERROR_CURRENT_UNSTABLE

i have the odrive 3.6 56v at 24v and a Scorpion 4035-500

When i first connected the odrive and configured the encoder and the rest i could do set_pos or velocity. Then i tuned the motor. Then i wanted to change to velocity mode. Now it wont do position/velocity control anymore. Motor calibration only turns for a split second, then beeps but doesnt rotates cw/ccw. I also did reset the configuration and did a new one.

After motor calibration:

In [104]: dump_errors(odrv0)
axis0
axis: Error(s):
ERROR_MOTOR_DISARMED
ERROR_MOTOR_FAILED
motor: Error(s):
ERROR_CURRENT_UNSTABLE
encoder: no error
controller: no error
axis1
axis: no error
motor: no error
encoder: no error
controller: no error

Before motor calibration and after reboot there are no errors.

How can that be?

i mounted the motor and encoder to the M1 and it works. I can calibrate the motor without errors. Back to M0 and it doesnt work again :confused:

something else i noticed is it doesnt seem to save the startup procedure:

In [1]: odrv0.axis0.config.startup_motor_calibration = 1

In [2]: odrv0.axis0.config.startup_encoder_index_search = 1

In [3]: odrv0.axis0.config.startup_encoder_offset_calibration =1

In [4]: odrv0.axis0.config.startup_closed_loop_control = 1

In [5]: odrv0.save_configuration()

In [6]: odrv0.reboot()

But after a reboot nothing happens.

if i do the exact same to M1 then everything works:

Reconnected to ODrive 2068358F524B as odrv0
In [13]: odrv0.axis1.config.startup_motor_calibration = 1

In [14]: odrv0.axis1.config.startup_encoder_index_search = 1

In [15]: odrv0.axis1.config.startup_encoder_offset_calibration =1

In [16]: odrv0.axis1.config.startup_closed_loop_control = 1

In [17]: odrv0.save_configuration()

In [18]: odrv0.reboot()

after a reboot the motor calibrates (successfully) and does position control. either there is a Hardware error or i need to completely reset the firm/software.

if that helps:

In [8]: odrv0.axis1.motor
Out[8]:
error = 0x0000 (int)
armed_state = 3 (int)
is_calibrated = True (bool)
current_meas_phB = 1.3570867776870728 (float)
current_meas_phC = -1.308037519454956 (float)
DC_calib_phB = -0.1084473729133606 (float)
DC_calib_phC = 0.38133883476257324 (float)
phase_current_rev_gain = 0.02500000037252903 (float)
thermal_current_lim = 45.605873107910156 (float)
get_inverter_temp()
current_control:
p_gain = 0.007143108174204826 (float)
i_gain = 27.287220001220703 (float)
v_current_control_integral_d = 0.0011333753354847431 (float)
v_current_control_integral_q = -0.07201576232910156 (float)
Ibus = 0.006855755113065243 (float)
final_v_alpha = -0.01041458174586296 (float)
final_v_beta = 0.07166272401809692 (float)
Iq_setpoint = -1.4722706079483032 (float)
Iq_measured = -1.6013392210006714 (float)
Id_measured = 0.02776429057121277 (float)
I_measured_report_filter_k = 1.0 (float)
max_allowed_current = 60.75 (float)
overcurrent_trip_level = 67.5 (float)
gate_driver:
drv_fault = 0 (int)
timing_log:
TIMING_LOG_GENERAL = 0 (int)
TIMING_LOG_ADC_CB_I = 4486 (int)
TIMING_LOG_ADC_CB_DC = 14666 (int)
TIMING_LOG_MEAS_R = 8582 (int)
TIMING_LOG_MEAS_L = 8582 (int)
TIMING_LOG_ENC_CALIB = 8830 (int)
TIMING_LOG_IDX_SEARCH = 0 (int)
TIMING_LOG_FOC_VOLTAGE = 8778 (int)
TIMING_LOG_FOC_CURRENT = 9670 (int)
config:
pre_calibrated = False (bool)
pole_pairs = 5 (int)
calibration_current = 10.0 (float)
resistance_calib_max_voltage = 2.0 (float)
phase_inductance = 7.143108177842805e-06 (float)
phase_resistance = 0.02728722058236599 (float)
direction = -1 (int)
motor_type = 0 (int)
current_lim = 10.0 (float)
current_lim_tolerance = 1.25 (float)
inverter_temp_limit_lower = 100.0 (float)
inverter_temp_limit_upper = 120.0 (float)
requested_current_range = 60.0 (float)
current_control_bandwidth = 1000.0 (float)

In [9]: odrv0.axis0.motor
Out[9]:
error = 0x0000 (int)
armed_state = 0 (int)
is_calibrated = False (bool)
current_meas_phB = 0.04845967888832092 (float)
current_meas_phC = -0.5625606179237366 (float)
DC_calib_phB = -0.37082546949386597 (float)
DC_calib_phC = -0.6459059715270996 (float)
phase_current_rev_gain = 0.02500000037252903 (float)
thermal_current_lim = 45.80812454223633 (float)
get_inverter_temp()
current_control:
p_gain = 0.007383590564131737 (float)
i_gain = 28.994342803955078 (float)
v_current_control_integral_d = 0.0 (float)
v_current_control_integral_q = 0.0 (float)
Ibus = 0.0 (float)
final_v_alpha = 0.0 (float)
final_v_beta = 0.0 (float)
Iq_setpoint = 0.0 (float)
Iq_measured = 0.0 (float)
Id_measured = 0.0 (float)
I_measured_report_filter_k = 1.0 (float)
max_allowed_current = 60.75 (float)
overcurrent_trip_level = 67.5 (float)
gate_driver:
drv_fault = 0 (int)
timing_log:
TIMING_LOG_GENERAL = 0 (int)
TIMING_LOG_ADC_CB_I = 2690 (int)
TIMING_LOG_ADC_CB_DC = 12882 (int)
TIMING_LOG_MEAS_R = 0 (int)
TIMING_LOG_MEAS_L = 0 (int)
TIMING_LOG_ENC_CALIB = 0 (int)
TIMING_LOG_IDX_SEARCH = 0 (int)
TIMING_LOG_FOC_VOLTAGE = 0 (int)
TIMING_LOG_FOC_CURRENT = 0 (int)
config:
pre_calibrated = False (bool)
pole_pairs = 5 (int)
calibration_current = 10.0 (float)
resistance_calib_max_voltage = 2.0 (float)
phase_inductance = 7.3835904004226904e-06 (float)
phase_resistance = 0.02899434231221676 (float)
direction = -1 (int)
motor_type = 0 (int)
current_lim = 10.0 (float)
current_lim_tolerance = 1.25 (float)
inverter_temp_limit_lower = 100.0 (float)
inverter_temp_limit_upper = 120.0 (float)
requested_current_range = 60.0 (float)
current_control_bandwidth = 1000.0 (float)

In [10]:

no one has an idea? i need to know if this is a hardware issue

Hi MMD, I just spotted your post, I had exactly the same error and symptoms the other day that resolved occasionally after a re-boot.

After a lot of head-scratching, I noticed one of the phases were loose in the screw terminal of the ODrive. Initially, I jammed a screwdriver in with the wire as I may have previously overtightened it; this worked a treat. I will be soldering the motor wires directly to the board soon.

Therefore it may be a connection problem to the motor. I think if the electrical parameters change after the full calibration sequence, the ODrive protects everything by disarming the motor.

I hope that helps.

i think i remember i had the feeling of some screw overtightening but it did feel secure nontheless. i may have to look at the connection again. Thanks

(i am unsure if the small terminal connection is enough to deliver 20-40amps safely. I may solder them directly as well)

I think that would be the best option, I was running mine at 60A on a 12v lead-acid battery at the time. The 0.5ohm brake resistor was a little warm also.

I hope that fixes your issue.

ignore this, i tried it again and now it saved it.

i dont think this is a connection issue because i have connected the motor on both drivers multiple times and every time axis 0 has the fault while axis 1 doesnt.

If you turn an encoder on axis 0 by hand, is encoder.shadow_count accurate?

yes encoder.shadow_count is accurate and also will get higher or lower depending on how i rotate the motor

Hi guys, I have the same error on axis0. On axis1 works totally fine.
Using 56V Odrive 3.6 with Odrive D5065 motor and 24V psu.
Has anybody solved this issue?

no and it seems like it is not going to be solved anytime soon :confused:

1 Like

Hi,

I had a similar set up as you (ODrive 3.6 54V at 24V) albeit with a different motor. I ended up having the same problem intermittently then realized my motor had been damaged and one of the phases had shorted, killing the motor and seemingly damaging the ODrive as well. Since your motor works fine on Axis 1 I doubt this is the case for you.

One thing you can try in order to rule out a hardware issue is flash different firmware and see if the issue persists. For everything in my set up I was using the RazorsEdge branch from here: https://github.com/Wetmelon/ODrive. It worked well for me.

You could give that a try and see if Axis 0 starts working. Note that ERROR_CURRENT_UNSTABLE has been renamed to ERROR_CURRENT_LIMIT_VIOLATION in that branch.

Hope this helps!

I had the same problems and I don’t know why this fixed it but all I did was change
odrv0.axis0.motor.config.calibration_current = 10 to
odrv0.axis0.motor.config.calibration_current = 20

This seems to fix the problem and I was also able to increase the
odrv0.axis0.controller.config.vel_limit = 300000
without any problems. This caused a lot of frustration and needs to be fixed.

You should check my post : 4Poles 1300kv stopping when high speeds are required

May be it can help. Low inductance motor induce high current variations.

1 Like

The issue in my case was a badly soldered connection. Ground pin for the encoder and one of the pins for the motor leads. Soldered it again and it works fine now on both axes.

sorry for the late reply

so i soldered both the DC in and the M0 Ports of the odrive directly but still the same issue. I also raised the calibration current to 20 but still current unstable (i dont know if this is a problem because on M1 there is no issue but my power supply only has 6.5 amps).

i have connected the motor to the original screw terminal of M1 and M1 still works with this motor without a problem.

so:
Motor works on M1 with screw terminals but not on M0 directly soldered to the PCB.

In [11]: odrv0.axis0.motor.config
Out[11]:
pre_calibrated = False (bool)
pole_pairs = 5 (int)
calibration_current = 20.0 (float)
resistance_calib_max_voltage = 2.0 (float)
phase_inductance = 7.38262588129146e-06 (float)
phase_resistance = 0.021810222417116165 (float)
direction = -1 (int)
motor_type = 0 (int)
current_lim = 10.0 (float)
current_lim_tolerance = 1.25 (float)
inverter_temp_limit_lower = 100.0 (float)
inverter_temp_limit_upper = 120.0 (float)
requested_current_range = 60.0 (float)
current_control_bandwidth = 1000.0 (float)

In [13]: odrv0.axis1.motor.config
Out[13]:
pre_calibrated = False (bool)
pole_pairs = 5 (int)
calibration_current = 10.0 (float)
resistance_calib_max_voltage = 2.0 (float)
phase_inductance = 7.215397545223823e-06 (float)
phase_resistance = 0.028293903917074203 (float)
direction = 1 (int)
motor_type = 0 (int)
current_lim = 10.0 (float)
current_lim_tolerance = 1.25 (float)
inverter_temp_limit_lower = 100.0 (float)
inverter_temp_limit_upper = 120.0 (float)
requested_current_range = 60.0 (float)
current_control_bandwidth = 1000.0 (float)

i can see a marginally higher resistance of approx. 0.007, this may be due to longer cables.

maybe its me or maybe its the software or maybe its defective hardware, i dont know.

Have you tried lowering this?