2016-11-09 54 views
0

我試圖控制電機的轉矩。這是我試圖通過對電機電流進行PID控制並因此實現PWM來實現的。更高的PWM意味着更高的扭矩 我是arduino-uno的新手,因此需要編碼方面的幫助。我已經寫了一個相同的代碼,但它的正確性有點不確定。儘管如此,我仍然不確定'積分'變量的價值。 提前電機的PID轉矩控制

#include "RunningAverage.h" 
int m1 = 13; 
int m2 = 12; 
int me = 9; 
int t = millis()+5000; 
RunningAverage myRA(80); 
int stat=0; 
int pwmn=100; 
int counter=0; 
int kP; 
int kI=0; 
int kD=0; 
int SetPt; 
int Last; 
int Actual; 
int Error; 
int Integral; 
float P; 
float I; 
float D; 
int Drive; 
int ScaleFactor; 


void motorRight(){ 
digitalWrite(m1,HIGH); 
digitalWrite(m2, LOW); 
} 


void motorLeft(){ 
digitalWrite(m2,HIGH); 
digitalWrite(m1, LOW); 
} 

void motorOff(){ 
digitalWrite(m2, LOW); 
digitalWrite(m1, LOW); 
} 


void motorBrake(){ 
digitalWrite(m2, HIGH); 
digitalWrite(m1, HIGH); 
delay(10); 
motorOff(); 
} 

void setup() { 
// put your setup code here, to run once: 
pinMode(m1,OUTPUT); 
pinMode(m2,OUTPUT); 
pinMode(me,OUTPUT); 
analogWrite(me,pwmn); 
Serial.begin(115200); 
motorRight(); 
} 

void loop() { 
// put your main code here, to run repeatedly: 
myRA.addValue(analogRead(A1)); 
Serial.print(myRA.getAverage()); 
Serial.println(",500,600"); 
Actual = myRA.getAverage(); 
Error = SetPt - Actual; 
P = Error*kP; // calc proportional term 
I = Integral*kI; // integral term 
D = (Last-Actual)*kD; // derivative term 
Drive = P + I + D; // Total drive = P+I+D 
Drive = Drive*ScaleFactor; // scale Drive to be in the range 0-255 
//Serial.println(pwmn); 
if(counter>10){ 
if(pwmn<250){ 
pwmn++; 
} 
counter=0; 
} 
counter++; 
if (abs(Drive)>255) { 
Drive=255; 
} 
analogWrite (me,Drive); // send PWM command to motor board 
Last = Actual; // save current value for next time 
// analogWrite(me,pwmn); 
delay(50); 
}' 
+1

請先了解如何首先縮進 –

+0

不正確的縮進道歉。我試圖專注於代碼內容和執行。感謝雖然:) – Sakshi

回答

-1

你是正確的任何幫助深表感謝 謝謝,積分的計算是錯誤的。積分(來自積分)意味着加起來。你想要的是

I = I + kI*Error; 

你也應該限制積分項(I)一些最大和最小值,以避免「發條」的錯誤。這種情況發生在伺服無法達到目標時,並且由於I項是可能失控的錯誤總和。

+0

這也是錯誤的。它實際上是$ I + = err * dt $。如果你這樣做,那麼你就沒有一種簡單的方法來調整Ki,因爲它變成了整體。積分應該是錯誤的總和。 – Martin