Hi all,
I’ve gotten to the point where I’ve set up my B-G431B-ESC1 board with this 14 pole motor and an AS5600, and it all seems to work well enough in open loop velocity control mode. The motor spins fairly well, and the encoder readout is correct at 6.28 radians per motor revolution. However, if I set MotionControlType::torque (or any of the other closed loop control types), I can’t obtain a useful response from the motor other than initFOC’s alignment routine. find_pole_pairs_number.ino correctly estimates the pole count of my motor like so:
Estimated PP : 7
PP = Electrical angle / Encoder angle
2160.00/309.02 = 6.99
And yet afterwards, the motor fails to respond in any way other than vibrate erratically or heat up. Moreover, setting phase_resistance to its correct value (specified to be 0.6 ohm, which I’ve confirmed to be close enough with a multimeter) results in no motion at all, even during initFOC, so I have to either leave it unset or set it to a much higher value than it actually is–to around 3-6 ohm–to get it to move at all. Are there any troubleshooting steps that come to mind? Thanks in advance for any help, and here’s my current code:
#include <Arduino.h>
#include <SimpleFOC.h>
BLDCMotor motor = BLDCMotor(7);
BLDCDriver6PWM driver = BLDCDriver6PWM(PA8, PC13, PA9, PA12, PA10, PB15);
MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);
//target variable
float target_velocity = 0;
// instantiate the commander
Commander command = Commander(Serial);
void doTarget(char* cmd) { command.scalar(&target_velocity, cmd); }
void disableMotor(char* cmd) { motor.disable(); }
void enableMotor(char* cmd) { motor.enable(); }
void setup() {
Serial.begin(115200);
motor.useMonitoring(Serial);
Wire.setClock(400000);
Wire.begin();
sensor.init(&Wire);
driver.voltage_power_supply = 24;
driver.init();
// link the motor and the driver
motor.linkDriver(&driver);
motor.linkSensor(&sensor);
// limiting motor movements
motor.voltage_limit = 4; // have tried up to 5V
motor.velocity_limit = 5;
motor.foc_modulation = FOCModulationType::SpaceVectorPWM;
motor.torque_controller = TorqueControlType::voltage;
motor.phase_resistance = 6; // have to either set this an order of magnitude higher or leave unset for things to work at all
motor.voltage_sensor_align = 5;
motor.controller = MotionControlType::torque;
// have tried various values for these to get MotionControlType::velocity to work
motor.PID_velocity.P = 0.5;
motor.PID_velocity.I = 20;
motor.PID_velocity.D = 0;
// have tried with and without this filter
// velocity low pass filtering time constant
// the lower the less filtered
//motor.LPF_velocity.Tf = 0.001;
// init motor hardware
motor.init();
motor.initFOC();
command.add('T', doTarget, "target value");
command.add('D', disableMotor, "disable");
command.add('E', enableMotor, "enable");
Serial.print("phase resistance: ");
Serial.println(motor.phase_resistance);
_delay(1000);
}
unsigned long last_print = 0;
unsigned long cycle_count = 0;
void loop() {
motor.loopFOC();
motor.move(target_velocity);
command.run();
cycle_count++;
unsigned long now_us = _micros();
if ((now_us - last_print) > 500000) {
Serial.print(cycle_count);
cycle_count = 0;
Serial.print(" ");
Serial.print(sensor.getVelocity());
Serial.print(" ");
Serial.println(sensor.getAngle());
last_print = now_us;
}
}