SimpleFOC STM32 in ArduinoIDE

Hi, I am facing an issue of running SimpleFOC library in Arduino IDE for STM32 Nucleo 431RB. Code Below works on UNO. I have selected the Nucleo 431RB board in Boards manager, Code is not compiling. So just like Arduino i need to enter angle after code uplaoding via Serial Monitor. Thanks


#include <SimpleFOC.h>
#include <PciManager.h>
#include <PciListenerImp.h>

BLDCMotor motor = BLDCMotor(8);
BLDCDriver3PWM driver = BLDCDriver3PWM(PC7, PB4, PB10, 8);


// hall sensor instance
HallSensor sensor = HallSensor(PA10, PB3, PB5, 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();
}

Hi,

It’s easier to help you if you actually share the error messages.
But in this case I guess PciListenerImp is only available for arduinos.

You do not need the PCI manager for nicleo boards. This library works only for AVR boards.

Nucleo boards have enough interrupt pins and you can use them directly in enable interrupts. Uncomment le doC in the code. :slight_smile: