2016-03-04 40 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 
...