eine gesundes neues Jahr wünsche ich euch.
Ich habe da mal eine Frage bzgl. Heizersteuerung mit Hilfe eines Wemos D1 mini in Kombi mit einem BME280 (zur Temperaturüberwachung im Raum) und eines 28BYJ-48 + ULN2003 Servomotors zur Einstellung des man. Drehreglers am Gasheizer.
Geplant ist eine Sollwertvorgabe der TEmperatur die dann über eine Regelstrecke den Servomotor ansteuert. Bei der Regelstrecke bin ich mir noch nicht so im klaren welche Regelung ich einsetzen soll. Soll ich eine Zweipunktregelung nehmen oder vielleicht doch auf einen PID-Regler gehen? Was meint ihr?
Das System wird eher träge reagieren. Bis die TEmperatur anspricht denke ich ist schon mit 1-2min zu rechnen. Der Raum dürfte ca. 4m²x2m=8m³ haben. Max 10m³.
Wenn ich einen PID-Regler nehmen würde, dann weiß ich im Moment noch nicht wie ich den output, also die Regelabweichung vernünftig auf den Servomotor umgesetzt bekomme. Der Drehregler lässt sich ca. 120° von min. nach max. verdrehen. Der Motor hat ja 2048 Schritte für eine Umdrehung. im Prinzip wären das dann nur 1/3 an Umdrehungen was ich machen dürfte um von min nach max. zu gelangen. wie kann ich eine errechnete Regelabweichung auf den Motor "mappen"? Hier fehlt mir noch ein wenig das Verständnis und hoffe, dass mir jemand hier unter die Arme greifen kann. Oder vielleicht gibt es ja Codeschnipsel die ich mir mal zu Gemüte führen kann.
Vielleicht wäre auch noch wichtig zu erwähnen, dass der Drehregler an dem Heizer schon ein gewisser Temperaturregler ist. Er misst die Temperatur mittels eines Temperaturfühlers der widerrum auf den Drehregler intern reagiert. (Diese Temp-fühler mit der Drahtwendel die irgendwie über ein hydrostatisches Prinzip funktionieren?)
Vielen Dank!
Normal reicht für einen Raum eine Zwei-Punkt-Regelung. Das ist halt nur An/Aus. Das ist ein Konflikt mit deinem Einstell-Knopf. Von daher wäre ein PI-Regler angebracht. D-Anteil braucht man nicht.
Und ein Servomotor ist was anderes als ein Schrittmotor...
danke für Deine Antwort. Du hast natürlich recht, wenn Du sagst, dass ein SErvomotor etwas anderes ist als ein Schrittmotor!! Es sollte natürlich Schrittmotor heissen.
Ich habe mir mal den PID Regler von Brett Beauregard hergenommen. Den D-Anteil kann ich ja mit der Konstante Kd=0 eliminieren.PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
Das ganze rufe ich dann in meinem Code mit
Input = bme.readTemperature();
myPID.Compute();
auf. Ich lasse mir den Output dann per Serial.prntln (Output); ausgeben.
Was mich wundert ist, dass der Output nie kleiner Null wird?! Ist das richtig? Denn ich stelle mir gerade vor, wenn die Temperatur zu hoch wird, dann soll der Drehregler ja wieder in die entgegengesetzte Richtung gedreht werden. So würde ja bei einer "Null" der Motor stillstehen.
Bin im Moment noch etwas verwirrt.
da unterliegst Du einem Denkfehler. Der Schrittmotor soll doch auf eine Position gefahren werden.
Position 0° = Heizung aus
Position 120° Heizung max Leistung
negative Stellgrösse wird da nicht benötigt. Ich bin aber nicht Sicher ob ein Servomotor am besten geeignet ist, Irgendwann must du den ja mal refferieren damit der Controller weiß wo er steht. Ich denke ein Servo wäre besser geeignet.
Da ein 28BYJ-48 nicht sonderlich viel Kraft hat, könnte man Diesen einfach auf Block fahren lassen.
Aber bei der Kraft ist auch das Problem, daß Diese echt recht mager ist.
Wenn's damit klappt oder auch nur zum Spielen ist der BYJ aber kein Fehlkauf.
Hallo Heinz,
ahh ok das stimmt. So habe ich das noch gar nicht gesehen. Wenn Regelabweichung 0 ausgegeben wird heißt das ja der man Drehregler wird durch den Schrittmotor auf "0" bzw "Aus" gestellt. DAs bedeutet es wird keine weitere Energie zugeführt. JE nach Trägheit des ganzen Systems, das ich noch nicht kenne muss ich dann später die Regelparameter Kp und Ki einstellen. ICh dachte wenn die Solltemperatur erreicht ist dann ist "0" und entsprechend um diesen Nullpunkt regelt er dan herum........alles klar habe es verstanden.
Wegen dem referenzieren habe ich mir schon Gedanken gemacht und werde wahrscheinlich auf einen HAll-Sensor gehen. Das mache ich aber erst im letzten Schritt......
Was mich jedoch noch mehr beschäftigt ist die Sache mit der Umsetzung der Regelabweichung (Output) auf den Schrittmotor. Ich habe leider überhaupt keine Ahnung wie ich dem SChrittmotor sagen kann, bei welchem Output er z.B. 100 Schritte vorwärts fahren soll oder wann zurück. ODer nur 2 Schritte vor bzw. zurück. Ich habe mal im Sketch folgendes gemacht:
Hier habe ich mal erfolgreich versucht den Schrittmotor immer um ein SChritt anzusteuern. Anstatt der 1 in KLammer könnte ich bzw. muss ich ja dann die Regelabweichung irgendwie unter bekommen. Aber die Regelabweichung entspricht ja nicht den SChritten die ich machen muss. ICh habe nochmals nachgeschaut. Es sind 180° von min auf max. Das bedeutet 1024 SChritte habe ich maximal zur Verfügung. Um nicht auf Anschlag zu fahren könnte ich ja z.B. nur 950 Schritte oder so fahren, um nicht nach oben hin Schritte zu verlieren weil der Drehregler sich nicht weiter drehen lässt, der Counter aber dennoch weiterzählt. Und beim Zudrehen könnte es ja dann passieren, wenn ich zurück bei "0" SChritte angekommen bin, dass der Drehregler etwas offen stehen bleibt. Sagt mir mal wie würdet ihr den Output auf den Motor "übersetzen"?
Hallo postmaster-ino,
danke für den Hinweis, der etwas mageren Kraft bin ich mir bewusst. Wegen dem brauchst Du Dir aber keine Gedanken machen. Die reicht in meinem Fall Gott sei Dank aus um den Drehregler zu drehen. (ist sehr leichtgängig)
Da Du als Mensch den Drehknopf der Heizung bisher nicht abgerissen hast, wirst Du um den Hall-Sensor herum kommen - lasse den Stepper in setup() 1/4tel Umdrehung Richtung Null laufen - daß Er dann am Ende ankommt, also auf Block fährt, stört nicht sonderlich.
Danach ist Dir aber bekannt, wo der Stepper steht.
Nun musst Du 'nur noch' den Output des PID-Regler auf die Drehknopf-Stellung umrechnen - Das könnte mit map klappen - sofern der Output zwischen 0 und 100% bleibt, sonst muß der Rückgabewert noch entsprechend abgegrenzt werden (constrain).
Vll. schaust Du Dir auch die MoBaTools an - damit kann man unter Anderem auch einen BYJ ansteuern.
Du musst dann nur den MoBoTools die Ziel-Position übergeben und um den Rest kümmert sich die Lib (selbst delay stören hier nicht, wodurch man die Werte-Aufnahme des PID-Regler damit einbremsen könnte).
das mit der Viertel Umdrehung ist glaube ich eine gute Idee, dann spare ich mir tatsächlich den Sensor. WEnn er diese Bewegung, also das "quasi initialisieren" gemacht hat setze ich den Motor auf "0". Er fährt halt bis zum Anschlag un kommt nicht mehr weiter, obwohl er vielleicht noch weiter SChritte fahren muss. Die "verpuffen" halt dann einfach so. Danke für den Tipp!
DAs mit dem Umrechnen habe ich denke ich noch nicht ganz verstanden wie du das meinst. Du meinst wenn die Output-WErte des PID-Reglers größer als 100 sind dann müsste man auf 100 limitieren. Also was darüber ist abschneiden...... Meintest Du das so? Die Funktion map() schaue ich mir mal an.
Die MoBaTools kenn ich nicht. Das muss ich mir erst anschauen....
Vielen Dank!
Die MoBoTools kannst Du aus der IDE heraus installieren, Die werden aktiv gepflegt vom User microbahner hier aus dem Forum.
Wenn Der Output-Wert die SOLL-Stellung des Regler ist, müssen wir 'nur' schauen, dieses Soll auf den Verfahrweg des Motor zu begrenzen.
Viel mehr als Vollgas geht nicht, egal, was der PID-Regler gerade sagt.
Gleiches bei Null/Aus.
Ich habe noch nicht mit der PID-Lib geschafft, meine Versuche in Sache PID sind selbst zusammen geschustert und laufen so halbwegs - damit lasse ich den Heizungsvorlauf auf 55°C regeln - klappt zumindest gut genug, daß ich Das vorerst so laufen lasse (starkes Überschwingen, müsste wohl P kleiner machen, dafür I vergrößern - Das aber erst, wenn ich den Kram im Haus-Bus aufgenommen habe, da Dann die Feinarbeiten ohne Rennerei (Keller - 1.OG) möglich sind )
Rittermini:
Vielleicht wäre auch noch wichtig zu erwähnen, dass der Drehregler an dem Heizer schon ein gewisser Temperaturregler ist.
Warum dann das ganze Projekt? Verstehe das Ziel noch nicht.
BTW: Deine Regelstrecke ist dein Raum/Ofen. Der Regler heißt einfach Regler.
Serenifly:
D-Anteil braucht man nicht.
Begründe mal bitte.
Ich schätze das allgemein bei Reglern für eine Raumtemperatur deutlich anders ein, weil solche Strecken typischerweise träge sind und überschwingen.
postmaster-ino:
starkes Überschwingen, müsste wohl P kleiner machen, dafür I vergrößern
Eher beides kleiner und D größer. Oder du versuchst es mal mit einem "Anti-Windup", damit der I-Anteil beim Aufheizen erst gar nicht so groß wird, dass er sich lange abbauen muss.
Die Sache mit dem Drehregler wollte ich erwähnen, weil dies evtl. von Nachteil bei der Regelstrecke sein könnte. Der manuelle Regler ist nur so ein ungefähres Ding zum einstellen der Temperatur. 15°C am man. Drehregler sind bestimmt keine 15°C am BE280 Temp.sensor. und ich weiss nicht inwieweit dies wiederum die Regelstrecke negativ beeinträchtigt.
Wegen dem D-Anteil kann ich leider nichts sagen. Das müsste ich dann mal sehen wenn ich das System am laufen habe wie es dich verhält...morgen gehts wieder weiter.....
Gruss
Ich weiß nicht, ob es sinnvoll ist, bei diesen Voraussetzungen einen PID-Regler zu verwenden. EIn einfacher Zweipunktregler tut es hier vollkommen.
Allerdings würde ich hier eine gewisse Hysterese einbauen, z.B. Einschalten 1K unter dem Sollwert und ausschalten 1K darüber.
Wenn unbedingt der Drehregler an der Heizung verwendet werden soll, dann würde ich einfach zwei Stellungen nutzen, ganz oben/rechts zum Einschalten und ganz unten/links zum Ausschalten.
Ich verstehe, dann kann ein eigener Regler schon Abhilfe schaffen.
Rittermini:
und ich weiss nicht inwieweit dies wiederum die Regelstrecke negativ beeinträchtigt.
Das ist grundsätzlich doch klar. Je nach dem wie warm es schon ist, ist halb aufgedreht manchmal Vollgas und manchmal aus. Einschätzung von mir: du brauchst dadurch hohe Werte für Kp und insbesondere Ki. D Anteil benötigst du eventuell in diesem speziellen Fall tatsächlich nicht.
Das was der Regler als Wert ausgibt musst du auf gültige Werte begrenzen und so viel Grad/Schritte lässt du den Motor dann vom Nullpunkt (ganz zu) aus anfahren. Ein Servo wäre hier noch besser aber das wurde ja schon gesagt.