2804

简介

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 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”,电机转动一圈

更多资料下载

常见问题

DFshopping_car1.png DFRobot商城购买链接