/** * * 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 // magnetic sensor instance - SPI // MagneticSensorSPI sensor = MagneticSensorSPI(AS5048_SPI, 10); MagneticSensorSPI sensor = MagneticSensorSPI(8, 14, 0x3FFF); // magnetic sensor instance - MagneticSensorI2C // 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(6, 5, 17, 7); // 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); void doTarget(char* cmd) { command.scalar(&target_angle, cmd); } void setup() { // 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); // choose FOC modulation (optional) motor.foc_modulation = FOCModulationType::SpaceVectorPWM; // 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.2f; //ORIGINALLY 0.2f -Svavar motor.PID_velocity.I = 5; //ORIGINALLY 20 -Svavar motor.PID_velocity.D = 0; //ORIGINALLY 0 -Svavar // 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.01f; //ORIGINALLY 0.01f -Svavar // angle P controller motor.P_angle.P = 5; // this was originally 20 -Svavar // maximal velocity of the position control motor.velocity_limit = 10; // this was originally 20 -Svavar // use monitoring with serial Serial.begin(115200); // comment out if not needed motor.useMonitoring(Serial); // VERBOSE MONITORING OUTPUT command.verbose = VerboseMode::machine_readable; // can be set using the webcontroller - optional // 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); } void loop() { // OUTPUT MONITORING DATA TO SIMPLEFOC STUDIO motor.monitor(); // 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); // function intended to be used with serial plotter to monitor motor variables // significantly slowing the execution down!!!! // motor.monitor(); // user communication command.run(); }