Strange Behavior with Hoverboard Motors using ESP32 and TMC6200-BOB

Hello SimpleFOC community,

I am working on a project to control a hoverboard motor using an ESP32 and the TMC6200-BOB module with the SimpleFOC library. I am also using the built-in Hall effect sensor in the motor for feedback control. However, I am experiencing some strange behavior with the motor control and I am seeking help from the community.

I have been using the SimpleFOC library example codes for motion control and speed control, and both seem to be working well. However, at certain points, the motor seems to get stuck, drawing a large amount of current and stopping completely. I have to manually dislodge the motor, after which it continues to work until it gets stuck again.

I have checked the wiring and connections multiple times but the issue persists. I am hoping that someone in the community has experienced a similar issue or has any suggestions on how to troubleshoot the problem.

The code that I’m actualy using is this one (the hall efect sensor speed control) :

#include <Arduino.h>
#include <SimpleFOC.h>




// BLDC motor & driver instance
// BLDCMotor motor = BLDCMotor(pole pair number);
BLDCMotor motor = BLDCMotor(15);
// BLDCDriver3PWM driver = BLDCDriver3PWM(pwmA, pwmB, pwmC, Enable(optional));
BLDCDriver6PWM driver = BLDCDriver6PWM(23, 22, 33, 25, 26, 27);

// Stepper motor & driver instance
//StepperMotor motor = StepperMotor(50);
//StepperDriver4PWM driver = StepperDriver4PWM(9, 5, 10, 6,  8);

// hall sensor instance
HallSensor sensor = HallSensor(18, 19, 21, 15);

// 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

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

void setup() {

  // initialize sensor sensor hardware
  sensor.init();
  sensor.enableInterrupts(doA, doB, doC);
  // 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::velocity;

  // contoller configuration
  // default parameters in defaults.h

  // velocity PI controller parameters
  motor.PID_velocity.P = 0.2f;
  motor.PID_velocity.I = 2;
  motor.PID_velocity.D = 0;
  // default voltage_power_supply
  motor.voltage_limit = 3;
  // jerk control using voltage voltage ramp
  // default value is 300 volts per sec  ~ 0.3V per millisecond
  motor.PID_velocity.output_ramp = 1000;

  // velocity low pass filtering time constant
  motor.LPF_velocity.Tf = 0.01f;

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

  Serial.println(F("Motor ready."));
  Serial.println(F("Set the target velocity 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_velocity);

  // function intended to be used with serial plotter to monitor motor variables
  // significantly slowing the execution down!!!!
  // motor.monitor();

  // user communication
  command.run();
}

Here I’ve posted a video were you can see what I’m talking about: Strange Behavior with Hoverboard Motors using ESP32 and TMC6200-BOB - YouTube

If anyone has any advice or suggestions, please let me know. Thank you in advance for your help.

Thanks in advance,
Marc

Hi @maymerich did you test your setup im open loop configuration? This should validate at least that there is no wiring problems

Switch out of ESP32 and try a different micro.

Why? I don’t think this comment is particularly helpful for OP, or anyone, to be honest.

Out of 3 components, the micro, the driver and the motor (1/3 probability of failure each), the micro is the easiest to swap out to test and eliminate one variable.

The TMC6200-BOB is an industry design, not a DIY, hard to think there is a problem. The motor also seems a clean pull, so I’d probably put 50% on the ESP32.

Prove me wrong.

Cheers,
Valentine

Agree with @JorgeMaker, please test in open loop and try and plot the hall sensor signals. This looks to me like a sensor/ alignment problem.

Hello! Thank you for your suggestions!

@JorgeMaker Yes, I did, and it works flawlessly! Here, I have a video showing it.

@Valentine That’s what I thought at the beginning, but I switched to a brand new one and it’s still the same.

@David_Gonzalez The sensor signal seems to be fine. I’ve made a video where I have the motor disconnected, so I can freely move it, and the Hall effect sensor signal looks perfect.

I don’t really know what else I can try. It really seems like a firmware issue. My next step, I think, will be to switch to a different microcontroller, maybe an STM32, but I would really like to stick with the ESP32 because it’s really cheap, powerful, and there are no stock issues.

1 Like

Have you verified your pole pair number? Is PP check passing? I still believe this is an alignment issue or sensor issue; I can picture the motor getting “stuck” when commanding a slow velocity with imperfect hall sensors positioning. You could modify the alignment offset manually by providing it as following:

motor.initFOC(x.x, CW or CCW);

Experiment with a couple of different numbers and check if you get better results.

I meant switch out of ESP32 to STM32.

That may fix the problem.

Cheers,
Valentine

Our HallSensor code uses interrupts - there has been some recent reports of problems with high speed interrupts on the ESP32 - due to a software problem, not the hardware.
Apparently reverting to an earlier version of the ESP32 framework solves the problems.

So I don’t know if this is your issue also, but it might be worth checking if it works better with an older framework version.

Here’s the post I’m referring to: Encodor miss some interrupt

1 Like

Could you please share the code?I am trying to use TMC6200 in SPI mode.

I’m developing a SimpleFOC based medium power (10-20A) controller based on ESP32-S3 and faced similar issues while testing with a hoverboard motor and hall sensors (closed loop voltage torque control and automatic sensor alignment).
Turns out the PWM noise was coupling over to the hall wires and triggering some false hall interrupts which resulted in jerky motion and the motor geting stuck ocasionally. This was with 5.1kOhm pullups. Changing them to 750 Ohm fixed the issue. Looking at the hall signals on oscilloscope, they still contain some PWM noise - will probably add a RC filter.

1 Like

Yep - I also found that those hoverboard motors need crazy strong pullups to avoid noise causing unwanted interrupts from the halls.