Ich hatte Erfolg in der Kontrolle der Position meines Motors mit PD-Controller. Ich habe jedoch einige Probleme mit der Programmierung.Motor bewegt sich nicht
Hier ist mein Code:
#define encoder0PinA_M1 2
#define encoder0PinB_M1 22
int EnablePin = 8;
int PWMPin1 = 3;
int PWMPin2 = 11;
volatile signed int encoder0Pos = 0;
unsigned long LastTime;
signed int Input;
signed int Scaled_PID;
float PID_Output, Scaled_PID1;
signed int ErrorSum,ErrorDiff,Error,LastError;
float kp=6;
float ki=0;
float kd=1;
int SampleTime = 10;
int TimeChange;
unsigned long Now;
void setup()
{
pinMode(encoder0PinA_M1, INPUT);
//digitalWrite(encoder0PinA_M1, HIGH);
pinMode(encoder0PinB_M1, INPUT);
pinMode(EnablePin, OUTPUT);
pinMode(PWMPin1, OUTPUT);
pinMode(PWMPin2, OUTPUT);
//digitalWrite(encoder0PinB_M1, HIGH);
attachInterrupt(0, doEncoder, CHANGE);
Serial.begin (9600);
Serial.println("start");
}
void PID()
{
Now = millis();
TimeChange = Now - LastTime;
if(TimeChange >= SampleTime)
{
Error = Input - encoder0Pos;
ErrorSum = ErrorSum + Error;
ErrorDiff = Error - LastError;
PID_Output = kp * Error + ki * ErrorSum + kd * ErrorDiff;
LastError = Error;
LastTime = Now;
}
}
void speedlimitforward()
{
if (PID_Output >= 15)
{
PID_Output= 15;
}
if(PID_Output <= -15)
{
PID_Output=-15;
}
Scaled_PID = PID_Output+15;
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPin1,Scaled_PID);
}
void speedlimitbackward()
{
if (PID_Output >= 20)
{
PID_Output= -20;
}
if(PID_Output <= -20)
{
PID_Output= 20;
}
Scaled_PID = PID_Output+20;
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPin2,Scaled_PID);
}
void loop()
{
Input=50;
PID();
speedlimitforward();
}
void doEncoder()
{
if (digitalRead(encoder0PinA_M1) == digitalRead(encoder0PinB_M1))
{
encoder0Pos++;
} else {
encoder0Pos--;
}
}
Wenn Sie an meinem Code aussehen, ich habe als globale Variable und in Schleife erklärt Input() ich Wert auf Input geben (50 zählt in dieser Code). Dieser Code funktioniert einwandfrei und der Motor stoppt bei fast 50 Encoderzählungen.
Aber wenn ich die Schleife im obigen Code zu dem unten angegebenen Code ändere, bewegt sich mein Motor nicht. Ich mag es für einige Zeit auf 50 Zählung warten zu bewegen und kommt zurück auf 0 Zahl:
void loop()
{
Input=50;
PID();
speedlimitforward();
delay(2000);
Input=0;
PID();
speedlimitbackward();
delay(2000);
Input=-100;
PID();
speedlimitbackward();
}
1) Dies ist nicht C. Arduino ist nicht C. 2) 'volatile' garantiert nicht atomaren Zugriff. 3) Dies ist kein Debugging-Service. Verwenden Sie den Debugger. 4) Die Verwendung von Fließkomma auf Arduino ist höchstwahrscheinlich eine schlechte Idee. Verwenden Sie skalierte Ganzzahlen. – Olaf