Motor closed loop cannot operate normally

There seems to be a dividing line in the closed-loop motor, which can not operate normally. What is the problem( Speed control mode)

Your feedback (encoder or other feedback source) is not working, and so it’s not commutating: The stator field is not moving with the rotor as it should, and seems to be at a fixed electrical angle. When you force it by hand, you can jump over a ‘pole’ of the motor.
Do you have an encoder at all?

If you are trying to use the sensorless mode, you must enable the sensorless estimator as the feedback source.
Note you must configure axis.sensorless_estimator.config.pm_flux_linkage with the constant for your motor. It is calculated as:
5.51328895422 / (<pole pairs> * <rpm/v>)

1 Like

Thank you
I use a magnetic encoder
I tested it
It can read data

I can perform encoder calibration and encoder index calibration without error. I can also enter the closed-loop control mode, but I can’t operate it. Like in the video, the closed-loop is abnormal

What’s it like in torque control?

The same is true for torque. There is a boundary line. As you said, the stator magnetic field does not rotate, like maintaining a fixed electrical angle

How are you calibrating the motor? Are you doing anything weird like overriding pre_calibrated before it has been calibrated ? Do you have any firmware mods?

This is what I set up
I didn’t make strange settings
The firmware version is 0.5.1

odrv0.erase_configuration() odrv0.config.brake_resistance = 0.1 odrv0.config.dc_bus_undervoltage_trip_level = 32 odrv0.config.dc_bus_overvoltage_trip_level = 43 odrv0.config.dc_max_positive_current = 20.0 odrv0.config.dc_max_negative_current = -2.0 odrv0.config.max_regen_current = 0 odrv0.save_configuration()odrv0.axis0.motor.config.pole_pairs = 18 odrv0.axis0.motor.config.calibration_current = 10 odrv0.axis0.motor.config.resistance_calib_max_voltage = 5 odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT odrv0.axis0.motor.config.current_lim = 30 odrv0.axis0.motor.config.requested_current_range = 40

odrv0.axis0.encoder.config.calib_range=0.2 odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL odrv0.axis0.encoder.config.use_index = True odrv0.axis0.encoder.config.cpr = 16384 odrv0.axis0.encoder.config.bandwidth = 3000 odrv0.axis0.config.calibration_lockin.current = 10 odrv0.axis0.config.calibration_lockin.ramp_time = 0.4 odrv0.axis0.config.calibration_lockin.ramp_distance = 3.1415927410125732 odrv0.axis0.config.calibration_lockin.accel = 20 odrv0.axis0.config.calibration_lockin.vel = 40 odrv0.save_configuration()

odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROLodrv0.axis0.controller.config.vel_limit = 30 odrv0.axis0.controller.config.pos_gain = 30 odrv0.axis0.controller.config.vel_gain = 0.07 odrv0.axis0.controller.config.vel_integrator_gain = 3.5 odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP odrv0.axis0.controller.config.vel_ramp_rate = 5 odrv0.save_configuration()
odrv0.reboot()odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION dump_errors(odrv0)
odrv0.axis0.motor.config.pre_calibrated = True odrv0.axis0.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH dump_errors(odrv0)
odrv0.axis0.config.startup_encoder_index_search = True

odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
odrv0.axis0.encoder.config.pre_calibrated = True
odrv0.axis0.config.startup_encoder_offset_calibration = True

odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL