pid_control.h

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