Files
2025-11-07 20:19:23 +08:00

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