-
Notifications
You must be signed in to change notification settings - Fork 70
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #30 from simplefoc/dev
PR for v1.0.5 Release
- Loading branch information
Showing
55 changed files
with
3,886 additions
and
62 deletions.
There are no files selected for viewing
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
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
/** | ||
* | ||
* 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 <SimpleFOC.h> | ||
// software interrupt library | ||
#include <PciManager.h> | ||
#include <PciListenerImp.h> | ||
#include <SimpleFOCDrivers.h> | ||
#include <encoders/smoothing/SmoothingSensor.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); | ||
|
||
// 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(); | ||
} |
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
|
||
# SimpleFOC communications support code | ||
|
||
This folder contains classes to support you communicating between MCUs running SimpleFOC, and other systems. | ||
|
Oops, something went wrong.