47 lines
1.4 KiB
C
47 lines
1.4 KiB
C
#ifndef PID_H
|
|
#define PID_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// 防止除零和其他误差的极小值
|
|
#define EPSILON 1e-5f
|
|
#define SIGMA EPSILON
|
|
|
|
#include "app_config.h"
|
|
|
|
// PID 控制模式
|
|
typedef enum {
|
|
PID_MODE_DERIVATIVE_NONE = 0, // PI 控制器模式,无微分项
|
|
PID_MODE_DERIVATIVE_CALC, // 根据当前误差计算微分项
|
|
PID_MODE_DERIVATIVE_CALC_NO_SP, // 根据当前值计算微分项,忽略设定值
|
|
PID_MODE_DERIVATIVE_SET // 使用外部提供的微分项值
|
|
} pid_mode_t;
|
|
|
|
// PID 控制器结构体
|
|
typedef struct {
|
|
pid_mode_t mode; // 控制模式
|
|
float dt_min; // 最小时间间隔
|
|
float kp; // 比例系数
|
|
float ki; // 积分系数
|
|
float kd; // 微分系数
|
|
float integral; // 积分累积值
|
|
float integral_limit; // 积分限幅
|
|
float output_limit; // 输出限幅
|
|
float error_previous; // 上一次的误差值
|
|
float last_output; // 上一次的输出值
|
|
} PID_t;
|
|
|
|
// 函数声明
|
|
void initializePid(PID_t *pid, pid_mode_t mode, float dtMin);
|
|
int32_t setPidParameters(PID_t *pid, float kp, float ki, float kd, float integralLimit, float outputLimit);
|
|
float calculatePidOutput(PID_t *pid, float sp, float val, float val_dot, float dt);
|
|
void resetPidIntegral(PID_t *pid);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // PID_H
|