This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/lib/control/inc/pid.h

175 lines
4.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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