見出し画像

発狂しそうなあなたのために~Odrivetoolの使い方?

あとでまとめます。今はメモ程度です。


キャリブレーションですらうまくいかねえ

原因は3つ考えられます。

1.電流は足りていますか?

私は開発当初、直流安定化電源で行っていましたが、とても動作が不安定で、リポバッテリーに電源を変更したら解決しました!
かなりの電流が必要です。

2.  電流制限のconfigは書き換えましたか?

電源が十分でもOdrive内の設定で工場出荷時のままだと制限されています。
下のコマンドで変更しましょう。

odrv0.axis0.motor.config.current_lim = 

3.  配線は大丈夫ですか?

4.  エンコーダーはついてますか?

Odriveは基本的にエンコーダーなしではコントロールできないと考えていいです。

5.  モーター設定はあってますか?

6.  エンコーダー設定はしましたか?

7.  PID定数は設定しましたか?

なぜかモーターが止まる!??

初期状態では安全設定が多くかまされているので、電流とRPMの制限を下のコードで解除

odrv0.axis0.controller.config.vel_limit = 200
odrv0.axis0.motor.config.current_lim = 150

それでも、モーター動作中にOdriveリセットがかかる場合は、電源強化するか、だんだん加速させることで、電力不足エラーをごまかす↓
vel制御モードです。

odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
odrv0.axis0.controller.config.vel_ramp_rate = 0.5
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP
 

この際、HIGH CURRENT MOTOR使用の場合、input_velの値が小さすぎるときにも同様にOdriveリセットがかかってしまい、モーターが止まってしまうことがあるようです。

POS制御モードで回転速度が速すぎて落ちてしまう場合もあります。

その際にはposFILTERを使用してモーターの速度を指定しましょう。

odrv0.axis0.controller.config.control_mode = CONTROL_MODE_POSITION_CONTROL
odrv0.axis0.controller.config.input_filter_bandwidth = 6.0 
odrv0.axis0.controller.config.input_mode = INPUT_MODE_POS_FILTER
odrv0.axis0.controller.input_pos = 1

Configサンプル


・DUAL SHAFT MOTOR - D6374 150KV

D6374 150kv

odrv0.axis0.motor.config


I_bus_hard_max: inf (float)
I_bus_hard_min: -inf (float)
I_leak_max: 0.10000000149011612 (float)
R_wL_FF_enable: False (bool)
acim_autoflux_attack_gain: 10.0 (float)
acim_autoflux_decay_gain: 1.0 (float)
acim_autoflux_enable: False (bool)
acim_autoflux_min_Id: 10.0 (float)
acim_gain_min_flux: 10.0 (float)
bEMF_FF_enable: False (bool)
calibration_current: 10.0 (float)
current_control_bandwidth: 500.0 (float)
current_lim: 150.0 (float)
current_lim_margin: 8.0 (float)
dc_calib_tau: 0.20000000298023224 (float)
inverter_temp_limit_lower: 100.0 (float)
inverter_temp_limit_upper: 120.0 (float)
motor_type: 0 (uint8)
phase_inductance: 2.413000402157195e-05 (float)
phase_resistance: nan (float)
pole_pairs: 7 (int32)
pre_calibrated: False (bool)
requested_current_range: 60.0 (float)
resistance_calib_max_voltage: 2.0 (float)
torque_constant: 0.055133331567049026 (float)
torque_lim: inf (float)

odrv0.axis0.encoder.config

abs_spi_cs_gpio_pin: 1 (uint16)
bandwidth: 1000.0 (float)
calib_range: 0.019999999552965164 (float)
calib_scan_distance: 50.26548385620117 (float)
calib_scan_omega: 12.566370964050293 (float)
cpr: 8192 (int32)
direction: 1 (int32)
enable_phase_interpolation: True (bool)
find_idx_on_lockin_only: False (bool)
hall_polarity: 0 (uint8)
hall_polarity_calibrated: False (bool)
ignore_illegal_hall_state: False (bool)
index_offset: 0.0 (float)
mode: 0 (uint16)
phase_offset: 4791 (int32)
phase_offset_float: 1.239592432975769 (float)
pre_calibrated: False (bool)
sincos_gpio_pin_cos: 4 (uint16)
sincos_gpio_pin_sin: 3 (uint16)
use_index: False (bool)
use_index_offset: True (bool)

odrv0.axis0.controller.config

この記事が気に入ったらサポートをしてみませんか?