2016-03-04 17 views
0

我正在创建一个PID控制器来控制电机。我调查了使用PID库,但我认为它不适合我的需要,因为我需要使用相同的控制器在两个方向上控制电机。PID控制器,编码D部分的问题。

我目前有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

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

如果您发布的代码是一个函数里面,你可能需要static关键字:

static double lastError; 

为了从电话呼叫保留价值。否则,它可能会重新初始化为零,并给你看到的结果。如果lastError是全局的,

对于导数(错误),有些使用微分(measured_value)以避免对设定值的更改敏感。

我想你的代码更改为:

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