无刷电机力矩控制模拟棘轮

无刷电机可以通过控制力矩来实现设人机交互中的触觉反馈。下面使用灯哥开源FOC双路无刷电机控制器、ESP32开发板、无刷电机、AS5600磁编码器套件和Arduino SimpleFOClibrary,实现用无刷电机模拟8个挡位的棘轮触碰效果。调整速度PID参数中的比例P可以模拟不同的刚度:

#include <SimpleFOC.h>

MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);
TwoWire I2Cone = TwoWire(0);

BLDCMotor motor = BLDCMotor(7);
BLDCDriver3PWM driver = BLDCDriver3PWM(32, 33, 25, 22);

Commander command = Commander(Serial);
void doTarget(char* cmd) { command.motor(&motor, cmd); }

// attractor angle variable
float attract_angle = 0;

// distance between attraction points
float attractor_distance = 45*_PI/180.0; // dimp each 45 degrees

float findAttractor(float current_angle){
  return round(current_angle/attractor_distance)*attractor_distance;
}

void setup() {
  // initialise magnetic sensor hardware
  I2Cone.begin(19, 18, 400000); 
  sensor.init(&I2Cone);
  motor.linkSensor(&sensor);

  // power supply voltage
  driver.voltage_power_supply = 14;
  driver.init();
  motor.linkDriver(&driver);
  motor.voltage_limit = 4.0;

  // set motion control loop to be used
  motor.controller = MotionControlType::torque;
  
  // haptic attraction controller - only Proportional 
  motor.PID_velocity.P = 5; 
  motor.PID_velocity.I = 0; 
  motor.PID_velocity.limit = 8;
  
  // use monitoring with serial 
  Serial.begin(115200);
  
  motor.useMonitoring(Serial);
  motor.monitor_downsample = 100;
  
  // add target command T
  command.add('T', doTarget, "set target");
  
  // initialize motor
  motor.init();
  
  // align sensor and start FOC
  motor.initFOC();

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

void loop() {
  motor.loopFOC();

  float torque = motor.PID_velocity(attract_angle - motor.shaft_angle);
  motor.move(torque);
  
  // calculate the attractor
  attract_angle = findAttractor(motor.shaft_angle);

  motor.monitor();

  command.run();
}

通过一个PID类的实例或者直接使用马达速度控制PID(便于在SimpleFOC Studio中调整),根据构造的位置误差输出电压控制量,来控制电机扭矩(参考基于电压的扭矩控制)。

 在SimpleFOC Studio左侧的速度PID栏中可以动态调整比例系数P的值,来感受旋转电机遇到挡点时不同的触碰刚度,P越大刚度越大。软件右侧可以实时监控电机角度,可以看出连续旋转电机时由于存在“挡点”,角度曲线呈现起伏。

 电机以逆时针旋转方向(CCW)为正方向,如果电机从0°开始匀速正向旋转,那么根据PID算法输出的电压与误差项(attract_angle - motor.shaft_angle)成比例,“电压-角度”曲线将如下图所示。在0-45°/2的范围内,随着角度增大,电机受到逐渐增大的阻力,越过45°/2这一点后误差项的符号瞬间改变,电压反向。这种电机反馈力矩的突变会产生一种碰到棘轮齿的感觉。改变比例系数P,可以调整曲线斜率,实现不同强度的触感。

下面是SimpleFOC Studio中实时反馈的“电压-时间”曲线,可以看出形状与上图类似。

 

 

参考:

Haptic textures - Simple FOC community forum

SmartKnob - github

基于电压的力矩控制 -SimpleFOC

使用无刷电机模拟弹簧-阻尼器 - 知乎

DIY触觉输入旋钮 - 无刷直流电机 -哔哩哔哩

posted @ 2022-11-17 14:02  XXX已失联  阅读(1204)  评论(0编辑  收藏  举报