/** * * 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 #include OSAP_Runtime osap; OSAP_Gateway_USBSerial serLink(&Serial); OSAP_Port_DeviceNames namePort("bldc"); // uint8_t* temp_angle = 0; My experiment uint8_t byteData[4]; float convertedData; void setAngle(uint8_t* data, size_t len){ if (len >= 4) { // Copy the first 4 bytes from data to byteData array memcpy(byteData, data, 4); // Convert the byteData to a float memcpy(&convertedData, byteData, sizeof(float)); } } OSAP_Port_Named setAngle_port("setAngle", setAngle); // magnetic sensor instance - SPI // MagneticSensorSPI sensor = MagneticSensorSPI(AS5048_SPI, 10); MagneticSensorSPI sensor = MagneticSensorSPI(7, 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, 4, 3); // Stepper motor & driver instance //StepperMotor motor = StepperMotor(50); //StepperDriver4PWM driver = StepperDriver4PWM(9, 5, 10, 6, 8); // angle set point variable // float target_angle = 0; // Removed this to make way for OSAP // instantiate the commander //Commander command = Commander(Serial); //Ég tók þetta út //void doTarget(char* cmd) { command.scalar(&target_angle, cmd); } //Ég tók þetta út 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); // Ég tók þetta út // comment out if not needed // motor.useMonitoring(Serial); // Ég tók þetta út // initialize motor motor.init(); // align sensor and start FOC motor.initFOC(); // add target command T // command.add('T', doTarget, "target angle"); // Ég tók þetta út // Serial.println(F("Motor ready.")); // Ég tók þetta út // Serial.println(F("Set the target angle using serial terminal:")); // Ég tók þetta út _delay(1000); // Now let's start up the OSAP runtime: osap.begin(); } void loop() { // Run OSAP: osap.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(convertedData); // target_angle = target_angle + 0.2; // This was a test without Commander // function intended to be used with serial plotter to monitor motor variables // significantly slowing the execution down!!!! // motor.monitor(); // user communication // command.run(); // Ég tók þetta út }