Skip to content

Commit a765332

Browse files
committed
Example for LinearHall
1 parent d4c0ce5 commit a765332

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/**
2+
*
3+
* Velocity motion control example
4+
* Steps:
5+
* 1) Configure the motor and sensor
6+
* 2) Run the code
7+
* 3) Set the target velocity (in radians per second) from serial terminal
8+
*/
9+
#include <SimpleFOC.h>
10+
#include <encoders/linearhall/LinearHall.h>
11+
12+
// BLDC motor & driver instance
13+
BLDCMotor motor = BLDCMotor(11);
14+
BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);
15+
// Stepper motor & driver instance
16+
//StepperMotor motor = StepperMotor(50);
17+
//StepperDriver4PWM driver = StepperDriver4PWM(9, 5, 10, 6, 8);
18+
19+
// hall sensor instance
20+
LinearHall sensor = LinearHall(A0, A1, 11);
21+
22+
// velocity set point variable
23+
float target_velocity = 0;
24+
// instantiate the commander
25+
Commander command = Commander(Serial);
26+
void doTarget(char* cmd) { command.scalar(&target_velocity, cmd); }
27+
28+
void setup() {
29+
30+
// driver config
31+
// power supply voltage [V]
32+
driver.voltage_power_supply = 12;
33+
driver.init();
34+
// link the motor and the driver
35+
motor.linkDriver(&driver);
36+
37+
// aligning voltage [V]
38+
motor.voltage_sensor_align = 3;
39+
40+
// set motion control loop to be used
41+
motor.controller = MotionControlType::velocity;
42+
43+
// contoller configuration
44+
// default parameters in defaults.h
45+
46+
// velocity PI controller parameters
47+
motor.PID_velocity.P = 0.2f;
48+
motor.PID_velocity.I = 2;
49+
motor.PID_velocity.D = 0;
50+
// default voltage_power_supply
51+
motor.voltage_limit = 6;
52+
// jerk control using voltage voltage ramp
53+
// default value is 300 volts per sec ~ 0.3V per millisecond
54+
motor.PID_velocity.output_ramp = 1000;
55+
56+
// velocity low pass filtering time constant
57+
motor.LPF_velocity.Tf = 0.01f;
58+
59+
// use monitoring with serial
60+
Serial.begin(115200);
61+
// comment out if not needed
62+
motor.useMonitoring(Serial);
63+
64+
// initialize motor
65+
motor.init();
66+
// initialize sensor hardware. This moves the motor to find the min/max sensor readings and
67+
// averages them to get the center values. The motor can't move until motor.init is called, and
68+
// motor.initFOC can't do its calibration until the sensor is intialized, so this must be done inbetween.
69+
// You can then take the values printed to the serial monitor and pass them to sensor.init to
70+
// avoid having to move the motor every time. In that case it doesn't matter whether sensor.init
71+
// is called before or after motor.init.
72+
sensor.init(&motor);
73+
Serial.print("LinearHall centerA: ");
74+
Serial.print(sensor.centerA);
75+
Serial.print(", centerB: ");
76+
Serial.println(sensor.centerB);
77+
// link the motor to the sensor
78+
motor.linkSensor(&sensor);
79+
// align sensor and start FOC
80+
motor.initFOC();
81+
82+
// add target command T
83+
command.add('T', doTarget, "target voltage");
84+
85+
Serial.println(F("Motor ready."));
86+
Serial.println(F("Set the target velocity using serial terminal:"));
87+
_delay(1000);
88+
}
89+
90+
91+
void loop() {
92+
// main FOC algorithm function
93+
// the faster you run this function the better
94+
// Arduino UNO loop ~1kHz
95+
// Bluepill loop ~10kHz
96+
motor.loopFOC();
97+
98+
// Motion control function
99+
// velocity, position or voltage (defined in motor.controller)
100+
// this function can be run at much lower frequency than loopFOC() function
101+
// You can also use motor.move() and set the motor.target in the code
102+
motor.move(target_velocity);
103+
104+
// function intended to be used with serial plotter to monitor motor variables
105+
// significantly slowing the execution down!!!!
106+
// motor.monitor();
107+
108+
// user communication
109+
command.run();
110+
}

0 commit comments

Comments
 (0)