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