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

时间:2016-03-04 03:18:48

标签: variables controller pid

我正在创建一个用于控制电机的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);

1 个答案:

答案 0 :(得分:0)

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

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

static double lastError;

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

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

我会将您的代码更改为:

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