
esp_simplefoc 组件实战指南在 ESP-IDF 中基于 Arduino-FOC 实现无刷电机磁场定向控制【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solutionesp_simplefoc 是 Espressif ESP IoT Solution 仓库components/motor/esp_simplefoc中面向 ESP 芯片的 FOCField-Oriented Control磁场定向控制组件基于 Arduino-FOC 移植而来专门针对支持 LEDC 与 MCPWM 外设的 ESP 芯片设计。本文以该组件的官方使用文档docs/zh_CN/motor/foc/esp_simplefoc.rst为主体结合仓库内源码与测试用例完整讲解从组件引入、FreeRTOS 配置、电机与 MOS 驱动器参数设定、角度传感器绑定、控制器模式选择到初始化与循环控制的完整落地流程读完即可在 ESP-IDF 工程中驱动三相无刷电机。一、组件定位与核心特性esp_simplefoc 是一个在 ESP-IDF 环境下使用的 C 组件其 API 与 Arduino-FOC 保持一致的接口风格便于沿用已有的 SimpleFOC 工程经验。根据组件的 README.md 与官方使用文档它具备以下能力电压控制支持对电机进行基于电压矢量的控制输出。上位机控制可通过 SimpleFOCStudio 调整和配置电机控制参数方便在线调试。多电机控制最高支持四路无刷电机控制驱动模式LEDC / MCPWM既可手动选择也可由系统决定。兼容 SimpleFOC 例程API 与 Arduino-FOC 控制例程兼容迁移成本低。IQMath 加速采用 Espressif 的 IQMath 定点数学库大幅加速 FOC 运算依赖声明见 idf_component.yml 中的espressif/iqmath: ^1.11.0。FOC 是一种面向无刷直流电机的磁场定向控制算法通过对定子电流进行 dq 坐标解耦实现对扭矩、速度与位置的平滑控制。esp_simplefoc 在此基础上提供了力矩、速度、角度以及对应的开环控制模式。支持的芯片与依赖从 idf_component.yml 可以看到组件当前版本为 1.3.0支持的目标芯片包括目标芯片说明esp32经典双核 ESP32esp32s2单核 Xtensaesp32s3双核 Xtensa带向量指令esp32c3 / esp32c6 / esp32h2RISC-V 系列组件要求 ESP-IDF 版本不低于 5.0并依赖以下公共组件i2c_bus版本1.*用于 I2C 角度传感器接入espressif/arduino-foc版本2.3.0~3提供 FOC 核心算法与基础类espressif/iqmath版本^1.11.0提供定点数学运算加速。从组件的 CMakeLists.txt 可以看出其构建策略所有源码含 esp_hal_bldc_3pwm.cpp、esp_hal_bldc_6pwm.cpp、esp_hal_stepper.cpp 及三个角度传感器适配在编译时统一纳入其中 6PWMMCPWM驱动仅在CONFIG_SOC_MCPWM_SUPPORTED定义时参与编译也就是说芯片是否支持 MCPWM 会直接影响可用驱动类型。二、将组件添加到你的工程2.1 通过组件管理器引入推荐使用 ESP-IDF 组件管理器的add-dependency命令添加依赖在 CMake 构建阶段组件会被自动下载idf.py add-dependency espressif/esp_simplefoc也可以在工程中手动创建idf_component.yml并在dependencies一节中声明dependencies: espressif/esp_simplefoc: version: 1.* public: true2.2 引入头文件组件将 Arduino-FOC 的各类核心头文件统一汇总到一个入口头文件 esp_simplefoc.h 中该头文件一次引入电机类、驱动器、通信调试与角度传感器等全部能力#include esp_simplefoc.h从该头文件可以看出组件实际暴露的能力包括电机类BLDCMotor、StepperMotor驱动器BLDCDriver3PWM、BLDCDriver6PWM、StepperDriver2PWM、StepperDriver4PWM通信与调试Commander、SimpleFOCDebug传感器GenericSensor、AS5600、MT6701、AS5048a电流采样GenericCurrentSense、LowsideCurrentSense。三、FreeRTOS 系统时钟配置必需步骤FOC 是一个对控制周期敏感的应用官方文档与组件 README 都强调一个硬性要求必须将 FreeRTOS 的configTICK_RATE_HZ设置为 1000否则可能出现电机运行异常。配置方法运行idf.py menuconfig进入(Top) → Component config → FreeRTOS → Kernel将configTICK_RATE_HZ从默认的 100 修改为 1000。这一要求同样体现在组件的测试工程配置中test_apps/sdkconfig.defaults 明确写入了CONFIG_FREERTOS_HZ1000同时在测试配置中还关闭了任务看门狗CONFIG_ESP_TASK_WDT_ENn、将 CPU 主频设置为 240 MHzCONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240y、并把定时器任务栈加深到 4096CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH4096。这些配置对保证 FOC 实时控制循环稳定运行同样具有参考价值。四、电机参数配置在实例化BLDCMotor时需要根据实际的三相无刷电机填写参数参数含义默认值pp电机极对数必填按实际电机填写R电机相电阻ΩNOT_SETKV电机 KV 值NOT_SETL电机相电感HNOT_SET其中R、KV、L主要用于电机参数辨识与高级控制可后续通过 SimpleFOCStudio 或代码回填。对于极对数为 14 的三相无刷电机实例化为BLDCMotor motor BLDCMotor(14);测试工程 test_esp_simplefoc.cpp 中的开环控制用例正是使用 14 极对电机验证的BLDCMotor motor BLDCMotor(14);五、MOS 驱动器控制参数与引脚配置5.1 参数说明参数含义默认值pwm pinPWM 输出引脚需按 MOS 驱动器电路确定必填enable pin驱动器使能脚若驱动器需手动使能则填写 GPIONOT_SETvoltage_power_supplyMOS 驱动器供电电压V必填voltage_limit驱动器电压限制V应略低于供电电压必填5.2 3PWM 驱动实例化对于 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);这里BLDCDriver3PWM(4, 5, 6)的 4、5、6 是三个相A/B/C的 PWM 输出引脚而driver.init({1, 2, 3})中的 1、2、3 则是LEDC 通道号。这一点需要特别留意3PWM 驱动支持 LEDC 与 MCPWM 两种底层外设初始化函数的入参决定了选用哪种外设。5.3 LEDC 与 MCPWM 两种驱动模式从 esp_hal_bldc_3pwm.h 的源码可以看到组件定义了显式的驱动模式枚举enum class DriverMode { mcpwm 0, /*! Foc hardware drive modeMCPWM */ ledc 1, /*! Foc hardware drive modeLEDC */ };BLDCDriver3PWM提供三种初始化重载int init() override; // 系统自动选择模式 int init(int _mcpwm_group); // 显式使用 MCPWM参数为 MCPWM group 编号需芯片支持 int init(std::vectorint _ledc_channels); // 显式使用 LEDC参数为 LEDC 通道号数组即官方文档中driver.init({1, 2, 3})实际就是第三种重载——使用 LEDC 通道 1、2、3。而文档描述“支持手动选择 LEDC 或 MCPWM 外设来控制 MOS 驱动器最高可实现四路无刷电机控制”对应源码中的模式枚举与多实例能力。该头文件中还定义了 LEDC/MCPWM 的默认参数可作为理解底层配置的参考LEDC_LEDC_FREQUENCY 20 kHz_LEDC_DUTY_RES 9 bit最大占空比 511低速模式、LEDC_TIMER_0MCPWM默认频率 20 kHz最大 50 kHz时基分辨率 10 MHz。对于支持 MCPWM 的芯片如 ESP32、ESP32-S3可在init时传入 mcpwm group 编号改用 MCPWM 输出组件 CMakeLists.txt 中的CONFIG_SOC_MCPWM_SUPPORTED条件编译也印证了这一点。此外驱动还提供enable()/disable()/deinit()以及setPhaseState()等接口其中使能极性由enable_active_high控制默认高电平有效。测试用例中 6PWM 驱动BLDCDriver6PWM(1, 2, 3, 4, 5, 6)的验证代码位于 test_esp_simplefoc.cpp同样受CONFIG_SOC_MCPWM_SUPPORTED宏保护进一步佐证了 6PWM 与 MCPWM 的绑定关系。六、角度传感器配置esp_simplefoc 当前内置三款角度传感器的适配位于 components/motor/esp_simplefoc/port/angle_sensor传感器接口说明AS5048aSPI高分辨率磁编码器MT6701I2C / SPI同时支持两种总线AS5600I2C低成本磁编码器常用于入门以 AS5600 为例实例化并绑定到电机AS5600 as5600 AS5600(I2C_NUM_0, GPIO_NUM_1, GPIO_NUM_2); as5600.init(); motor.linkSensor(as5600);构造函数中I2C_NUM_0为 I2C 外设编号GPIO_NUM_1、GPIO_NUM_2分别为 SDA、SCL 引脚。测试工程对三款传感器均有对应用例例如 AS5600 的 I2C 用例test_esp_simplefoc.cppTEST_CASE(test as5600, [sensor][as5600][i2c]) { AS5600 as5600 AS5600(I2C_NUM_0, GPIO_NUM_12, GPIO_NUM_13); as5600.init(); for (int i 0; i 10; i) { ESP_LOGI(TAG, angle:%.2f, as5600.getSensorAngle()); vTaskDelay(1000 / portTICK_PERIOD_MS); } as5600.deinit(); }注意测试代码针对不同目标芯片使用了不同引脚组合在实际工程中请以你的硬件接线为准。MT6701 的 SPI 用例演示了其 SPI 构造签名MT6701(SPI2_HOST, cs, sck, miso, mosi)其中 miso 可传 -1 表示不使用AS5048a 的用法与之类似。七、控制器模式选择根据应用需求可在MotionControlType中选取以下控制方式控制方式说明torque力矩控制velocity速度控制闭环angle角度控制闭环velocity_openloop速度开环控制angle_openloop角度开环控制提示在硬件验证阶段可优先选择开环控制方案快速验证电机与驱动器接线是否正确再切换到闭环控制。测试用例中的开环验证即展示了该用法test_esp_simplefoc.cppmotor.velocity_limit 200.0; motor.voltage_limit 12.0; motor.controller MotionControlType::velocity_openloop; motor.init(); for (int i 0; i 5000; i) { motor.move(1.2f); vTaskDelay(1 / portTICK_PERIOD_MS); }八、FOC 初始化与循环控制完成上述参数设置后按以下流程启动电机motor.init(); // 电机硬件初始化 motor.initFOC(); // FOC 初始化与校准包含角度传感器零点、极对数估计等 while (1) { motor.loopFOC(); // FOC 控制循环电流/角度解算 motor.move(target_value); // 施加控制目标速度/角度/力矩 command.run(); // 处理上位机Commander命令 }注意若initFOC估计出的极对数与实际填入的极对数不符请排查电机极对数设置并尽可能缩小磁环与角度传感器之间的间距以提高角度读取的可靠性。控制循环中的command.run()对应Commander组件头文件见 esp_simplefoc.h 中的communication/Commander.h它使你能通过串口配合 SimpleFOCStudio 在线调整控制参数这正是组件“支持上位机控制”特性的落地通道。九、编译烧录与运行完成配置与代码编写后执行idf.py build flash完成首次下载后即可观察电机实际运行效果。若需配合 SimpleFOCStudio 在线调参请确保串口波特率设置测试用例中使用Serial.begin(115200)与上位机一致。十、源码级参考与延伸阅读组件入口与能力清单esp_simplefoc.h3PWM 驱动器头文件模式枚举、默认频率/分辨率、初始化重载esp_hal_bldc_3pwm.h构建与条件编译逻辑CMakeLists.txt依赖与支持目标芯片idf_component.yml传感器适配源码AS5600 / MT6701 / AS5048aport/angle_sensor测试用例传感器读写、6PWM 驱动、开环控制test_esp_simplefoc.cpp测试工程 FreeRTOS 配置sdkconfig.defaults仓库中同时提供了可直接运行的官方示例工程examples/motor 目录包括foc_openloop_control开环控制示例适合快速验证硬件foc_velocity_control速度闭环控制示例foc_knob_example旋钮Knob交互式 FOC 示例。这些示例与组件的examples字段一一对应见 idf_component.yml可作为从示例到自研工程迁移的起点。esp_simplefoc 的 API 接口与 Arduino-FOC 保持一致因此也完全可以参照 Arduino-FOC 的 API 文档扩展使用。组件源码以 Apache License 开源详见 license.txt。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考