High speed sensorless BLDC motor

Dear ODrive support, I just get an ODrive Single BLDC Motor Driver and I try to make running a motor but without success.

Our application: to drive the motor from very low speed (1 000 rpm) to higher speed (40 000 rpm) with a variable load applied on the motor axis and the speed should remain constant.

My setup:
-ODESC3.6 driver
-Anaconda Prompt
-odrivetool v0.5.4
-ODrive 3.6 CDC interface: USB Serial(CDC)
-ODrive 3.6 Native Interface: libusb-win32 (v1.2.6.0)

My motor:
-Nominal voltage: 24VDC
-No load max. speed: 40 000 rpm
-Speed constant: 1746 rpm/V
-Sensorless Brushless
-1 pole pair
-16 mm diameter, 56 mm long

In order to make it working in sensorless mode I tried the following commands and here is the complete Prompt IN/OUT text:


ODrive control utility v0.5.4

Please connect your ODrive.
You can also type help() or quit().

Connected to ODrive 347836543031 as odrv0
In [1]: odrv0.erase_configuration()

In [2]: odrv0.axis0.controller.config.vel_limit = 1000

In [3]: odrv0.config.brake_resistance = 0.52
…: odrv0.axis0.controller.config.vel_gain = 0.02
…: odrv0.axis0.controller.config.vel_integrator_gain = 0
…: odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
…: odrv0.axis0.motor.config.pole_pairs = 1
…: odrv0.axis0.motor.config.direction = 1
…: odrv0.axis0.sensorless_estimator.config.pm_flux_linkage = 5.51328895422/(1*1736)
…:

In [4]: odrv0.save_configuration()

In [5]: odrv0.reboot()
Oh no odrv0 disappeared

Reconnected to ODrive 347836543031 as odrv0
In [6]: odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION

In [7]: odrv0.axis0.motor
Out[7]:
DC_calib_phB: -1.4684582948684692 (float)
DC_calib_phC: -2.3750576972961426 (float)
armed_state: 0 (uint8)
config:
calibration_current: 10.0 (float)
current_control_bandwidth: 1000.0 (float)
current_lim: 60.0 (float)
current_lim_tolerance: 1.25 (float)
direction: 1 (int32)
inverter_temp_limit_lower: 100.0 (float)
inverter_temp_limit_upper: 120.0 (float)
motor_type: 0 (uint8)
phase_inductance: 0.0 (float)
phase_resistance: 0.0 (float)
pole_pairs: 1 (int32)
pre_calibrated: True (bool)
requested_current_range: 60.0 (float)
resistance_calib_max_voltage: 2.0 (float)
current_control:
I_measured_report_filter_k: 1.0 (float)
Ibus: nan (float)
Id_measured: -0.18381670117378235 (float)
Iq_measured: -0.03971865773200989 (float)
Iq_setpoint: 0.0031250002793967724 (float)
final_v_alpha: nan (float)
final_v_beta: nan (float)
i_gain: nan (float)
max_allowed_current: 60.75 (float)
overcurrent_trip_level: 67.5 (float)
p_gain: 0.0 (float)
v_current_control_integral_d: 0.0 (float)
v_current_control_integral_q: 0.0 (float)
current_meas_phB: 0.13887059688568115 (float)
current_meas_phC: 0.07685089111328125 (float)
error: 128 (uint16)
gate_driver:
drv_fault: 0 (uint16)
get_inverter_temp(obj: object_ref) → result: float
is_calibrated: True (bool)
phase_current_rev_gain: 0.02500000037252903 (float)
thermal_current_lim: 283.064453125 (float)
timing_log:
TIMING_LOG_ADC_CB_DC: 12858 (uint16)
TIMING_LOG_ADC_CB_I: 2470 (uint16)
TIMING_LOG_ENC_CALIB: 0 (uint16)
TIMING_LOG_FOC_CURRENT: 7026 (uint16)
TIMING_LOG_FOC_VOLTAGE: 0 (uint16)
TIMING_LOG_GENERAL: 0 (uint16)
TIMING_LOG_IDX_SEARCH: 0 (uint16)
TIMING_LOG_MEAS_L: 0 (uint16)
TIMING_LOG_MEAS_R: 0 (uint16)

In [8]: odrv0.axis0.motor.config.pre_calibrated = True
…: odrv0.axis0.motor.config.current_lim = 60
…:

In [9]: odrv0.save_configuration()

In [10]: odrv0.reboot()
Oh no odrv0 disappeared

Reconnected to ODrive 347836543031 as odrv0
In [12]: odrv0.axis0.requested_state = 5

In [13]: odrv0.axis0.config.startup_sensorless_control = True

In [14]: odrv0.save_configuration()

In [15]: odrv0.reboot()
Oh no odrv0 disappeared

Reconnected to ODrive 347836543031 as odrv0
In [17]: odrv0.axis0.controller.vel_setpoint = 50

In [18]: odrv0.axis0.controller.vel_setpoint = 100

In [19]: odrv0.axis0.controller.vel_setpoint = 10

In [31]: odrv0.axis0.motor.is_calibrated
Out[31]: True

In [32]: dump_errors(odrv0)
system: not found
axis0
axis: Error(s):
UNKNOWN ERROR: 0x00000020
UNKNOWN ERROR: 0x00000040
motor: Error(s):
MOTOR_ERROR_MODULATION_MAGNITUDE
sensorless_estimator: no error
encoder: no error
controller: no error


During the commands, the motor is never moving or presenting any change. Please also have a look on the dump_errors I return.

Thank you in advance for your instructions and suggestion. Perhaps you will find the good commands to make it working.

Best Regards,
Julien

Hi,
we cannot give support for non-genuine ODrives. If you need a single axis ODrive I would recommend the ODrive Pro or ODrive S1.

1 Like