発狂しそうなあなたのために~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
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
この記事が気に入ったらサポートをしてみませんか?