/** * * Hall sensor velocity motion control example, modified to demonstrate usage of SmoothingSensor * Steps: * 1) Configure the motor and sensor * 2) Run the code * 3) Set the target velocity (in radians per second) from serial terminal * 4) Try with and without smoothing to see the difference (send E1 and E0 commands from serial terminal) * * * * NOTE : * > Specifically for Arduino UNO example code for running velocity motion control using a hall sensor * > Since Arduino UNO doesn't have enough interrupt pins we have to use software interrupt library PciManager. * * > If running this code with Nucleo or Bluepill or any other board which has more than 2 interrupt pins * > you can supply doC directly to the sensor.enableInterrupts(doA,doB,doC) and avoid using PciManger * */ #include // software interrupt library #include #include #include #include // 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); // hall sensor instance HallSensor sensor = HallSensor(2, 3, 4, 11); // wrapper instance SmoothingSensor smooth(sensor, motor); // Interrupt routine intialisation // channel A and B callbacks void doA(){sensor.handleA();} void doB(){sensor.handleB();} void doC(){sensor.handleC();} // If no available hadware interrupt pins use the software interrupt PciListenerImp listenerIndex(sensor.pinC, doC); // velocity set point variable float target_velocity = 0; // instantiate the commander Commander command = Commander(Serial); void doTarget(char* cmd) { command.scalar(&target_velocity, cmd); } void enableSmoothing(char* cmd) { float enable; command.scalar(&enable, cmd); motor.linkSensor(enable == 0 ? (Sensor*)&sensor : (Sensor*)&smooth); } void setup() { // initialize sensor sensor hardware sensor.init(); sensor.enableInterrupts(doA, doB); //, doC); // software interrupts PciManager.registerListener(&listenerIndex); // set SmoothingSensor phase correction for hall sensors smooth.phase_correction = -_PI_6; // link the SmoothingSensor to the motor motor.linkSensor(&smooth); // driver config // power supply voltage [V] driver.voltage_power_supply = 12; driver.init(); // link the motor and the driver motor.linkDriver(&driver); // aligning voltage [V] motor.voltage_sensor_align = 3; // 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.2f; motor.PID_velocity.I = 2; 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 time constant motor.LPF_velocity.Tf = 0.01f; // 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"); // add smoothing enable/disable command E (send E0 to use hall sensor alone, or E1 to use smoothing) command.add('E', enableSmoothing, "enable smoothing"); Serial.println(F("Motor ready.")); Serial.println(F("Set the target velocity 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_velocity); // function intended to be used with serial plotter to monitor motor variables // significantly slowing the execution down!!!! // motor.monitor(); // user communication command.run(); }