Why "Closed-loop control - torque using voltage" runs wrong?

Here is my code and my system:

#include <SimpleFOC.h>

// BLDC motor & driver instance
BLDCMotor motor = BLDCMotor(7);
BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);

// encoder instance
MagneticSensorSPI encoder = MagneticSensorSPI(AS5048_SPI, 10);

// instantiate the commander
Commander command = Commander(Serial);
void doMotor(char* cmd) { command.motor(&motor, cmd); }

void setup() { 
  
  // use monitoring with serial 
  Serial.begin(115200);
  // enable more verbose output for debugging
  // comment out if not needed
  SimpleFOCDebug::enable(&Serial);
  
  // initialize encoder sensor hardware
  encoder.init();
  // link the motor to the sensor
  motor.linkSensor(&encoder);

  // driver config
  // power supply voltage [V]
  driver.voltage_power_supply = 12;
  // driver init
  if(!driver.init()){
    Serial.println("Driver init failed!");
    return;
  }
  // link driver
  motor.linkDriver(&driver);

  // aligning voltage
  motor.voltage_sensor_align = 5;

  // set motion control loop to be used
  motor.torque_controller = TorqueControlType::voltage;
  motor.controller = MotionControlType::torque;

  // comment out if not needed
  motor.useMonitoring(Serial);

  // initialize motor
  if(!motor.init()){
    Serial.println("Motor init failed!");
    return;
  }
  // align sensor and start FOC
  if(!motor.initFOC()){
    Serial.println("FOC init failed!");
    return;
  }
  
  // set the initial motor target
  motor.target = 2; // Volts 

  // add target command M
  command.add('M', doMotor, "Motor");

  Serial.println(F("Motor ready."));
  Serial.println(F("Set the target using serial terminal and command M:"));
  _delay(1000);
}

void loop() {
  // main FOC algorithm function
  motor.loopFOC();

  // Motion control function
  motor.move();

  // user communication
  command.run();
}

I ran the “getting start” section right but got wrong in the step3:


when I monitored the arduino, it seemed normal because it initialized right:

MOT: Monitor enabled!
MOT: Init
MOT: Enable driver.
MOT: Align sensor.
MOT: sensor_direction==CCW
MOT: PP check: OK!
MOT: Zero elec. angle: 3.40
MOT: No current sense.
MOT: Ready.
Motor ready.
Set the target using serial terminal and command M:

but when I input “MC1”(which means changing the system to “vel” model as the guide says):


The motor vibrates so violently that it “scurries” around the table. Why?

Hey,

  1. you should fix your test setup to the table firmly to make sure the motor cannot move (except to rotate) - otherwise you will risk damage to your test setup, loose cables, etc. And also the vibration will not be good for your sensor readings - the stator should be firmly held in its place

  2. before using velocity mode you have to tune the PID settings, and perhaps the low pass filter constant and motion downsample. Please see our documentation.

@runger . :smiley: :smiley:Once again, thank you so much for your prompt and insightful response!