開ループ速度から電流トルクの入口まで — JC4827 × SimpleFOC
同じBLDCモータを、速さ・角度・押しの強さ(トルク)で回せるようにした。 トルク制御方式(押しの指令)は最初は電圧、あとから電流にした。
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 |
流れの違いと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;
|
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)。
| 役割 | 第一構成 |
|---|---|
| MCU | JC4827(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 |
| 5010 | 360 KV、1 相 0.83 Ω。電源オフの線間 1.65、1.66、1.65 Ω(2026-09-28)。机上確認済み。角度は使うときに合わせる |
| センサ | AS5600(0x36)・P4 Wire1 |
| UI | Adafruit 5752(0x49)+タッチ |
BLDC S-con (SimpleFOC-Console-Box)
LCD+タッチ+5752 で LIVE/EDIT を見ながら調律する。 右下 MODE で VEL ⇔ OL ⇔ ANG を循環(切替時は自動で安全側へ)。
| 操作 | 内容 |
|---|---|
| ノブ #0〜#3 | VEL: P/I/F/T / ANG: Ap ほか(EDIT) |
| L3 / L5 / L8 | 電圧上限を即反映 |
| APPLY | EDIT を LIVE へ |
| HOLD / E-STOP | 現在角ホールド/緊急停止 |
| MODE | VEL(velocity)⇔ OL ⇔ ANG(angle) |
| Serial | M0=VEL M1=OL M2=ANG A5=Ap |
画面に 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 PWM | SimpleFOC |
|---|---|---|
| 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モータ。余裕を少し取る |
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×) |
| 手触り | より滑らか | より粗い |
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)
-
復習(コード変更なし) —
Upload → CS offs≈1.61 V → ENABLE → VEL
T3。 手負荷でUqが増える(外側=角速度、内側=Uq)。 -
FW — MODE TORQ(
M3/MODE 循環 ANG の次)を追加。ビルド成功。 -
学習A — TORQ+TQ0 で
T=0.5〜2.0 V を確認(下記)。
手順(再現)
- Upload →
SAFE・foc=0・CS OK - ENABLE → MODE TORQ(または Serial
M3) T=0で静止(tgt=0Uq=0)- ノブ #3 または Serial で
T0.5→ APPLY。必要ならT1.0T1.5T2.0 - 止めるときは T0 → 必要なら E-STOP
合格記録(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 を出し続ける」。速さは結果であって目標ではない。
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、電線に出るのは三相、という分担。
| MODE | controller |
|---|---|
| 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。
ここまで分かったこと
- 符号 PA/PB — 3 V を短く出すと Ia も Ib も約 +0.29 A。 10 mΩ×50 の計算と合うので、ゲインは 2.0 のまま。符号はプラスのまま。
- TQ1・T=0 — 合格。軸は止まる。Iq≈0。最初は Uq が約 −0.2 V まで漂った。積分を止めたあとは 0 のまま。
- TQ1・軸を押さえた T0.05(最初) — Iq=0.05 A、軸は止まる。 Uq は約 1.03〜1.15 V(12.2×0.05=0.61 V より大きい)。 Ud≈−0.22 V。原因は下の比較で分かった。
- TQ1・無負荷 T0.05 — 電圧の天井まで回る(L=2 で約 33〜35 rad/s、L=5 で約 76 rad/s)。 やり直さない。T は 0.05 A より上げない。
- TQ0・軸を押さえた 0.60 V — Uq は 0.60 V のまま。表示 Iq の中央値は 0.04 A(62 点、平均 0.038 A。期待 0.049 A)。
- TQ0・軸を押さえた 1.20 V — 電圧を 2 倍にすると、表示 Iq の中央値は 0.09 A(期待 0.098 A)。電流もおおむね 2 倍。
- 積分を止めたあとの 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 だった。
電流は 0.05 なのに電圧が 2 倍近くあった。ゲインを上げれば数字は合いそう…?
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 は、ここでは使わない。
- T=0 で ENABLE — 角度は 4.22 rad のまま。Iq≈0、Uq≈0。
- 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 はそのまま。
-
速度 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。止まっていません。 -
速度 P=0.05 —
保持 3.30 rad の約 1 秒後から
Uqが ±5 V。 角度は 3.06〜3.48 rad のまま、その場で揺れました。この P は使いません。 - 速度 P=0.02・保持 3.30 rad・約 21 秒 — err=0 rad。Iq≈0 A、Uq≈0 V。
-
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 秒 |
使う前の確認
- モータの線を外します。
- ②を使うときだけ、
alt/main_5010_low_r.cppをsrc/main.cppにコピーして Upload します。①に戻すときはalt/main_2805_gimbal.cppをコピーします。 - シリアルの先頭付近で、
R=とKV=を見ます。①なら 12.2 と 140、②なら 0.83 と 360 です。 - 数字がモータと合ってから、そのモータだけをつなぎます。
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輪倒立 | ロボットアーム |
|---|---|---|---|---|---|
| 開ループ | △ | △ | × | × | × |
| 速度+電圧 | ◎ | △ | △ | △ | △ |
| 角度+電圧 | × | × | ◎ | × | ○ |
| 電圧トルク | ◎ | ◎ | × | ○ | △ |
| 推定電流 | ○ | ○ | △ | ○ | ○ |
| 電流トルク | △ | ◎ | △ | ◎ | ○ |
| 速度+電流 | ◎ | ○ | △ | ○ | △ |
| 角度+電流 | × | × | ◎ | × | ◎ |
- ファン — 回り続ければ足ります。市販品は電圧トルク(PWM で電圧の割合)です。 フィルタが詰まっても回転数を保つなら、速度+電圧か速度+電流です。
- RCカー — スロットルは押しの割合です。電圧トルクが市販の ESC です。 電流トルクにすると、速度が上がっても踏ん張りがそろいます。 車輪の角度を目標にすると、タイヤがそこで止まろうとします。
- ジンバル — カメラの向きが目標です。2805 で合格した角度+電圧と、角度+電流が本命です。 一定の速さでパンするときだけ、速度が足ります。
- RW と2輪 — 外側の目標は、機体の傾き(IMU)です。モータの軸の角度ではありません。 リアクションホイールは電流トルクが本命です。 2輪の車輪は、電流トルクでも、速度+電流でも立てられます。
- ロボットアーム — 関節の角度が目標で、当たったときの電流に天井が要ります。角度+電流が本命です。 角度+電圧は軽い模型なら使えます。低抵抗のモータは、止まった瞬間の電流が大きくなります。 電流トルクだけだと、姿勢は重力で下がります。内側の押しとしては使えます。
モータの選び方
| モータ | 向く使い方 |
|---|---|
| 2805(①のファーム) | 向きを止める。ゆっくり回す。1 相 12.2 Ω なので、L=5 V でも電流は小さい |
| 5010(②のファーム) | 電流の天井つきで、速く回す、強く押す。角度はまだ合わせない。L=1 V、C=0.60 A |
| 2208 | 開ループまで。閉ループのガジェットには、まだ使わない |
この先のガジェット
- モータ評価ベンチ — 同じ画面で速さと電流を見る。方式は速度+電流と、電流トルクです。
- 1 軸で向きを保つもの — 2805 と、角度+電圧か角度+電流。歯のあいだは、まだ行き来します。
- 回り続けるホイール — 速度+電流。強く回すなら 5010 と ②のファームです。
- 2 台いるガジェット — そのとき M0 を確認します。いまは M1 だけです。
- 二足 — 関節が角度+電流になってからです。この章では作りません。
この章の学習は、ここまでです。 ガジェットを作るときは、先にモータとファーム(①か②か)を合わせます。 5010 の角度と、M0/2 軸は、そのガジェットで使います。
まだ先のこと
docs/hardware/simplefoc-basics.md