INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
pid dc motor regelung
22.02.2014, 00:31
Beitrag #1
pid dc motor regelung
Hallo hoffentlich kann man mir hier wieter helfen habe einen poti, dcmotor,duemillanove, motorshield. will mit dem dc motor den poti auf eine position steuern das ganze soll über einen pid regler laufen. Hab da schon mal angefangen und erhoffe mir jetzt mal so ein bisschen hilfe zu meinen Fragen

erstmal der code



unsigned long lastTime;
float Input, Output, Setpoint;
float fehler, ITerm, lastInput;
float kp, ki, kd;
int SampleTime = 1000; //1 sec
float NewSampleTime=0;
float outMin, outMax;
bool inAuto = true;
float aggKp=4, aggKi=0.2, aggKd=1;
float consKp=1, consKi=0.05, consKd=0.25;
float Min=(110), Max=(250);
float Kp=2,Ki=0.5,Kd=2;
float minusMin=(-255), minusMax=(-110);
float ratio;

#define MANUAL 0
#define AUTOMATIC 1

void setup() {

Serial.begin(9600);

Input=analogRead(5);
Setpoint=(500);




float outMax = (255);
float outMin = (10);
// put your setup code here, to run once:

}

void loop() {

Input=analogRead(5);

if(!inAuto) return;
unsigned long now = millis();
int timeChange = (now - lastTime);
if(timeChange>=SampleTime)

Input=analogRead(5);
/*Compute all the working error variables*/
float fehler = Setpoint - Input;
ITerm = (ki * fehler);
//if (ITerm > outMax) ITerm = (255);
// if (ITerm < outMin) ITerm = (10);
float dInput = (Input - lastInput);

/*Compute PID Output*/
Output = kp * fehler + ITerm- kd * dInput;

/*Remember some variables for next time*/
lastInput = Input;
lastTime = now;


//if (Kp<0 || Ki<0|| Kd<0) return;


SampleTime=1000;
float SampleTimeInSec = ((int) SampleTime/1000);
kp = Kp;
ki = Ki * SampleTimeInSec;
kd = Kd / SampleTimeInSec;


if (NewSampleTime > 0)

{ float ratio = (NewSampleTime / SampleTime);
ki *= ratio;
kd /= ratio;
SampleTime = (unsigned long)NewSampleTime; }

//pwm begrenzung aus Output

// if(Min > Max) return;

if (Output > 0)

outMin = Min, outMax = Max;

else if (Output < 0)

outMin = minusMin, outMax = minusMax;

if(Output > outMax) Output = outMax;
else if(Output < outMin) Output = outMin;

//if (ITerm > outMax) ITerm= outMax;
//else if(ITerm < outMin) ITerm= outMin;







//Serial.print("setpoint: ");Serial.print(Setpoint); Serial.print(" ");
Serial.print("input: ");Serial.print(Input); Serial.print(" ");
Serial.print("output: ");Serial.print(Output); Serial.print(" ");
//Serial.print("fehler");Serial.print(fehler);Serial.print(" ");
Serial.print("iterm");Serial.print(ITerm);Serial.print(" ");
Serial.print("ki");Serial.print(ki);Serial.print(" ");



Serial.print("dinput");Serial.print(dInput);Serial.print(" ");
Serial.print("ratio");Serial.print(ratio);Serial.print(" ");
Serial.print("sampletimeinsec");Serial.print(SampleTimeInSec);Serial.print(" ");
Serial.print("timechange");Serial.print(timeChange);Serial.print(" ");
delay();


// put your main code here, to run repeatedly:

}

nun mal ne frage sollte man beim iterm auch die letzten 3 iterm ergebnisse mit einbeziehen anstatt ihn zusammen zu addieren und dann zu begrenzen???
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2014, 20:34 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2014 21:33 von dreyer.)
Beitrag #2
RE: pid dc motor regelung
Noch eine andere frage wie krieg ich die loop seriell gestoppt oder mit nichts tuen beschäftigt und kann sie denn wieder auf seriell befehl starten?
Hab da so ein Ansatz aber der ist es nicht. Leider ist es egal was icheingebe die loop beginnt und lässt sich auch nicht durch serial send manuall abschalten?? beim abschalten sollte er denn in eine return schleife kommen.

void loop() {

if (Serial.available())
{ modus = Serial.read ();


if (modus = AUTO) newAuto = true;

if(newAuto && !inAuto) inAuto = true ;
if (modus = MANUALL) inAuto= false;
if (modus = MANUALL) return ;


//inAuto = newAuto;

}



Input=analogRead(5);

if(!inAuto) return;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2014, 22:10
Beitrag #3
RE: pid dc motor regelung
Mal ne kätzerische Frage,
wenn ihr auf nem Arduino eine Regelung machen wollt, wie taktet ihr die Regelzyklen denn ? Also entweder man geht alle X Millisekunden den Algoryhtmus durch oder man muß die Zeit seit dem letzten Regelzyklus mit in die Rechnung einfließen lassen weil es sonst doch zu unerwünschten Schwingern kommt....
....oder will mir nun einer erzählen das ich aufm Holzweg bin...
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2014, 20:36
Beitrag #4
RE: pid dc motor regelung
ja Zeit wird mit eingerechnet steht ja auch im code "sampletime" alle 1000 millis
timechange ist wert wie lange es tatsächlich dauert und die zeit wird im output mit berechnet.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2014, 21:59
Beitrag #5
RE: pid dc motor regelung
(24.02.2014 20:34)dreyer schrieb:  Noch eine andere frage wie krieg ich die loop seriell gestoppt oder mit nichts tuen beschäftigt und kann sie denn wieder auf seriell befehl starten?
Hab da so ein Ansatz aber der ist es nicht. Leider ist es egal was icheingebe die loop beginnt und lässt sich auch nicht durch serial send manuall abschalten?? beim abschalten sollte er denn in eine return schleife kommen.

void loop() {

if (Serial.available())
{ modus = Serial.read ();


if (modus = AUTO) newAuto = true;

if(newAuto && !inAuto) inAuto = true ;
if (modus = MANUALL) inAuto= false;
if (modus = MANUALL) return ;


//inAuto = newAuto;

}



Input=analogRead(5);

if(!inAuto) return;

Wie ich sehe hast du auch schon erkannt das die Serielle Ausgabe die Regelung wohl stört. Wäre es dir eine Hilfe über einen Port die Ausgabe Ein bzw. Auszuschalten was ich auch schon mal bei Zeitkritischen Vorgängen gemacht habe.

Etwa so:

if(!digitalRead(StatusPort))
{
Serial.println(programm);
...
}

Der Statusport muß natürlich als Eingang initialisiert sein evtl. mit PullUP.
So werden die Daten nur ausgegeben wenn die Taste gedrückt ist.
Auf jeden Fall kann man so von ausen bestimmen ob Daten über die Serielle ausgegeben werden.

lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.02.2014, 23:09
Beitrag #6
RE: pid dc motor regelung
ich will dem arduino am ende eine poti sollposition , ein loop an /aus signal von einem .net programm senden. Ich hab mich mit der kommunikation zwischen exe und arduino noch nicht auseinander gesetzt, könnte mir aber vorstellen das da auch wieder seriell mit zwischen hängt.? Wie wäre es denn mit einer leeren do while Aufgabe?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  PWM-Lüfter mit Adafruit Motor-Shield steuern? phischmi 9 448 22.07.2016 18:06
Letzter Beitrag: phischmi
  Arduino Uno+Motor Shield+Velleman Mustercode funktionieren nicht Dubidu 8 484 20.07.2016 19:05
Letzter Beitrag: Scheams
  DC Motor in beide Richtungen steuern WIMunios 5 643 24.03.2016 12:04
Letzter Beitrag: Bitklopfer
  Motor Geschwindigkeitssteuerung mit L293DNE ArduinoFanX 12 1.213 11.01.2016 13:21
Letzter Beitrag: arduinofan
  Rampe ohne Delay DC-Motor de_flexus 3 1.933 22.11.2015 13:07
Letzter Beitrag: frank2000
  Hilfe Möchte meinen schritt Motor ohne mastermann7 4 1.027 09.06.2015 14:28
Letzter Beitrag: fraju
  Arduino Motor-Shield Cray-1 8 1.833 18.10.2014 17:57
Letzter Beitrag: tito-t
  Code funktioniert nicht - Motor startet nicht, trotz das die Bedingungen erfüllt sind Daniel Zorn 16 4.353 06.02.2014 10:23
Letzter Beitrag: demokrit
  Elko für den Motor? Coleby 4 1.656 11.01.2014 12:30
Letzter Beitrag: lumi

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste