BeRTOS
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 */