Hi, i am using 42BLFX01E BLDC motor. 48v. I am using 24v supply. When i run position control it goes to angle and then it start moves forward and reverse slowly. Most of the time it does. What could be the issue. Motor has 8 poles. I tested hall Sensor example. It’ ok. Reduced motor.P_angle.P = 20; to 10 or 5. But it didn’t work.
3 Answers
3Paste this in loop()
// Don't try to stop between cogging steps
if (motor.controller == MotionControlType::angle) {
const float c = _PI_3/motor.pole_pairs;
target = floor(target / c + 0.5f) * c;
}
Hey @MianSannan could you post your code? I probably can’t solve your problem, but it might help someone else.
#include <SimpleFOC.h>
#include <PciManager.h>
#include <PciListenerImp.h>
BLDCMotor motor = BLDCMotor(8);
BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);
// hall sensor instance
HallSensor sensor = HallSensor(2, 3, 4, 8);
// Interrupt routine intialisation
// channel A and B callbacks
void doA(){sensor.handleA();}
void doB(){sensor.handleB();}
void doC(){sensor.handleC();}
// If no available hadware interrupt pins use the software interrupt
PciListenerImp listenC(sensor.pinC, doC);
// angle set point variable
float target_angle = 0;
// instantiate the commander
Commander command = Commander(Serial);
void doTarget(char* cmd) { command.scalar(&target_angle, cmd); }
void setup() {
// initialize sensor hardware
sensor.init();
sensor.enableInterrupts(doA, doB); //, doC);
// software interrupts
PciManager.registerListener(&listenC);
// link the motor to the sensor
motor.linkSensor(&sensor);
// driver config
// power supply voltage [V]
driver.voltage_power_supply = 24;
driver.init();
// link the motor and the driver
motor.linkDriver(&driver);
// 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::angle;
// contoller configuration
// default parameters in defaults.h
// velocity PI controller parameters
motor.PID_velocity.P = 0.1f;
motor.PID_velocity.I = 0.2;
motor.PID_velocity.D = 0;
// default voltage_power_supply
motor.voltage_limit = 12;
motor.PID_velocity.output_ramp = 1000;
// velocity low pass filtering time constant
motor.LPF_velocity.Tf = 0.001f;
// angle P controller
motor.P_angle.P = 20;
// maximal velocity of the position control
motor.velocity_limit = 4;
// use monitoring with serial
Serial.begin(115200);
// comment out if not needed
motor.useMonitoring(Serial);
// initialize motor
motor.init();
// align sensor and start FOC
motor.initFOC();
// add target command T
command.add('T', doTarget, "target angle");
Serial.println(F("Motor ready."));
Serial.println(F("Set the target angle using serial terminal:"));
_delay(1000);
}
void loop() {
motor.loopFOC();
motor.move(target_angle);
// user communication
command.run();
}
It's just because of float values ?
– MianSannanSensor resolution. If the target is inbetween two hall steps, the velocity integral error will gradually grow until the motor moves and hops over the target to the next hall step, and the cycle repeats.
– dekutree64