Verständnisfrage zur PWM

Hallo,

habe zwar schon Einiges drüber recherchiert, verstehe aber leider immer noch nicht warum ein PWM Signal mit der Funktion analogWrite() programmiert wird? PWM ja ein digitales Signal mit Pegeln High and Low. Mit analogWrite() konvertiere ich das in ein analoges so zusagen?

Nee, das ist einfach ne unglückliche Namensgebung. Hat mit analog nix zu tun, außer dass man aus einem PWM Signal einen analogen Wert durch Integration nachbilden kann (R/C Glied).

Weil man nicht nachgedacht hat. Oder irrsinnigerweise gemeint hat es wäre für Laien verständlicher nicht wissen zu müssen was PWM bedeutet.

Das Arduino System hat einige so Macken aus den Anfangszeiten. Heute würde man es anders machen, aber man kann es nicht mehr ändern, da Programme sonst nicht mehr kompatibel wären. Und generell ist es ein Irrglaube, dass man viel programmieren kann ohne auch nur ein klein wenig Grundlagen zu lernen.

Ok, das heißt, dass Signal bleibt trotzdem digital?
Aber damit der mittlere Wert der Spannung angegeben werden kann, also nicht nur 0 oder 5V, sondern zum Beispiel auch 4V, wird ein analoger Wert angegeben?

hi,

es wird nirgends ein analoger wert angegeben, sondern einer zwischen 0 und 255, das heißt, auf zeit bezogen:
0/255stel ein und 255/255stel aus: ständig aus
bis
255/255stel ein, 0/255stel aus: ständig ein.

ein wert von 66 hieße dann: 66/255stel ein, 189/255stel aus.

gruß stefan

Wieder nee, Du gibst im Prinzip das Tastverhältnis an. Bei 50% hast Du immer noch Impulse von 5V, aber eben nur die Hälfte der Zeit einer Periode.

User_ino:
Ok, das heißt, dass Signal bleibt trotzdem digital?
Aber damit der mittlere Wert der Spannung angegeben werden kann, also nicht nur 0 oder 5V, sondern zum Beispiel auch 4V, wird ein analoger Wert angegeben?

Es bleibt eine Rechteckspannung mit 0V 5V nur der Mittelwert ändert sich mit dem Verhältnic von HIGH zu LOW. ZB ein LED ist sujektiv weniger hell da es weniger Zeit eingeschaltet ist und das Auge es nicht flackern sieht.
Grüße Uwe

Das Arduino Board hat ja 3 Timer, einer davon ist ein 16 bit Timer. Heißt das, dass man damit schnellere PWM Signale erzeugen kann, da er ja dann eine doppelte Bandbreite an analogen Werten hat, also bis 512.?

Jedes zusätzliche Bit verdoppelt den möglichen Wertebereich.

Hier Code, wie Du die Auflösung auf 10 Bit hochsetzt (0-1023) - 4. Beitrag von unten:

http://forum.arduino.cc/index.php/topic,41964.0.html

Gruß Helmuth

edit: Und verwechsle nicht Auflösung (wie viele mögliche Abstufungen bzw. Pulsbreitenverhältnissse - Genauigkeit) und Modulationsfrequenz (wie oft wird pro Sekunde an- und ausgeschaltet - Geschwindigkeit).

Ok, das heißt bei analogWrite(pin, 255) wird der Pin mit 5V versorgt und bei analogwrite(pin, 65535) genauso. Der Motor wird sich in beiden Fällen gleichschnell rotieren. Der Unterschied ist nur, dass die Spannung wird im ersten Fall um 5/256 0,0196 Volt Schritten erhöht, im anderen Fall 5/65536=7,63*10^-5 V Schritten?

Aus dem Pin kommen IMMER 5 V raus, die Frage ist nur wie oft und wie lange.

Bei 8 Bit ist der Maximalwert 255, bei 10 Bit 1023.

Was sich in Abhängigkeit des Pulsweitenverhältnisses ändert, ist die DURCHSCHNITTSspannung.

Bei 8 Bit in 5V/256 Schritten, bei 10 Bit in 5V/1024 Schritten.

Hier, lies und verstehe das: Der Strippenstrolch - PWM-Pulsweitenmodulation

Schau dir mal das Datenblatt zum Atmega328 an. Auf Seite 136 sind die Modi für Timer1 aufgelistet. Standardmäßig läuft er auf phase correct. Wohl dann Modus 1, da 8 Bit. Da gibt es feste Modi, die nur mit 8, 9 oder 10 Bit gehen. Die sind einfacher, da die ein festes TOP Register haben. Wenn man ein variables TOP haben will, braucht man ein zusätzliches Register. Je nach Modus ICR1 oder OCR1A.

Die Frequenz ist wie gesagt was anderes als die Auflösung. Die Frequenz kann man über den Vorteiler/Prescaler einstellen. Das kann nötig sein, wenn man die Frequenz in den nicht-hörbaren Bereich drücken muss um Schalt-Geräusche zu verhindern:
http://playground.arduino.cc/Main/TimerPWMCheatsheet

Aber wenn ich die Frequenz verändere, dann verändere ich ja uch die Periode eines PWM Signals und kann somit schnellere Geschwindigkeit des Motors erreichen? Denn wenn die Periode länger wird, kann ich ja auch durch die Anweisung analogWrite(pin, 240) eine längere Zeit mit dem HIGH Pegel erreichen als bei einer kürzeren Periode?

Nein, Du darfst einen Gleichstrommotor der mit PWM Modulation betrieben wird nicht mit einem Drehstrommotor vergleichen der an einem Frequenzumformer hängt. Betrachte es in diesem Fall wirklich wie weniger Strom. Wenn du eine 512er Abstufung hast, wird das Ergebnis von analogWrite(pin, 256) dasselbe sein, wie bei einer 256er Abstufung analogWrite(pin, 128).

Grüße,

Sven

@User_ino: Vielleicht beschreibst Du uns einfach mal ganz genau, was Du eigentlich vorhast - was mit welcher konkreten Hardware passieren soll.

Sonst drehen wir uns hier weiterhin im Kreis während der Motor stillsteht... :wink:

Beste Grüße

Helmuth

edit: Wie Serenifly schon schrieb, Änderung der Frequenz macht nur Sinn, wenn der Motor brummt/piept. Bei einer "normalen" Gleichstrommaschine – Wikipedia änderst Du die Drehgeschwindigkeit nur durch das Pulsweitenverhältnisses, egal bei welcher Frequenz.

Ok, ich frage kurz und knapp.
Verstehe ich jetzt richtig? Die maximale Geschwindigkeit eines Motors kann man mit dem PWM Signals eines Arduino Board nicht beeinflussen?

Stimmt so, Du kannst ihn nur langsamer machen, aber nicht schneller wie wenn er einfach digital nagesteuert wird.

Grüße,

Sven

Ein Gleichstrommotor, welcher mittels PWM angesteuert wird, dreht sich nicht schneller, als wenn Du ihn direkt mit Gleichspannung identischen Pegels versorgst. Die Maximalgeschwindigkeit kannst Du beieinflussen - aber nur nach unten.

Super, danke!