PWM- verändern

Hallo Leute,

ich habe eine Pumpe und möchte diese mit PWM in ihrer Förderleistung steuern. Startwert ist 100% und Endwert sollen z.B. 50% Förderleistung sein. Dazwischen soll die Spannung in gleichmässigen Schritten abnehmen und anschliessend wieder gleichmässig zunehmen, bis sie nochmal 100% erreicht. (und das dann in einer Endlosschleife)5% Schritte wären schon absolut ausreichend, da ich Druckschwankungen durch die grossen Spannungspruenge vermeiden möchte. Hat da vielleicht jemand ne Idee :slight_smile:
Vielen Dank fuer eure Hifle

Kannst Du mal ein Bild reinhängen wie die Kurve letztendlich aussehen soll, was für eine Periodendauer der Endlosschleife willst Du haben, und bist Du sicher, dass Du die Spannung verändern willst, und nicht nur das Impuls-Pause-Verhältnis?

Hallo...ja mein ich ja;-)der Motor bildet ja automatisch den Mittelwert...aber das Tastverhältnis wuerde ich gerne in gleichmässigen Schritten ändern

Kannst Du ganz einfach mit analogWrite machen, der Arduino steurt dann das PWM selbst.

mhhh ja das mit analogWrite kenn ich ja...aber geht es nicht, dass das Programm automatisch die tastverhältnisse anpasst! Also dass man nicht jeden Wert von Hand eingeben muss. Ich brauch irgendwie etwas fuer ne lineare Abnahme :-)

Ach so hab jetzt erst das mit dem potentiometer gesehen ;-) Sehr schön :-) Danke

Aber wie ist das denn ohne Poti zu realisieren ? Geht so was ueber ne Zeitmessung ?

Hast Du schon mal programmiert??

nur Hobbymässig :wink:

Wenn Du mal die Form der Kurve aufzeichnen würdest, die Du haben willst, und sie hier hochladen könntest, dann könnte Dir sicher jemand helfen. ;)

Da kannst Du eine For -Schleife proggen.

http://arduino.cc/en/Reference/For

Die X Variable packst Du dann in das Analogwrite und ob Du hoch oder runter zählst ist egal...

http://dl.dropbox.com/u/2414056/Document1.pdf

so sollte die Kurve aussehen :-) Schonmal vielen Dank

Diese Steps: Wie willst Du die steuern? Per Taster? Sensor? Zeit? Wenn Zeit: Wieviel Zeit pro Step?

Wie wärs denn mit was in der Richtung:

int steps;
[...]
int value = (steps%100)*255/100;
if (value<128)
  value = 255-value;
analogWrite(PIN, value);

Der Vorteil wäre, dass Du nicht in einer for-Schleife festhängen würdest und Dein Arduino gleichzeitig auch noch andere Sachen machen könnte.

steps musst Du dann einfach in dem Intervall hochzählen wie Du es brauchst.

also meine Zeit messe ich zu Beginn....diese teile ich dann ich gleichlange intervalle auf, wobei nach jedem Intervall das Tastverhältnis zuerst verringert und dann in den gleichen Intervallen wieder erhöht werden soll..ich hoffe es ist einigermassen verständlich ;-) Vielen vielen Dank

Ach so...könntest du viell. diese Anweisung ein bisschen erklären :-)

int value = (steps%100)*255/100;

vor allem %100 in der Klammer

Das ist ein Modulo, das bedeutet soviel wie "teile mir die erste Ganzzahl durch die zweite Ganzzahl und gib mir nur den Rest zurück".

Siehe diese Seite, da hats noch ein paar interessante Sachen... :)

Aha ;-) Modulo also ;-) heisst das dann dass du den Wert steps durch 255 teilst und den Rest dann wie verrechnest oder bin ich auf dem Holzweg ;-)

ZUERST wird “modulo 100” gerechnet.
Jogurt hätte auch sagen können:
if (steps>100) steps=0;
Dadurch würde man aber die Information verlieren, der wie vielte Zyklus jetzt gerade vorliegt…

DANN wird auf 255 skaliert. Normalerweise würde man denken:
steps/100255
aber / ist eine Ganzkomma-Operation, und der Rest geht dadurch verloren… Macht man es umgekehrt
steps
255/100
dann ist das Resultat etwas genauer; man muss nur aufpassen, dass es bei der Multiplikation nicht zu einem Überlauf kommt…

Es soll aber während dieses Zyklus nicht nur rauf- sondern auch wieder runtergezählt werden, deshalb nutzt Jogurt die Werte 128 bis 255, um herunterzuzählen
if (value>=128) value = 255-value;
(Ich glaube, er hat sich da beim < vertan…)

Das ist sehr guter Code - bitte verstehen und nachmachen :slight_smile:

Jogurt hätte auch sagen können:
if (steps>100) steps=0;

Nicht ganz, das Äquivalent zu “steps%=100” wäre “while (steps>=100) steps = steps-100;”. Dabei bleibt der Übertrag erhalten.

if (value>=128) value = 255-value;
(Ich glaube, er hat sich da beim < vertan…)

Nein, Jimmy83 will laut Diagramm PWM mit einer geglätteten Spannung zwischen 2,5V und 5V haben, daher muss sich value zwischen 128 und 255 bewegen. Aus diesem Grund mache ich die Subtraktion von 255 nur, wenn der Wert von value kleiner ist als 128, das hebt ihn dann wieder über diese Grenze.

Das ist sehr guter Code - bitte verstehen und nachmachen

Danke. :slight_smile:

Ich habe oben gesagt, dass mein "if" NICHT das gleiche ist, sondern nur eine nahe liegendere Möglichkeit darstellt. Ich wollte nicht das modulo erklären (=Deine Schleife), sondern den Sinn.

Ich hatte die Kurve nicht richtig angeguckt; so wie ich das verschlimmbessert habe, ergibt sich dann ein Mittelwert von 1,25V :-)

Und entschuldige, dass ich das "h" vergessen habe ;D