krnl 1
Loading...
Searching...
No Matches
pidcntrl.ino
Go to the documentation of this file.
1#define epsilon 0.01
2#define dt 0.01 //100ms loop time
3#define MAX 4 //For Current Saturation
4#define MIN -4
5#define Kp 0.1
6#define Kd 0.01
7#define Ki 0.005
8
9// JDN speed approx 10 kHz with if (abs(..)) chg to if (1)
10
11float PIDcal(float setpoint,float actual_position)
12{
13 static float pre_error = 0;
14 static float integral = 0;
15 float error;
16 float derivative;
17 float output;
18
19 //Caculate P,I,D
20 error = setpoint - actual_position;
21
22 //In case of error too small then stop intergration
23 if(abs(error) > epsilon)
24 {
25 integral = integral + error*dt;
26 }
27 derivative = (error - pre_error)/dt;
28 output = Kp*error + Ki*integral + Kd*derivative;
29
30 //Saturation Filter
31 if(output > MAX)
32 {
33 output = MAX;
34 }
35 else if(output < MIN)
36 {
37 output = MIN;
38 }
39 //Update error
40 pre_error = error;
41
42 return output;
43}
44
45void setup()
46{
47 Serial.begin(9600);
48}
49
50unsigned long t1,t2;
51void loop(void) {
52int i;
53float ref,f2,f3;
54 t1 = millis();
55 ref = 1.25;
56 f2 = 1.0;
57 for (i=0; i< 30000; i++) {
58 f3 = PIDcal(ref,f2);
59
60 }
61 t2 = millis();
62
63 Serial.print(t1); Serial.print(" ");
64 Serial.print(t2); Serial.print(" ");
65 Serial.print(t2-t1); Serial.print(" ");
66 Serial.print(1.0*(t2-t1)/30000.0); Serial.println(" ");
67
68}
volatile int i
#define epsilon
Definition apidalg.ino:4
#define MAX
Definition apidalg.ino:6
#define Ki
Definition apidalg.ino:10
#define Kp
Definition apidalg.ino:8
#define dt
Definition apidalg.ino:5
#define Kd
Definition apidalg.ino:9
#define MIN
Definition apidalg.ino:7
struct k_t * t1
Definition krnlgen.ino:3
struct k_t * t2
Definition krnlgen.ino:3
void loop(void)
Definition pidcntrl.ino:51
void setup()
Definition pidcntrl.ino:45
float PIDcal(float setpoint, float actual_position)
Definition pidcntrl.ino:11