notes
Control

電流制御の追従性 (指令と feedback が違う理由)

電流指令を送っても feedback が振動・遅れ・飽和する理由。ESC 内部 PID の帯域、Back-EMF 飽和、di/dt 制限、電流センサノイズ、cogging ripple の 6 種

要点: 電流指令 (torque command) を送っても feedback は完全一致しない。ESC 内部 PID の有限帯域 (1) + Back-EMF による電圧飽和 (2) + di/dt 制限 (3) + 電流センサノイズ (4) + cogging ripple (5) + bus 電圧 sag (6) の 6 種類の理由。物理限界内では正常。

数字と現象#

症状主原因目安
静止時に feedback ±0.1-0.3 A 振動電流センサノイズshunt/hall の熱雑音、int16 量子化
低速で周期振動cogging ripple電気角周期 (BLDC 3相 6-step の 1/6)
高速で feedback < 指令Back-EMF 飽和Ke·ω が bus 電圧に近づく
ステップ後 1-2ms overshoot内部 PID 過渡ESC PID の帯域 ~1-5 kHz
複数モータで劣化Bus 電圧 sagbattery 内部抵抗 × 合計電流
高頻度反転で追いつかないmotor インダクタンスの di/dt 制限di/dt ≤ V/L

6 種の原因を分解#

1. ESC 内部 current PID の帯域#

ESC (RoboMaster C610/C620/GM6020, ODrive, etc.) は内部で FOC + current PID を走らせる。

  • 制御周期 ~10-50 kHz、帯域 ~1-5 kHz
  • PID gain は fixed 型が多い (Dji ESC は変更不可、ODrive は user 調整可)
  • 指令ステップに対して:
    • 立ち上がり ~100-500 μs
    • 過渡 overshoot 数 % (機構と motor の組み合わせで変動)

2. Back-EMF による電圧飽和#

BLDC の電圧方程式:

  • 高速回転で が bus 電圧に近づく
  • ESC が電流を維持するために必要な voltage が足りない
  • 結果: feedback current < 指令 current (motor が要求速度で回れず、電流が制限)

目安速度:

  • C610 (24V 電源想定、Ke ≈ 60 mV·s/rad): 24V / 60mV ≈ 400 rad/s で完全飽和
  • 実用上 300 rad/s から劣化開始

3. Motor インダクタンス L による di/dt 制限#

  • L 小さい motor (C610 ~10-30 μH) では 1 A/μs 級 → 通常無視可
  • L 大きい motor (dense-wound gimbal 型) では ms 級の応答遅れ
  • PWM 周期より遅い di/dt は制御で見えない (ripple として現れる)

4. 電流センサのノイズ + 量子化#

  • ESC 内 shunt 抵抗 or Hall センサ
    • shunt: 熱雑音 (Johnson) + amp noise → ~mA 級
    • Hall: 磁気ノイズ + offset drift → 数十 mA 級
  • ADC 分解能: 12-bit なら FS/4096
  • CAN 送信は int16 → 更に量子化 (RoboMaster: 1 LSB = 1 mA @ C610)

→ 静止 motor でも feedback は ±0.1-0.3 A のノイズ帯

5. Cogging torque + 電気角依存 ripple#

BLDC の 3 相スロット構造で、rotor 位置に依存した cogging torque が発生:

  • 磁気吸引で 「ここに rotor が来ると引き込まれる」位置がある
  • ESC が cogging を打ち消すため、指令 constant でも電流指令に 電気角周期の ripple を乗せる
  • 見える feedback: 指令通り + 電気角リプル

電気角周期:

  • 極対数 P の motor で 機械回転 1 周 = P 電気周期
  • C610 (M2006, 極対 7): 電気周期 = 360°/7 ≈ 51°
  • C620 (M3508, 極対 7): 同じく 51°
  • GM6020 (極対 14): 25.7°

低速回転 (電気周期が観測可能な速度域) で顕著。高速では追従できず damping。

6. Bus 電圧 sag#

battery / 電源の内部抵抗 R_int で:

  • LiPo 6S (~24V) で R_int ~10-30 mΩ、瞬時 100A で 1-3 V 降下
  • 複数モータ同時大電流で ESC の使える voltage 減 → tracking 劣化

電流制御は失敗してるのか?#

No、物理限界内:

  • ESC 内部 current PID は正しく指令を追従しようとしてる
  • ただし: 帯域 + 電圧 headroom + 物理制約により 完全追従は無理
  • Steady state で指令 = 平均 feedback、transient で誤差、飽和域で underperform

電圧制御 (raw PWM) との比較:

電圧制御 (PWM duty)電流制御 (RoboMaster 等)
電流motor 動特性そのままESC PID が吸収して指令追従
帯域電源電圧で決まるESC PID 帯域で決まる
ノイズ直接見えるESC 内で減衰 (feedback は sensor ノイズ)
制御しやすさ上位で電流 PID 必要上位は torque command で済む

デバッグ手順#

  1. 静止 sanity: motor 停止で duty=0、feedback.current 0 中心 ±数十 mA なら正常
  2. 低速 constant: duty=0.05 で 1 秒、feedback 平均 ≈ 指令、周期振動有 → cogging
  3. 高速 constant: duty=1.0 で 1 秒、feedback < 指令 → back-EMF 飽和
  4. ステップ応答: 0→0.5→0 急変、feedback の overshoot と rise time で ESC PID 評価
  5. 多 motor 同時: 単体 vs 4 台同時で bus 電圧比較 (sag があれば影響)
  6. CAN latency: candump で send → feedback 間隔測る (10ms 級なら DDS/USB 側)

対策 (困った時)#

症状別#

  • ノイズが大きくて FF fit が壊れる → moving average or median filter (host 側 or FW 側 v_filter)
  • cogging ripple が見えて困る → 低速指令避ける、または cogging compensation (rotor 位置依存 FF 追加)
  • 高速で torque 足りない → 電源電圧上げる or 高 Kt motor に変更 (C620 → GM6020 は逆に voltage 上限が上がる)
  • ステップ応答の overshoot 大 → 指令を smoothen (jerk-limited trajectory)

諦めるべきもの#

  • ESC 内部 PID の再チューニング (Dji ESC 不可)
  • 電流センサノイズの完全除去 (物理限界)
  • 電圧飽和領域での torque 増大 (motor spec 通り)

関連#

最終更新:

On this page