-
-
Save krisoft/602728174f63fe6d0841d557122736bf to your computer and use it in GitHub Desktop.
Weird jump after initialisation - instrumented code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SimpleFOC.h> | |
// magnetic sensor instance - SPI | |
MagneticSensorSPI sensor = MagneticSensorSPI(AS5048_SPI, 4); | |
// BLDC motor & driver instance | |
BLDCMotor motor = BLDCMotor(7); | |
BLDCDriver3PWM driver = BLDCDriver3PWM(5, 10, 6, 8); | |
// velocity set point variable | |
float target_velocity = 0; | |
// instantiate the commander | |
Commander command = Commander(Serial); | |
void doTarget(char* cmd) { command.scalar(&target_velocity, cmd); } | |
int count = 800; | |
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); | |
// set motion control loop to be used | |
motor.controller = MotionControlType::velocity; | |
// contoller configuration | |
// default parameters in defaults.h | |
// velocity PI controller parameters | |
motor.PID_velocity.P = 0.2; | |
motor.PID_velocity.I = 10; | |
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 | |
// default 5ms - try different values to see what is the best. | |
// the lower the less filtered | |
motor.LPF_velocity.Tf = 0.01; | |
// 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(4.12, Direction::CW); | |
// add target command T | |
command.add('T', doTarget, "target voltage"); | |
Serial.println(F("Motor ready.")); | |
Serial.println(F("Set the target velocity using serial terminal:")); | |
_delay(1000); | |
Serial.print("Sensor before jump: "); | |
Serial.println(sensor.getAngle()); | |
} | |
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_velocity); | |
// function intended to be used with serial plotter to monitor motor variables | |
// significantly slowing the execution down!!!! | |
// motor.monitor(); | |
// user communication | |
command.run(); | |
if(count>0){ | |
count -= 1; | |
} | |
if(count==1){ | |
Serial.print("Sensor after jump: "); | |
Serial.println(sensor.getAngle()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment