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 文档