PID 控制器,编码 D 部分的问题

PID controller, Issues with coding D part.

本文关键字:问题 控制器 编码 PID      更新时间:2023-10-16

我正在努力创建一个用于控制电机的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);
听起来好像

lastError 总是零。 也许在代码开头将其打印为调试信息。

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

static double lastError;

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

对于导数(误差),有些人使用导数(measured_value)来避免对设定值变化敏感。

我会将您的代码更改为:

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