236 lines
7.0 KiB
C
236 lines
7.0 KiB
C
#ifndef __PID_H__
|
||
#define __PID_H__
|
||
#include "lib.h"
|
||
#include "pid_auto_tune.h"
|
||
|
||
#define INCOMPLETE_DIFFEREN 0 // 不完全微分
|
||
|
||
typedef enum
|
||
{
|
||
PID_SUB_TYPE_POSITION = 1, // 位置式
|
||
PID_SUB_TYPE_INCREMENT = 2, // 增量式
|
||
} pid_sub_type_e;
|
||
typedef enum
|
||
{
|
||
DEAD_ZONE_BOTH = 0, // 正负都可以
|
||
DEAD_ZONE_POSITIVE = 1, // 正数
|
||
DEAD_ZONE_NEGATIVE = 2, // 负数
|
||
} 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_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
|