S1 force feedback

Hi,

I have used the ODrive Pro for some years. For one project I switched to the S1. I use hall sensors for encoder. I also use nearly the same configurations for the S1 from the pro. I just added the break resistor. Now the force feedback is nearly zero on the S1. The pro works against turning at set_vel 0 and could not be stoppt at any heigher rpm. The S1 gives some force feedback, but is not returning to its last position. Is there any difference in the S1 to the pro in the case?

Cheers, Robert

There definitely shouldn’t be any difference, especially not in an application like this. Sounds like either a wiring issue or an ODrive configuration issue – how are you transferring the configuration from the ODrive Pro to the ODrive S1?

HI, thanks for your reply. I first transfered it with backup-config. After I tested it, I also set up the S1 with the ODrive tool.
A Wirering problem is not realy likely, because I have the problem on two similar motor configurations, that have no problem with the ODrive Pro.
The S1 configuration has a slight force feedback, but is definitly not that effective as the pro. It do not take more current. But i have a big enough Power source and the current limits are much higher.

Can you use backup-config to export both the S1 and Pro configs and upload them here?

Here the configs from S1 and Pro. They are for slightly different motors.
I have to insert the text:
S1:
{“axis0”: {“commutation_mapper”: {“config”: {“approx_init_pos”: 0.0, “approx_init_pos_valid”: false, “circular_output_range”: 1.0, “circular”: true, “index_gpio”: 7, “index_offset”: 0.0, “index_offset_valid”: false, “offset”: 0.0, “offset_valid”: true, “passive_index_search”: false, “scale”: 1.0, “use_endstop”: false, “use_index_gpio”: false}}, “config”: {“I_bus_hard_max”: Infinity, “I_bus_hard_min”: -Infinity, “I_bus_soft_max”: Infinity, “I_bus_soft_min”: -Infinity, “P_bus_soft_max”: Infinity, “P_bus_soft_min”: -Infinity, “calib_range”: 0.019999999552965164, “calib_scan_distance”: 8.0, “calib_scan_vel”: 2.0, “commutation_encoder_bandwidth”: NaN, “commutation_encoder”: 8, “dir_gpio_pin”: 9, “enable_error_gpio”: false, “enable_step_dir”: false, “enable_watchdog”: false, “encoder_bandwidth”: 100.0, “error_gpio_pin”: 10, “index_search_at_target_vel_only”: false, “load_encoder”: 8, “startup_closed_loop_control”: false, “startup_encoder_index_search”: false, “startup_encoder_offset_calibration”: false, “startup_homing”: false, “startup_max_wait_for_ready”: 3.0, “startup_motor_calibration”: false, “step_dir_always_on”: false, “step_gpio_pin”: 8, “torque_soft_max”: Infinity, “torque_soft_min”: -Infinity, “watchdog_timeout”: 0.0, “anticogging”: {“calib_bidirectional”: true, “calib_coarse_integrator_gain”: 100.0, “calib_coarse_tuning_duration”: 60.0, “calib_end_vel”: 0.07000000029802322, “calib_fine_dist_scale”: 1.0, “calib_fine_tuning_duration”: 120.0, “calib_start_vel”: 4.0, “enabled”: false, “max_torque”: 0.15000000596046448}, “calibration_lockin”: {“accel”: 3.183098793029785, “current”: 4.0, “ramp_distance”: 0.5, “ramp_time”: 0.4000000059604645, “vel”: 6.36619758605957}, “can”: {“bus_voltage_msg_rate_ms”: 0, “encoder_msg_rate_ms”: 0, “error_msg_rate_ms”: 0, “heartbeat_msg_rate_ms”: 100, “iq_msg_rate_ms”: 0, “node_id”: 3, “powers_msg_rate_ms”: 0, “temperature_msg_rate_ms”: 0, “torques_msg_rate_ms”: 0, “version_msg_rate_ms”: 0}, “general_lockin”: {“accel”: 20.0, “current”: 10.0, “finish_distance”: 100.0, “finish_on_distance”: false, “finish_on_vel”: false, “initial_pos”: 0.0, “ramp_distance”: 3.1415927410125732, “ramp_time”: 0.4000000059604645, “vel”: 40.0}, “motor”: {“acim_autoflux_attack_gain”: 10.0, “acim_autoflux_decay_gain”: 1.0, “acim_autoflux_enable”: false, “acim_autoflux_min_Id”: 10.0, “acim_gain_min_flux”: 10.0, “acim_nominal_slip_vel”: 2.3399999141693115, “bEMF_FF_enable”: false, “calibration_current”: 4.0, “current_control_bandwidth”: 100.0, “current_hard_max”: 110.0, “current_slew_rate_limit”: 10000.0, “current_soft_max”: 90.0, “direction”: 1.0, “ff_pm_flux_linkage”: 0.0, “ff_pm_flux_linkage_valid”: false, “fw_enable”: false, “fw_fb_bandwidth”: 500.0, “fw_mod_setpoint”: 0.7813565135002136, “motor_model_l_d”: 0.0, “motor_model_l_dq_valid”: false, “motor_model_l_q”: 0.0, “motor_type”: 0, “phase_inductance”: 6.874503014842048e-05, “phase_inductance_valid”: true, “phase_resistance”: 0.05476512014865875, “phase_resistance_valid”: true, “pole_pairs”: 7, “power_torque_report_filter_bandwidth”: 8000.0, “resistance_calib_max_voltage”: 10.0, “sensorless_observer_gain”: 1000.0, “sensorless_pll_bandwidth”: 1000.0, “sensorless_pm_flux_linkage”: 0.0, “sensorless_pm_flux_linkage_valid”: false, “torque_constant”: 0.030629629269242287, “wL_FF_enable”: false}, “sensorless_ramp”: {“accel”: 31.83098793029785, “current”: 10.0, “finish_distance”: 15.915493965148926, “finish_on_distance”: false, “finish_on_vel”: true, “initial_pos”: 0.0, “ramp_distance”: 0.5, “ramp_time”: 0.4000000059604645, “vel”: 63.6619758605957}}, “controller”: {“config”: {“absolute_setpoints”: false, “circular_setpoint_range”: 1.0, “circular_setpoints”: false, “commutation_vel_scale”: 1.0, “control_mode”: 2, “enable_gain_scheduling”: false, “enable_overspeed_error”: true, “enable_torque_mode_vel_limit”: true, “enable_vel_limit”: true, “gain_scheduling_width”: 0.0010000000474974513, “homing_speed”: 0.25, “inertia”: 0.0, “input_filter_bandwidth”: 2.0, “input_mode”: 2, “pos_gain”: 1.0, “spinout_electrical_power_bandwidth”: 20.0, “spinout_electrical_power_threshold”: 10.0, “spinout_mechanical_power_bandwidth”: 20.0, “spinout_mechanical_power_threshold”: -10.0, “steps_per_circular_range”: 1024, “torque_ramp_rate”: 0.009999999776482582, “use_commutation_vel”: false, “use_load_encoder_for_commutation_vel”: false, “vel_gain”: 0.20000000298023224, “vel_integrator_gain”: 0.5, “vel_integrator_limit”: Infinity, “vel_limit”: 40.0, “vel_limit_tolerance”: 1.2000000476837158, “vel_ramp_rate”: 30.0}}, “enable_pin”: {“config”: {“debounce_ms”: 50, “enabled”: false, “gpio_num”: 7, “is_active_high”: false, “offset”: 0.0}}, “interpolator”: {“config”: {“dynamic”: true}}, “max_endstop”: {“config”: {“debounce_ms”: 50, “enabled”: false, “gpio_num”: 0, “is_active_high”: false, “offset”: 0.0}}, “mechanical_brake”: {“config”: {“gpio_num”: 0, “is_active_low”: true}}, “min_endstop”: {“config”: {“debounce_ms”: 50, “enabled”: false, “gpio_num”: 0, “is_active_high”: false, “offset”: 0.0}}, “motor”: {“motor_thermistor”: {“config”: {“beta”: 3435.0, “enabled”: true, “gpio_pin”: 4, “r_ref”: 10000.0, “t_ref”: 25.0, “temp_limit_lower”: 100.0, “temp_limit_upper”: 120.0}}}, “pos_vel_mapper”: {“config”: {“approx_init_pos”: 0.0, “approx_init_pos_valid”: false, “circular_output_range”: 1.0, “circular”: false, “index_gpio”: 7, “index_offset”: 0.0, “index_offset_valid”: false, “offset”: 0.0, “offset_valid”: false, “passive_index_search”: false, “scale”: 0.1428571492433548, “use_endstop”: false, “use_index_gpio”: false}}, “trap_traj”: {“config”: {“accel_limit”: 0.5, “decel_limit”: 0.5, “vel_limit”: 2.0}}}, “can”: {“config”: {“baud_rate”: 250000, “protocol”: 1}}, “config”: {“dc_bus_overvoltage_trip_level”: 52.0, “dc_bus_undervoltage_trip_level”: 10.5, “dc_max_negative_current”: -1.0, “dc_max_positive_current”: 120.0, “enable_uart_a”: true, “gpio0_mode”: 17, “gpio10_mode”: 17, “gpio11_mode”: 17, “gpio12_mode”: 4, “gpio1_mode”: 17, “gpio2_mode”: 17, “gpio3_mode”: 17, “gpio4_mode”: 17, “gpio5_mode”: 17, “gpio6_mode”: 4, “gpio7_mode”: 4, “gpio8_mode”: 17, “gpio9_mode”: 17, “max_regen_current”: 0.0, “uart0_protocol”: 3, “uart_a_baudrate”: 9600, “usb_cdc_protocol”: 3, “user_config_0”: 0, “user_config_1”: 0, “user_config_2”: 0, “user_config_3”: 0, “user_config_4”: 0, “user_config_5”: 0, “user_config_6”: 0, “user_config_7”: 0, “brake_resistor0”: {“dc_bus_voltage_feedback_ramp_end”: 53.0, “dc_bus_voltage_feedback_ramp_start”: 51.0, “enable_dc_bus_voltage_feedback”: false, “enable”: true, “resistance”: 2.0}, “gpio11_analog_mapping”: {“endpoint”: null, “max”: 0.0, “min”: 0.0}, “gpio1_analog_mapping”: {“endpoint”: null, “max”: 0.0, “min”: 0.0}, “gpio8_pwm_mapping”: {“endpoint”: null, “max”: 0.0, “min”: 0.0}, “inverter0”: {“current_hard_max”: 96.0, “current_soft_max”: 80.0, “drv_config”: 9029553697166464, “mod_magn_max”: 0.6781481504440308, “shunt_conductance”: 1999.9998779296875, “temp_limit_lower”: 83.95999908447266, “temp_limit_upper”: 103.11000061035156}}, “hall_encoder0”: {“config”: {“edge0”: 0.46867263317108154, “edge1”: 0.6461350321769714, “edge2”: 0.7879056334495544, “edge3”: 0.9674991965293884, “edge4”: 0.15842601656913757, “edge5”: 0.29775094985961914, “edges_calibrated”: true, “enabled”: true, “hall_polarity_calibrated”: true, “hall_polarity”: 0, “ignore_illegal_hall_state”: true}}, “inc_encoder0”: {“config”: {“cpr”: 90, “enabled”: true}}, “rs485_encoder_group0”: {“config”: {“mode”: 0}}, “spi_encoder0”: {“config”: {“baudrate”: 1687500, “biss_c_bits”: 18, “delay”: 0.0, “max_error_rate”: 0.004999999888241291, “mode”: 0, “ncs_gpio”: 17}}, “spi_encoder1”: {“config”: {“baudrate”: 1687500, “biss_c_bits”: 18, “delay”: 0.0, “max_error_rate”: 0.004999999888241291, “mode”: 0, “ncs_gpio”: 17}}}

Pro:
{“amt21_encoder_group0”: {“config”: {“addr0”: 84, “enable”: false, “event_driven_mode”: false, “gpio”: 0, “rs485”: 0}}, “axis0”: {“commutation_mapper”: {“config”: {“approx_init_pos”: 0.0, “approx_init_pos_valid”: false, “circular_output_range”: 1.0, “circular”: true, “index_gpio”: 7, “index_offset”: 0.0, “index_offset_valid”: false, “index_search_always_on”: false, “offset”: 0.0, “offset_valid”: true, “scale”: 1.0, “use_endstop”: false, “use_index_gpio”: false}}, “config”: {“I_bus_hard_max”: Infinity, “I_bus_hard_min”: -Infinity, “calib_range”: 0.019999999552965164, “calib_scan_distance”: 8.0, “calib_scan_vel”: 2.0, “commutation_encoder”: 8, “dir_gpio_pin”: 9, “enable_error_gpio”: false, “enable_step_dir”: false, “enable_watchdog”: false, “encoder_bandwidth”: 100.0, “error_gpio_pin”: 10, “index_search_at_target_vel_only”: false, “load_encoder”: 8, “startup_closed_loop_control”: false, “startup_encoder_index_search”: false, “startup_encoder_offset_calibration”: false, “startup_homing”: false, “startup_max_wait_for_ready”: 3.0, “startup_motor_calibration”: false, “step_dir_always_on”: false, “step_gpio_pin”: 8, “torque_soft_max”: Infinity, “torque_soft_min”: -Infinity, “watchdog_timeout”: 0.0, “anticogging”: {“calib_coarse_integrator_gain”: 100.0, “calib_coarse_tuning_duration”: 60.0, “calib_end_vel”: 0.07000000029802322, “calib_fine_tuning_duration”: 120.0, “calib_start_vel”: 4.0, “enabled”: false, “max_torque”: 0.15000000596046448}, “calibration_lockin”: {“accel”: 3.183098793029785, “current”: 4.0, “ramp_distance”: 0.5, “ramp_time”: 0.4000000059604645, “vel”: 6.36619758605957}, “can”: {“bus_voltage_msg_rate_ms”: 0, “encoder_msg_rate_ms”: 0, “error_msg_rate_ms”: 0, “heartbeat_msg_rate_ms”: 100, “iq_msg_rate_ms”: 0, “is_extended”: false, “node_id”: 3, “temperature_msg_rate_ms”: 0, “torques_msg_rate_ms”: 0, “version_msg_rate_ms”: 0}, “general_lockin”: {“accel”: 20.0, “current”: 10.0, “finish_distance”: 100.0, “finish_on_distance”: false, “finish_on_vel”: false, “initial_pos”: 0.0, “ramp_distance”: 3.1415927410125732, “ramp_time”: 0.4000000059604645, “vel”: 40.0}, “motor”: {“acim_autoflux_attack_gain”: 10.0, “acim_autoflux_decay_gain”: 1.0, “acim_autoflux_enable”: false, “acim_autoflux_min_Id”: 10.0, “acim_gain_min_flux”: 10.0, “acim_nominal_slip_vel”: 2.3399999141693115, “bEMF_FF_enable”: false, “calibration_current”: 4.0, “current_control_bandwidth”: 100.0, “current_hard_max”: 110.0, “current_slew_rate_limit”: 10000.0, “current_soft_max”: 90.0, “direction”: 1.0, “ff_pm_flux_linkage”: 0.0, “ff_pm_flux_linkage_valid”: false, “fw_enable”: false, “fw_fb_bandwidth”: 500.0, “fw_mod_setpoint”: 0.7813565135002136, “motor_model_l_d”: 0.0, “motor_model_l_dq_valid”: false, “motor_model_l_q”: 0.0, “motor_type”: 0, “phase_inductance”: 7.802167965564877e-05, “phase_inductance_valid”: true, “phase_resistance”: 0.08081876486539841, “phase_resistance_valid”: true, “pole_pairs”: 7, “resistance_calib_max_voltage”: 10.0, “sensorless_observer_gain”: 1000.0, “sensorless_pll_bandwidth”: 1000.0, “sensorless_pm_flux_linkage”: 0.0, “sensorless_pm_flux_linkage_valid”: false, “torque_constant”: 0.07876190543174744, “wL_FF_enable”: false}, “sensorless_ramp”: {“accel”: 31.83098793029785, “current”: 10.0, “finish_distance”: 15.915493965148926, “finish_on_distance”: false, “finish_on_vel”: true, “initial_pos”: 0.0, “ramp_distance”: 0.5, “ramp_time”: 0.4000000059604645, “vel”: 63.6619758605957}}, “controller”: {“config”: {“absolute_setpoints”: false, “circular_setpoint_range”: 1.0, “circular_setpoints”: false, “commutation_vel_scale”: 1.0, “control_mode”: 2, “enable_gain_scheduling”: false, “enable_overspeed_error”: true, “enable_torque_mode_vel_limit”: true, “enable_vel_limit”: true, “gain_scheduling_width”: 0.0010000000474974513, “homing_speed”: 0.25, “inertia”: 0.0, “input_filter_bandwidth”: 2.0, “input_mode”: 2, “pos_gain”: 1.0, “spinout_electrical_power_bandwidth”: 20.0, “spinout_electrical_power_threshold”: 10.0, “spinout_mechanical_power_bandwidth”: 20.0, “spinout_mechanical_power_threshold”: -10.0, “steps_per_circular_range”: 1024, “torque_ramp_rate”: 0.009999999776482582, “use_commutation_vel”: false, “vel_gain”: 0.4000000059604645, “vel_integrator_gain”: 2.0, “vel_integrator_limit”: Infinity, “vel_limit”: 40.0, “vel_limit_tolerance”: 1.2000000476837158, “vel_ramp_rate”: 30.0}}, “interpolator”: {“config”: {“dynamic”: true}}, “max_endstop”: {“config”: {“debounce_ms”: 50, “enabled”: false, “gpio_num”: 0, “is_active_high”: false, “offset”: 0.0}}, “mechanical_brake”: {“config”: {“gpio_num”: 0, “is_active_low”: true}}, “min_endstop”: {“config”: {“debounce_ms”: 50, “enabled”: false, “gpio_num”: 0, “is_active_high”: false, “offset”: 0.0}}, “motor”: {“motor_thermistor”: {“config”: {“beta”: 3435.0, “enabled”: true, “gpio_pin”: 3, “r_ref”: 10000.0, “t_ref”: 25.0, “temp_limit_lower”: 100.0, “temp_limit_upper”: 120.0}}}, “pos_vel_mapper”: {“config”: {“approx_init_pos”: 0.0, “approx_init_pos_valid”: false, “circular_output_range”: 1.0, “circular”: false, “index_gpio”: 7, “index_offset”: 0.0, “index_offset_valid”: false, “index_search_always_on”: false, “offset”: 0.0, “offset_valid”: false, “scale”: 0.1428571492433548, “use_endstop”: false, “use_index_gpio”: false}}, “trap_traj”: {“config”: {“accel_limit”: 0.5, “decel_limit”: 0.5, “vel_limit”: 2.0}}}, “can”: {“config”: {“baud_rate”: 250000, “protocol”: 1}}, “config”: {“dc_bus_overvoltage_trip_level”: 52.0, “dc_bus_undervoltage_trip_level”: 10.5, “dc_max_negative_current”: -1.0, “dc_max_positive_current”: 120.0, “enable_can_a”: true, “enable_uart_a”: false, “gpio0_mode”: 17, “gpio10_mode”: 17, “gpio11_mode”: 17, “gpio12_mode”: 4, “gpio13_mode”: 4, “gpio14_mode”: 17, “gpio15_mode”: 17, “gpio16_mode”: 17, “gpio17_mode”: 17, “gpio18_mode”: 17, “gpio1_mode”: 17, “gpio2_mode”: 17, “gpio3_mode”: 17, “gpio4_mode”: 17, “gpio5_mode”: 17, “gpio6_mode”: 17, “gpio7_mode”: 17, “gpio8_mode”: 17, “gpio9_mode”: 17, “max_regen_current”: 0.0, “uart0_protocol”: 3, “uart_a_baudrate”: 115200, “usb_cdc_protocol”: 3, “gpio15_analog_mapping”: {“endpoint”: null, “max”: 0.0, “min”: 0.0}, “gpio16_analog_mapping”: {“endpoint”: null, “max”: 0.0, “min”: 0.0}, “gpio8_pwm_mapping”: {“endpoint”: null, “max”: 0.0, “min”: 0.0}, “gpio9_pwm_mapping”: {“endpoint”: null, “max”: 0.0, “min”: 0.0}, “inverter0”: {“current_hard_max”: 150.0, “current_soft_max”: 100.0, “drv_config”: 9029553772700800, “shunt_conductance”: 1999.9998779296875, “temp_limit_lower”: 83.95999908447266, “temp_limit_upper”: 103.11000061035156}, “motor_fan”: {“enabled”: false, “lower”: 70.0, “upper”: 80.0}, “odrv_fan”: {“enabled”: false, “lower”: 70.0, “upper”: 80.0}}, “hall_encoder0”: {“config”: {“enabled”: true, “hall_polarity_calibrated”: true, “hall_polarity”: 0, “ignore_illegal_hall_state”: true}}, “hall_encoder1”: {“config”: {“enabled”: false, “hall_polarity_calibrated”: false, “hall_polarity”: 0, “ignore_illegal_hall_state”: false}}, “inc_encoder0”: {“config”: {“cpr”: 42, “enabled”: true}}, “inc_encoder1”: {“config”: {“cpr”: 8192, “enabled”: false}}, “spi_encoder0”: {“config”: {“baudrate”: 1687500, “delay”: 0.0, “max_error_rate”: 0.004999999888241291, “mode”: 0, “ncs_gpio”: 17}}, “spi_encoder1”: {“config”: {“baudrate”: 1687500, “delay”: 0.0, “max_error_rate”: 0.004999999888241291, “mode”: 0, “ncs_gpio”: 17}}}

Hey there,

What motors are these specifically? It looks like the vel gains are different (vel_gain=0.4/vel_integrator_gain=2 on the Pro, vel_gain=0.2/vel_integrator_gain=0.5 on the S1), so this is likely a tuning issue.

With identical motors and vel gains, the performance will be identical – however neither of these are the case here. If the vel gains are identical and the torque constants are correctly set, then performance should be similar. I’d try setting the vel gain and vel integrator gain to 0.4 and 2, respectively, on the S1.

I noticed you said “but is not returning to its last position” – this is a result of the velocity integrator windup, and is not a deliberate behavior. If you’re looking for it to return to a specific position, you should either use position control or torque control with an external motion controller giving fine-grained torque setpoints.

Maybe you can give a bit more detail as to what your application/usecase is?

Hi solomondg,

thank you for your reply, I use the motors to build underwater thruster. I have now a project, were the space is pre defined and just a S1 is fitting. Therefore I switched from the Pro to S1. The additional brake resistor was also a plus. Unfortunately I have bad results, because the motor is not taking more current for higher torque. I than just tested to catch the motor and it just stopped. I know that this happens, when you have set the vel_integrator_gain = 0. But in my config I brought it up to 5. It definitely differs the behavior but it never made it so strong, that you can not stop it easily by hand. This is not possible with the same Motor and config on the Pro. There the motor will rip of your hand. Additional on the Pro the motor in closed loop will fight for its position (in vel_mode) and is turning back to nearly its starting position. With the S1 it just resist but you can turn it and it will stay where its get turned.

You said the motor is different, correct? Can you link the two motors you’re using?

Given the same parameters and motor, the S1 and the Pro should control the motors completely identically – so this definitely sounds like a configuration issue.

The motors are self developed. But I had both of the motors on the Pro performing very well.
I agree, it should be a configuration issue. But could it be, that there is a problem in the firmware of the S1? I tested the latest version and the 0.6.7 both had the same “issue”.

It’s very unlikely this is a difference in firmware, as the S1 and Pro use identical firmware (with some slight changes to account for the differences in hardware design).

Have you tried the same motor on each with the same configuration? Can you upload said configuration for each ODrive?