BLDC Driver with STSPIN32G4
FOC control simulation results generated by the bldc-sim crate.
| Parameter | Value | Unit | Description |
|---|---|---|---|
| R_s | 0.497 | Ω | Stator resistance per phase |
| L_d | 0.4975 | mH | d-axis inductance |
| L_q | 0.4975 | mH | q-axis inductance |
| λ_m | 8.67 | mWb | PM flux linkage |
| J | 44 | g·cm² | Rotor inertia |
| B | 0.00001 | N·m·s/rad | Viscous friction |
| Pole pairs | 7 | - | Number of pole pairs |
| V_dc | 48 | V | DC bus voltage |
| I_max | 10 | A | Maximum phase current |
Datasheet: Maxon EC-i 40
| Parameter | Value | Description |
|---|---|---|
| Kp | 0.5 | Speed PI proportional gain |
| Ki | 0.05 | Speed PI integral gain |
| Max acceleration | 500 RPM/s | Speed ramp rate limit |
| Control frequency | 2.5 kHz | FOC update rate |
| Parameter | Value | Description |
|---|---|---|
| Physics dt | 10 μs | Integration time step |
| Control period | 400 μs | FOC control loop period |
| Integration method | RK4 | Runge-Kutta 4th order |
bldc-sim supports full state machine simulation using the bldc crate's state machine module. This allows testing of:
- OpenLoop → FOC transition: Motor startup sequence with automatic mode transition
- Stall detection and recovery: Detection of stall conditions and recovery to OpenLoop mode
- Mode transition tracking: Recording of all mode changes during simulation
| Scenario | Description |
|---|---|
StartupWithTransitionScenario |
Tests startup from standstill through OpenLoop to FOC transition |
StateMachineStepResponse |
Tests step response with mode tracking |
StateMachineLoadDisturbance |
Tests load disturbance rejection with stall monitoring |
use bldc_sim::motor_model::MotorParams;
use bldc_sim::scenarios::StartupWithTransitionScenario;
use bldc_sim::simulation::{SimConfig, StateMachineSimulation};
let params = MotorParams::default_small_bldc();
let config = SimConfig {
duration: 3.0,
..Default::default()
};
let mut sim = StateMachineSimulation::new(params, config);
let scenario = StartupWithTransitionScenario::new(500.0)
.with_max_transition_time(2000.0)
.with_duration(3.0);
let result = scenario.run(&mut sim);
println!("OpenLoop time: {:.3}s", result.mode_durations.openloop);
println!("FOC time: {:.3}s", result.mode_durations.foc);
println!("Stalls: {}", result.stall_count);


