← Portfolio に戻る SimpleFOC L0 ①③④ 完了 TORQ 電圧 合格 電流 0.05 A 合格 速度 T1 合格 角度 +1 rad 合格 5010 机上確認

開ループ速度から電流トルクの入口まで — JC4827 × SimpleFOC

同じBLDCモータを、速さ・角度・押しの強さ(トルク)で回せるようにした。 トルク制御方式(押しの指令)は最初は電圧、あとから電流にした。

更新 2026年9月28日 | slug simplefoc-basics | PIO jc4827_simplefoc | 正本 docs/hardware/simplefoc-basics.md

この章の一覧: 合格した 7 段は この章でできたこと。 外側と内側の対応は 学んだ制御の地図。
JC4827 BLDC S-con — 画面に LIVE/EDIT・MODE CL、右に NeoRotary 4
BLDC S-con — JC4827 画面+ Adafruit 5752(NeoRotary 4)。 Vps12 PP7 2805/LIVE P=0.40 I=1.2 F=0.01/右下 MODE CL

Chocofon(B)

速さも、角度も、押しの強さも、同じBLDCモータで指定できた。

AIチューター

外側が合わせたい量。内側が押しの出し方。押しは電圧から電流へ。

管理人

角度+電流の速度 P は 0.02。0.05 は Uq が ±5 V だったので使わない。

0. この章でできたこと

同じBLDCモータを、速さ・角度・押しの強さ(トルク)で回せるようにした。 トルク制御方式(押しの指令)は最初は電圧、あとから電流にした。

段 何を指令したか 合格の数字
① 開ループ 電気角を自分で進める。L は電圧の振幅 2208モータ、L = 1.5 V で常用
③ 閉ループ速度 目標の速さとの差で Uq(電圧)を増減 2805モータ、電源 12 V。手で止めても戻る。常用 P=0.40、I=1.2、L=5 V
④ 閉ループ角度 角度の差から、内側の速さを頼む Ap=5。+1 rad で約 1 秒、err≈0
トルクA(電圧) T が電圧そのもの。速さは目標にしない T = 0.5〜2.0 V で、画面の tgt と Uq が一致
電流の入口 軸を押さえた 0.05 A。Uq は巻線抵抗 × 電流 Uq = 0.61 V(12.2 Ω × 0.05 A)。約 1.15 V は積分の積み上げ
速度+電流 速さに合わせて Iq(電流)と Uq(電圧)が増減 無負荷で目標 1 rad/s、平均 0.99 rad/s。速度 P=0.01
角度+電流 角度に合わせて Iq(電流)と Uq(電圧)が増減 速度 P=0.02 で 3.30 rad → 4.30 rad が err=0。P=0.05 は Uq が ±5 V
5010 360KV 低抵抗。電圧の天井は 1 V、電流の天井は 0.60 A 0.20 V で約 7.5 rad/s(360 KV と合う)。電流 0.20 A の押しを確認。速度の平均は追従。角度は使うときに合わせる

5.00 rad と 4.00 rad は、磁石の歯と歯のあいだなので、速度 P=0.02 でもまだ行き来します。 北の星は二足/レッグドで、いまは机上の入口です。 MCU は JC4827(ESP32-S3)。①から電圧トルクまでは PowerShield v0.2。 電流は MKS Dual FOC Plus v3.2 の M1 だけです。

0-1. 学んだ制御の地図

一文:
外側は target(合わせたい量)、 内側は押しの出し方(TQ0=Uq[V]/TQ1=Iq[A])。 ①③④は外側が速さか角度、内側は電圧まで済。 電圧トルク(TORQ+TQ0)も合格。 電流は、軸を押さえた 0.05 A(Uq = 0.61 V)、無負荷の 1 rad/s(平均 0.99 rad/s)、 角度の +1 rad(3.30 rad → 4.30 rad)まで合格。

モーションコントロールModeの説明

呼び名 [serialコマンド] 外側(target) 内側(押し) 状態
開ループ速度 [OL(M1)] (なし・電気角を自分で進める) 電圧の振幅 L[V] 済
閉ループ速度・電圧 [VEL(M0)+TQ0] 角速度[rad/s] Uq[V] 済
閉ループ角度・電圧 [ANG(M2)+TQ0] 角度(+内側速度 PID) Uq[V] 済
電圧トルク [TORQ(M3)+TQ0] トルク(≒Uq) Uq をほぼ直結 合格 9/22
推定電流 [TORQ(M3)+TQ2] トルク(≒推定 Iq) Uq=I×R+逆起電力 トルク合格 9/26
電流トルク [TORQ(M3)+TQ1] トルク(≒シャント Iq) Iq を電流 PID で追う。差が 0.02 A 未満なら Uq=I×12.2 Ω 軸保持合格 9/26
閉ループ速度・電流 [VEL(M0)+TQ1] 角速度[rad/s] 速度 PID → Iq[A]→ Uq。速さに合わせて Iq と Uq が増減 無負荷 T1 合格 9/26
閉ループ角度・電流 [ANG(M2)+TQ1] 角度(絶対 rad) Ap → 速さは ±1 rad/s まで → 速度 P=0.02 → Iq → Uq +1 rad 合格 9/26

括弧の番号はシリアルのモードです。M0=VEL、M1=OL、M2=ANG、M3=TORQ。 TQ0=電圧、TQ1=シャント電流、TQ2=推定電流。 T の単位は外側で変わる: VEL/OL=[rad/s]、ANG=[rad]、TORQ+TQ0=[V](上限 min(L,3))、TORQ+TQ1=[A](≤C)。

流れの違いとSimpleFocコマンドとの関係

serialコマンド センサFB 流れ SimpleFocコマンド
OL(M1) なし T → 電気角を積分 → 振幅 L[V] → PWM(三相) motor.controller = MotionControlType::velocity_openloop;
VEL(M0)+TQ0 AS5600 T−vel → 速度 PID → Uq → PWM(三相) motor.controller = MotionControlType::velocity;
motor.torque_controller = TorqueControlType::voltage;
ANG(M2)+TQ0 AS5600 T−ang → Ap → vel_sp → 速度 PID → Uq → PWM(三相) motor.controller = MotionControlType::angle;
motor.torque_controller = TorqueControlType::voltage;
TORQ(M3)+TQ0 AS5600 T=Uq → PWM(三相)(速度 PID なし) motor.controller = MotionControlType::torque;
motor.torque_controller = TorqueControlType::voltage;
TORQ(M3)+TQ2 AS5600(推定なのでシャントは使わない) T=推定 Iq → Uq=I×R+逆起電力 → PWM(三相) motor.controller = MotionControlType::torque;
motor.torque_controller = TorqueControlType::voltage;
motor.phase_resistance = 12.2;
TORQ(M3)+TQ1 AS5600+CS T=Iq → 電流 PID → Uq → PWM(三相) motor.controller = MotionControlType::torque;
motor.torque_controller = TorqueControlType::foc_current;
VEL(M0)+TQ1 AS5600+CS T−vel → 速度 PID → Iq → 電流 PID → Uq → PWM(三相) motor.controller = MotionControlType::velocity;
motor.torque_controller = TorqueControlType::foc_current;
ANG(M2)+TQ1 AS5600+CS T−ang → Ap → 速度 ±1 rad/s → 速度 P=0.02 → Iq → Uq → PWM(三相) motor.controller = MotionControlType::angle;
motor.torque_controller = TorqueControlType::foc_current;

上の Mode の表と同じ 8 行です。 開ループだけ velocity_openloop。閉ループ速度は velocity。 TQ0 と TQ2 は torque_controller が voltage。TQ2 だけ抵抗 12.2 Ω を入れます。 TQ1 は foc_current で、センサは AS5600+CS。

いま: 電圧トルクは 4。 推定電流は 4-2。 電流トルク以降は 5 から 7。 詳細は正本 docs/hardware/simplefoc-basics.md。

0-2. 用語ミニ辞典

画面や Serial に出る語。表記は Vps(電源)/UVW(三相)で統一。

語わかりやすい意味この習作
PP 極対数(電気角=PP×機械角) 2208/2805 とも 7。pole_pairs
Vps モータ電源の公称電圧(実測と一致) ① 4.8 V/③ 12 V
L 電圧上限(または OL の振幅) L=3 V / 5 V / 8 V。CL=天井、OL=振幅
T / tgt VEL=目標速度 [rad/s]/ANG=目標角 [rad] ノブ #3 または T5
vel / ang 実測角速度・累積角 センサ実測(OL でも指令で上書きしない)
Uq q 軸電圧 — 回転方向に押す=力(トルク)になる側 CL では Uq ≪ L が健全
Ud d 軸電圧(磁場合わせ側) 電圧 FOC・抵抗未設定では Ud=0。電流では 0 でないことがある
Ap 角度ループ P(P_angle.P) ④常用 5。A5
UVW 三相ワイヤ/ドライバ相 PowerShield IN1/2/3 ↔ PWM
P / I / F 速度 PID と速度 LPF 電圧モードの常用 P=0.40、I=1.2、F=0.01 s
TQ 内側の押し方。TQ0=電圧、TQ1=シャント電流、TQ2=推定電流 OL は常に電圧。R と KV は TQ2 のときだけ入れる
CL / OL / ANG / TORQ 閉ループ速度/開ループ/角度/トルク MODE・M0〜M3

ログ1行の読み方

mode=CL tgt=5.00 vel=5.02 ang=238.20 L=5.00 Uq=0.53 en=1

この行では tgt と vel は rad/s、ang は rad、 L と Uq は V です。 vel が tgt に近く、Uq が L より十分小さいとき、 電圧に余裕がある(飽和していない)。

0-3. 評価環境と使用パーツ

PowerShield は UNO 用シールドのため JC4827 には刺さらない。 P2/P3 からジャンパ。I2C センサは P4(Wire1)。 写真は 2026-09-20 の PowerShield 机。 2026-09-26 の電流は MKS M1(GPIO 番号は同じ。パッド対応は正本の ⑤-B)。

机上ベンチ外観 — JC4827・PowerShield・モータ・AS5600
机上ベンチ外観(2026-09-20)
SimpleFOC 習作のモータ、センサ、ドライバの一覧
モータ、センサ、ドライバ(2026-09-27)
構成図
構成図
役割第一構成
MCUJC4827(ESP32-S3)
ドライバ①〜⑤-A は PowerShield。電流の机は MKS M1(10 mΩ)
①モータ2208モータ 80 KV、1 相 10.11 Ω、電源 4.8 V
③モータ2805モータ 140 KV、1 相 12.2 Ω、電源 12 V
5010360 KV、1 相 0.83 Ω。電源オフの線間 1.65、1.66、1.65 Ω(2026-09-28)。机上確認済み。角度は使うときに合わせる
センサAS5600(0x36)・P4 Wire1
UIAdafruit 5752(0x49)+タッチ

BLDC S-con (SimpleFOC-Console-Box)

LCD+タッチ+5752 で LIVE/EDIT を見ながら調律する。 右下 MODE で VEL ⇔ OL ⇔ ANG を循環(切替時は自動で安全側へ)。

操作内容
ノブ #0〜#3VEL: P/I/F/T / ANG: Ap ほか(EDIT)
L3 / L5 / L8電圧上限を即反映
APPLYEDIT を LIVE へ
HOLD / E-STOP現在角ホールド/緊急停止
MODEVEL(velocity)⇔ OL ⇔ ANG(angle)
SerialM0=VEL M1=OL M2=ANG A5=Ap
Chocofon(B):
画面に PP7 と Uq が出るだけで安心する! でも MODE 連打はだめ(チャタリング)。

1. 開ループ速度

センサなしで回す段です。 自作 PWM との違いは 1-1、 2208モータで L = 1.5 V まで見た結果は 1-2 です。

1-1. 3phase PWM vs 開ループ速度(SimpleFOC)

一文:
⓪は「正弦 3 相を自分で書いた開ループ」。 SimpleFOC は同じ開ループを Driver / Motor / Sensor / controller に分け、 閉ループ・電流 FOC まで同じ骨格で載せられる枠にする。

オブジェクト構成

MagneticSensorI2C sensor  ──link──►  BLDCMotor motor
BLDCDriver3PWM driver    ──link──►  BLDCMotor motor
setup: init → initFOC → enable
loop:  loopFOC() → move()     (UI は別コア)
観点⓪ 自作 3phase PWMSimpleFOC
PWM ledcWrite 3本 BLDCDriver3PWM
電気角 omega を自分で積分 OL: 内部進行/CL: センサ+FOC
制限 V_limit 手書き motor.voltage_limit(画面 L)
目標 rps 変数 motor.target(画面 T)
次へ 閉ループは一から センサを link するだけ

主要コマンド(何をしているか)

motor.controller = MotionControlType::velocity;        // VEL: 閉ループ速度
motor.controller = MotionControlType::velocity_openloop; // OL: 開ループ速度
motor.controller = MotionControlType::angle;           // ANG: 閉ループ角度
motor.torque_controller = TorqueControlType::voltage;  // 内側は電圧指令
motor.PID_velocity.P = ...;   // 画面 P
motor.P_angle.P = ...;        // 画面 Ap(ANG)
motor.linkSensor(&sensor);
motor.initFOC();              // 電気角ゼロ合わせ
// loop:
motor.loopFOC();              // センサ+逆 Park → 三相 → PWM
motor.move();                 // 外ループ(速度/角度/openloop)
設定意味
velocity 閉ループ速度 — 目標 ω に追従(MODE VEL)
velocity_openloop 開ループ速度 — 電気角を指令どおり進める(MODE OL)
angle 閉ループ角度 — Ap → 速度 PID → Uq(MODE ANG)
TorqueControlType::voltage トルク相当を電圧で出す(TQ0)。TQ1 はシャント、TQ2 は推定
loopFOC() / move() 内ループ(逆 Park→三相→PWM)/外ループ(Uq 算出)

1-2. 開ループ速度

2208モータ、電源 4.8 V。 V_POWER_SUPPLY をテスタ実測の 4.8 V に合わせたうえで、 voltage_limit(L)を細かく変える。

L(電圧の振幅)挙動メモ
0.8 V止まる/かくかく下限付近
0.9 Vかくかく回る—
1.3 Vほぼ滑らか実用下限
1.5 V常用2208モータ。余裕を少し取る
学び: L の体感は成功。一方 PP 誤りは Open-Loop 目視では弱い (5/6/7 どれでも回る)→ ③で露呈。

2. 閉ループ速度

2208 の閉ループ速度はロックが多いので保留。学習モータを 2805モータ 140KV、電源 12 V に切り替え、 AS5600 付きで速度閉ループ。流れの説明は 4-1. 電圧 FOC(Uq)。

段内容結果
a 追従・固着しない 合格 — L=3 V、T=5 rad/s、Uq ≪ L
b 手外乱で戻る 合格 — 負荷で一時 Uq=L、離すと復帰
c PP 照合 合格 — PP=5 で fail/固着。PP=7 に戻済
d 滑らかさ(PID/LPF) 合格 — P=0.40、I=1.2、F=0.01 s、L=5 V

制御は MotionControlType::velocity + TorqueControlType::voltage。 FOC は core1、画面は core0(I2C mutex)。 開ループとのばらつきの違いは 2-1。

2-1. OL vs CL 比較

同じ目標 tgt≈5 rad/s、センサ実測の vel / ang で比較(2026-09-21)。 平均はどちらも ≈5。ばらつきと手触りは CL が有利。

指標 CL(L=5 V) OL(L=3 V)
vel 平均 5.00 rad/s 5.01 rad/s
vel 標準偏差 0.82 rad/s 1.17 rad/s(1.43×)
vel 範囲 3.5〜6.9 rad/s 3.1〜8.4 rad/s
角度増分の標準偏差 0.020 rad 0.032 rad(1.61×)
手触り より滑らか より粗い

注: CL の L は電圧の天井(Uq の平均は約 0.5 V)、OL の L は振幅固定。意味が違うので、同じ L の数字の比較ではない。

3. 閉ループ角度

2805モータ、電源 12 V。 外側が角度 P(Ap)、内側が閉ループ速度と同じ速度 PID。 目標との差を埋めるように Uq を増減する点は速度と同じ (詳細は 電圧 FOC)。

項目内容結果
追従 Ap=5・約 +1 rad APPLY 合格 — 約1 s で err≈0・vel≈0
外乱 手で回して離す 合格 — 目標角へ復帰(一時 Uq≈L 可)
注意 約2 rad 一気や Ap=8 暴れやすい → 1〜2 rad ずつ/大移動は A3

常用: Ap=5 / 内側 P=0.40、I=1.2、F=0.01 s、L=5 V。 MODE ANG(Serial M2)。HOLD=いまの角を目標に停止。

4. 電圧トルク

一文:
MODE TORQ+内側 TQ0 では、 Serial/ノブの T がそのまま Uq[V]。 速さは目標にしない。「決めた押しを出し続ける」が体感の核。

当日の流れ(復習 → 学習A)

  1. 復習(コード変更なし) — Upload → CS offs≈1.61 V → ENABLE → VEL T3。 手負荷で Uq が増える(外側=角速度、内側=Uq)。
  2. FW — MODE TORQ(M3/MODE 循環 ANG の次)を追加。ビルド成功。
  3. 学習A — TORQ+TQ0 で T=0.5〜2.0 V を確認(下記)。

手順(再現)

  1. Upload → SAFE・foc=0・CS OK
  2. ENABLE → MODE TORQ(または Serial M3)
  3. T=0 で静止(tgt=0 Uq=0)
  4. ノブ #3 または Serial で T0.5 → APPLY。必要なら T1.0 T1.5 T2.0
  5. 止めるときは T0 → 必要なら E-STOP

上限は min(L, 3 V)。ノブ step 0.1 V。当日は L=5・2805 @12 V。

合格記録(2805 @12V)

T(=Uq指令) ログの様子 体感
0.5 V tgt=Uq=0.50・vel≈0 押しは弱い。摩擦/コギングに負けて回らない(正常)
1.0 V Uq=1.00 V 固定・vel が勝手に 5〜9 rad/s トルクを感じ始め、回り始める
1.5〜2.0 V Uq=T・vel さらに速い(約 15〜20 rad/s) 押しがはっきり。手で止めても Uq は T のまま

VEL 復習との差: 速度モードでは「遅れる → Uq が増える」。 TORQ では「自分が決めた Uq を出し続ける」。速さは結果であって目標ではない。

電圧トルクはここまで合格(2026-09-22)。 電流側は 学習B。5010 は 8. 5010。

4-1. 電圧 FOC(Uq)

一文:
閉ループ速度と閉ループ角度(内側 TQ0)は電流を制御に使わず、電圧指令 Uq でトルク相当を出す。 閉ループ速度も閉ループ角度も、目標との差を埋めるように Uq を増減する。

q 軸(Uq)のイメージ

ロータをメリーゴーランドの馬だと思う。 q 軸は、その馬を回転方向に押す向き — 回りやすい=力(トルク)になる側。 画面の Uq は、その押しの強さ(電圧)だ。

d 軸(Ud)は磁界に揃える側。抵抗/インダクタンス未設定の電圧 FOC では Ud = 0 のまま(本段では Uq だけ見ればよい)。

閉ループ速度(MODE VEL / CL)

tgt(目標速度) − vel(実測速度)
        ↓
  速度 PID(P / I / F)
        ↓
      Uq を増減    (|Uq| ≤ L)
        ↓
  逆 Park → 三相電圧 → PWM

目標より遅い → Uq を上げる。速い → 下げる。 手で負荷をかけても、差を埋めるために一時 Uq≈L まで出ることがある。

閉ループ角度(MODE ANG)

tgt(目標角) − ang(実測角)
        ↓
  Ap × 誤差 → 目標速度 vel_sp
        ↓
  vel_sp − vel → 速度 PID(同じ P/I/F)
        ↓
      Uq を増減    (|Uq| ≤ L)
        ↓
  逆 Park → 三相電圧 → PWM

角がズレる → 「この速さで寄れ」→ 内側の速度 PID が Uq を出す、二段構え。 結局やることは速度と同じで、差を埋めるように Uq を増減する。

Uq / Ud のあと(印加)

決まった Uq・Ud とセンサの電気角を setPhaseVoltage に渡し、逆 Park → 三相電圧 → PWM で UVW に振る。 制御の頭は d/q、電線に出るのは三相、という分担。

MODEcontroller
VEL MotionControlType::velocity
OL MotionControlType::velocity_openloop(Uq は PID ではなく振幅 L)
ANG MotionControlType::angle(外側 Ap → 内側速度 PID → Uq)

4-2. 推定電流(Uq=I×R+逆起電力)

TQ2 はシャントを使いません。PowerShield のときの結果です。 Uq = 電流 × 12.2 Ω + 逆起電力。 トルクは合格。速度は平均が追従し、コギングで脈動します。P/I は触っていません。

5. 電流トルク

一文:
軸を止めた 0.05 A の電圧は 0.61 V で足りる。 最初に見えた約 1.15 V は、積分が少しずつ足した電圧だった。 ゲインも T も上げていない。

机が変わったところ

開ループから電圧トルクまでは PowerShield。2026-09-26 の電流は JC4827 + MKS Dual FOC Plus v3.2 の M1 だけ + 2805 140KV。 基板上の ESP32 は未実装。PWM と電流読みは JC4827 だけ。 1 相はテスタの線間 24.5 Ω を 2 で割った 12.2 Ω。 VIN は 11.97 V(FW の 12 V は変えない)。 シャントは 10 mΩ × 50 倍=ゲイン 2.0 A/V。

ここまで分かったこと

  1. 符号 PA/PB — 3 V を短く出すと Ia も Ib も約 +0.29 A。 10 mΩ×50 の計算と合うので、ゲインは 2.0 のまま。符号はプラスのまま。
  2. TQ1・T=0 — 合格。軸は止まる。Iq≈0。最初は Uq が約 −0.2 V まで漂った。積分を止めたあとは 0 のまま。
  3. TQ1・軸を押さえた T0.05(最初) — Iq=0.05 A、軸は止まる。 Uq は約 1.03〜1.15 V(12.2×0.05=0.61 V より大きい)。 Ud≈−0.22 V。原因は下の比較で分かった。
  4. TQ1・無負荷 T0.05 — 電圧の天井まで回る(L=2 で約 33〜35 rad/s、L=5 で約 76 rad/s)。 やり直さない。T は 0.05 A より上げない。
  5. TQ0・軸を押さえた 0.60 V — Uq は 0.60 V のまま。表示 Iq の中央値は 0.04 A(62 点、平均 0.038 A。期待 0.049 A)。
  6. TQ0・軸を押さえた 1.20 V — 電圧を 2 倍にすると、表示 Iq の中央値は 0.09 A(期待 0.098 A)。電流もおおむね 2 倍。
  7. 積分を止めたあとの T0.05(約 59 秒) — 目標との差が 0.02 A より小さいあいだ、Uq は目標×12.2 Ω だけ。Id が 0.02 A より小さいあいだ Ud=0。 結果は Uq=0.61 V、Iq≈0.04 A、Ud≈0。P=1、I=5 のまま。

電圧モード(TQ0)の画面とシリアルの Iq は、500 ms ごとにシャントを読む表示だけ。 モータを回す計算には入らない。TQ1 の Iq は電流 PID が見ている値。同じ行の IqS は生読み。 最初の 1.15 V のとき、Iq と IqS は両方とも約 0.05 A だった。

Chocofon(B):
電流は 0.05 なのに電圧が 2 倍近くあった。ゲインを上げれば数字は合いそう…?
AIチューター:
0.60 V で約 0.04 A、1.20 V で約 0.09 A。短い 3 V も計算と合う。 ゲインを約 1.7 倍すると、合っていた側が崩れる。 1.15 V は I=5 が、画面では見えない約 1 mA を足し続けた結果。
管理人:
軸を押さえた 0.05 A と、角度の +1 rad(速度 P=0.02)は合格。5010 の机は下の 8。M0 と 2 軸は、新しいガジェットで使うときに確認する。角度の速度 P は 0.02 より上げない。 skip_align は true のまま。電流ゲインと電源電圧の定数も変えない。

6. 閉ループ速度・電流

トルクモードの T は電流そのもの。 速度モードの T は速さ(rad/s)で、目標に合わせるために Iq の目標が動き、その電流に合わせて Uq が動く。 速度の P=0.01、I=0.05。電流の P=1、I=5、天井 C=0.60 A はそのまま。 電圧用の P=0.40 / I=1.20 は、ここでは使わない。

  1. T=0 で ENABLE — 角度は 4.22 rad のまま。Iq≈0、Uq≈0。
  2. T=1・約 68 秒・軸は自由 — 角度は 4.22 から 71.80 rad(67.6 rad)。平均は 0.99 rad/s(目標 1.00)。 Iq はだいたい 0.00〜0.04 A(最大 0.07 A)。Uq はだいたい 0.2〜0.5 V。Ud≈0。

画面の vel は 0.1〜4 rad/s に跳ねる。ゆっくり回すと磁石の引っかかりでそうなる。 平均は角度の進みで見る。遅くなった瞬間は Uq が約 0.5 V まで上がり、跳ねた瞬間は 0 V 近くまで下がる。

7. 閉ループ角度・電流

T は絶対の角度です。 Ap=5。内側に頼む速さは ±1 rad/s。速度の I=0.05。 角度のときだけ速度の P=0.02。電流の P=1、I=5、C=0.60 はそのまま。

  1. 速度 P=0.01 — 保持 4.22 rad から T5.20(5.20 rad)。約 2 秒で 5.31 rad。 その後は 5.13 rad と 5.30 rad を行き来。Uq は ±0.4 V。止まっていません。
  2. 速度 P=0.05 — 保持 3.30 rad の約 1 秒後から Uq が ±5 V。 角度は 3.06〜3.48 rad のまま、その場で揺れました。この P は使いません。
  3. 速度 P=0.02・保持 3.30 rad・約 21 秒 — err=0 rad。Iq≈0 A、Uq≈0 V。
  4. T4.30(4.30 rad、+1 rad) — 約 4 秒で 4.30 rad。その後約 28 秒、err=0 rad。 Iq はだいたい 0.03 A。Uq は 0.31〜0.41 V。Ud≈0。

同じログで 2.00 rad と 0.00 rad も止まりました。 5.00 rad と 4.00 rad は磁石の歯と歯のあいだで、まだ行き来します。 電圧はそこでも ±0.6 V 以内です。+1 rad が止まったので、ANG+TQ1 はこの P で合格です。

8. 5010(低抵抗)

一文:
5010 360KV は、電圧 1 V・電流 0.60 A の天井で、押しと速さを机の上で確認した。 角度は目標に着いていない。2805 と同じく、使うときに合わせる。

机は 2805 と同じです。JC4827 + MKS Dual FOC Plus v3.2 の M1 だけ + AS5600。 VIN は 11.97 V。極対数は 7。起動は毎回 dir=-1(CCW)。 電流の P=1、I=5。速度の P=0.01、I=0.05。角度のときだけ速度 P=0.02、内側の速さは ±1 rad/s、Ap=5。 電圧の天井 L=1.0 V、電流の天井 C=0.60 A。どちらも上げていません。

巻線

ドライバの電源を切って、出力端子のあいだを測りました。 線間は 1.65、1.66、1.65 Ω。平均 1.65 Ω を 2 で割ると、1 相は 0.83 Ω。 モータ線で先に測った線間平均 1.60 Ω(1 相 0.80 Ω、2026-09-27)と近いです。 12 V を入れたまま測ると約 1.3 Ω と低く出るので、その数字は使いません。 0.20 A のときの電圧は 0.20×0.83=0.17 V。0.60 A なら 0.50 V。

机上の結果(2026-09-28)

やったこと ログ 読み方
電圧 T=0.20 V Uq は 0.20 V のまま。約 7.5 rad/s で回り続けた 0.20 V × 360 KV と合う。電圧は巻線まで届いている
電流 T=0.20 A Iq は約 0.20 A。Uq は約 0.19 V。速さは約 7 rad/s 押しは 0.20×0.83 Ω。無負荷なので速度の上限はなく、回り続ける。コイルの音は 2805 と同じ
推定電流 T=0.10 A Uq が 1.00 V で止まった。約 49 rad/s 逆起電力が足されて天井に着く。0.10 A は保持していない。L は上げない
速度+電流 T=1、2、−2、3、5、10。平均の速さは目標に近い。Uq は最大約 0.27 V 画面の vel は dir=-1 なので符号が逆。1〜3 rad/s はコギングで跳ね、10 rad/s は連続。速度 P は 0.01 のまま
角度+電流 保持 1.12 rad のあと、軸は約 −1.2 rad まで逆に動いて止まった。T=2 と T=5 も目標へ向かっていない。T=0 は絶対角 0 で、速さが 3 rad/s を超えて停止した 画面の ang はセンサの生の角度。中の軸角は符号が逆なので、生の数字を目標に入れると逆に押す。Uq は ±1 V に届いていない。使うときに合わせる

0.10 V を出したとき、表示の電流は約 0.25 A でした。抵抗から見ると 0.12 A です。 回っている速さは 360 KV と合うので、電流ゲインは 2.0 A/V のままです。

管理人:
5010 の押しと速度は、この天井で確認した。角度のゲインは、2805 と同じく実際に使うときに合わせる。 L は 1 V、C は 0.60 A、電流の P/I、速度の P は上げない。

9. ファームの使い分け

一文:
いま基板に入っているのは ① 2805(ジンバル系) です。 ② 5010(低抵抗系) は alt に置いてあり、コンパイルされません。 モータは外してあります。今日は回しません。

書き込まれるのは、いつも src/main.cpp だけです。 alt のファイルは控えです。PlatformIO はそこをビルドしません。

呼び名ファイル
① 2805(ジンバル系) src/main.cpp(いまの基板)。控えは alt/main_2805_gimbal.cpp
② 5010(低抵抗系) alt/main_5010_low_r.cpp だけ。基板には入っていない

控えの中身は、GitHub で開けます。 GitHub: ① 2805 GitHub: ② 5010

中身の違い

電流の P=1、I=5、速度の P=0.01、I=0.05、角度の速度 P=0.02、内側の速さ ±1 rad/s、Ap=5、 skip_align、電流ゲイン 2.0 A/V は、①も②も同じです。違うのは、モータに合わせた天井です。

項目 ① 2805 ② 5010
起動行 R=12.2 KV=140 R=0.83 KV=360
1 相 12.2 Ω(線間 24.5 Ω) 0.83 Ω(電源オフの線間 1.65 Ω)
電圧 L 初期値 5 V。ボタンは L3 / L5 / L8 初期値もボタンも 1.0 V
電流のノブ 最大 3.0 A。学習では 0.60 A まで 最大 0.60 A。それ以上は出せない
相の検査 PA/PB 3 V を 0.2 秒 0.30 V を 0.2 秒

使う前の確認

  1. モータの線を外します。
  2. ②を使うときだけ、alt/main_5010_low_r.cpp を src/main.cpp にコピーして Upload します。①に戻すときは alt/main_2805_gimbal.cpp をコピーします。
  3. シリアルの先頭付近で、R= と KV= を見ます。①なら 12.2 と 140、②なら 0.83 と 360 です。
  4. 数字がモータと合ってから、そのモータだけをつなぎます。
取り違え: ①を 5010 につなぐと、L=5 V は約 6 A、検査の 3 V は約 3.6 A です。シャントの範囲は約 ±3.3 A です。 ②を 2805 につないでも電圧は 1 V までなので、電流は約 0.08 A と小さく、押しは弱いです。 どちらのファイルも、モータがつながったまま書き込みません。

10. どの制御を、どのガジェットに

一文:
ガジェットは、合わせたい量で選びます。 速さなら速度、向きなら角度、押しの強さならトルクです。 押しの出し方は、電圧か電流かです。
方式 向くガジェット 机で分かったこと
開ループ センサなしで、まず回るか見る 2208 で常用 L=1.5 V。極対数の誤りは、ここでは見えにくい
速度+電圧 負荷が小さい回転。雲台を一定の速さで回す 2805。手で止めると Uq が増えて戻る。常用 P=0.40、I=1.2、L=5 V
角度+電圧 2805 で向きを止める。パン、チルト Ap=5。+1 rad は約 1 秒で err≈0。歯と歯のあいだは行き来する
電圧トルク 押しの強さを電圧で体感する実験 T と Uq が一致する。速さは目標にしない。無負荷だと回り続ける
推定電流 シャントがない基板で、遅い押しを出す PowerShield のトルクは合格。5010 では Uq が 1 V で頭打ちになり、電流は保持しない
電流トルク 関節が何かに当たって止まるときの押し 2805 は軸を押さえた 0.05 A が合格。無負荷だと電圧の天井まで回る。5010 は 0.20 A の押しを確認
速度+電流 ホイール。評価ベンチで速さと電流を見る 2805 は 1 rad/s が平均 0.99。5010 も平均は追従。低速はコギング
角度+電流 向きを保ち、押しは電流の天井まで 2805 の +1 rad は速度 P=0.02 で合格。P=0.05 は Uq が ±5 V。5010 は使うときに合わせる

ガジェット別の検討例

市販品の動きに、上の8方式を当てた例です。 ◎は本命、○は使える、△は一部の動きだけ、×は目的と合いません。 推定電流は電流センサ(CS)が要らないので、基板を作りやすいです。 電圧トルクや電流トルクが要るガジェットでは、その代わりに ○ として使えます。

方式 冷却ファン RCカー ジンバル RW・2輪倒立 ロボットアーム
開ループ △ △ × × ×
速度+電圧 ◎ △ △ △ △
角度+電圧 × × ◎ × ○
電圧トルク ◎ ◎ × ○ △
推定電流 ○ ○ △ ○ ○
電流トルク △ ◎ △ ◎ ○
速度+電流 ◎ ○ △ ○ △
角度+電流 × × ◎ × ◎
  1. ファン — 回り続ければ足ります。市販品は電圧トルク(PWM で電圧の割合)です。 フィルタが詰まっても回転数を保つなら、速度+電圧か速度+電流です。
  2. RCカー — スロットルは押しの割合です。電圧トルクが市販の ESC です。 電流トルクにすると、速度が上がっても踏ん張りがそろいます。 車輪の角度を目標にすると、タイヤがそこで止まろうとします。
  3. ジンバル — カメラの向きが目標です。2805 で合格した角度+電圧と、角度+電流が本命です。 一定の速さでパンするときだけ、速度が足ります。
  4. RW と2輪 — 外側の目標は、機体の傾き(IMU)です。モータの軸の角度ではありません。 リアクションホイールは電流トルクが本命です。 2輪の車輪は、電流トルクでも、速度+電流でも立てられます。
  5. ロボットアーム — 関節の角度が目標で、当たったときの電流に天井が要ります。角度+電流が本命です。 角度+電圧は軽い模型なら使えます。低抵抗のモータは、止まった瞬間の電流が大きくなります。 電流トルクだけだと、姿勢は重力で下がります。内側の押しとしては使えます。

モータの選び方

モータ向く使い方
2805(①のファーム) 向きを止める。ゆっくり回す。1 相 12.2 Ω なので、L=5 V でも電流は小さい
5010(②のファーム) 電流の天井つきで、速く回す、強く押す。角度はまだ合わせない。L=1 V、C=0.60 A
2208 開ループまで。閉ループのガジェットには、まだ使わない

この先のガジェット

  1. モータ評価ベンチ — 同じ画面で速さと電流を見る。方式は速度+電流と、電流トルクです。
  2. 1 軸で向きを保つもの — 2805 と、角度+電圧か角度+電流。歯のあいだは、まだ行き来します。
  3. 回り続けるホイール — 速度+電流。強く回すなら 5010 と ②のファームです。
  4. 2 台いるガジェット — そのとき M0 を確認します。いまは M1 だけです。
  5. 二足 — 関節が角度+電流になってからです。この章では作りません。
管理人:
この章の学習は、ここまでです。 ガジェットを作るときは、先にモータとファーム(①か②か)を合わせます。 5010 の角度と、M0/2 軸は、そのガジェットで使います。

まだ先のこと

次: ガジェットは、上の表で方式を選んでから作ります。 M0/2 軸と、5010 の角度は、そのときに確認します。 正本: docs/hardware/simplefoc-basics.md

更新 2026-09-28(ガジェット別の検討例)| Hub projects/simplefoc-basics