Hallo Zusammen, ich möchte mein System (Wasserkreislauf) um eine Regelung erweitern. Das System sieht wie folgt aus: Eine Zahnradpumpe, die über 2 Schrittmotoren betrieben wird, fördert über PVC Rohre im Kreislauf Wasser zu einem Tank. Nun habe ich an einer Stelle des Rohrs einen Kugelhahn eingebaut, um eine beliebige Last (abhänig von der Hahnstellung) auf die Schrittmotoren auszuüben. Das Ziel ist jetzt folgendes wird am Hahn gedreht sinkt der Druck im nachfolgenden Rohrabschnitt, aber dadür steigt die Strömungsgeschwindigkeit. Genau hier soll der Regler einsetzen und die Drehzahl der Schrittmottren erhöhen, damit der Druck konstant bleibt. Zur Software: Die Ansteuerung der Schrittmotoren steht soweit und wird über einen TIMER_INTERRPUT realisiert. Der Schtittmotor legt halnschritte zurück also 400 Schritte pro um Drehung (0,9° Auflösung). Für den Timer wird kein Vorteiler benutzt und er löst alle 5000 Takte(untere Drehbereich) bis 833 Takte(oberer Drehbereich) aus. Die Drehzahl lässt sich über einen Seriellen Monitor oder einen Poti einstellen. Der Druck Sensor läuft über I2C und sendet byteweise. Zur Hardware: Als Controller wird ein Arduino Mega verwendet. Schrittmotoren (NEMA 17) Sensor (AMS5812) JETZT zu eigenlichen Frage: Wie geht man da am besten ran ???. Der Druckwert hat ja als solches nichts mit dem Takt zu tun mit dem der TIMER auslöst. Natürlich steigt die Drehzahl prpotional zum fallenden Druck ,also die richtung ist klar. Aber Muss ich erst eine Lookup-Tabelle erstellen um die Verbindung herzustellen oder reicht es wenn ich mir eine Regel-Bibliothek runterziehe. Regler arbeiten immer mit SOLL und IST Größen, wenn ich den Takt (der dann ins OCRXA Register geschreiben wird) als SOLL Größe definere sollte es doch passen? Hab noch wenig Erfahrung mit Regelen, ich hoffe ihr könnt mir mit eurer Vorgehensweise helfen.
Ahmet D. schrieb: > Die Ansteuerung der Schrittmotoren steht soweit und wird über einen > TIMER_INTERRPUT realisiert. Das ist schon mal praktisch. Ein Regler sollte nämlich regelmässig aufgerufen werden und dazu ist dein Timer gut brauchbar. Grundsätzlich könntest du ein Zweipunktregler benutzen. Der macht sowas wie * wenn Ist Druck > Soll Druck = Reduziere Schritte/s * wenn Ist Druck < Soll Druck = Vergrössere Schritte/s Je nachdem, wie häufig du das aufrufst, kanns überschwingen oder zu langsam sein. Es kann auch sinnvoll sein, eine kleine Totzone einzurichten. Viele von uns würden einen PI(D) Regler implementieren, weil man damit bei festem Aufruftakt das Antwortverhalten des Reglers in drei Aspekten einstellen kann. Dazu kannst du mal Application Note AVR221 von Microchip/Atmel studieren, in denen PID Regler und deren Implementierung (in C) beschrieben werden. Grundsätzlich ist es immer sinnvoll, wenn die Eingangswerte zum Regler einigermassen gleich skaliert sind. Ein Sollwert z.B. zwischen 0 und 1023 mit einem Istwert von 0-40 zu vergleichen ist unpraktisch.
:
Bearbeitet durch User
Matthias S. schrieb: > Ahmet D. schrieb: >> Die Ansteuerung der Schrittmotoren steht soweit und wird über einen >> TIMER_INTERRPUT realisiert. > > Das ist schon mal praktisch. Ein Regler sollte nämlich regelmässig > aufgerufen werden und dazu ist dein Timer gut brauchbar. Bei einem Timer allerdings, der die Schrittfrequenz für einen Schrittmotor generiert, könnte ganz eventuell die Frequenz eben genau der Schrittfrequenz entsprechen und die ist alles andere als konstant, eildiweil Drehzahlabhängig. Ein Regler wird sich schön beschweren, wenn die Abtastfrequenz proportional zum Ausgangswert ist.
Hallo Wolfgang, Danke für die Antwort leider Habe ich nicht ganz verstanden was du damit meinst ? Wolfgang schrieb: > Bei einem Timer allerdings, der die Schrittfrequenz für einen > Schrittmotor generiert, könnte ganz eventuell die Frequenz eben genau > der Schrittfrequenz entsprechen und die ist alles andere als konstant, > eildiweil Drehzahlabhängig. Der Timer hat für jede Drehzahl eine andere Frequenz bzw. es errechnet sich für jede Drehzahl eine Zeitfenster nach dem der Timer immer auslöst und den Schrittmotor einen Schritt laufen lässt. Mir ist nich ganz klar was mit : Wolfgang schrieb: > könnte ganz eventuell die Frequenz eben genau der Schrittfrequenz entsprechen und das ist mir auch nicht klar: Wolfgang schrieb: > Ein Regler wird sich schön beschweren, wenn > die Abtastfrequenz proportional zum Ausgangswert ist. Die Abtastfrequenz also die Frequenz mit der ich meine IST Wert (Druck) abfrage, kann ich doch beliebig einstellen je höher desto besser naturlich. Und mit Ausgangsgröße ist denk ich mal die Rückführgröße die in meinen Fall der Druck wäre. vlt. entgeht mir was grundlegendes.
Ahmet D. schrieb: > Die Abtastfrequenz also die Frequenz mit der ich meine IST Wert (Druck) > abfrage, kann ich doch beliebig einstellen je höher desto besser > naturlich. Nein, das ist nicht immer so. Das System hat eine gewisse Trägheit und wenn man da zu schnell regeln will, schaukelt das Dings oder es passiert z.B. gar nichts. In welchen Zeitabständen man den Regler aufruft, sollte man also probieren. Dafür ist, wen du einen Timer immer wieder umprogrammierst für die Motoren, ein anderer Timer die beste Lösung.
Hallo Mattihas, Matthias S. schrieb: > Grundsätzlich könntest du ein Zweipunktregler benutzen. Die Möglichkeit mit dem Zweipunktregler hört sich sehr gut an. Aber entspricht seine Funktionsweise nicht dem ON/OFF Prinzip. Für eine Heizungsstuerung wäre das dann entweder garnicht Heizen der mit der maximalen Leistung. Ich hab auch gelesen das eine 70% zu 30% leistung möglich. Aber im Sinne der Schrittmotoren ist es bestimmt nicht, wenn ich sie von max zu Null Umderehungen und umgekehrt belastet. Matthias S. schrieb: > Viele von uns würden einen PI(D) Regler implementieren, weil man damit > bei festem Aufruftakt das Antwortverhalten des Reglers in drei Aspekten > einstellen kann. Die Implementierung eines PID Reglers klingt viel versprechend, auch weil keine weiter Elektroik Dank digitaler Regelung mehr angeschafft werden muss. Außerdem habe ich auf der Arduino Seite paar PID Regler Bibliotheken gefunden. Gibt es bei der Anwenung von solchen Libraries igerndwelche tücken vor den man sich in Acht nehmen sollte. Matthias S. schrieb: > rundsätzlich ist es immer sinnvoll, wenn die Eingangswerte zum Regler > einigermassen gleich skaliert sind. Ein Sollwert z.B. zwischen 0 und > 1023 mit einem Istwert von 0-40 zu vergleichen ist unpraktisch. Ich denke das sich das bei mir nicht vermeiden lässt das sich der Druck bei mir wie du sehr gut geschätzt (war erstaunt XD) hast zwischen 10-40 mbar bewegt. Und die Stellgröße also der Wert der ins OCRXA Register geschschreiben wird und der für die Drehzahl verantwortlich ist bewegt sich zwischen 833 - 5000.
Ahmet D. schrieb: > Das System sieht wie folgt aus: > > Eine Zahnradpumpe, die über 2 Schrittmotoren betrieben wird, fördert > über PVC Rohre im Kreislauf Wasser zu einem Tank. Nun habe ich an einer > Stelle des Rohrs einen Kugelhahn eingebaut, um eine beliebige Last > (abhänig von der Hahnstellung) auf die Schrittmotoren auszuüben. Was soll es mal werden? Vielleicht könnte man das Problem einfacher lösen. Oder steht die Technik unverrückbar schon fest?
Ahmet D. schrieb: > Ich denke das sich das bei mir nicht vermeiden lässt Du musst ja nicht mit absoluten Druckwerten arbeiten, sondern z.B. mit den Werten, die der Sensor zurückgibt. Wenn ich das im Datenblatt richtig verstehe, sind das so Werte zwischen etwa 3000 und 30000. Das ist etwas besser zu handhaben als 0-40.
Hallo Zusammen; wolle g. schrieb: > Was soll es mal werden? > Vielleicht könnte man das Problem einfacher lösen. > Oder steht die Technik unverrückbar schon fest? Die Technik steht weites gehend fest, wie oben beschrieben. Im Grunde geht es darum die Strömungsgeschwindigkeit im einem Rohr zu regeln mit möglichst mit der genannten Hardware. Das ist es auch weredn soll. Dafür eignet sich als Regelgrößen der Druck und der Volumenstrom. Weil ich gerne will das mir beide Einheiten zur verfügung stehen, benutze ich ein selbst gebautes Pitot-Rohr, mit dem ich den statischen und dynamischen Druck abzapfe, mittel Bernoulli komm ich dann auch auf den Volumenstrom. Matthias S. schrieb: > Du musst ja nicht mit absoluten Druckwerten arbeiten, sondern z.B. mit > den Werten, die der Sensor zurückgibt. Wenn ich das im Datenblatt > richtig verstehe, sind das so Werte zwischen etwa 3000 und 30000. > Das ist etwas besser zu handhaben als 0-40. Matthias das was du im Datenblatt gelesen hast ist vermutlich die spezifiziertem Minimaldruck und Maximaldruck die 3277 und 29491. Das sind leider nur feste konstanten (Digoutp(max)- Digoutp(min)) in der Berechungformel zu eingentlich Einheit(mBar). Der Sensor liest Bytesweise ein aber da er 2 Bytes zur Druckermittlungs einlesen muss und diese auch zu einen Wert zusammen gefasst werden (Byte1 * 256 + Byte2 = Digout(p)) ,somit hatten wir 16 Bits und damit denn Zahlenbereich der besser geeingnet wäre. Und nach der Berechnungsformel Druck=((Digout(p)-konstante)/Konstante)+ Konstante jetzt passt es auch nach Digout(p) zu regel den je höher der Digout(p) desto größer der an liegende Druck.
Ahmet D. schrieb: > Aber im Sinne der Schrittmotoren ist es bestimmt nicht, wenn > ich sie von max zu Null Umderehungen und umgekehrt belastet Keine Sorge, genau dieses ist die Spezialitaet von Schrittmotoren
Ahmet D. schrieb: > Das sind leider nur feste konstanten (Digoutp(max)- Digoutp(min)) in der > Berechungformel zu eingentlich Einheit(mBar). Der Sensor liest > Bytesweise ein aber da er 2 Bytes zur Druckermittlungs einlesen muss und > diese auch zu einen Wert zusammen gefasst werden (Byte1 * 256 + Byte2 = > Digout(p)) ,somit hatten wir 16 Bits und damit denn Zahlenbereich der > besser geeingnet wäre. Aber die echten mBar interessieren doch nur den Benutzer, für den man einmal eine Umrechenroutine zurechtzimmert, die die internen Werte hin- und zurückrechnet. Der Regler braucht keine echten mBar. Und der Zweipunktregler bei dir macht ja nicht Start und Stop des Motors, sondern er wirkt auf die Drehgeschwindigkeit. Siehe Matthias S. schrieb: > * wenn Ist Druck > Soll Druck = Reduziere Schritte/s > * wenn Ist Druck < Soll Druck = Vergrössere Schritte/s Da steht nur was von Schrittgeschwindigkeit vergrössern oder verringern. Im Idealfall pendelt der Regler dann um den Sollwert herum. Fügt man eine Totzone ein, wird das Pendeln evtl. Null. Sinnvoll ist es, die max. und min. Werte für die Geschwindigkeit zu klemmen.
:
Bearbeitet durch User
Hallo, Matthias S. schrieb: > Sinnvoll ist es, die max. und min. Werte für die Geschwindigkeit zu > klemmen. Die Max und Min Werte für die Geschindigkeit kenn ich. Brauch ich für den Zweipunktregler Hardware. Das hier; Matthias S. schrieb: >> * wenn Ist Druck > Soll Druck = Reduziere Schritte/s >> * wenn Ist Druck < Soll Druck = Vergrössere Schritte/s Wirkt auf den ersten blick so, als ob sich das gut Softwaretechnisch lösen lässt.
Ahmet D. schrieb: > Wirkt auf den ersten blick so, als ob sich das gut Softwaretechnisch > lösen lässt. Ja, logisch. Wenn du Reglerhardware benutzen willst, solltest du das ansagen :-) Du gibst den Sollwert über deine 'mBar zu Sensorwert' Umrechnungsroutine in den Zweipunktregler und als Istwert das Wort vom Sensor. Das Ergebnis des Vergleichs erhöht oder verringert die Motorgeschwindigkeit.
Matthias S. schrieb: > Ja, logisch. Wenn du Reglerhardware benutzen willst, solltest du das > ansagen :-) Eigentlich das gegenteil, ich würde es ganz gerne rein software technisch lösen. Matthias S. schrieb: > Du gibst den Sollwert über deine 'mBar zu Sensorwert' Umrechnungsroutine > in den Zweipunktregler und als Istwert das Wort vom Sensor. Das Ergebnis > des Vergleichs erhöht oder verringert die Motorgeschwindigkeit. Ist die Realiseriung vom Zweipunktregler ohne Hardware nicht möglich ?
Das regelt man nicht mit Schrittmotoren und Pumpen sondern Quetschventilen.
Ahmet D. schrieb: > Ist die Realiseriung vom Zweipunktregler ohne Hardware nicht möglich ? Doch, das sage ich doch die ganze Zeit. Alles in Software, keine Hardware zusätzlich erforderlich. Du hast ja schon alles da.
:
Bearbeitet durch User
Ahmet D. schrieb: > Die Technik steht weites gehend fest, wie oben beschrieben. > Im Grunde geht es darum die Strömungsgeschwindigkeit im einem Rohr zu > regeln mit möglichst mit der genannten Hardware. Das ist es auch weredn > soll. Eigentlich hätte ich es etwas konkreter gewusst. Trotzdem ein Lösungsvorschlag: Die Strömungsgeschwindigkeit in einem Rohr kann man konstant halten, wenn man den Differenzdruck über einem Strömungswiderstand (Lochblende, Ventil) konstant hält. Einfache Differenzdruckregler, sogar ohne Hilfsenergie, gibt es z.B. im Heizungsbau. Eine Kreiselpumpe mit flacher Kennlinie erleichtert die ganze Sache nochmals. Der Kugelhahn muss vor dem Differenzdruckregler angebracht werden. Fertig
Hallo wolle, wolle g. schrieb: > Trotzdem ein Lösungsvorschlag: > Die Strömungsgeschwindigkeit in einem Rohr kann man konstant halten, > wenn man den Differenzdruck über einem Strömungswiderstand (Lochblende, > Ventil) konstant hält. > Einfache Differenzdruckregler, sogar ohne Hilfsenergie, gibt es z.B. im > Heizungsbau. > Eine Kreiselpumpe mit flacher Kennlinie erleichtert die ganze Sache > nochmals. > Der Kugelhahn muss vor dem Differenzdruckregler angebracht werden. > Fertig Wie geasgt ich will es mit dem mir vorhandenen mittel lösen, wie oben genannt
Hallo Leute, while there is code there will alwasy bug Also ich hab nach paar PID Libraries bin da auf <PID_v1_h> von Brett Beauregard aber die eignet sich mer zum steuern von DC Motoren soweit ich das einschätzen drufte. Der Output benötigt einen PIN in mein TImer hat keinen PIN. deswegen hab ich selbst was versucht. Nun zu dem was ich machen will. Ich will die Drezhal der Schrittmotoren über den Druck reglen. Dazu hab ich ein Array in dem ich bestimmte Schwelllenwerte deklariert habe. Die Drezahl soll sich so lange erhöhen oder verringen bis der Schwellenwert erreicht wurde. Ist der Schwellenwert erreicht worden wird das nächst Schwellenwert vom Array hergezogen und das ganze geht von vorne los. Wenn der letzte Wert vom Array heranggezogen wird, soll der Feldzähler des Arrays wieder auf das erste Feld zeigen, damit das ganze von vorn los geht. Den Druckwert der von Sensor gelesen wird stelle ich über den Barometer ein den ich mittel Silikonschläuchen und einer Großen Sprizte einstelle. Barometer und Sensor sind mit der Sprizte parallel verzeigt verbunden, deswengen stellt sich bei beiden der gleiche Druck ein Die Drehzahl beeinfluss über den Timer, oder genauer über die Funktion Setspeed(). Der Timer zieht sich nur den Wert aus der Funktion Setspeed() ins Regsiter und löst danach aus und macht dan eine Step für beide Motoren. Der Wert den sich der Timer zieht liegt zwischen 3200 bis 22.400. Der Code steht nocht nicht so wie oben beschreiben und befindet sich noch in der entwicklungspahse aber es gibt schon erste probleme Meine erste Frage: Also ich lasse in der Main die unten genannte Funktion laufen. Mein Problem wenn ich am Barometer den gewünschten Druck einstelle, ziehn die motoren die Drehzahl an bis sie hangen bleiben egal on sie Unterhalb, Oberhalb oder genau im Druckberech liegen. Wenn ich aber die ber die Auskommentierten Prints einkommentire sehe ich am Seriellem monitor das, er Arduino genau das macht was er machen soll. leigt darüber runterzählen... liegt darunter hoch zählen ..... .... void ReglerStellen() { if(InputDruck <= (SetponitArray[Setpointzeahler]-15)) // SetponitArray[Setpointzeahler] entspricht 100. { Steller= Steller + 50; // Steller wird der Funktion Setspeed() über geben. //Serial.println("Hochzählen"); } if(InputDruck >= (SetponitArray[Setpointzeahler]+15)) // SetponitArray[Setpointzeahler] entspricht 100. { Steller = Steller - 50; // Steller wird mit 3200 deklaiert,Steller hat sollte nicht weit über unter 3200 und 22400 liegen. //Serial.println("Runterzählen"); } if( (InputDruck >= (SetponitArray[Setpointzeahler]-15) ) && (InputDruck <= (SetponitArray[Setpointzeahler]+15) ) ) { //Serial.println("Eingependelt"); } } ich verstehe nicht warum das so ist ??? echt ratlos??
Beitrag #5508705 wurde vom Autor gelöscht.
Hast du denn nun einen Ticker, der den Regler regelmässig aufruft? Das ist eine Bedingung für Funktion. Als nächstes solltest du deine Tabelle mal weglassen und den Setpoint einfach per Konsole oder fester Vorgabe zum Probieren benutzen, sonst blickst du nicht mehr durch, auf welchen Wert der Regler nun laufen will. Gebe dir Soll- und Istwerte auf der Konsole aus und auch den Reglerausgang - sprich, die Schrittgeschwindigkeit. Dann sollte klar sein, das bei dir ein höherer Timerwert ja einen langsameren Motor bedeutet und ein kleinerer Wert lässt den Motor schneller laufen. Ob die Funktion Steller() so funktioniert, weiss ich nicht. Damit genug Zeit für die Konsole bleibt, ruf den Regler erstmal selten auf, z.B. alle Sekunde oder so.
Matthias S. schrieb: > Als nächstes solltest du deine Tabelle mal weglassen und den Setpoint > einfach per Konsole oder fester Vorgabe zum Probieren benutzen, sonst > blickst du nicht mehr durch, auf welchen Wert der Regler nun laufen > will. Gebe dir Soll- und Istwerte auf der Konsole aus und auch den > Reglerausgang - sprich, die Schrittgeschwindigkeit. > > Dann sollte klar sein, das bei dir ein höherer Timerwert ja einen > langsameren Motor bedeutet und ein kleinerer Wert lässt den Motor > schneller laufen. Ob die Funktion Steller() so funktioniert, weiss ich > nicht Hast du Super erkannt hab ich auch alles so gemacht. Wie oben bechrieben habe ich einmal mir nur alles ausggeben lassen ohne dem SM zu übergeben und einmal mit. Resultat war das, wenn ich mir die Werte ausgeben lassen hab alles geklappt hat mit dem beschleuinigen und abbremssen. das Gleiche mit übergabe an dem SM hat dazu geführt das er nur noch beschleunigt hat bis der SM hängen blieb. Matthias S. schrieb: > Hast du denn nun einen Ticker, der den Regler regelmässig aufruft? Das > ist eine Bedingung für Funktion. > Damit genug Zeit für die Konsole bleibt, ruf den Regler erstmal selten > auf, z.B. alle Sekunde oder so. Das hab ich nicht bedacht, muss es mal ausprobieren, meld mich dan gleich wieder.
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.