使用一块ESP32(具体型号:ESP32 LOLIN D32)开发板,实现三个无刷电机的FOC闭环控制。由于AS5600磁编码器采用固定I2C地址,而ESP32硬件仅提供两路I2C接口,因此需要对SimpleFOC进行一定扩展。经过测试,最终成功实现了三路AS5600角度采集以及三路BLDC电机闭环控制。
一、SimpleFOC默认仅支持两路I2C
AS5600是一款性价比较高的磁编码器,分辨率12位,通过I2C接口读取角度数据。其最大的特点是使用方便,但也存在一个限制:I2C地址固定为0x36,无法通过硬件配置修改地址。
在单个I2C总线上,如果同时连接多个AS5600,就会出现地址冲突问题。ESP32虽然支持两组硬件I2C控制器,但对于三个AS5600来说仍然不够使用。
SimpleFOC库原生支持通过TwoWire对象指定不同的I2C总线,因此可以较容易地实现两路AS5600的读取。然而当需要连接第三个AS5600时,就必须寻找新的解决方案。
二、增加一路软I2C,实现三路AS5600读取
为了在不增加额外硬件的情况下实现第三路AS5600连接,我采用了软件模拟I2C(Soft I2C)的方案。
由于常见的SoftwareWire库在ESP32新版本Arduino框架下兼容性存在问题,因此重新编写了一套轻量级SoftI2C类,用GPIO模拟I2C通信时序,实现AS5600寄存器读取功能。
随后,为了让SimpleFOC能够像使用普通I2C传感器一样使用第三个AS5600,又增加了一个新的传感器类:
- SoftI2C类
- MagneticSensorI2CEx类
其中SoftI2C负责底层通信,而MagneticSensorI2CEx则继承SimpleFOC的Sensor基类,实现角度数据读取接口。
这样一来:
- 第一颗AS5600使用Wire
- 第二颗AS5600使用Wire1
- 第三颗AS5600使用SoftI2C
成功解决了固定地址冲突问题,实现三路编码器同时工作。
经过测试,三个AS5600均能够稳定读取角度信息,并实时输出到串口。
三、借助SimpleFOC实现三路电机闭环控制
在解决编码器问题之后,剩下的工作就变得相对简单。
每个电机分别配置:
- BLDCMotor对象
- BLDCDriver3PWM驱动器
- AS5600位置传感器
然后通过SimpleFOC提供的接口完成:
- 传感器绑定
- 驱动器绑定
- 电机初始化
- FOC初始化
- 闭环运行
经过调试后,三个电机均能够正常完成电角度校准,并进入闭环控制状态。
后续还增加了串口控制指令,例如:
- M1P6.28
- M2P3.14
- M3P100
通过串口即可直接控制三个电机运动到指定位置,实现多轴协同控制。
四、硬件配置与应用展望
本次实验使用的主要硬件如下:
- ESP32 LOLIN D32开发板 ×1
- SimpleFOC Mini驱动板 ×3
- AS5600磁编码器 ×3
- 无刷电机 ×3
整个系统仅使用一块ESP32即可实现三路FOC控制,大幅降低了硬件成本和系统复杂度。
完成三轴控制平台搭建后,可以直接利用SimpleFOC开源库提供的丰富功能,实现:
- 三轴云台控制
- 机械臂关节控制
- 机械恐龙运动控制
- 摄像稳定平台
- 多自由度机器人
相比传统自行编写FOC算法,SimpleFOC已经完成了电流环、速度环、位置环等大量底层工作,开发者只需关注运动控制逻辑即可,大大缩短开发周期。
经过本次实践验证,通过增加一路软I2C和扩展传感器接口,ESP32完全能够胜任三路AS5600和三路BLDC电机的FOC控制任务,为后续多轴运动控制项目提供了一个低成本、易扩展的解决方案。