69 lines
1.3 KiB
C
69 lines
1.3 KiB
C
|
|
//
|
|||
|
|
// Created by Administrator on 2026/1/16.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
#ifndef RTTHREAD_PID_CONTROLLER_H
|
|||
|
|
#define RTTHREAD_PID_CONTROLLER_H
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
class PidController
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
PidController();
|
|||
|
|
|
|||
|
|
// 设置目标(通用 target)
|
|||
|
|
void setTarget(double target);
|
|||
|
|
|
|||
|
|
// PID 增益
|
|||
|
|
void setGains(double kp, double ki, double kd);
|
|||
|
|
|
|||
|
|
/// 设置积分上下限: lower <= I <= upper
|
|||
|
|
/// 若 upper <= lower,则不启用积分限幅
|
|||
|
|
void setIntegralLimits(double lower, double upper);
|
|||
|
|
|
|||
|
|
/// 设置误差死区: |error| < deadzone 时视为 0
|
|||
|
|
void setDeadzone(double deadzone);
|
|||
|
|
|
|||
|
|
/// 设置 D 项滤波系数(简单一阶滤波)
|
|||
|
|
/// coeff <= 0 表示不启用滤波
|
|||
|
|
void setDerivativeFilterCoeff(double coeff);
|
|||
|
|
|
|||
|
|
/// 重置内部状态(积分/上一拍误差/滤波器)
|
|||
|
|
void reset(double integral = 0.0, double prev_error = 0.0);
|
|||
|
|
|
|||
|
|
/// 核心:根据当前值计算控制量
|
|||
|
|
double compute(double x, double dt);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
// gains
|
|||
|
|
double kp_;
|
|||
|
|
double ki_;
|
|||
|
|
double kd_;
|
|||
|
|
|
|||
|
|
// target
|
|||
|
|
double target_;
|
|||
|
|
|
|||
|
|
// state
|
|||
|
|
double integralError_;
|
|||
|
|
double prevError_;
|
|||
|
|
|
|||
|
|
// integral clamp
|
|||
|
|
double iLower_;
|
|||
|
|
double iUpper_;
|
|||
|
|
|
|||
|
|
// deadzone
|
|||
|
|
double deadzone_;
|
|||
|
|
|
|||
|
|
// derivative filter
|
|||
|
|
double dFilterCoeff_;
|
|||
|
|
double dErrorFiltered_;
|
|||
|
|
|
|||
|
|
bool initialized_;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endif //RTTHREAD_PID_CONTROLLER_H
|