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 電圧 sag | battery 内部抵抗 × 合計電流 |
| 高頻度反転で追いつかない | 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 で済む |
デバッグ手順
- 静止 sanity: motor 停止で duty=0、feedback.current 0 中心 ±数十 mA なら正常
- 低速 constant: duty=0.05 で 1 秒、feedback 平均 ≈ 指令、周期振動有 → cogging
- 高速 constant: duty=1.0 で 1 秒、feedback < 指令 → back-EMF 飽和
- ステップ応答: 0→0.5→0 急変、feedback の overshoot と rise time で ESC PID 評価
- 多 motor 同時: 単体 vs 4 台同時で bus 電圧比較 (sag があれば影響)
- 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 通り)
関連
- RoboMaster 電流指令の正規化 — 送信側の正規化仕様
- MIT mode — τ_ff の意味論
- FF スタック — friction/accel_ff の fit
- BLDC motor specs
最終更新: