#ifndef __PID_H__ #define __PID_H__ #include "lib.h" #include "pid_auto_tune.h" #include "pid_c.h" #include "pid_g.h" #include "pid_x.h" #include "pid_zh.h" #include "pid_zh1.h" #include "pid_hd.h" #define INCOMPLETE_DIFFEREN 0 // 不完全微分 typedef enum { PID_SUB_TYPE_POSITION, // 位置式 PID_SUB_TYPE_INCREMENT, // 增量式 } pid_sub_type_e; typedef enum { DEAD_ZONE_POSITIVE = 1, // 正数 DEAD_ZONE_NEGATIVE = -1, // 负数 DEAD_ZONE_BOTH = 0 // 正负都可以 } deadzone_e; typedef enum { // PID自整定 PID_TYPE_AUTO_TUNE, // 通用PID PID_TYPE_COMMON, // 神经PID PID_TYPE_NEURAL, // 模糊PID PID_TYPE_FUZZY, // 以下是自定义PID // cj PID PID_TYPE_CUSTOM_CAO, // gp jPID PID_TYPE_CUSTOM_GAO, // xsh PID PID_TYPE_CUSTOM_XU, // zxm PID PID_TYPE_CUSTOM_ZHANG, // hangdian PID PID_TYPE_CUSTOM_HANGDIAN, } pid_type_e; typedef struct { float32 ref; float32 feedback; float32 pre_feedback; float32 e_0; // 当前误差 float32 e_1; // 上一次误差 float32 kp; float32 ki; float32 kd; float32 err_limit; BOOL detach; float32 err_dead; float32 alpha; float32 lastdev; float32 out; float32 out_max; float32 out_min; float32 sv_range; float32 iout; // 积分输出 BOOL sm; BOOL ki_enable; BOOL kd_enable; float32 deviation; // 纠正系统误差造成的影响,作用于死区,大于0需要补偿,小于0需要反向补偿 BOOL in_dead_zone; // 是否在死区内 } 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 err_dead; float32 deviation; // 纠正系统误差造成的影响,作用于死区 float32 out_max; // 输出限幅 float32 out_min; // 输出限幅 float32 sum_iterm; float32 iout; // 积分输出 float32 alpha; // 不完全微分参数 float32 lastdev; // 不完全微分参数 BOOL sm; BOOL ki_enable; BOOL kd_enable; float32 sv_range; // 没有用的 float32 err_limit; BOOL detach; } pid_common_increment_t; // 增量式PID typedef struct PID_COMMON { uint8_t type; /* 设置PID三个参数 */ void (*set_ctrl_prm)(struct PID_COMMON *self, float32 kp, float32 ki, float32 kd); /* 设置积分范围 */ void (*set_integral_prm)(struct PID_COMMON *self, float32 integral_up, float32 integral_low); /* 控制接口 */ float32 (*PID)(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 { uint8_t type; /* 设置PID三个参数 */ void (*set_ctrl_prm)(struct PID_NEURAL *self, float32 minimum, float32 maximum); /* 设置输出范围 */ void (*set_out_prm)(struct PID_NEURAL *self, float32 minimum, float32 maximum); /* 控制接口 */ float32 (*PID)(struct PID_NEURAL *self, float32 target, float32 feedback); struct { float32 setpoint; /*设定值*/ float32 kcoef; /*神经元输出比例*/ float32 kp; /*比例学习速度*/ float32 ki; /*积分学习速度*/ float32 kd; /*微分学习速度*/ float32 lasterror; /*前一拍偏差*/ float32 preerror; /*前两拍偏差*/ float32 deadband; /*死区*/ float32 result; /*输出值*/ float32 output; /*百分比输出值*/ float32 maximum; /*输出值的上限*/ float32 minimum; /*输出值的下限*/ float32 wp; /*比例加权系数*/ float32 wi; /*积分加权系数*/ float32 wd; /*微分加权系数*/ } pri; } pid_neural_t; // 神经PID typedef struct { float32 kp; float32 ki; float32 kd; float32 kup; float32 kui; float32 kud; float32 maxe; // 非线性区间最大值 float32 mine; // 非线性区间最小值 } FUZZY_PID_t; // 模糊PID typedef struct PID_FUZZY { /* 设置PID三个参数 */ void (*set_ctrl_prm)(struct PID_FUZZY *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 deviation, float32 out_min, float32 out_max); // 设置PID参数 void (*set_error_max_min)(struct PID_FUZZY *self, float32 mine, float32 maxe); // 设置非线性区间值 void (*update_ctrl_prm)(struct PID_FUZZY *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max); // 更新PID参数 void (*set_range)(struct PID_FUZZY *self, float32 out_min, float32 out_max); // 更新最大最小值 void (*set_cfg)(struct PID_FUZZY *self, float32 max_err, BOOL mode); // 配置PID模式,默认不使用积分分离 void (*set_smooth_enable)(struct PID_FUZZY *self, BOOL enable, float32 sv_range); // 设置平滑范围 void (*set_iout)(struct PID_FUZZY *self, float32 iout); // 设置积分输出 void (*set_err_dead)(struct PID_FUZZY *self, float32 err_dead); // 设置死区 void (*set_kp)(struct PID_FUZZY *self, float32 kp); void (*set_ki_enable)(struct PID_FUZZY *self, BOOL enable); void (*set_ki)(struct PID_FUZZY *self, float32 ki); // 微分开启使能 void (*set_kd_enable)(struct PID_FUZZY *self, BOOL enable); void (*set_kd)(struct PID_FUZZY *self, float32 kd); void (*set_kd_dev)(struct PID_FUZZY *self, float32 alpha); void (*restctrl)(struct PID_FUZZY *self, float32 out); // 复位PID积分及微分控制数据 /* 控制接口 */ float32 (*execute)(struct PID_FUZZY *self, float32 target, float32 feedback); BOOL(*in_dead_zone) (struct PID_FUZZY *self); union { pid_common_position_t position; pid_common_increment_t increment; } pri_u; pid_sub_type_e sub_type; // 位置式PID,增量式PID BOOL open; // 是否使用模糊PID控制 BOOL speed_integral_enable; // 变速积分,暂时没有验证成功 deadzone_e deadzone_dir; FUZZY_PID_t pid_params; } pid_fuzzy_t; // 模糊PID // PID typedef struct { BOOL is_init; // 是否初始化 pid_type_e type; // 不同的算法类型,模糊PID,神经PID,通用PID pid_sub_type_e sub_type; // 位置式PID,增量式PID union { pid_common_t common; pid_neural_t neural; pid_fuzzy_t fuzzy; // 自定义PID pid_c_t cao; pid_g_t gao; pid_x_t xu; pid_zh_t zhang; pid_zh1_t zhang1; pid_hd_t hd; } pid_u; pid_auto_tune_t auto_tune; } pid_t; // PID控制 extern void pid_constructor(pid_t *self); // private // 神经元PID extern void pid_neural_constructor(struct PID_NEURAL *self); // 模糊PID extern void pid_fuzzy_constructor(struct PID_FUZZY *self); #endif