This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
STM32G431VBTxマイコンを使用したBLDCモータードライバー。Hall センサベースの FOC(Field Oriented Control)実装で、CAN 通信によるモーター制御を行う Embassy 非同期フレームワークベースの組み込み Rust プロジェクト。
プロジェクト構造(ワークスペース):
firmware/- STM32組み込みファームウェア(no_std、Embassy ベース)controller/- CAN通信用デスクトップGUIコントローラー(Dioxus、std)bldc/- ハードウェア非依存BLDCモーター制御ライブラリ(no_std対応)bldc-sim/- FOC制御検証用物理シミュレーションprotocol/- CAN通信プロトコル定義(ファームウェア/コントローラー共有)scripts/- CANデバッグ用Bashスクリプト
参考資料:
重要: 各プロジェクトは独立しているため、作業ディレクトリに注意。
cd firmware
# ビルドしてデバイスにフラッシュ・実行
cargo run
# リリースビルド
cargo run --release
# ビルドのみ
cargo build
# Lint とフォーマット
cargo fmt
cargo clippycd controller
# ビルドと実行
cargo run
# リリースビルド
cargo run --release# ワークスペース全体のテスト(bldc、bldc-sim、protocol)
cargo test
# 特定クレートのテスト
cargo test -p bldc
cargo test -p bldc-sim
cargo test -p g4-driver-protocol注意: ファームウェアはno_stdのためホストでのテスト不可。bldcクレートでアルゴリズムをテスト。
# セットアップ(初回のみ)
pip install pre-commit
pre-commit install
# 手動実行
pre-commit run --all-files./scripts/can.sh speed 1000 # 速度指令(1000 RPM)
./scripts/can.sh pi 0.5 0.05 # PIゲイン設定
./scripts/can.sh enable # モーター有効化
./scripts/can.sh monitor # ステータス監視
./scripts/can.sh test # テストシーケンス
# 別のCANインターフェース使用
CAN_INTERFACE=can0 ./scripts/can.sh speed 500# 仮想CAN(開発/テスト用)
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
# ハードウェアCAN(250kbps)
sudo ip link set can0 type can bitrate 250000
sudo ip link set up can0- マイコン: STM32G431VBTx(Cortex-M4、170MHz)
- ターゲット: thumbv7em-none-eabi
- デバッグ: probe-rs経由のSWD/JTAG
- TIM1: 3相補完PWM出力(50kHz)- PE9/PE8、PE11/PE10、PE13/PE12
- TIM4: Hallセンサーインターフェース(XORモード)- PB6/PB7/PB8
- OPAMP1/2/3: 電流センシング用アンプ
- ADC1/ADC2: 電流値読み取り
- FDCAN1: CAN通信(PA11=RX、PA12=TX、250kbps)
- GPIO: PC13/PC14/PC15にLED接続
- 極対数: 6
- 制御周期: 2.5kHz(400μs)
- DCバス電圧: 24V
- デフォルトPIゲイン: Kp=0.5、Ki=0.05
Embassy非同期ランタイムで以下のタスクを並行実行:
-
motor_control_task (2.5kHz) - FOC制御ループ
- OpenLoop: 6ステップ駆動で始動
- ClosedLoopFoc: 速度PI制御 → Park逆変換 → SVPWM → PWM出力
- Calibration: 電気角オフセット自動検出
-
can_task - CAN通信(100ms周期でステータス送信)
-
voltage_monitor_task - DCバス電圧監視(過電圧/低電圧保護)
-
led_task - 動作確認用LED点滅
主要モジュール:
config/- パラメータ定義、EEPROM永続化state.rs- タスク間共有状態(Mutex保護、コンテキストベース管理)hall_tim.rs- TIM4ハードウェアHallインターフェースmotor_driver.rs- PWM制御抽象化
ファームウェアのFOCロジックを分離したno_std対応ライブラリ:
pi_controller.rs- PI制御器(アンチワインドアップ対応)svpwm.rs- 空間ベクトルPWMtransforms.rs- Clarke/Park変換hall_sensor.rs- Hallセンサー状態管理
フィーチャフラグ: hall(デフォルト)、calibration、encoder、sensorless、std
Dioxusデスクトップアプリケーション + tokio-socketcan非同期CAN通信
state.rs- アプリケーション状態管理can/- CAN通信(protocol、manager、setup)ui/- Dioxus UIコンポーネント(connection、control、settings)
ファームウェアとコントローラーで共有するCANプロトコル定義。defmtフィーチャでファームウェア向けデバッグ出力対応。
全てリトルエンディアンf32形式。
#![no_std]、#![no_main]: bare metal環境- 浮動小数点演算に
libm、高速三角関数にidsp使用 - FOC制御は400μs以内に完了必要
- ヒープアロケーション非推奨
- Linux環境必須(socketcan使用)
- Windows/macOSはWSL/VM経由
三角関数を使わないx/y/z座標変換方式を採用(calebfletcher/foc準拠)。atan2f/sinfを削除し計算負荷を大幅削減。
- 積分項計算:
integral += ki * error * dt形式で数値安定性向上 - アンチワインドアップ: デフォルト無効(応答性優先)
STM32ハードウェアXORモードでソフトウェアポーリング不要。170MHzタイマーでマイクロ秒精度のタイムスタンプ。Atomic変数でロックフリー実装。
12個の独立したMutex → 3つのコンテキスト(MotorContext、CalibrationContext、SystemContext)にグループ化。責任範囲を明確化。
