77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
#ifndef __PID_HD__
|
|
#define __PID_HD__
|
|
#include "lib.h"
|
|
|
|
#define INTEGRAL_SEPARATION 1 // 积分分离
|
|
#define INCOMPLETE_DIFFEREN_HD 1 // 不完全微分
|
|
|
|
typedef enum
|
|
{
|
|
INAUTO,
|
|
OFFAUTO,
|
|
} pid_mode_e;
|
|
|
|
typedef struct
|
|
{
|
|
pid_mode_e pid_mode;
|
|
float32 x[3];
|
|
float32 ref;
|
|
float32 feed_back;
|
|
float32 pre_feed_back;
|
|
float32 pre_error;
|
|
float32 ki_error; /*积分误差*/
|
|
float32 ki_limit; /*积分分离界限*/
|
|
float32 ki_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_HD == 1
|
|
float32 td_alpha; /*不完全微分系数*/
|
|
float32 td_beta; /*不完全微分系数beta*/
|
|
float32 pre_derivative; /*上一次微分值*/
|
|
#endif
|
|
float32 out;
|
|
float32 pre_out;
|
|
float32 out_max;
|
|
float32 out_min;
|
|
BOOL sm;
|
|
float32 sv_range;
|
|
uint32_t control_time; /*控制算法运行一次花费的时间*/
|
|
uint32_t tmp_time; /*临时用来记录控制的运行时间*/
|
|
} pid_hd_position_t; // 位置式PID
|
|
|
|
typedef struct PID_HD
|
|
{
|
|
/* 设置PID三个参数 */
|
|
void (*set_ctrl_prm_position)(struct PID_HD *self, float32 kp, float32 ki, float32 kd);
|
|
/* 设置输出范围 */
|
|
void (*set_out_prm_position)(struct PID_HD *self, float32 maximum, float32 minimum);
|
|
/*设置模式*/
|
|
void (*set_mode)(struct PID_HD *self, pid_mode_e mode);
|
|
|
|
/* 控制接口 */
|
|
float32 (*pid_position)(struct PID_HD *self, float32 err);
|
|
|
|
// 自定义参数
|
|
/* 实际值与目标值之间的误差 */
|
|
float32 err;
|
|
/* 输出值 */
|
|
float32 out;
|
|
/* private */
|
|
struct
|
|
{
|
|
pid_hd_position_t position;
|
|
} pri_u;
|
|
} pid_hd_t;
|
|
|
|
extern void pid_hd_constructor(struct PID_HD *self);
|
|
|
|
#endif // __PID_HD__
|