Trouble getting ILM-E70x10 motor to work with ODrive S1

Hi everyone,

i recdently received a an ODrive S1 and i am trying to get it to work with a TQ Group ILM-E70x10 (Datasheet).

The main problem ist that at medium-high RPMs, the (measured) current ripple is so large that the controller easily reaches the maximum allowed current for a split second, which it turn causes it to shut off.

This also happens in the torque controlled mode, when the applied torque is high enough. What is very strange is that the motor does not turn at all in torque mode unless i increase the torque to ~0.2Nm, which is a third of the total torque it can produce.

What is also strange is that when plotting I_q and I_d i can see that the controller correctly tries to produce no I_d at all (setpoint is zero). Still, the controller measures that therre is I_d current flowing.

A friend suggested that the alignment between mechanical and electrical axis may be off somehow. The phase resistance and inductance seems a bit off after the measurement routine, but is still in the correct ballpark. Also after changing the values to the ones given in the datasheet of the motor, nothing changes.

Unfourtunately, i can only use the hall sensors on the motor itself as the rotor is directly mounted to a geabox with a 30:1 reduction, so i cant attach a “real” encoder there.

One idea i had was that the hall sensors are improperly placed in the motor and the controller somehow expects a different layout. They are not 120° apart and i read that this does not necessarily have to be the case, but i was unable up to now to come up with the correct necessary placement. (The hall sensors are soldered onto the stator from the manufacturer, so i dont have any way to change it.)

Any help would be appreciated, thanks in advance!

One additional curiosity: I am fairly certain that the pole pair count is 10. I read that the placement of hall sensors is usually 120 electrical degrees apart, which would mean 12 mechanical degrees in our case.
I measured the placement and they are in fact 60 degrees apart (but they are ordered 1,3,2), not 12. Does this matter in anyway?

Hi!

The main problem ist that at medium-high RPMs, the (measured) current ripple is so large that the controller easily reaches the maximum allowed current for a split second, which it turn causes it to shut off.

Interesting.

A friend suggested that the alignment between mechanical and electrical axis may be off somehow. The phase resistance and inductance seems a bit off after the measurement routine, but is still in the correct ballpark. Also after changing the values to the ones given in the datasheet of the motor, nothing changes.

I agree with your friend. However, the phase resistance/inductance shouldn’t affect this much. This is likely an issue with the hall encoder calibration.

One idea i had was that the hall sensors are improperly placed in the motor and the controller somehow expects a different layout. They are not 120° apart and i read that this does not necessarily have to be the case, but i was unable up to now to come up with the correct necessary placement. (The hall sensors are soldered onto the stator from the manufacturer, so i dont have any way to change it.)

The ODrive actually doesn’t care! It’ll automatically measure the hall angles, whether they’re 60° or 120° (or some random other set of angles) and use those.

I think there may be some issues with the hall calibrations here. Typically we strongly recommend that calibration is done under no load, and your gearbox may be adding a bit of load here. I’d recommend changing your “calibration lock-in current” (assuming you’re using the GUI) to the maximum continuous motor current of 5.6A, and remove the gearbox for calibration, if at all possible. Additionally, this is a pretty high inductance motor, you may need to reduce the current_control_bandwidth to around 100-200 (this can be done in the inspector tab of the GUI, just make sure to run save_configuration() afterwards).

Thanks @solomondg ! I think this maybe improved some things, but i still have the same problem.
I am fairly certain it is the control loop completely getting out of hand, since i seem to be able to influence the RPMs at which this happens by modifying the velocity P & I values.

As i previosuly tried to use a different controller which constantly complained about an improper hall sensor state (either all three low or all three high), which i suspect is EMI related, i tried to see if the ODrive sees the hall sensor readings correctly.

Shouldnt at least one of those two graphs increment from 1 to 6 and then go down again constantly to reflect the six different hall states? Os does the odrive do the “calibration” which sensor is which internally? Even then, the signal should look the same at every revolution at a constant speed right?

EDIT: At very low speeds or when turning the rotor manually, the hall state correctly increases from 1 to 5, so maybe this isnt a problem after all.

I can remove the gearbox for the calibration sequence, but due to an unfourtunate design choice, this adds friction at a different place and im unsure if thats better.

Right now, we dont necessarily need to high velocities, but we have a different problem: In high torque moments, the ODrive faults with a MISSING_ESTIMATE error, which is very interesting since thats basically the same error we got with a totally different controller. I have shielded the phase cables individually and connected the shielding together at one end (but they arent connected to ground) and used shielded cable for the hall sensors (all signal wires are enclosed under one shield), which is both connected to ground on the controller side and the motor side, but that didnt change the MISSING_ESTIMATE error.

Shouldnt at least one of those two graphs increment from 1 to 6 and then go down again constantly to reflect the six different hall states? Os does the odrive do the “calibration” which sensor is which internally? Even then, the signal should look the same at every revolution at a constant speed right?

I think this is just an issue with the sampling rate of the GUI – if the ODrive isn’t complaining about the hall sensors, I’d generally assume they’re fine. There’s some internal conditioning from the sensor signals that should mitigate EMI issues. It’ll throw an error if it detects an invalid hall state; the fact you haven’t seen this yet makes me think it’s not an issue.

Regarding shielding – I would connect the shield of the phase cables to ODrive DC-, and the shield of the hall cables to ODrive GND on the J11 connector (e.g. pin 16 or 26).

I can remove the gearbox for the calibration sequence, but due to an unfourtunate design choice, this adds friction at a different place and im unsure if thats better.

Totally understood, in that case I’d just crank calibration lock-in current to the motor’s maximum continuous current.

Right now, we dont necessarily need to high velocities, but we have a different problem: In high torque moments, the ODrive faults with a MISSING_ESTIMATE error, which is very interesting since thats basically the same error we got with a totally different controller. I have shielded the phase cables individually and connected the shielding together at one end (but they arent connected to ground) and used shielded cable for the hall sensors (all signal wires are enclosed under one shield), which is both connected to ground on the controller side and the motor side, but that didnt change the MISSING_ESTIMATE error.

Very interesting. Can you make sure you’re on firmware 0.6.11, and then let me know the value of detailed_disarm_reason next time it throws the missing_estimate error?

Note overall that just due to the low resolution of hall sensors, you’ll have to tune the control loop a bit less aggressively, so I’d definitely expect that your achievable gains will be lower than what would be possible with a proper encoder.

Thank you for your answer, sorry for not getting back earlier!

Very interesting. Can you make sure you’re on firmware 0.6.11, and then let me know the value of detailed_disarm_reason next time it throws the missing_estimate error?

Is it possible to somehow get this value via can? We are using the ros2 odrive node for control and it is unfourtunately not that straight forward to have a computer with the odrive gui running attached via USB, since the odrive is mounted in a way which does not allow that. Alternatively: Would it be possible to let the odrive run into this error and then connect via USB afterwards to read out this value or would this somehow reset the error?
Thanks!

I managed to read the property with a small script, and i think the detailed_disarm_reason value is 3. Are the values documented anywhere? Im not able to find anything what this means.

Oops sorry for not getting back to you earlier – for the future, yes, USB would work just fine.

Unfortunately we haven’t written the docs for detailed_disarm_reason quite yet – it was a last-minute change before 0.6.11, I’d definitely expect docs on 0.6.12.

It looks like this error is related to the ODrive missing either the motor electrical angle or electrical angle velocity, which definitely points to the hall sensors.

Over USB, can you run odrivetool backup-config config.json and then paste the resulting config.json here? That way I can see your whole config/parameter tree.

Thanks! Here is my config. I unfourtunately cant upload json files, so i had to attach the whole file as raw text:

{
  "can.config.baud_rate": 1000000,
  "can.config.data_baud_rate": 10000000,
  "can.config.tx_brs": 0,
  "can.config.protocol": 1,
  "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": 10.5,
  "config.dc_bus_overvoltage_trip_level": 50.0,
  "config.dc_max_positive_current": 10.0,
  "config.dc_max_negative_current": -0.009999999776482582,
  "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.gpio8_mode": 17,
  "config.gpio9_mode": 17,
  "config.gpio10_mode": 17,
  "config.gpio11_mode": 17,
  "config.gpio12_mode": 17,
  "config.gpio8_pwm_mapping.endpoint": null,
  "config.gpio8_pwm_mapping.min": 0.0,
  "config.gpio8_pwm_mapping.max": 0.0,
  "config.gpio1_analog_mapping.endpoint": null,
  "config.gpio1_analog_mapping.min": 0.0,
  "config.gpio1_analog_mapping.max": 0.0,
  "config.gpio11_analog_mapping.endpoint": null,
  "config.gpio11_analog_mapping.min": 0.0,
  "config.gpio11_analog_mapping.max": 0.0,
  "config.brake_resistor0.enable": true,
  "config.brake_resistor0.resistance": 2.0,
  "config.brake_resistor0.enable_dc_bus_voltage_feedback": false,
  "config.brake_resistor0.dc_bus_voltage_feedback_ramp_start": 51.0,
  "config.brake_resistor0.dc_bus_voltage_feedback_ramp_end": 53.0,
  "config.inverter0.current_soft_max": 80.0,
  "config.inverter0.current_hard_max": 96.0,
  "config.inverter0.temp_limit_lower": 83.95999908447266,
  "config.inverter0.temp_limit_upper": 103.11000061035156,
  "config.inverter0.mod_magn_max": 0.6781481504440308,
  "config.inverter0.shunt_conductance": 1999.9998779296875,
  "config.inverter0.drv_config": 9029553697166464,
  "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": 8,
  "axis0.config.dir_gpio_pin": 5,
  "axis0.config.error_gpio_pin": 6,
  "axis0.config.enable_error_gpio": false,
  "axis0.config.calibration_lockin.current": 7.800000190734863,
  "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": 10.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": 10.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": 34,
  "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": 10,
  "axis0.config.can.error_msg_rate_ms": 10,
  "axis0.config.can.temperature_msg_rate_ms": 10,
  "axis0.config.can.bus_voltage_msg_rate_ms": 10,
  "axis0.config.can.torques_msg_rate_ms": 10,
  "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": 8,
  "axis0.config.commutation_encoder": 8,
  "axis0.config.encoder_bandwidth": 100.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": 10,
  "axis0.config.motor.phase_resistance": 0.10997502505779266,
  "axis0.config.motor.phase_inductance": 0.00011418917711125687,
  "axis0.config.motor.phase_resistance_valid": true,
  "axis0.config.motor.phase_inductance_valid": true,
  "axis0.config.motor.torque_constant": 0.06361538171768188,
  "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": 10.0,
  "axis0.config.motor.resistance_calib_max_voltage": 5.0,
  "axis0.config.motor.current_soft_max": 12.0,
  "axis0.config.motor.current_hard_max": 25.600000381469727,
  "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.10000000149011612,
  "axis0.controller.config.vel_integrator_gain": 0.05000000074505806,
  "axis0.controller.config.vel_integrator_limit": Infinity,
  "axis0.controller.config.vel_limit": 5.0,
  "axis0.controller.config.vel_limit_tolerance": 5.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": 7,
  "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": 10,
  "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": 10.0,
  "axis0.commutation_mapper.config.offset_valid": true,
  "axis0.commutation_mapper.config.offset": 0.0,
  "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": 10,
  "axis0.commutation_mapper.config.use_endstop": false,
  "axis0.interpolator.config.dynamic": true,
  "axis0.motor.motor_thermistor.config.gpio_pin": 4,
  "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,
  "rs485_encoder_group0.config.mode": 0,
  "rs485_encoder_group1.config.mode": 0,
  "inc_encoder0.config.enabled": false,
  "inc_encoder0.config.filter": 0,
  "inc_encoder0.config.cpr": 8192,
  "hall_encoder0.config.enabled": true,
  "hall_encoder0.config.hall_polarity": 0,
  "hall_encoder0.config.hall_polarity_calibrated": true,
  "hall_encoder0.config.ignore_illegal_hall_state": false,
  "hall_encoder0.config.edges_calibrated": true,
  "hall_encoder0.config.edge0": 0.8046679496765137,
  "hall_encoder0.config.edge1": 0.9604957699775696,
  "hall_encoder0.config.edge2": 0.10464093089103699,
  "hall_encoder0.config.edge3": 0.29852864146232605,
  "hall_encoder0.config.edge4": 0.4610975980758667,
  "hall_encoder0.config.edge5": 0.6097253561019897,
  "spi_encoder0.config.ncs_gpio": 12,
  "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": 12,
  "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
}

Any chance this is a wiring issue? Would you mind sending some pictures?

Its entirely possible that this is a wiring issue. The wiring is a bit fragile, however im unable to produce any errors at low speeds when violently moving the cables at low speeds.
I will send over some pictures later, right now i dont have access to the insides of the motor.

However i noticed something very strange instead: We had our axis.config.motor.current_soft_limit at 12A. When we reached ~11.7A as Iq_Measured, the controller went into MISSING_ESTIMATE. Then, we raised the soft limit to 15A and the MISSING_ESTIMATE occured at ~14.8A Iq. This then happened again when having the soft_limit at 20A. Now we raised the limit to ~35A (im aware that this is too much for the motor) and the error happens way less often.

I dont understand this at all, since these two things shouldnt be related in any way right? The only thing i can imagine is that when the current reaches this soft limit, one of the control loops starts to aggressively “control” something™ which causes this hall sensor error.

Hi again,

i just wanted to give a small update. All our issues have been fixed and the issues were all due to improper hall sensor values. The manual of the motor specifies an axial distance between the hall sensors in the stator and the rotor that is too large in practice. We added some shims and now everything works completely fine.
Thanks again for your help!

Oh, great to hear! Apologies for missing your last message, I totally didn’t see that, but I’m glad you got everything figured out now! This’ll be great for me to know too in the future in case anyone else has a similar issue, so thanks for sharing!