66 lines
2.4 KiB
C
66 lines
2.4 KiB
C
#ifndef __PID_G_H__
|
|
#define __PID_G_H__
|
|
#include "lib.h"
|
|
|
|
typedef struct
|
|
{
|
|
float32 ref; /*目标*/
|
|
float32 feed_back; /*实际*/
|
|
float32 pre_feed_back; /*上一次实际*/
|
|
float32 kp; /*比例学习速度*/
|
|
float32 ki; /*积分学习速度*/
|
|
float32 kd; /*微分学习速度*/
|
|
float32 ki_error; /*积分误差*/
|
|
float32 error; /*误差*/
|
|
float32 pre_error; /*前一拍偏差*/
|
|
float32 prev_error; /*前两拍偏差*/
|
|
float32 err_dead; /*死区*/
|
|
float32 err_limit; /*积分分离上限*/
|
|
float32 maximum; /*输出值的上限*/
|
|
float32 minimum; /*输出值的下限*/
|
|
float32 out; /*输出值*/
|
|
float32 sum_iterm; /*积分累加*/
|
|
float32 ui_ratio; /*积分权重*/
|
|
BOOL ki_enable; /*积分使能*/
|
|
BOOL kd_enable; /*微分使能*/
|
|
BOOL detach; /*积分分离标志*/
|
|
BOOL weight; /*积分权重标志*/
|
|
float32 out_max; /*输出最大值*/
|
|
float32 out_min; /*输出最小值*/
|
|
} g_param_t;
|
|
|
|
typedef struct PID_G
|
|
{
|
|
/* 设置PID三个参数 */
|
|
void (*set_ctrl_prm)(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max);
|
|
/* 更新PID参数 */
|
|
void (*update_ctrl_prm)(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max);
|
|
/* 控制接口 */
|
|
float32 (*PID)(struct PID_G *self, float32 target, float32 feedback);
|
|
/* 更新控制区间 */
|
|
void (*set_range)(struct PID_G *self, float32 out_min, float32 out_max);
|
|
/* 设置积分分离 */
|
|
void (*set_cfg)(struct PID_G *self, float32 max_err, BOOL mode);
|
|
/* 设置积分权重 */
|
|
void (*set_weight)(struct PID_G *self, float32 max_ratio, BOOL mode);
|
|
/* 更新kp */
|
|
void (*set_kp)(struct PID_G *self, float32 kp);
|
|
/* 使能ki */
|
|
void (*set_ki_enable)(struct PID_G *self, BOOL enable);
|
|
/* 更新ki */
|
|
void (*set_ki)(struct PID_G *self, float32 ki);
|
|
/* 使能kd */
|
|
void (*set_kd_enable)(struct PID_G *self, BOOL enable);
|
|
/* 更新kd */
|
|
void (*set_kd)(struct PID_G *self, float32 kd);
|
|
/* 复位PID积分及微分控制数据 */
|
|
void (*restctrl)(struct PID_G *self);
|
|
|
|
/* private */
|
|
g_param_t pri;
|
|
|
|
} pid_g_t;
|
|
|
|
extern void pid_g_constructor(struct PID_G *self);
|
|
#endif // __PID_G_H__
|