Forum: Mikrocontroller und Digitale Elektronik Durchflussregelung mittels Schrittmotor


von Ahmet D. (closed_loop_stepper)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Wolfgang (Gast)


Lesenswert?

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.

von Ahmet D. (closed_loop_stepper)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Ahmet D. (closed_loop_stepper)


Lesenswert?

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.

von Wolle G. (wolleg)


Lesenswert?

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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Ahmet D. (closed_loop_stepper)


Lesenswert?

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.

von 2 Cent (Gast)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Ahmet D. (closed_loop_stepper)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Ahmet D. (closed_loop_stepper)


Lesenswert?

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 ?

von Analog OPA (Gast)


Lesenswert?

Das regelt man nicht mit Schrittmotoren und Pumpen sondern 
Quetschventilen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Wolle G. (wolleg)


Lesenswert?

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

von Ahmet D. (closed_loop_stepper)


Lesenswert?

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

von Ahmet D. (closed_loop_stepper)


Lesenswert?

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.
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Ahmet D. (closed_loop_stepper)


Lesenswert?

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
Noch kein Account? Hier anmelden.