PWM Frequenz

Hallo,

die kleinste PWM Frequenz eines Unos beträgt ja 30,5 Hz.

Gibt es eine Möglichkeit diese noch weiter runterzuteilen, ich benötige eine Frequenz max. 4 Hz für ein Magnetventil.

Danke!

Du meinst wirklich PWM ?

Ich verstehe das so, dass das Magnet-Ventil echt schalten soll: { x msec auf, y msec zu }

4 Hz scheinen mir schon bei 50% ein bisschen hektisch : (125 + 125 msec). Wie lange soll dein Ventil das aushalten?

Bei Werten in der Nähe von 0 bzw. 100% ist auf jeden Fall eine PPM Modulation sinnvoller, um eine Mindest-Pulsdauer nicht zu unterschreiten.

Hallo und danke für die Antwort.

lt. Bosch-Rexroth kann das Magnetventil, ein einfaches Ein/Aus-Ventil, mit maximal 4 Hz angesteuert werden. Ob PWM oder PPM hab ich jetzt nicht nachgefragt. Das sollte es dann auch dauerhaft aushalten. Das Ventil wird nicht im Dauerbetrieb betrieben. Damit soll ein Hubzylinder auf bestimmte Positionen angehoben werden, das evtl. auftretende "Ruckeln" des Zylinders macht nichts.

zu PPM: ist vermutlich die einfachere Lösung, da ich diese selbst programmieren kann.

zu PPM: ist vermutlich die einfachere Lösung, da ich diese selbst programmieren kann.

Kannst PWM oder PPM bei den Frequenzen leicht selbst programmieren.

Wenn das Ganze nicht eher eine Regelung der Zylinderposition sein sollte. (Kannst du die messen?)

Der Zylinder wirkt auf einen Hebel, den Winkel des Hebels messe ich mit einem berührungslosen Winkelgeber von Cherry .

michael_x: Kannst PWM oder PPM bei den Frequenzen leicht selbst programmieren.

Sehe ich auch so (ähnlich)!

Entweder eine reine SoftPWM basteln, oder einen Timer Interrupt belegen.

StefanB79: lt. Bosch-Rexroth kann das Magnetventil, ein einfaches Ein/Aus-Ventil, mit maximal 4 Hz angesteuert werden.

Dann steuert man das Ventil direkt an (ein/aus), und es kann bis zu 4 mal pro Sekunde schalten. Warum sollte man ein einfaches Ein/Aus-Ventil mit PWM ansteuern?

Viel wichtiger: wieviel Strom und Spannung braucht das Ventil?

StefanB79: Gibt es eine Möglichkeit diese noch weiter runterzuteilen, ich benötige eine Frequenz max. 4 Hz für ein Magnetventil.

Letztlich ist das eine Periodendauer von 250ms, das kannst du problemlos selbst programmieren.

Nimm das "BlinkwithoutDelay" als Basis.

edit: ich hätte da noch was aus der Bastelkiste:

/*************************************************************************************************
**  SlowPWM                                            **
**************************************************************************************************
** Setzt den Wert _PWM (0-255) in eine langsame Schalt-PWM um.                  **
** Frequenz = 1/Periodendauer ;                                **
**                                                 **
**                                                 **
**                                                    **
**  Input: Periodendauer [ms];     _PWM;                               **
**  Output:    Pin "ReglerOutPin"                              **
**  genutzte Globale Variablen:    keine                           **
**************************************************************************************************/
void SlowPWM( unsigned long Periodendauer, byte _PWM){
int PinStatus = LOW;  
static unsigned long lastON =0;
static unsigned long AnDauer = 0, _PWMlast = 0, PeriodendauerLast = 0;
static boolean pinstatus = true;


  if (_PWM != _PWMlast || Periodendauer != PeriodendauerLast){      // Übergabewerte haben sich geändert, Neuberechnung
    AnDauer= (Periodendauer * _PWM ) / 255;
    _PWMlast = _PWM;
  }
  
  if (PinStatus == LOW){
    if (millis() - Periodendauer > lastON){
      lastON = millis();
      PinStatus = HIGH;
    }
  } else {
    if (millis() - AnDauer > lastON){
      PinStatus = LOW;
    }
  }
  digitalWrite(ReglerOutPin,PinStatus); 
} // End Funktion SlowPWM

Das ist eine Funktion die genau das macht. Ich hatte sie damals verwendet, um mit einem Relais eine geregelte Heizung zum machen, und die Schaltzyklen lagen im Minutenbereich, aber das sollte mit 4 Hz auch gehen.

wenn du es mit höherer Auflösung brauchst, dann kannst du das ja auf micros() umschreiben.

Die Funktion muß in der loop() stehen, und es darf nirgends(!) delay() verwendet werden, oder andere Funktionen, die die Loop blockieren.

Hallo,

ich muß DrDiettrich recht geben. Irgendwie verzettelt ihr euch mit der PWM total. max. 4Hz lt. Datenblatt bedeutet, mindestens 125ms EIN Signal und mindestens 125 AUS Signal. Da braucht es nix mit PWM und so. Einfach gleiche Zeiten für EIN und AUS Schaltdauer. Wie wenn man eine LED mit stink normalen 4Hz blinken lassen möchte.

Wenn die Dauer des EIN- oder AUS Signal kürzer als 125ms ist, kann das Ventil nicht mehr sauber schalten. Da nützt auch eine Gesamtperiodendauer von 250ms nichts mehr.

Es gibt durchaus Regelventile, die mit einer langsamen PWM angesteuert werden müssen.

Das macht man, damit der Anker immer leicht schwingt. Damit vermeidet man die Losbrechkraft die man aufwenden müsste, würde der Anker fest an einer Stelle stehen. Dies ist für eine feinere Regelung hilfreich.

Und: PWM bedeutet PulsWeitenModulation. das geht mit jeder Frequenz - egal ob MegaHertz oder MilliHertz.

@Stefan: Ich kenne allerdings auch Verfahren mit denen solche schwebende Ventile angesteuert werden, in denen keine niederfrequente PWM angesteuert wird, sondern eine schnelle PWM, deren Stromniveau mit 4 Hz geändert wird. Das gibt dann ein noch ruhigeres Regelverhalten.

Hallo,

du meinst es ist gewollt das das Ding dem Takt mechanisch nicht mehr folgen kann?
Es ist also nie ganz offen bzw. nie ganz geschlossen?

Richtig. Das sind Regelventile die so angesteuert werden, dass der Anker immer leicht um die Sollposition hin und herschwingt. Mit dem PWM-Wert bestimmt man die Sollpostion. Das leichte Schwingen sorgt dafür, dass auch eine sehr kleine Änderung der Sollposition umgesetzt wird.

Würde man eine höhere Frequenz fahren, bei der Anker fest an der Sollpostion steht, würde er bei einer minimalen Änderung des Stromes einfach an der Stelle kleben bleiben.

du meinst es ist gewollt das das Ding dem Takt mechanisch nicht mehr folgen kann? Es ist also nie ganz offen bzw. nie ganz geschlossen?

Dann wären die 4 Hz aber sowas wie eine Minimal-Frequenz, oder ... ?

Hallo,

laut meiner Meinung nein. In der Situation jetzt wird es kein Minimum mehr geben. Nur noch ein unbekanntes Maximum. Wenn die Frequenz zu hoch ist, wird das Ventil überhaupt nicht mehr wissen was es machen soll und wird, so denke ich, in der Mitte stehen bleiben.

Regelventile kenne ich eigentlich nur in 2-Weg Ausführug, die einen Hydraulik-Zylinder links und rechts beaufschlagen - quasi als H-Bridge. Da sind kleine Schwingungen erwünscht oder zumidest akzeptabel, aber die sollten dann auch schneller als 4 Hz sein, da sie ja nur das Ventil vom "Kleben" abhalten sollen, nicht aber den Zylinder zum Schwingen bringen sollen.

In unseren Wickelmaschinen haben wir auch oft solche Proportional-Ventile für Hydraulik aber meist sind die sogenannten Dither-Frequenzen 30-50Hz mit kleiner Amplitude um das Ventil "leichtgängig" zu halten. Und werden diese zusätzlich mit Höheren Amplituden beaufschlagt um die Gewünschte Ankerbewegung zu bekommen. Ich denke bei den 4 Hz handelt es sich um die höchste zulässige Schaltfrequenz. Ich habe dies schon mal in früheren Projekten umgesetzt. Dafür brauch man keinen PWM Ausgang die kann man auch im Normalen Programm machen vorausgesetzt man nutzt keine Delays in seinem Programm

Hier der Code:

unsigned long pmicros;
int nextCall=HIGH;

void setup(){
 pinMode(13,OUTPUT);
}

void loop(){
Low_PWM(13,30,75);  // Low_PWM(pin,Frequenzbasis,Ontime)
}

void Low_PWM(int Pin, int Fre, int Value){
long time;
long ontime;
time=1000000/Fre;
 ontime=time/100*Value;
 if (micros() - pmicros > time && nextCall==HIGH) {
   digitalWrite(Pin,HIGH);
   pmicros=micros();
   nextCall=LOW;
 }
 if (micros() - pmicros > ontime&& nextCall==LOW){
   digitalWrite(Pin,LOW);
   nextCall=HIGH;  
 }
}

Gruß DerDani