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