3 @brief proportional integral derivative controller
5 A proportional integral derivative controller (PID controller or three-term controller) is
6 a control loop mechanism employing feedback that is widely used in industrial control systems
7 and a variety of other applications requiring continuously modulated control.
9 u(t) = K_p\left[e(t)+\frac{1}{T_i}\int{e(t)}\text{dt}+T_d\frac{\text{d}e(t)}{\text{d}t}\right]
12 u(k) = K_p\left[e(k)+\frac{T}{T_i}\sum^k_{i=0}e(i)+\frac{T_d}{T}[e(k)-e(k-1)]\right]
14 - positional PID controller
16 u(k) &= K_p e(k) + q\sum^k_{i=0} K_i e(i) + K_d [e(k)-e(k-1)] \\
17 &= (K_p+K_d) e(k) + q\sum^k_{i=0}K_i e(i) + (-K_d) e(k-1) \\
18 &\begin{cases}q=0&|\sum\limits^{k-1}_{i=0}K_ie(i)|>E \bigvee
19 [\sum\limits^{k-1}_{i=0}K_ie(i)]K_ke(k)>0 \\ q=1\end{cases}
21 - incremental PID controller
23 \Delta u(k) &= K_p [e(k)-e(k-1)] + K_i e(k) + K_d [e(k)+e(k-2)-2e(k-1)] \\
24 &= (K_p+K_i+K_d) e(k) + (-K_p-2K_i) e(k-1) + K_d e(k-2)
26 https://en.wikipedia.org/wiki/PID_controller
36 @addtogroup A_PID proportional integral derivative controller
40 typedef struct a_pid a_pid
;
42 #if defined(__cplusplus)
44 #endif /* __cplusplus */
47 @brief initialize for PID controller
48 @param[in,out] ctx points to an instance of PID controller
50 #define a_pid_init(ctx) a_pid_zero(ctx)
53 @brief set proportional integral derivative constant for PID controller
54 @param[in,out] ctx points to an instance of PID controller
55 @param[in] kp proportional constant
56 @param[in] ki integral constant
57 @param[in] kd derivative constant
59 A_EXTERN
void a_pid_kpid(a_pid
*ctx
, a_float kp
, a_float ki
, a_float kd
);
62 @brief calculate for PID controller
63 @param[in,out] ctx points to an instance of PID controller
64 @param[in] set setpoint value
65 @param[in] fdb feedback value
66 @return setpoint value
68 A_EXTERN a_float
a_pid_run(a_pid
*ctx
, a_float set
, a_float fdb
);
71 @brief calculate for positional PID controller
72 @param[in,out] ctx points to an instance of PID controller
73 @param[in] set setpoint value
74 @param[in] fdb feedback value
77 A_EXTERN a_float
a_pid_pos(a_pid
*ctx
, a_float set
, a_float fdb
);
80 @brief calculate for incremental PID controller
81 @param[in,out] ctx points to an instance of PID controller
82 @param[in] set setpoint value
83 @param[in] fdb feedback value
86 A_EXTERN a_float
a_pid_inc(a_pid
*ctx
, a_float set
, a_float fdb
);
89 @brief zeroing for PID controller
90 @param[in,out] ctx points to an instance of PID controller
92 A_EXTERN
void a_pid_zero(a_pid
*ctx
);
94 #if defined(__cplusplus)
98 typedef struct a_pid pid
;
100 #endif /* __cplusplus */
103 @brief instance structure for PID controller
107 a_float kp
; //!< proportional constant
108 a_float ki
; //!< integral constant
109 a_float kd
; //!< derivative constant
110 a_float summax
; //!< maximum integral output
111 a_float summin
; //!< minimum integral output
112 a_float sum
; //!< controller integral output
113 a_float outmax
; //!< maximum final output
114 a_float outmin
; //!< minimum final output
115 a_float out
; //!< controller final output
116 a_float var
; //!< cache variable
117 a_float fdb
; //!< cache feedback
118 a_float err
; //!< cache error
119 #if defined(__cplusplus)
120 A_INLINE
void init() { a_pid_init(this); }
121 A_INLINE
void kpid(a_float _kp
, a_float _ki
, a_float _kd
)
123 a_pid_kpid(this, _kp
, _ki
, _kd
);
125 A_INLINE a_float
run(a_float set
, a_float _fdb
)
127 return a_pid_run(this, set
, _fdb
);
129 A_INLINE a_float
pos(a_float set
, a_float _fdb
)
131 return a_pid_pos(this, set
, _fdb
);
133 A_INLINE a_float
inc(a_float set
, a_float _fdb
)
135 return a_pid_inc(this, set
, _fdb
);
137 A_INLINE
void zero() { a_pid_zero(this); }
138 #endif /* __cplusplus */