Hallo zusammen, Einführung: { Programmiersprache: C Software: Keil µVision3 bzw. Softune Workbench von Fujitsu µC: Atmel T89C51AC2 bzw. Fujitsu MB90F352 Ich möchte ein Becherglas mit Wasser um 5°K pro Minute erwärmen. Gemessen wird mit einem PT100 an einem 10bit AD-Wanlder Geregelt wird Softwäremäßig mit einer PID Formel. Die Heizung Soll mit einer PWM angesteuert werden. } Das heißt ich habe einen SOLL-Wert (nicht sonderlich schwer zu berechnen) und einen IST-Wert (AD-Wandlungswert in 10bit). Meine aufgestellten Formeln für PID sind mit Dezimalzahlen ausgerechnet und Probiert, da ich diese Formeln ja jetzt in C geschrieben habe und auf den µC benutze, habe ich als IST-Wert ja nur den 10 bit(2Byte) wert des AD-Wandlers. 1.Überlegung: Umwandeln der 2Byte Hexwerte in Dezimal? Habe im Forum gesucht und auch ein paar lösungen für ASM gefunden. Da ich aber in C Programmiere diese Lösung erst mal zurückgestellt. 2.Überlegung: Ich weiße die 10 bit des AD-Wandlers als Word dem IST-Wert zu und benutze diesen zum Rechnen.(was soviel heißt das mein IST-Wert ein Hex-Wert ist) Meine Frage: Funktioniert meine PID Rechnung jetzt trozdem noch da meine anderen werte in der PID Rechnung ja Dezimal vorliegen oder kommt da nur mißt rauß. Vielen Dank für eure Anworten Christian
Du hast einen Grundlegenden Denkfehler. Hex, Dezimal, Binaer sind alles nur verschiedene Schreibweisen von immer demselben Ding: einer Zahl. Im Rechner ist alles einfach nur eine Zahl. Erst wenn du sie irgendwohin ausgibst, kommt die Frage ins Spiel: in welcher Form gebe ich sie aus: als Binaerwert, Hexwert, oder Dezimalzahl. d.h. wenn du in den ADC ausliest, dann kriegst du einfach nur eine Zahl. Die verwurschtest du anhand deiner Formel mit einer anderen Zahl und kriegst als Ergebnis wieder eine Zahl.
Ob Dezimal, Hexadezimal, Oktal oder Binär - das sind alles nur unterschiedliche Repräsentationen ein und desselben Wertes. Ob Du nun in einem C-Programm schreibst a = 255; oder a = 0xFF; oder a = 0377; oder a = (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0); ist inhaltlich exakt dasselbe.
Was soviel heißt. Ohne Denkfehler ggg Es ist wurscht ob in meiner Formel Hex, Dez oder Bin steht nur von einer Sorte oder Gemischt da es sowieso NUR Zahlen sind und dem µC egal ist was ich eingebe? Korrekt? Was bekomme ich dann eigentlich als Ergebnis aus der Rechnung? Weil deas übergebe ich ja dan an die PWM.
> Es ist wurscht ob in meiner Formel Hex, Dez oder Bin steht nur von > einer Sorte oder Gemischt da es sowieso NUR Zahlen sind und dem µC > egal ist was ich eingebe? > Korrekt? Exakt. Hex, Dezimal, Binär interessiert dich nur an den Schnittstellen nach aussen. Wenn Du willst kannst Du Zahlen ja auch durch * unterschiedliche Tonhöhen * Anzahl Händeklatschen * Blinkimpulse * Wasserstand in einer Röhre * ausgestreckte Finger an einer Hand * was auch immer (denk dir was aus) symbolisieren. Alles was du brauchst ist eine Ausgabefunktion die die Zahl (die Rechnerintern als Bitmuster vorliegt) in die gewünschte Form bringt, bzw. im umgekehrten Fall von der gewünschten Form in die Zahl (also in das rechnerintern benutzte Bitmuster) 'übersetzt'. > Was bekomme ich dann eigentlich als Ergebnis aus der Rechnung? Weil > deas übergebe ich ja dan an die PWM. Das weiss ich doch nicht. Aber ich würde mal sagen: Einen Wert für die zu regelnde Größe. zb. soll die PWM eine bestimmte Spannung erzeugen, mit der dann das Heizelement beheizt wird oder auch nicht. Was hängt dann an der PWM dran? Eine PWM für sich alleine ist ja ziemlich sinnleer.
Ich benutze z.B. beim Fujitsu µC ein PPG Register, an diesem Ausgang möchte dan ein Solid-State-Relais (SSR) betreiben um daran die Heizung anzuschließen. Somit kann ich ja über die PulsPause die Leistung der Heizung beeinflussen. (verbessert mich wenn ich mir Irre). Beim Atmel hab ich mir noch keine gedanken gemacht wie ich eine PWM an einem Ausgang Realisiere.
> Somit kann ich ja über die PulsPause die Leistung der Heizung > beeinflussen. (verbessert mich wenn ich mir Irre). Nein, das ist schon richtig so.
> Somit kann ich ja über die PulsPause die Leistung der Heizung > beeinflussen. (verbessert mich wenn ich mir Irre). Sollte das nicht nicht am besten netzsynchron passieren? (Ich habe keine Ahnung von Wechselstrom-Leistungselektronik, deswegen frage ich das.)
Ei Wunderbar. Zum entgültigen abschluss. Meine Rechnung der PID Regelung hat bei Tests Werte zwischen 0,0000 und maximal ca. 1,0000 Um einen Anständigen wert für ein 8bit PPG zu bekommen habe ich den wert mit 256 Multipliziert. Nach dem verstehen der oberen Postings gehe ich mal davon aus das sich da nix geändert hat. (natürlich Kappe ich wert über 1 und unter 0 mit einer entscheidung ab). Ansonsten habe ich die Berechnung der PID Regelung absolut nicht verstanden. (die war hier aus dem Forum).
@Rahul Das Puls Pause sollte schon mit angemessen Hoher Frequenz laufen. Wenn meine Gesamtperiode zu lang ist kann ich ja auch mit der Hand ein und ausschalten.
das wird nichts: denn 1*256=256 bei 8bit(unsigned) =0 oberstes Bit wird abgeschnitten wertebereich 0..255 wenn du die PID Regelung aus dem Forum hast wird es wahrscheinlich auch nichts da du die Regelparameter deiner Regelstrecke anpassen musst! sonst schwingt sie oder hat Abweichungen oder funktioniert...
> Ansonsten habe ich die Berechnung der PID Regelung absolut nicht > verstanden. (die war hier aus dem Forum). Ich kenn zwar die Berechnung aus dem Forum nicht, aber das klingt so als ob Du Dir mal ein bischen Theorie reinziehen solltest. So nach dem Motto: Wie funktioniert eigentlich ein PID Regler und was macht der eigentlich? http://de.wikipedia.org/wiki/Regler
@Wolfram Logischerweiße habe ich schonn eigene P,I und D Werte benutz. Aus dem Forum habe ich nur die Berechnung, in die ich die P,I und D Werte einsetze. >1*256=256 bei 8bit(unsigned) =0 oberstes Bit wird abgeschnitten >wertebereich 0..255 OK war rechen fehler von mir Multiplizieren wir mit 255 da sollte es ja gehen. Zum besseren verständis da Hier ja eine Diskussion um die PID Regelung entstanden ist (was ich sehr Begrüße) hier meine Formel. P=150 in meinem Fall spielt aber für die Diskussion ja keine I=6 Rolle D=15 void Regelung (void) { KP = (P*(Soll-Ist))/100; KD = (D*((Soll-Ist)-Diffalt))/10; KIn = KIa+((I*(Soll-Ist))/50); RegelAusg = KP + KD + (KIn/10); RegelPWM = RegelAusg * 255; //da 8bit PPG ergibt 255 Steps if (RegelPWM >= 255) { PWM = 255; } else if (RegelPWM <= 0) { PWM = 0; } else { PWM = RegelPWM; } KIa = KIn; Diffalt = (Soll-Ist); }
@kbuchegg Deinen Link von Wiki bringt mich in meiner Frage net so weiter den kenne ich schonn. Ich habe mich schon Informiert befor ich hier Poste Ich lese seit gut 3 Monaten hier im Forum bevor ich Heute das erste mal was selbst geschrieben habe. Aber trozedem Danke für den Link. Was so ein PID Regler oder die einzel Regler machen ist Theoretisch denke ich schon verstanden aber das ganze in die Praxis umzusetzen und auch noch in eine Hochsprache zu Quetschen ist mir schon recht schwergefallen. Ich hab auch schon Lehrgänge über Regelung besucht (ist schonn ne weile her aber immerhin) war aber alles nur Theorie.
OK. Also was an der Berechnung verstehst du jetzt nicht? Schaut eigentlich straightforward aus: PID P tatsächliche Abweichung I Integration der Abweichungen (also: Summe) D Ableitung der Abweichung (also: Steigung der Tangente, Stichwort: Differenzenquotient) Das alles findet sich doch sehr schön im Code.
Mit der Berechnung hab ich ja jetzt auch kein Problem mehr. War ja nur eine Vermutung das ich was falsch mache, bin ja nicht unfehlbar. So wie es bis jetzt aus den Antworten von euch hervorgeht siehts ja gar nicht so Schlecht aus. Da ich ja Probegerechnet habe, hat mich eigentlich nur interessiert ob ich jetzt immer noch wert zischen 0,0000 und 1,0000 herausbekomme. Da wie oben beschrieben ja egal ist ob ich mit Hex oder Dez rechne sollte als ergebniss ja immer noch 0,0000 - 1,0000 herauskommen (als Dez Zahl betrachtet).
Mal eine Frage: Von welchem Typ sind eigentlich Deine Variablen? (KP, KD, KIn, KIa usw.)
@Dirk Dörr unsigned int seconds,valueH,valueL,status,empfang,P,I,D,PWM; unsigned long KP,KD,KIn,KIa; float Soll,Ist,Diffalt,RegelPWM,RegelAusg;
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.