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