175 lines
4.1 KiB
C
175 lines
4.1 KiB
C
#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
|