Teknic m-2310p-ln-04k bldc motor does not spinning with closed loop

Hello team,

Can i drive the teknic m-2310p-ln-04k bldc motor by using simplefocShield + arduino uno?
phase to phase resistance:0.72 ohms

It has an encoder (4000 quadrature counts per revolution) also a hall sensor. I couldn’t drive it via sensors. Only can drive open loop. The sensors can not be compatible with simplefocshield? Actually i dont have too much experience with arduino. Please help me :slight_smile:

/**
*

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

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

// encoder instance
Encoder encoder = Encoder(2, 3, 1000);

// Interrupt routine intialisation
// channel A and B callbacks
void doA(){encoder.handleA();}
void doB(){encoder.handleB();}

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

// initialize encoder sensor hardware
encoder.init();
encoder.enableInterrupts(doA, doB);
// link the motor to the sensor
motor.linkSensor(&encoder);

// driver config
// power supply voltage [V]
driver.voltage_power_supply = 12;
driver.init();
// link driver
motor.linkDriver(&driver);

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

MOT: Monitor enabled!

MOT: Init

MOT: Enable driver.

MOT: Align sensor.

MOT: Failed to notice movement

MOT: Init FOC failed.

Motor ready.

As you can read on the simpleFOC website page on supported bldc drivers and the simpleFOCshield product page the simpleFOCshield is made for gimbal motors with >10 ohm internal resistance. Not to say that it can’t work but it has an advised maximum current of 2A which would mean (for 0.72 ohm resistance) roughly 1.4V voltage limit before you risk burnout. Maybe someone with a bit more experience with this situation can jump in and give advice advice on how to best use this hardware combination.

Thank you bartios :slight_smile: I have a dc power source so i can adjust the voltage and the current. If i hadn’t had it , i would burn the card probably :slight_smile:
When i use the open loop - velocity control program in the examples, it is working well. I can enter the velocity by rad/sec and when i measure the speed with tachometer, the result is the same with the entered value.

I want to use the closed loop also. So i run the encoder program example in the utils. When i run it and turn the rotor by hand, i can see the changing value on the serial monitor. The resolution is 0.01 point. When i rotate the rotor one cycle, the value is roundly 6.00. Does it make sense?

The angle is in radians, so one full rotation = 2π radians = ~ 6.28

So one full rotation should give you ±6.28 radians, depending on the direction you turn the rotor…

So it makes sense.

Thank you :slight_smile: do you have any suggestion to fix the problem?

Hmmm… this is mysterious.

You say:

  • sensor is working with the encoder test program
  • open loop is working
  • but closed loop torque mode is not working

I see the motor datasheet says 8 poles, and you have initialized BLDCMotor(4) with 4 pole pairs, so this looks correct to me.

Are you working in ArduinoIDE or in PlatformIO?
I can’t see anything wrong in your code at first glance.

Hello Richard,
I’m working in ArduinoIDE

Hi Hasan,

Have you made any progress?

When open loop is working but closed-loop is not working, then the problem is very often with the sensor, or with the motor specifications (number of pole pairs).

Also 0.72 is a low resistance, it will produce high currents if you don’t set a voltage limit. Maybe it is tripping the over-current protection of the shield? Perhaps you need to lower the voltage limit?