ESP SimpleFOC
esp_simplefoc
is an FOC component based on Arduino-FOC, developed specifically for ESP chips that support LEDC and MCPWM functions. It supports the following features:
Voltage control support
Motor control parameters can be adjusted and configured through SimpleFOCStudio
Compatible with Arduino-FOC control routines
Uses IQMath for FOC computation acceleration
Allows manual selection of LEDC or MCPWM peripherals to control MOSFET drivers, supporting up to four brushless motor controls
FOC (Field-Oriented Control) is a field-oriented control algorithm for brushless DC motors that can produce smooth torque, speed, and position control. For a more user-friendly explanation, refer to the Arduino-FOC official documentation.
Using SimpleFOC in Your Project
Use the command
idf.py add_dependency
to add the component to your project:idf.py add-dependency "espressif/esp_simplefoc"
Use
idf.py menuconfig
to configure FreeRTOS(Top) → Component config → FreeRTOS → Kernel
:
configTICK_RATE_HZ
: The tick rate frequency for FreeRTOS, defaulting to 100, needs to be set to 1000 in FOC scenarios.
Configure motor parameters, MOSFET driver control parameters and pins, angle sensors, and controllers.
Motor Parameters
pp
: Pole pair count, which you need to set according to the actual three-phase brushless motor parameters.R
: Motor phase resistance, defaults toNOT_SET
.KV
: Motor KV value, defaults toNOT_SET
.L
: Motor phase inductance, defaults toNOT_SET
.
For a three-phase brushless motor with 14 pole pairs, the corresponding motor initialization would be:
BLDCMotor motor = BLDCMotor(14);
MOSFET Driver Control Parameters and Pins
pwm pin
: PWM output pin, which you need to set according to the actual MOSFET driver circuit.enable pin
: MOSFET driver enable pin. If your MOSFET driver needs manual enabling, fill in the corresponding GPIO manually. Defaults to NOT_SET.voltage_power_supply
: Power supply voltage for the MOSFET driver.voltage_limit
: Voltage limit for the MOSFET driver.
For a 3PWM mode 12V MOSFET driver, the corresponding driver initialization and parameters are:
BLDCDriver3PWM driver = BLDCDriver3PWM(4, 5, 6); driver.voltage_power_supply = 12; driver.voltage_limit = 11; driver.init({1, 2, 3}); motor.linkDriver(&driver);
Angle Sensor
You need to initialize the angle sensor according to the actual sensor you are using. Currently supported angle sensors are:
as5048a
: Supports SPI interface for angle data reading.mt6701
: Supports I2C and SPI interfaces for angle data reading.as5600
: Supports I2C interface for angle data reading.
For initializing the AS5600 angle sensor and binding it to the motor:
AS5600 as5600 = AS5600(I2C_NUM_0, GPIO_NUM_1, GPIO_NUM_2); as5600.init(); motor.linkSensor(&as5600);
Controller
esp_simplefoc
supports various control methods. You can choose based on the actual application requirements:
torque
: Torque control.velocity
: Speed control.angle
: Angle control.velocity_openloop
: Open-loop speed control.angle_openloop
: Open-loop angle control.Note
For hardware verification stages, you may prefer to select an open-loop control scheme for quick hardware validation.
FOC Initialization and Control Loop
After completing the above parameter settings, you need to run init
and initFOC
to perform motor initialization and calibration, then start loopFOC
:
motor.init(); motor.initFOC(); while (1) { motor.loopFOC(); motor.move(target_value); command.run(); }Note
If the pole pair count estimated by
initFOC
does not match the actual pole pair count entered, please check the motor’s pole pairs and minimize the distance between the magnetic ring and the angle sensor as much as possible.
Run
idf.py build flash
for the initial download, then observe the motor’s actual running performance.
API Reference
The API interface of esp_simplefoc
is consistent with Arduino-FOC, and you can refer to the Arduino-FOC API documentation.