Link

索引搜索程序

只有当Encoder 的构造函数提供了索引引脚时,才能执行索引搜索程序。该程序首先使电机恒定转速运动,而后便进行索引引脚的搜索。要设置电机的转速,可以修改参数:

// 索引搜索速度 - 默认为1rad/s
motor.velocity_index_search = 2;

索引搜索会在motor.initFOC()函数中执行。

该程序的速度控制环实际上与 开环速度 控制相同,唯一的区别是电压设定值将不在是motor.volatge_limit (或 motor.curren_limit*motor.phase_resistance)而是motor.voltage_sensor_align.

使用索引搜索的代码示例

这是一个运动控制的例程,它使用编码器作为位置传感器,特别是带索引的编码器。索引搜索速度设置为3 RAD/s:

// 索引搜索速度 [rad/s]
motor.velocity_index_search = 3;

motor.initFOC()中通过索引搜索对齐电机和位置传感器后,电机将以角速度 2 RAD/s 开始旋转并保持此速度。

#include <SimpleFOC.h>

// 电机实例
BLDCMotor motor = BLDCMotor(11);
// 驱动器实例
BLDCDriver3PWM driver = BLDCDriver3PWM(9, 10, 11, 8);

// 编码器实例
Encoder encoder = Encoder(2, 3, 500, A0);
// 回调通道A和B
void doA(){encoder.handleA();}
void doB(){encoder.handleB();}
void doIndex(){encoder.handleIndex();}


void setup() {
  
  // 初始化编码传感器硬件
  encoder.init();
  encoder.enableInterrupts(doA, doB,doIndex); 

  // 连接电机和传感器
  motor.linkSensor(&encoder);

  // 配置驱动器
  driver.init();
  motor.linkDriver(&driver);

  // 索引搜索速度 [rad/s]
  motor.velocity_index_search = 3; // rad/s
  motor.voltage_sensor_align = 4; // Volts

  // 设置运动控制环
  motor.controller = MotionControlType::velocity;

  // 配置控制器
  // 默认参数见defaults.h

  // 速度PI控制器参数
  motor.PID_velocity.P = 0.2;
  motor.PID_velocity.I = 20;
  // 默认为电源电压
  motor.voltage_limit = 6;
  // 基于斜坡电压的急动控制
  // 默认值为300v/s,即0.3v/ms
  motor.PID_velocity.output_ramp = 1000;
 
  // 速度低通滤波时间常数
  motor.LPF_velocity.Tf = 0.01;


  // 监视串口
  Serial.begin(115200);
  // 如果不需要,可以注释掉此行
  motor.useMonitoring(Serial);
  
  // 初始化电机
  motor.init();
  // 校准编码器,启用FOC
  motor.initFOC();


  Serial.println("Motor ready.");
  _delay(1000);
}

// 角度设置点变量
float target_velocity = 2;

void loop() {
  // FOC算法主函数
  motor.loopFOC();

  // 运动控制函数
  motor.move(target_velocity);

}