#ifndef __PID_H__ #define __PID_H__ #include "lib.h" typedef enum { // PID自整定 PID_TYPE_AUTO_TUNE, // 增量式PID PID_TYPE_COMMON_INCREMENT, // 位置式PID PID_TYPE_COMMON_POSITION, // 神经PID PID_TYPE_NEURAL, } pid_type_e; typedef enum { // 位置式 PID_SUB_TYPE_POSITION, // 增量式 PID_SUB_TYPE_INCREMENT, } pid_sub_type_e; #define FUZZY_SUB_TYPE PID_SUB_TYPE_POSITION #define INCOMPLETE_DIFFEREN 0 // 不完全微分 #define INTEGRAL_SEPARATION 1 // 积分分离 #pragma pack(1) typedef struct { float32 ref; float32 feed_back; float32 pre_feed_back; float32 pre_error; float32 ki_error; /*积分误差*/ float32 ki_limit; /*积分分离界限*/ float32 kp_limit; /*变积分界限*/ float32 alpha; /*不完全微分系数*/ float32 err; float32 sum_iterm; float32 kp; float32 kp_small; /*在接近稳态时的Kp*/ float32 kp_big; /*在大范围时的Kp*/ float32 ki; float32 kd; float32 err_limit; BOOL detach; float32 err_dead; #if INCOMPLETE_DIFFEREN == 1 dc_t alpha; dc_t lastdev; #endif float32 out; float32 pre_out; float32 out_max; float32 out_min; BOOL sm; float32 sv_range; } pid_common_position_t; // 位置式PID typedef struct { float32 ref; // 目标设定值 float32 feedback; // 传感器采集值 float32 out; // PID计算结果 float32 kp; float32 ki; float32 kd; float32 e_0; // 当前误差 float32 e_1; // 上一次误差 float32 e_2; // 上上次误差 float32 ki_error; /*积分误差*/ float32 alpha; float32 lastdev; float32 err_dead; float32 out_max; // 输出限幅 float32 out_min; // 输出限幅 BOOL sm; float32 sv_range; } pid_common_increment_t; // 增量式PID #pragma pack() typedef struct PID_COMMON { pid_sub_type_e type; /* 设置PID三个参数 */ void (*set_ctrl_prm)(struct PID_COMMON* self, float32 kp, float32 ki, float32 kd); void (*set_ctrl_prm_position)(struct PID_COMMON* self, float32 kp, float32 ki, float32 kd); /* 设置输出范围 */ void (*set_out_prm)(struct PID_COMMON* self, float32 maximum, float32 minimum); void (*set_out_prm_position)(struct PID_COMMON* self, float32 maximum, float32 minimum); /* 控制接口 */ float32(*PID_increment)(struct PID_COMMON* self, float32 err); float32(*PID_position)(struct PID_COMMON* self, float32 err); /* in value */ float32 err; /* out value */ float32 out; union { pid_common_position_t position; pid_common_increment_t increment; } pri_u; } pid_common_t; // 通用PID typedef struct PID_NEURAL { pid_sub_type_e type; /* 设置PID三个参数 */ void (*set_ctrl_prm)(struct PID_NEURAL* self, float32 k, float32 kp, float32 ki, float32 kd); /* 设置输出范围 */ void (*set_out_prm)(struct PID_NEURAL* self, float32 maximum, float32 minimum); /* 控制接口 */ float32(*PID)(struct PID_NEURAL* self, float32 err); /* in value */ float32 err; /* out value */ float32 out; /* private */ struct { float32 k; /*神经元输出比例*/ float32 kp; /*比例学习速度*/ float32 ki; /*积分学习速度*/ float32 kd; /*微分学习速度*/ float32 ki_error; /*积分误差*/ float32 last_error; /*前一拍偏差*/ float32 prev_error; /*前两拍偏差*/ float32 deadband; /*死区*/ float32 maximum; /*输出值的上限*/ float32 minimum; /*输出值的下限*/ float32 wp; /*比例加权系数*/ float32 wi; /*积分加权系数*/ float32 wd; /*微分加权系数*/ float32 u[3]; /*神经元输出*/ } pri; } pid_neural_t; // 神经PID // PID typedef struct { pid_type_e type; union { pid_common_t common; pid_neural_t neural; } pid_u; } pid_t; // PID控制 extern void pid_constructor(pid_t* self); // private // 神经元PID extern void pid_neural_constructor(struct PID_NEURAL* self); //HD:增量式PID extern void pid_increment_constructor(struct PID_COMMON* self); //HD: 位置式PID extern void pid_position_constructor(struct PID_COMMON* self); #endif