【SimpleFOC-小项目】驱动电机正转3周
基于 SimpleFOC 让电机正转三周,你需要完成以下几个关键步骤。以下是完整的代码示例和说明:
1. 硬件连接
首先确保硬件正确连接:
-
电机(如BLDC)与驱动板(如L6234、DRV8302等)连接
-
驱动板与MCU(如Arduino Uno)的PWM引脚连接
-
电流检测/编码器接线(如果使用闭环控制)
2. 完整代码示例(基于位置控制)
#include <SimpleFOC.h>
// 电机参数配置
BLDCMotor motor = BLDCMotor(7); // 7对极电机
BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8); // PWM引脚 9,5,6 使能引脚 8
// 编码器配置(示例为磁性编码器)
MagneticSensorI2C sensor = MagneticSensorI2C(0x36, 12, 0x0E, 4);
// 目标位置变量
float target_position = 0;
void setup() {
Serial.begin(115200);
// 初始化编码器
sensor.init();
motor.linkSensor(&sensor);
// 初始化驱动器
driver.init();
motor.linkDriver(&driver);
// 配置电机参数
motor.voltage_limit = 5; // 电压限制
motor.velocity_limit = 5; // 速度限制
// 配置位置控制环
motor.P_angle.P = 0.5; // 位置P增益
motor.controller = MotionControlType::angle; // 位置控制模式
// 初始化电机
motor.init();
motor.initFOC();
Serial.println("电机就绪!即将正转3圈...");
delay(1000);
// 设置目标位置(3圈 = 3 * 2π ≈ 18.85弧度)
target_position = 6 * _PI; // 注意:3圈实际是6π弧度(机械角度)
}
void loop() {
// 执行FOC
motor.loopFOC();
// 位置控制
motor.move(target_position);
// 打印实际位置(可选)
Serial.print("当前位置: ");
Serial.println(motor.shaft_angle);
// 检查是否到达目标(可选停止条件)
if (fabs(motor.shaft_angle - target_position) < 0.1) {
Serial.println("到达目标位置!");
while(1); // 停止程序
}
}
3. 关键参数说明
-
极对数:
BLDCMotor(7)中的7需根据实际电机修改 -
圈数计算:
-
3圈机械角度 = 3 * 2π = 6π ≈ 18.85弧度
-
如果使用电角度需乘以极对数
-
-
控制模式:选择位置控制(
angle模式)
4. 运行流程
-
上电初始化FOC
-
设置目标位置为18.85弧度(3圈)
-
电机平滑转动到目标位置
-
到达后通过串口提示并停止
5. 调试技巧
-
首次运行时先降低
voltage_limit和velocity_limit确保安全 -
通过串口监视器观察实际位置
-
若电机振动需调整P增益(
motor.P_angle.P)
6. 注意事项
motor.controller = MotionControlType::angle_openloop;
不同编码器(光学/磁性/霍尔)需修改传感器配置
实际运行前请根据你的硬件修改极对数、引脚编号等参数。

浙公网安备 33010602011771号