Torque using voltage - Failed to notice movement

Hello everyone,

I’m new to SimpleFOC and very excited about this project.

I’m working with an iPower GM2804 Motor with a AS5048A Sensor connected over SPI, a SimpleFOC shield V3.2 and an Arduino Uno.

I have gone through the steps outlined in the getting started guide and have gotten the sensor to send the correct angle values to the serial monitor as well as the motor to move smoothly in open loop control.

I am now stuck at the next step: Closed-loop control - torque using voltage. I have adapted the code in the Examples (motion_control/torque_control/magnetic_sensor/voltage_control) to my hardware. However, I get the following error message in the serial monitor:

MOT: Init
MOT: Enable driver.
MOT: Align sensor.
MOT: Failed to notice movement
MOT: Init FOC failed.
FOC init failed!

I have tried the troubleshooting steps outlined in the guide but have not gotten it to work.
The motor does move slightly when starting the serial motor (making some noise) but then doesn’t react to any commands through the serial monitors. You can find a video of this behaviour here.

This is my code:

/**
 * Torque control example using voltage control loop.
 * 
 * Most of the low-end BLDC driver boards doesn't have current measurement therefore SimpleFOC offers 
 * you a way to control motor torque by setting the voltage to the motor instead hte current. 
 * 
 * This makes the BLDC motor effectively a DC motor, and you can use it in a same way.
 */
#include <SimpleFOC.h>

// magnetic sensor instance - SPI
MagneticSensorSPI sensor = MagneticSensorSPI(10, 14, 0x3FFF);

// BLDC motor & driver instance
BLDCMotor motor = BLDCMotor(7);

BLDCDriver3PWM driver = BLDCDriver3PWM(6, 10, 5, 8);

// voltage set point variable
float target_voltage = 2;
// instantiate the commander
Commander command = Commander(Serial);
void doTarget(char* cmd) { command.scalar(&target_voltage, cmd); }

void setup() {

  // use monitoring with serial 
  Serial.begin(115200);
  // enable more verbose output for debugging
  // comment out if not needed
  SimpleFOCDebug::enable(&Serial);

  // initialise magnetic sensor hardware
  sensor.init();
  // link the motor to the sensor
  motor.linkSensor(&sensor);

  // power supply voltage
  driver.voltage_power_supply = 12;
  driver.init();
  motor.linkDriver(&driver);

  // aligning voltage 
  motor.voltage_sensor_align = 1;
  // choose FOC modulation (optional)
  motor.foc_modulation = FOCModulationType::SpaceVectorPWM;
  // set motion control loop to be used
  motor.controller = MotionControlType::torque;

  // 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 voltage");

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

void loop() {

  // main FOC algorithm function
  // the faster you run this function the better
  // Arduino UNO loop  ~1kHz
  // Bluepill loop ~10kHz 
  motor.loopFOC();

  // Motion control function
  // velocity, position or voltage (defined in motor.controller)
  // this function can be run at much lower frequency than loopFOC() function
  // You can also use motor.move() and set the motor.target in the code
  motor.move(target_voltage);
  
  // user communication
  command.run();

  //Serial.print(sensor.getAngle());

}

Any pointers would be greatly appreciated!

Thank you and greetings from Vienna,
Marian

Your alignment voltage is set to 1V which is a bit low for this motor. If you increase it to 3 or 5V, do you get any movement during the initialization then?

The error you’re getting „Failed to notice movement“ either means the motor is not moving during initialization, or the sensor is not working.

You’ve checked the sensor is working independently, so my next question is: does the motor move during the initialization phase? It should turn about a quarter turn first in one direction, and then the other.

The issue might be that you’re using the pin 10 twice. Once for the Bald motor phase B and once for the chip select of the sensor.

You can confirm this by using a different chip select pin for your spi sensor. :slight_smile:

Hi @marian , welcome to SimpleFOC!

The code looks ok, I wonder is your sensor working? Did you test it independently of the motor?

Hi @runger,
thank you for the reply!

Yes, I did test the sensor independently from the motor and do get the correct angle values out.
I used the following code to test it and the result can be seen here.

#include <SimpleFOC.h>

// MagneticSensorSPI(MagneticSensorSPIConfig_s config, int cs)
//  config  - SPI config
//  cs      - SPI chip select pin 
// magnetic sensor instance - SPI
MagneticSensorSPI sensor = MagneticSensorSPI(10, 14, 0x3FFF);
// alternative constructor (chipselsect, bit_resolution, angle_read_register, )
// MagneticSensorSPI sensor = MagneticSensorSPI(10, 14, 0x3FFF);

void setup() {
  // monitoring port
  Serial.begin(115200);

  // initialise magnetic sensor hardware
  sensor.init();

  Serial.println("Sensor ready");
  _delay(1000);
}

void loop() {
  // iterative function updating the sensor internal variables                                                                                                                          
  // it is usually called in motor.loopFOC()
  // this function reads the sensor hardware and 
  // has to be called before getAngle nad getVelocity
  sensor.update();
  // display the angle and the angular velocity to the terminal

  float pi = 3.1415926535897932384626433832795;

  float deg = sensor.getAngle() *  180 / pi;
  
  //Serial.print(deg);

  Serial.print(sensor.getAngle());
  
  Serial.print("\t");
  Serial.println(sensor.getVelocity());
}

I tried increasing the alignment voltage - the motor does move a little more during the initialization with higher voltage numbers but the error messages still remain the same.

Yes, the motor moves during the initialization phase but only slightly and it also makes some noises when moving - as can be seen in this clip.

I did some troubleshooting and managed to get it working with a SimpleFOC Mini and an Arduino Mega with the same code, only adjusting for the different hardware (pin numbers).

I would still be curious to know why it doesn’t work with the Uno and the Shield.

Thank you very much Antun, that did the trick :slight_smile:

Also thank you to Richard for the help.