Hi All,
Thank you for this great community and project! I have got my hands on a B-G431B-ESC1 and have run through the getting started examples. Everything seems to be working well at low speeds, however when I go above ~15rad/s in velocity mode, I can hear an increasing sound of electrical oscillations and then the motor will completely stop and make a loud screeching sound and the PSU will go to maximum current.
I am looking for some suggestions on what might be causing this. I have turned off all monitoring (incase it was slowing the loop), increased the minimum motor voltage and tried turning off quadrature however there seems to be minimal change in the results.
Has anyone experienced anything similar and have any suggestions?
Setup:
B-G431B-ESC1
Eagle power LA8398 KV90
AMT102-V (2021cpr)
PSU 12V (10A)
Arduino IDE - STMduinocore
Thanks for your help.
Lewis
Code:
/**
* B-G431B-ESC1 position motion control example with encoder
*
*/
#include <SimpleFOC.h>
// Motor instance
BLDCMotor motor = BLDCMotor(20);
BLDCDriver6PWM driver = BLDCDriver6PWM(A_PHASE_UH, A_PHASE_UL, A_PHASE_VH, A_PHASE_VL, A_PHASE_WH, A_PHASE_WL);
LowsideCurrentSense currentSense = LowsideCurrentSense(0.003f, -64.0f/7.0f, A_OP1_OUT, A_OP2_OUT, A_OP3_OUT);
// encoder instance
Encoder encoder = Encoder(A_HALL1, A_HALL2, 2048, A_HALL3);
// Interrupt routine intialisation
// channel A and B callbacks
void doA(){encoder.handleA();}
void doB(){encoder.handleB();}
void doIndex(){encoder.handleIndex();}
// instantiate the commander
Commander command = Commander(Serial);
void doTarget(char* cmd) { command.motion(&motor, cmd); }
void setup() {
// enable/disable quadrature mode
encoder.quadrature = Quadrature::ON;
// initialize encoder sensor hardware
encoder.init();
encoder.enableInterrupts(doA, doB, doIndex);
// link the motor to the sensor
motor.linkSensor(&encoder);
// driver config
// power supply voltage [V]
driver.voltage_power_supply = 12;
driver.init();
// link the motor and the driver
motor.linkDriver(&driver);
// link current sense and the driver
currentSense.linkDriver(&driver);
// current sensing
currentSense.init();
// no need for aligning
currentSense.skip_align = false;
motor.linkCurrentSense(¤tSense);
// aligning voltage [V]
motor.voltage_sensor_align = 3;
// index search velocity [rad/s]
motor.velocity_index_search = 3;
// set motion control loop to be used
//motor.controller = MotionControlType::velocity;
//motor.controller = MotionControlType::velocity_openloop;
//motor.controller = MotionControlType::velocity_openloop;
// set motion control loop to be used
//motor.torque_controller = TorqueControlType::voltage;
motor.controller = MotionControlType::velocity;
driver.voltage_limit = 12;
motor.voltage_limit = 0.5 * driver.voltage_limit;
// contoller configuration
// default parameters in defaults.h
// velocity PI controller parameters
motor.PID_velocity.P = 0.3;
motor.PID_velocity.I = 20;
// jerk control using voltage voltage ramp
// default value is 300 volts per sec ~ 0.3V per millisecond
motor.PID_velocity.output_ramp = 1000;
// velocity low pass filtering time constant
motor.LPF_velocity.Tf = 0.01;
// angle P controller
motor.P_angle.P = 20;
// maximal velocity of the position control
motor.velocity_limit = 40;
// use monitoring with serial
Serial.begin(115200);
// initialize motor
motor.init();
// align encoder and start FOC
motor.initFOC();
motor.target = 0.5; // Volts
// add target command T
command.add('T', doTarget, "target velocity");
Serial.println(F("Motor ready."));
Serial.println(F("Set the target angle using serial terminal:"));
_delay(1000);
}
void loop() {
// main FOC algorithm function
motor.loopFOC();
// Motion control function
motor.move();
//motor.monitor();
// user communication
command.run();
}