I want to test the continuous rotation speed of the motor. Which example should I use?(velocity)

I have
1.gimbal motor mitoot 2805/140KV
2.SimpleFOC MINI
3.mcu i use stm32f103 bluepill

Which example should I use in the arduino ide?


  • STM32 Bluepill position motion control example with encoder
  • The same example can be ran with any STM32 board - just make sure that put right pin numbers.

#include <SimpleFOC.h>

// Motor instance
BLDCMotor motor = BLDCMotor(11);
// BLDCDriver3PWM(IN1, IN2, IN3, enable(optional))
BLDCDriver3PWM driver = BLDCDriver3PWM(PB6, PB7, PB8, PB5);

// encoder instance
Encoder encoder = Encoder(PA8, PA9, 8192, PA10);

// Interrupt routine intialisation
// channel A and B callbacks
void doA(){encoder.handleA();}
void doB(){encoder.handleB();}
void doI(){encoder.handleIndex();}
// If no available hadware interrupt pins use the software interrupt

// angle set point variable
float target_angle = 100;
float target_velocity = 10;
// instantiate the commander
Commander command = Commander(Serial);
void doTarget(char* cmd) { command.scalar(&target_angle, cmd); }
void doLimit(char* cmd) { command.scalar(&motor.voltage_limit, cmd); }

void setup() {

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

// driver config
// power supply voltage [V]
driver.voltage_power_supply = 12;
//driver.voltage_limit = 6;
// link the motor and the driver

// aligning voltage [V]
motor.voltage_sensor_align = 3;
// index search velocity [rad/s]
motor.velocity_index_search = 3;
motor.voltage_limit = 6;
// set motion control loop to be used
motor.controller = MotionControlType::velocity;
//motor.controller = MotionControlType::velocity_openloop;

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

// initialize motor
command.add(‘T’, doTarget, “target velocity”);
command.add(‘L’, doLimit, “voltage limit”);

// velocity PI controller parameters
motor.PID_velocity.P = 0.2f;
motor.PID_velocity.I = 20;
//motor.PID_velocity.D = 0;
// default voltage_power_supply
motor.voltage_limit = 6;
// 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;

// angle P controller
// motor.P_angle.P = 2000;
// maximal velocity of the position control
//motor.velocity_limit = 1000;

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

// align encoder and start FOC

// 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() {
// 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 motor.target in the code
// function intended to be used with serial plotter to monitor motor variables
// significantly slowing the execution down!!!
// motor.monitor();

// user communication

I have the same motor.

You don’t have a sensor, so all you can do is open loop.

None of the examples are exactly right for any situation that will be encountered, you have to adapt them.

The open loop example, ideally if there is one specifically for the bluepill, is the way to go.

Make sure you set the voltage way down, like 1 or 2 volts, also set the power supply.

1 Like

i solved thank so much