我正在创建一个用于控制电机的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);
答案 0 :(得分:0)
听起来好像lastError始终为零。也许在代码开头将其打印为调试信息。
如果您发布的代码在函数内部,则可能需要static关键字:
static double lastError;
为了保持来电的价值。否则,它可能会重新初始化为零,并为您提供您看到的结果。如果lastError是全局的,
对于微分(误差),有些人使用导数(measured_value)来避免对设定值变化的敏感性。
我会将您的代码更改为:
static double lastDistance;
...
double d = Distance-lastDistance
...