# Periodic Jerk in velocity control mode

**URL:** https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641
**Category:** applications
**Tags:** esp32, as5600, simplefocmini
**Created:** [September 12, 2025, 11:15pm UTC](https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641 "2025-09-12T23:15:46Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![mig](https://community.simplefoc.com/user_avatar/community.simplefoc.com/mig/32/9386_2.png) [@mig](https://community.simplefoc.com/u/mig)
#### Post date: [September 12, 2025, 11:15pm UTC](https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641/1 "2025-09-12T23:15:46Z")

</div>

Hi,

New here and have tried to search for this issue without luck, perhaps I didn’t have the correct terminology?

I am running Simple FOC Mini, AS5600 and ESP32-C6 Super Mini.

Overall I can get things working, including angle control. However, when I run velocity control to tune the PID parameters there is a periodic jerk in the motion when the speeds are over approx. 50 r/s.

The period of this disruption is around 2 sec, regardless of the speed.

[https://youtu.be/O66ddPv0T7E](https://youtu.be/O66ddPv0T7E)

Any pointers on where I should start to look for a solution?

Thanks,  
Mig

---

<div class="post-metadata">

### Author: ![mig](https://community.simplefoc.com/user_avatar/community.simplefoc.com/mig/32/9386_2.png) [@mig](https://community.simplefoc.com/u/mig)
#### Post date: [September 13, 2025, 4:09am UTC](https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641/2 "2025-09-13T04:09:29Z")

</div>

Seems I found the problem:

[https://www.reddit.com/r/arduino/comments/1iuwcdq/psa\_arduino\_with\_single\_core\_esp32s\_adds\_5ms/](https://www.reddit.com/r/arduino/comments/1iuwcdq/psa_arduino_with_single_core_esp32s_adds_5ms/)

Issue with single core ESP32 and Arduino.

Will try running in a separate task.

---

<div class="post-metadata">

### Author: ![loudboy](https://community.simplefoc.com/letter_avatar_proxy/v4/letter/l/41988e/32.png) [@loudboy](https://community.simplefoc.com/u/loudboy)
#### Post date: [October 31, 2025, 3:07am UTC](https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641/3 "2025-10-31T03:07:43Z")

</div>

Did the RTOS solution work for you? I’m experiencing the same 2-second thunk.

---

<div class="post-metadata">

### Author: ![mig](https://community.simplefoc.com/user_avatar/community.simplefoc.com/mig/32/9386_2.png) [@mig](https://community.simplefoc.com/u/mig)
#### Post date: [October 31, 2025, 3:38am UTC](https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641/4 "2025-10-31T03:38:50Z")

</div>

Hi,

Yes it solved the problem!

---

<div class="post-metadata">

### Author: ![loudboy](https://community.simplefoc.com/letter_avatar_proxy/v4/letter/l/41988e/32.png) [@loudboy](https://community.simplefoc.com/u/loudboy)
#### Post date: [October 31, 2025, 7:03am UTC](https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641/5 "2025-10-31T07:03:44Z")

</div>

Wonderful! I’ll give it a shot. Thanks for the feedback.

---

<div class="post-metadata">

### Author: ![loudboy](https://community.simplefoc.com/letter_avatar_proxy/v4/letter/l/41988e/32.png) [@loudboy](https://community.simplefoc.com/u/loudboy)
#### Post date: [October 31, 2025, 3:12pm UTC](https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641/6 "2025-10-31T15:12:16Z")

</div>

I think I’ve been sitting here troubleshooting this thing so long that my brain has gone fuzzy and my vision cross-eyed. Would you mind posting your code showing how you implemented the solution?

---

<div class="post-metadata">

### Author: ![mig](https://community.simplefoc.com/user_avatar/community.simplefoc.com/mig/32/9386_2.png) [@mig](https://community.simplefoc.com/u/mig)
#### Post date: [November 10, 2025, 10:48am UTC](https://community.simplefoc.com/t/periodic-jerk-in-velocity-control-mode/7641/7 "2025-11-10T10:48:30Z")

</div>

Hi, Sorry for delayed response.

Below is the Arduino code that I used just to test if this fixed the problem.  
For my actual code I moved all the initialisation out of the task.

[code]

#include \<SimpleFOC.h\>

#define I2C\_SDA 6 // Custom SDA pin

#define I2C\_SCL 7 // Custom SCL pin

TaskHandle\_t TaskHandle\_Motor; //For Motor Control

// BLDC motor & driver instance

BLDCMotor motor = BLDCMotor(7);

BLDCDriver3PWM driver = BLDCDriver3PWM(0, 1, 2, 3);

// encoder instance

//Encoder encoder = Encoder(2, 3, 500);

// Interrupt routine intialisation

// channel A and B callbacks

//void doA(){encoder.handleA();}

//void doB(){encoder.handleB();}

MagneticSensorI2C sensor = MagneticSensorI2C(AS5600\_I2C);

// instantiate the commander

Commander command = Commander(Serial);

void doMotor(char\* cmd) { command.motor(&motor, cmd); }

void setup()

{

// use monitoring with serial

Serial.begin(115200);

xTaskCreate(MyTaskMotor, “TaskMotor”, 2000, NULL, 1, &TaskHandle\_Motor);

}

void loop()

{

vTaskDelete(NULL);

}

/\*--------------------------------------------------\*/

/\*---------------------- Tasks ---------------------\*/

/\*--------------------------------------------------\*/

static void MyTaskMotor(void\* pvParameters)

{

unsigned long timer;

// enable more verbose output for debugging

// comment out if not needed

SimpleFOCDebug::enable(&Serial);

// if SimpleFOCMini is stacked in arduino headers

// on pins 12,11,10,9,8

// pin 12 is used as ground

//pinMode(12,OUTPUT);

//pinMode(12,LOW);

Wire.begin(I2C\_SDA, I2C\_SCL);

// initialise magnetic sensor hardware

sensor.init(&Wire);

// link the motor to the sensor

motor.linkSensor(&sensor);

// driver config

// power supply voltage [V]

driver.voltage\_power\_supply = 12;

driver.init();

// link the motor and the driver

motor.linkDriver(&driver);

// aligning voltage [V]

motor.voltage\_sensor\_align = 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.17f; [//0.17](https://0.17)

motor.PID\_velocity.I = 0.55; [//0.55](https://0.55)

motor.PID\_velocity.D = 0.0005; [//0.0005](https://0.0005)

// default voltage\_power\_supply

motor.voltage\_limit = 10;

// jerk control using voltage voltage ramp

// default value is 300 volts per sec ~ 0.3V per millisecond

motor.PID\_velocity.output\_ramp = 300;

// velocity low pass filtering

// default 5ms - try different values to see what is the best.

// the lower the less filtered

motor.LPF\_velocity.Tf = 0.005f; [//0.02](https://0.02)

// angle P controller

motor.P\_angle.P = 6;

motor.P\_angle.D= 0.2; //.2

motor.P\_angle.I= 0.001;

// maximal velocity of the position control

motor.velocity\_limit = 50;

// comment out if not needed

motor.useMonitoring(Serial);

// initialize motor

motor.init();

// align encoder and start FOC

motor.initFOC();

// add target command M

command.add(‘M’, doMotor, “motor”);

Serial.println(F(“Motor ready.”));

Serial.println(F(“Set the target angle using serial terminal:”));

\_delay(1000);

timer = micros();

while(1)

```
{ //Control Loop

if ((micros()-timer) >= 0)

  { timer = micros();

    // 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();

  // function intended to be used with serial plotter to monitor motor variables

  // significantly slowing the execution down!!!!

  // motor.monitor();

  // user communication

  command.run();

  }

} 

```

}

[/code]

Good luck
