pid_control.h

Go to the documentation of this file.
00001 
00040 #ifndef ALGO_PID_CONTROL_H
00041 #define ALGO_PID_CONTROL_H
00042 
00043 #include <drv/timer.h>
00044 
00048 typedef float pidk_t;
00049 typedef float piddata_t;
00050 
00054 typedef struct PidCfg
00055 {
00056     pidk_t kp;              
00057     pidk_t ki;              
00058     pidk_t kd;              
00059 
00060     piddata_t i_max;        
00061     piddata_t i_min;        
00062 
00063     piddata_t out_max;      
00064     piddata_t out_min;      
00065 
00066     mtime_t sample_period;  
00067 
00068 } PidCfg;
00069 
00070 
00074 typedef struct PidContext
00075 {
00076     const PidCfg *cfg;
00077 
00078     piddata_t prev_err;     
00079     piddata_t i_state;      
00080 
00081 } PidContext;
00082 
00086 INLINE void pid_control_setPid(PidCfg *pid_cfg, pidk_t kp, pidk_t ki, pidk_t kd)
00087 {
00088     pid_cfg->kp = kp;
00089     pid_cfg->ki = ki;
00090     pid_cfg->kd = kd;
00091 }
00092 
00096 INLINE void pid_control_setPeriod(PidCfg *pid_cfg, mtime_t sample_period)
00097 {
00098     pid_cfg->sample_period = sample_period;
00099 }
00100 
00104 INLINE void pid_control_reset(PidContext *pid_ctx)
00105 {
00106     pid_ctx->i_state = 0;
00107     pid_ctx->prev_err = 0;
00108 }
00109 
00110 piddata_t pid_control_update(PidContext *pid_ctx, piddata_t target, piddata_t curr_pos);
00111 void pid_control_init(PidContext *pid_ctx, const PidCfg *pid_cfg);
00112 
00113 #endif /* ALGO_PID_CONTROL_H */