pid_control.h
Go to the documentation of this file.
00001
00042 #ifndef ALGO_PID_CONTROL_H
00043 #define ALGO_PID_CONTROL_H
00044 
00045 #include <drv/timer.h>
00046
00050 typedef float pidk_t;
00051 typedef float piddata_t;
00052
00056 typedef struct PidCfg
00057 {
00058     pidk_t kp;
00059     pidk_t ki;
00060     pidk_t kd;
00061
00062     piddata_t i_max;
00063     piddata_t i_min;
00064
00065     piddata_t out_max;
00066     piddata_t out_min;
00067
00068     mtime_t sample_period;
00069
00070 } PidCfg;
00071
00072
00076 typedef struct PidContext
00077 {
00078     const PidCfg *cfg;
00079
00080     piddata_t prev_err;
00081     piddata_t i_state;
00082
00083 } PidContext;
00084
00088 INLINE void pid_control_setPid(PidCfg *pid_cfg, pidk_t kp, pidk_t ki, pidk_t kd)
00089 {
00090     pid_cfg->kp = kp;
00091     pid_cfg->ki = ki;
00092     pid_cfg->kd = kd;
00093 }
00094
00098 INLINE void pid_control_setPeriod(PidCfg *pid_cfg, mtime_t sample_period)
00099 {
00100     pid_cfg->sample_period = sample_period;
00101 }
00102
00106 INLINE void pid_control_reset(PidContext *pid_ctx)
00107 {
00108     pid_ctx->i_state = 0;
00109     pid_ctx->prev_err = 0;
00110 }
00111
00112 piddata_t pid_control_update(PidContext *pid_ctx, piddata_t target, piddata_t curr_pos);
00113 void pid_control_init(PidContext *pid_ctx, const PidCfg *pid_cfg);
00114
00115 #endif /* ALGO_PID_CONTROL_H */