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
Rechnen mit dem Arduino
29.03.2016, 07:17
Beitrag #1
Rechnen mit dem Arduino
Sehr geehrte Community,

Ich habe ein Unterprogramm für einen PID-Regler nach folgendem Schema geschrieben:

uI = uI + Ki * Regeldifferenz_PID
Ergebnis = Kp * Regeldifferenz_PID + uI + KD (Regeldifferenz_PID - vorherige_Regeldiferenz_PID);

Da alleridngs das Arduino wohl mit der langen Berechnung nicht zurecht kam hab ich nur je eine Berechnung pro Zeile gemacht und anhand von Zwischenergebnissen weitergerechnet. Jetzt bekomme ich als Rückmeldung jedoch nurnoch 0 zurück und kann den Fehler einfach nicht finden...Huh liegt es am Datentyp (float), obwohl dieser hier ja immer derselbe ist....?

[
Code:
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
Stellgroesse = P_I_D (Regeldifferenz);  
}

float P_I_D (float Regeldifferenz_PID){          //Unterprogramm "P_I_D" mit Übergabe der float Variable für die Regeldifferenz

  const float Kp = 15.09,                        //Deklaration der const float Variable für den Kp-Wert
              Ki = 0.17,                         //Deklaration der const float Variable für den Ki-Wert
              KD = 24.4458;                      //Deklaration der const float Variable für den KD-Wert
              
  float Ergebnis;                                //Deklaration der float Variable "Ergebnis"
  float Ergebnis_1;                              //Deklaration der float Variable "Ergebnis_1"
  float Ergebnis_2;                              //Deklaration der float Variable "Ergebnis_2"
  float Ergebnis_3;                              //Deklaration der float Variable "Ergebnis_3"
  float Ergebnis_4;                              //Deklaration der float Variable "Ergebnis_4"
  float uI_1;                                    //Deklaration der float Variable "uI_1"
  
  static float vorherige_Regeldifferenz_PID = 0, //Deklaration der static float Variable "vorherige_Regeldifferenz_PID" mit dem Startwert 0
               uI = 0;                           //Deklaration der static float Variable "uI" mit dem Startwert 0
              
  uI_1 = uI + Ki;
  uI = uI_1 * Regeldifferenz_PID;                                  //I-Anteil
  Ergebnis_1 = Kp * Regeldifferenz_PID;
  Ergebnis_2 = Ergebnis_1 + uI;
  Ergebnis_3 = Regeldifferenz_PID - vorherige_Regeldifferenz_PID;
  Ergebnis_4 = KD * Ergebnis_3;
  Ergebnis = Ergebnis_2 + Ergebnis_4;
  vorherige_Regeldifferenz_PID = Regeldifferenz_PID;              //Speichern der aktuellen Rgeldifferenz in die static float Variable "vorherige_Regeldifferenz"
  
  return Ergebnis;                                                //Rückgabe des Wertes der float Variable "Ergebnis"
  }
[/code]]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.03.2016, 08:34
Beitrag #2
RE: Rechnen mit dem Arduino
Hi,
...mach doch einfach nach den Zwischenschritten eine Serial.println Ausgabe rein und kontrolliere die Werte....dazu ist diese Möglichkeit da..
lgbk

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
29.03.2016, 08:39
Beitrag #3
RE: Rechnen mit dem Arduino
Diese Funktion habe ich bereits ausgiebig genutzt, dennoch scheitert die Rechnung bereits am ersten Schritt, 0 und 0,17 zusammezurechnen. Laut dem Serielen Monitor habe ich das Ergebnis 0. Rechne ich manuell weiter mit dieser 0 wird schnell klar das der Fehler im Ursprung liegt.... nur verstehe ich nicht wie das sein kann :/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.03.2016, 08:49
Beitrag #4
RE: Rechnen mit dem Arduino
(29.03.2016 07:17)Rudi schrieb:  Ich habe ein Unterprogramm für einen PID-Regler nach folgendem Schema geschrieben:

uI = uI + Ki * Regeldifferenz_PID
Ergebnis = Kp * Regeldifferenz_PID + uI + KD (Regeldifferenz_PID - vorherige_Regeldiferenz_PID);

Da alleridngs das Arduino wohl mit der langen Berechnung nicht zurecht kam hab ich nur je eine Berechnung pro Zeile gemacht und anhand von Zwischenergebnissen weitergerechnet. Jetzt bekomme ich als Rückmeldung jedoch nurnoch 0 zurück und kann den Fehler einfach nicht finden...Huh liegt es am Datentyp (float), obwohl dieser hier ja immer derselbe ist....?

Hallo,

wenn ich deinen Sketch bei mir laufen lasse, rechnet er.

Gebe ich eine Regeldifferenz (float) von 0.5 ein, zeigt er als Ergebnis "Stellgroesse" im SerialMonitor mit 7.72 (float) an.

Da ich deine echten Werte nicht kenne, habe ich es so probiert.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.03.2016, 08:49
Beitrag #5
RE: Rechnen mit dem Arduino
(29.03.2016 08:39)Rudi schrieb:  Diese Funktion habe ich bereits ausgiebig genutzt, dennoch scheitert die Rechnung bereits am ersten Schritt, 0 und 0,17 zusammezurechnen. Laut dem Serielen Monitor habe ich das Ergebnis 0. Rechne ich manuell weiter mit dieser 0 wird schnell klar das der Fehler im Ursprung liegt.... nur verstehe ich nicht wie das sein kann :/

..ähm ich glaub das liegt einfach daran das du deine Variablen so bequem in der Funktion deklariert hast und da sind die dann eben nur Lokal verfügbar...deshalb deklariere ich meine Variablen immer Global und habe solche Schmerzen nicht...Big Grin
lgbk

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
29.03.2016, 09:43 (Dieser Beitrag wurde zuletzt bearbeitet: 29.03.2016 09:43 von Rudi.)
Beitrag #6
RE: Rechnen mit dem Arduino
@hotsystems

Ja bei sehr kleinen Werten scheint es tatsächlich zu funktionieren aber leider habe ich Werte zwischen ca- -300 bis 300 als Regeldiffernenz. Sobald ich jedoch beriets nur einen Wert von 30 eingebe bekomme ich als Ergebnis nur inf oder onf im Serial Monitor angezeigt.... ich nehme an da ist ein Fehlercode damit gemeint oder??

@Bitklopfer

Ich habe es ausprobiert, das Ergebnis war jedoch dasselbe :/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.03.2016, 10:22
Beitrag #7
RE: Rechnen mit dem Arduino
(29.03.2016 09:43)Rudi schrieb:  @hotsystems

Ja bei sehr kleinen Werten scheint es tatsächlich zu funktionieren aber leider habe ich Werte zwischen ca- -300 bis 300 als Regeldiffernenz. Sobald ich jedoch beriets nur einen Wert von 30 eingebe bekomme ich als Ergebnis nur inf oder onf im Serial Monitor angezeigt.... ich nehme an da ist ein Fehlercode damit gemeint oder??

Ja, das ist eindeutig ein Variablen-Überlauf.

Wenn ich den Wert 2.5 einsetze, dann sieht das Ergebnis so aus:

Code:
39.21
41.87
48.51
65.11
106.61
210.37
469.77
1118.27
2739.52
6792.64
16925.43
42257.41
105587.37
263912.25
659724.50
1649255.12
4123081.50
10307648.00
25769062.00
64422596.00
161056432.00
402641024.00
1006602560.00
2516506112.00
ovf
ovf
ovf
ovf

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.03.2016, 10:38
Beitrag #8
RE: Rechnen mit dem Arduino
@hotystems

Wie kann ich den so einen Variablen-Überlauf vermeiden bez. eliminieren? Dieser hie rwird ja durch die unendliche aufsummierung von uI_1 hervorgerufen... man könnte ja auch schreiben:

uI += Ki * Regeldifferenz_PID

aber dennoch bleibt der Überlauf bestehen... :/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Rechnen mit float und unsigned long Rudi 3 298 03.06.2016 12:41
Letzter Beitrag: hotsystems
Question Rechnen in C - Was ist denn nun richtig? Stephan_56 17 1.226 27.03.2016 11:31
Letzter Beitrag: ardu_arne
  Arduino kann nicht rechnen?! Maxi290997 11 1.235 16.12.2015 16:26
Letzter Beitrag: amithlon
Information Rechnen mit variablen Jim 3 1.811 22.05.2015 16:44
Letzter Beitrag: Jim
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 1.104 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 3.124 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf
  Mit 1wire Temperaturwerten weiter rechnen IngHam 5 3.069 28.08.2013 16:20
Letzter Beitrag: rkuehle

Gehe zu:


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