簡體   English   中英

電機的PID轉矩控制

[英]PID torque control of motor

我正在嘗試控制電動機扭矩。 我正在嘗試通過對電動機電流(因此對PWM)實施PID控制來實現此目的。 PWM越高,轉矩越高。 我是arduino-uno的新手,因此需要編碼方面的幫助。 我已經為相同的代碼編寫了代碼,但是對其正確性不確定。 我仍然不確定要使用的'Integral'變量的值。 任何幫助都非常感謝

#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);
}' 

您是正確的,積分計算是錯誤的。 積分(來自integral)意味着相加。 你想要的是

I = I + kI*Error;

您還應該將積分項(I)限制為某個最大值和最小值,以避免“纏繞”錯誤。 當伺服器無法達到目標時會發生這種情況,因為I項是它可能失控的誤差之和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM