基于 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() {// 执行FOCmotor.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;
不同编码器(光学/磁性/霍尔)需修改传感器配置
实际运行前请根据你的硬件修改极对数、引脚编号等参数。