【问题标题】:PID controller, Issues with coding D part.PID 控制器,编码 D 部分的问题。
【发布时间】:2016-03-04 03:18:48
【问题描述】:

我正在创建一个用于控制电机的 PID 控制器。我使用 PID 库进行了调查,但我认为它不适合我的需求,因为我需要使用同一个控制器在两个方向上控制电机。

我目前正在使用 PI 部分,但我正在努力处理 D 部分。我无法将当前错误存储到最后一个错误,然后可以用来计算下一个 D 值。相反,我的 d 值似乎反映了错误,而不是当前错误与上一个错误相比的变化。我的代码如下所示,任何建议将不胜感激。

**注意,我知道通常 delta_T 包含在控制器的积分和微分部分中,但是我更喜欢将其合并到控制常数 Ki 和 Kd 中以避免编码复杂化。

  Distance = analogRead (irSense); //read the sensor, assigns value to Distance
//Serial.println(Distance) ;
double lastError; 
int control;         //initialize control variable , set up PID parameters
int setpoint = 350;  //Neutral position, zero point, desired input
int error = Distance - setpoint;  //error function
double d = (error - lastError);  //derivative function

double kp = 0.9;         //Proportional constant
double ki = 0.000001;       //Intergral constant
double kd = .0001;          //Derivitve constant

i += error; //intergral Set
control = error * kp + i * ki + d * kd; //PID control funtion

lastError = error;

Serial.println (d);

【问题讨论】:

    标签: variables controller pid


    【解决方案1】:

    听起来好像 lastError 总是为零。也许在代码开始时将其打印为调试信息。

    如果您发布的代码在函数内部,您可能需要 static 关键字:

    static double lastError;
    

    为了保留从调用到调用的值。否则,它可能会重新初始化为零并为您提供您看到的结果。如果 lastError 是全局的,

    对于导数(误差),有些使用导数(测量值)来避免对设定点变化的敏感性。

    我会将您的代码更改为:

    static double lastDistance;
    ...
    double d = Distance-lastDistance
    ...
    

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2014-05-18
      相关资源
      最近更新 更多