#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