【SimpleFOC-小项目】驱动电机正转3周

基于 SimpleFOC 让电机正转三周,你需要完成以下几个关键步骤。以下是完整的代码示例和说明:

1. 硬件连接

首先确保硬件正确连接:

  • 电机(如BLDC)与驱动板(如L6234、DRV8302等)连接

  • 驱动板与MCU(如Arduino Uno)的PWM引脚连接

  • 电流检测/编码器接线(如果使用闭环控制)

2. 完整代码示例(基于位置控制)

cpp
#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. 关键参数说明

  1. 极对数BLDCMotor(7)中的7需根据实际电机修改

  2. 圈数计算

    • 3圈机械角度 = 3 * 2π = 6π ≈ 18.85弧度

    • 如果使用电角度需乘以极对数

  3. 控制模式:选择位置控制(angle模式)

4. 运行流程

  1. 上电初始化FOC

  2. 设置目标位置为18.85弧度(3圈)

  3. 电机平滑转动到目标位置

  4. 到达后通过串口提示并停止

5. 调试技巧

  • 首次运行时先降低voltage_limitvelocity_limit确保安全

  • 通过串口监视器观察实际位置

  • 若电机振动需调整P增益(motor.P_angle.P

6. 注意事项

motor.controller = MotionControlType::angle_openloop;

不同编码器(光学/磁性/霍尔)需修改传感器配置

实际运行前请根据你的硬件修改极对数、引脚编号等参数。

posted @ 2025-09-27 00:44  FBshark  阅读(24)  评论(0)    收藏  举报