#4 Drive the BLDC with SimpleFOC
Table of Contents
1 introduction
In this blog, drive the BLDC with Seeeduino XIAO and motor driver board up to 48V.
2 Get data from Hall sensor
Connect the Pin 0,1,2 with Hall sensor pin V,W,U,
Then run the code,Then the axis with hand, the hall sensor feed back readings according to phase order
3 Get Angle with SimpleFOC Hall sensor
The use simpleFOC library and connect the Xiao with motor driver board
The similar result return
4 Drive the MOTOR
Connect the motor and DCpower of 12V
run the code,
#include <SimpleFOC.h> // BLDC motor & driver instance BLDCMotor motor = BLDCMotor(13); //BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8); BLDCDriver6PWM driver = BLDCDriver6PWM(5, 8, 4, 9, 6, 8, 7); // Stepper motor & driver instance //StepperMotor motor = StepperMotor(50); //StepperDriver4PWM driver = StepperDriver4PWM(9, 5, 10, 6, 8); // hall sensor instance HallSensor sensor = HallSensor(1, 2, 0, 13); // Interrupt routine intialisation // channel A and B callbacks void doA(){sensor.handleA();} void doB(){sensor.handleB();} void doC(){sensor.handleC();} // 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 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 driver motor.linkDriver(&driver); // aligning voltage motor.voltage_sensor_align = 3; // 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(); }
Then the voltage set to 0V, and the motor do not run.
Then the axis, the volcity and running direction can be show with plot or data with serial.print()
This motor can drive up to 105V and this 12V is good enough for this test, I shall use this 24V motor to drive e-scooter
This simpleFOC is good to drive the BLDC.