ESP SimpleFOC
esp_simplefoc
是一个基于 Arduino-FOC 的 FOC 组件,针对支持 LEDC 与 MCPWM 功能的 ESP 芯片开发。支持以下特性:
支持电压控制
支持通过 SimpleFOCStudio 来调整和配置电机控制参数
兼容 Arduino-FOC 控制例程
采用 IQMath 实现 FOC 运算加速
支持手动选择 LEDC 或 MCPWM 外设来控制 MOS 驱动器,最高可实现四路无刷电机控制
FOC (Field-Oriented Control) 是一种用于无刷直流电机磁场定向控制算法,能够产生平滑的扭矩、速度与位置控制。有关更友好的解释,请查看 Arduino-FOC 官方文档 。
在您的项目中使用 SimpleFOC
使用
idf.py add_dependency
命令将组件添加到项目中idf.py add-dependency "espressif/esp_simplefoc"
使用
idf.py menuconfig
配置 FreeRTOS(Top) → Component config → FreeRTOS → Kernel
configTICK_RATE_HZ
: FreeRTOS的时钟Tick的频率,默认情况下为 100,在 FOC 场景下需设置为 1000
配置电机参数、MOS 驱动器控制参数与引脚、角度传感器、控制器
电机参数
pp
:极对数,您需要根据实际的三相无刷电机参数设置对应的电机极对数R
:电机相电阻,默认为NOT_SET
KV
: 电机 KV 值,默认为NOT_SET
L
:电机相电感,默认为NOT_SET
对于极对数为 14 的三相无刷电机而言,对应的电机实例化为:
BLDCMotor motor = BLDCMotor(14);
MOS 驱动器控制参数与引脚
pwm pin
:PWM 输出引脚,您需要根据实际的 MOS 驱动器电路来设置对应的 PWM 输出引脚enable pin
:MOS 驱动器使能脚,若您的 MOS 驱动器需要手动使能,请手动填入对应的 GPIO,默认为NOT_SET
voltage_power_supply
:MOS 驱动器的供电电压voltage_limit
:MOS 驱动器的电压限制
对于 3PWM 模式的 12V MOS 驱动器而言,对应的驱动实例化与参数为:
BLDCDriver3PWM driver = BLDCDriver3PWM(4, 5, 6); driver.voltage_power_supply = 12; driver.voltage_limit = 11; driver.init({1, 2, 3}); motor.linkDriver(&driver);
角度传感器
您需要根据实际使用的角度传感器进行对应的实例化,当前支持的角度传感器:
as5048a
:支持 SPI 方式读取角度数据mt6701
:支持 I2C、SPI 方式读取角度数据as5600
:支持 I2C 方式读取角度数据
对于 AS5600 角度传感器实例化与对应的绑定操作为:
AS5600 as5600 = AS5600(I2C_NUM_0, GPIO_NUM_1, GPIO_NUM_2); as5600.init(); motor.linkSensor(&as5600);
控制器
esp_simplefoc
支持多种控制方式,您需要根据实际的应用需求进行选择:
torque
:力矩控制velocity
:速度控制angle
:角度控制velocity_openloop
:速度开环控制angle_openloop
:角度开环控制备注
若在硬件验证阶段,可优先选择开环控制方案,以实现对硬件的快速验证。
FOC 初始化与循环控制
在完成上述参数设置后,您需要运行 电机 init
与 initFOC
,以实现电机初始化校准,并启动 loopFOC
:
motor.init(); motor.initFOC(); while (1) { motor.loopFOC(); motor.move(target_value); command.run(); }备注
若
initFOC
所估计的极对数与实际填入的极对数不符合,请排查电机极对数,并尽可能缩减磁环与角度传感器之间的间距。
运行
idf.py build flash
进行初始下载, 之后可观察电机的实际运行效果
API 参考
esp_simplefoc
的 API 接口与 Arduino-FOC,可参考 Arduino-FOC API 文档