简介
SimpleFOCmini无刷直流电机驱动板只需接入控制信号和电机UVW三相线,即可实现BLDC电机的位置、速度、力矩的开/闭环控制,支持SPWM和SVPWM控制算法,不支持传统6步换向控制算法。搭配三相直流无刷电机可通过SimpleFOC开源库快速上手,兼容Arduino、ESP32、树莓派等开发板。
FOC是什么?
FOC (Field-Oriented Control,磁场定向控制),也被称作矢量控制(Vc,Vector control),是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最优方法之一。FOC旨在通过精确地控制磁场大小与方向,使得电机的运动转矩平稳、噪声小、效率高,并且具有高速的动态响应。
FOC的优势:
1.低转速下控制
由于控制原理的区别,无刷电调只能控制电机,工作在高转速下,低速下很难控制;而FOC控制器则完全没有这个限制,不论在什么转速下都可以实现精确控制。
2.电机换向
同上面的理由,由于无感电调无法反馈转子位置,因此很难实现电机正反转的换向;而FOC驱动器的换向性能极其优秀,最高转速下正反转切换可以非常顺畅;此外FOC还可以以能量回收的形式进行刹车控制。
3.力矩控制
普通电调都只能控制电机转速,而FOC可以进行电流(力矩)、速度、位置三个闭环控制。
4.噪音
FOC驱动器的噪音会比电调小很多,原因是普通电调采用方波驱动,而FOC是正弦波。
特性
- 支持FOC控制
- 电源防反接功能
- 兼容Arduino、ESP32、树莓派等开发板
技术规格
- 输入电源电压:8-30V
- 每路最高输出电流:2.5A
- 板载3.3 LDO输出:最大电流10mA,最大PWM频率200kHz
- 控制信号兼容性:3.3V/5V
- 尺寸:26*21.5mm
引脚示意图

引脚 | 功能 | 说明 |
---|---|---|
VCC | 输入电源正极 | 输入电源 8~30V |
GND | 输入电源负极 | |
IN1 | 通道1输入 | IN1 为高 M1也为高,IN1 为低 M1 也为低 |
IN2 | 通道1输入 | IN2 为高 M2也为高,IN2 为低 M2 也为低 |
IN3 | 通道1输入 | IN3 为高 M3也为高,IN3 为低 M3 也为低 |
EN | 输入使能 | 同时控制通道1,通道2,通道3使能,高电平时输入有效 |
3.3V | 3.3v 电源 | 3.3v电源输出,最大输出电流10mA |
RESET | 复位输入 | 夏位芯片,同时禁止输出。低电平有效 |
SLEEP | 低功耗模式 | 低功耗睡眠模式,低电平有效 |
FAULT | 故障信号输出 | 过温过流时输出保护信号,低电平有效 |
M1 | 输出通道1 | 输出端,跟随IN1信号,输出幅值为电源电压值 |
M2 | 输出通道 2 | 输出端,跟随IN2信号,输出幅值为电源电压值 |
M3 | 输出通道 3 | 输出端,跟随IN3信号,输出幅值为电源电压值 |
尺寸图

接入Arduino使用教程
硬件准备
- Arduino UNO R3开发板 x1
- Arduino UNO IO 传感器扩展板 x1
- 4015无刷直流电机(FIT1036)或FIT1034、FIT1035 x1
- 单pin杜邦连接线 x5


软件准备
- 下载Arduino IDE: 点击下载Arduino IDE
- 下载Arduino_FOC库,该库包含BLDC电机的位置、速度、力矩的开/闭环控制,Arduino\ESP32开发板皆支持,需根据电机参数,调试代码内的各项参数。
硬件连接

演示代码
/**
*
* Position/angle motion control example
* Steps:
* 1) Configure the motor and magnetic sensor
* 2) Run the code
* 3) Set the target angle (in radians) from serial terminal
*
*/
#include <SimpleFOC.h>//一定要加载这个库
MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);//采用I2C通信,将AS5600的SDA、SCL引脚与ESP32对应的SDA、SCL连接,就无须定义引脚了,如果要用其他引脚也可以,但是需要重新定义
// BLDC motor & driver instance
BLDCMotor motor = BLDCMotor(11);//2804、2208电机的极对数为7,4015电机的极对数为11
BLDCDriver3PWM driver = BLDCDriver3PWM(9,10,11,8);//PWM引脚为9,10,11,使能引脚为8,foc板与开发板接线要对应
float target_angle = 0;//定义角度变量,也可以是扭矩,也可以是速度
// instantiate the commander
Commander command = Commander(Serial);//使用串口发送命令
void doTarget(char* cmd) { command.scalar(&target_angle, cmd); }
void setup() {//初始化
// initialise magnetic sensor hardware
sensor.init();//传感器初始化
// link the motor to the sensor
motor.linkSensor(&sensor);//电机连接传感器
// driver config
// power supply voltage [V]
driver.voltage_power_supply = 12;//驱动器连接的电源电压
driver.init();//驱动器初始化
// link the motor and the driver
motor.linkDriver(&driver);//电机连接驱动器
// choose FOC modulation (optional)
motor.foc_modulation = FOCModulationType::SpaceVectorPWM;//采用PWM方式驱动
// set motion control loop to be used
motor.controller = MotionControlType::angle;//角度模式
// velocity PI controller parameters
motor.PID_velocity.P = 0.05f;//速度P值,这个值不能填太大,否则容易抖动
motor.PID_velocity.I = 0.02;//这个值越大,响应速度会慢下来
motor.PID_velocity.D = 0;
// maximal voltage to be set to the motor
motor.voltage_limit = 6;//限制电压最大值,这个值一般为电源电压的一半
// velocity low pass filtering time constant
// the lower the less filtered
motor.LPF_velocity.Tf = 0.01f;//滤波
// angle P controller
motor.P_angle.P = 20;//位置PID的P值
// maximal velocity of the position control
motor.velocity_limit = 15;//限制最大速度,弧度/秒
// use monitoring with serial
Serial.begin(115200);//打开串口
// comment out if not needed
motor.useMonitoring(Serial);//
// initialize motor
motor.init();//电机初始化
// align sensor and start FOC
motor.initFOC();//传感器校正和启动FOC
// add target command T
command.add('T', doTarget, "target angle");//通过串口T命令发送位置,比如T6.28,表示电机转6.28弧度,即1圈
Serial.println(F("Motor ready."));
Serial.println(F("Set the target angle using serial terminal:"));
_delay(1000);
}
void loop() {
motor.loopFOC();//启动,使上劲
motor.move(target_angle);//转到目标位置
command.run();//监控输入的命令
}
结果
按下开发板复位键,电机自行校准位置,然后通过串口监视器输入“T6.28”,电机转动一圈