3 void a_pid_kpid(a_pid
*ctx
, a_float kp
, a_float ki
, a_float kd
)
10 A_HIDDEN a_float
a_pid_run_(a_pid
*ctx
, a_float set
, a_float fdb
, a_float err
);
11 a_float
a_pid_run(a_pid
*ctx
, a_float set
, a_float fdb
)
13 return a_pid_run_(ctx
, set
, fdb
, set
- fdb
);
15 a_float
a_pid_run_(a_pid
*ctx
, a_float set
, a_float fdb
, a_float err
)
17 a_float
const var
= ctx
->fdb
- fdb
;
18 ctx
->out
= A_SAT(set
, ctx
->outmin
, ctx
->outmax
);
25 A_HIDDEN a_float
a_pid_pos_(a_pid
*ctx
, a_float fdb
, a_float err
);
26 a_float
a_pid_pos(a_pid
*ctx
, a_float set
, a_float fdb
)
28 return a_pid_pos_(ctx
, fdb
, set
- fdb
);
30 a_float
a_pid_pos_(a_pid
*ctx
, a_float fdb
, a_float err
)
32 a_float
const var
= ctx
->fdb
- fdb
;
33 // When the limit of integration is exceeded or the direction of integration is the same, the integration stops.
34 if ((ctx
->sum
> ctx
->summin
&& ctx
->sum
< ctx
->summax
) || ctx
->sum
* err
< 0)
37 ctx
->sum
+= ctx
->ki
* err
; // sum = K_i[\sum^k_{i=0}err(i)]
39 ctx
->sum
+= ctx
->ki
* (err
+ ctx
->err
) * A_FLOAT_C(0.5);
42 // Avoid derivative kick, fdb[k-1]-fdb[k]. out = K_p[err(k)]+sum+K_d[fdb(k-1)-fdb(k)].
43 ctx
->out
= ctx
->kp
* err
+ ctx
->sum
+ ctx
->kd
* var
;
44 ctx
->out
= A_SAT(ctx
->out
, ctx
->outmin
, ctx
->outmax
);
51 A_HIDDEN a_float
a_pid_inc_(a_pid
*ctx
, a_float fdb
, a_float err
);
52 a_float
a_pid_inc(a_pid
*ctx
, a_float set
, a_float fdb
)
54 return a_pid_inc_(ctx
, fdb
, set
- fdb
);
56 a_float
a_pid_inc_(a_pid
*ctx
, a_float fdb
, a_float err
)
58 a_float
const var
= ctx
->fdb
- fdb
;
59 ctx
->out
+= ctx
->kp
* (err
- ctx
->err
) + ctx
->ki
* err
+ ctx
->kd
* (var
- ctx
->var
);
60 ctx
->out
= A_SAT(ctx
->out
, ctx
->outmin
, ctx
->outmax
);
67 void a_pid_zero(a_pid
*ctx
)