Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SimpleFOC.h>
- #include <PciManager.h>
- #include <PciListenerImp.h>
- // DRV8302 pins connections
- // don't forget to connect the common ground pin
- #define EN_GATE 53
- #define HAL_U 2
- #define HAL_V 3
- #define HAL_W 4
- #define M_PWM 5
- #define M_OC 6
- #define OC_ADJ 7
- #define HA 8
- #define HB 9
- #define HC 10
- #define LA 11
- #define LB 12
- #define LC 13
- #define ENC_A 50
- #define ENC_B 52
- // Motor instance
- BLDCMotor motor = BLDCMotor(4);
- BLDCDriver6PWM driver = BLDCDriver6PWM(HA, LA, HB, LB, HC, LC, EN_GATE);
- // encoder instance
- Encoder encoder = Encoder(ENC_A, ENC_B, 1000, A0);
- void doA(){encoder.handleA();}
- void doB(){encoder.handleB();}
- void doIndex(){encoder.handleIndex();}
- // If no available hadware interrupt pins use the software interrupt
- PciListener ImplistenerIndex(encoder.index_pin, doIndex);
- // 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 setup() {
- // put your setup code here, to run once:
- // initialize encoder sensor hardware
- encoder.init();
- encoder.enableInterrupts(doA, doB);
- // software interrupts
- PciManager.registerListener(&listenerIndex);
- // link the motor to the sensor
- motor.linkSensor(&encoder);
- // driver config
- // power supply voltage [V]
- driver.voltage_power_supply = 12;
- driver.init();
- // link the motor and the driver
- motor.linkDriver(&driver);
- // DRV8302 specific code
- // M_OC - enable overcurrent protection
- pinMode(M_OC,OUTPUT);
- digitalWrite(M_OC,LOW);
- // M_PWM - disable 3pwm mode
- pinMode(M_PWM,OUTPUT);
- digitalWrite(M_PWM, LOW);
- // OD_ADJ - set the maximum overcurrent limit possible
- // Better option would be to use voltage divisor to set exact value
- pinMode(OC_ADJ,OUTPUT);
- digitalWrite(OC_ADJ,HIGH);
- // aligning voltage [V]
- motor.voltage_sensor_align = 3;
- // index search velocity [rad/s]
- motor.velocity_index_search = 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 = 20;
- motor.PID_velocity.D = 0;
- // default voltage_power_supply
- motor.voltage_limit = 12;
- // 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 velocity");
- Serial.println(F("Motor ready."));
- Serial.println(F("Set the target velocity using serial terminal:"));
- _delay(1000);
- }
- void loop() {
- // put your main code here, to run repeatedly:
- // 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();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement