/** * 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>
// magnetic sensor instance - SPI // MagneticSensorSPI sensor = MagneticSensorSPI(AS5147_SPI, 10); // magnetic sensor instance - I2C MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C); // magnetic sensor instance - analog output // MagneticSensorAnalog sensor = MagneticSensorAnalog(A1, 14, 1020);
// BLDC motor & driver instance BLDCMotor motor = BLDCMotor(7); BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8); // Stepper motor & driver instance //StepperMotor motor = StepperMotor(50); //StepperDriver4PWM driver = StepperDriver4PWM(9, 5, 10, 6, 8);
// voltage set point variable float target_voltage = 0; // instantiate the commander Commander command = Commander(Serial); voiddoTarget(char* cmd) { command.scalar(&target_voltage, cmd); }
voidsetup() {
// use monitoring with serial Serial.begin(115200); // enable more verbose output for debugging // comment out if not needed SimpleFOCDebug::enable(&Serial);
// initialise magnetic sensor hardware sensor.init(); // link the motor to the sensor motor.linkSensor(&sensor);
// power supply voltage driver.voltage_power_supply = 12; driver.init(); 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;
// 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); }
voidloop() {
// 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);
float angle_in_radians = sensor.getAngle(); Serial.println("T"+String(angle_in_radians)); // user communication command.run(); }
/** * * Position/angle motion control example * Steps: * 1) Configure the motor and magnetic sensor * 2) Run the code * 3) Set the target angle (in radians) from serial terminal * */ #include<SimpleFOC.h>
// BLDC motor & driver instance BLDCMotor motor = BLDCMotor(11); BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8); // Stepper motor & driver instance //StepperMotor motor = StepperMotor(50); //StepperDriver4PWM driver = StepperDriver4PWM(9, 5, 10, 6, 8);
// angle set point variable float target_angle = 0; // instantiate the commander Commander command = Commander(Serial); voiddoTarget(char* cmd) { command.scalar(&target_angle, cmd); }
voidsetup() { // use monitoring with serial Serial.begin(115200); // enable more verbose output for debugging // comment out if not needed SimpleFOCDebug::enable(&Serial);
// initialise magnetic sensor hardware sensor.init(); // 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);
// 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.15f; motor.PID_velocity.I = 0; motor.PID_velocity.D = 0; // maximal voltage to be set to the motor motor.voltage_limit = 6;
// velocity low pass filtering time constant // the lower the less filtered motor.LPF_velocity.Tf = 0.03f;
// angle P controller motor.P_angle.P = 20; // maximal velocity of the position control motor.velocity_limit = 20; // 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 angle");
Serial.println(F("Motor ready.")); Serial.println(F("Set the target angle using serial terminal:")); _delay(1000); }
voidloop() { // 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_angle); float angle_in_radians = sensor.getAngle(); Serial.println(angle_in_radians); // function intended to be used with serial plotter to monitor motor variables // significantly slowing the execution down!!!! // motor.monitor();