SimpleFOC with Arduino Uno, AS5600 not working

I am facing trouble to get started with SimpleFOC library. The motor starts to move and got stuck. I checked for the magnetic sensor and it is working fine.

I wired the motor in this way

AS5600 to I2C pins and Arduino pin 11 to DIR. I tried both low and high and the problem still persists.

Using the example code from the library. I also tried with esp32 as well and face the same problem.

Read some answers in the forum and changed the I2C clock: Wire.setClock(100000); No change in the result.

Kindly inform if I need to make any changes in wiring.

Hi @saravanan_a , welcome to SimpleFOC!

What kind of motor are you trying to run in this way? Is it a 4-phase stepper? Which outputs of the driver are you using?

And perhaps you could share the code you are testing with…

Hi @runger,

I using a nema17 2 phase motor, 4 wires. I connected the Out 1,2 to A1,A2 and Out 3,4 to B1,B2 respectively.

Serial monitor output:

PP check result is kind of random. It fluctuates. It works sometimes for the same input.
I tried lowering the voltage limit to 1 volt and the motor does not move.

Closed loop, open loop velocity and torque control examples I tried.

#include <SimpleFOC.h>

// magnetic sensor instance - SPI
//MagneticSensorSPI sensor = MagneticSensorSPI(AS5147_SPI, 10);
// magnetic sensor instance - I2C
MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);
// magnetic sensor instance - analog output
// MagneticSensorAnalog sensor = MagneticSensorAnalog(A1, 14, 1020);

// BLDC motor & driver instance
//BLDCMotor motor = BLDCMotor(11);
//BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);
// Stepper motor & driver instance
StepperMotor motor = StepperMotor(50);
StepperDriver4PWM driver = StepperDriver4PWM(9, 5, 10, 6, 3, 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() {

// digitalWrite(3,OUTPUT);
// digitalWrite(8,OUTPUT);

// digitalWrite(3,HIGH);
// digitalWrite(8,HIGH);

// initialise magnetic sensor hardware

// link the motor to the sensor

// power supply voltage
driver.voltage_power_supply = 12;

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

// use monitoring with serial
// comment out if not needed

// initialize motor
// align sensor and start FOC

// 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:”));

void loop() {

// main FOC algorithm function
// the faster you run this function the better
// Arduino UNO loop ~1kHz
// Bluepill loop ~10kHz

// 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 in the code

// user communication;

I am not sure, to be honest. But I think the bandwidth of the Arduino UNO with the AS5600 I2C sensor is probably not enough for the stepper motor, which has a very high pole-count…

For the L298N, it also will not work well at very low voltages, and it switches very slowly. When using it you should lower the PWM frequency, it may improve the results.

driver.pwm_frequency = 4000; // set this before driver.init()

TBH, Arduino UNO, AS5600 and L298 are the “least capable” combination of hardware we can support, really. The control bandwidth you will achieve with this hardware is very low.

With the stepper motors, because of the high pole count, they are among the more demanding motors to drive with field oriented control.

So while you might get it working with careful tuning and experimentation, it will be a challenge.

You will have better results with a fast 32 bit MCU, and a more accurate, faster sensor (maybe using SPI or ABZ type interfaces). And you should consider replacing the L298N with a FET-based driver stage.