Forum: Mikrocontroller und Digitale Elektronik Hardware-PWM wo ist der Fehler in meinen Überlegungen?


von Richard (Gast)


Lesenswert?

Hallo zusammen,

wie der eine oder andere vielleicht mitbekommen hat beschäftige ich mich 
aktuell sehr mit Soft-PWM. Dabei bin ich jetzt auf ein kleines Problem 
gestoßen, welches ich mir an den Hardware-PWMs erklären wollte aber 
nicht konnte.

ich probiers mal zu beschrieben: eine 8-Bit PWM:
PWM-Wert 0 bedeutet der Ausgang ist nie an.
PWM-Wert 1 bedeutet der Ausgang ist 1 Taktzyklus an.
usw.
PWM-Wert 254 ... 254 Taktzyklen
PWM-Wert 255 ... 255 Taktzyklen

die 8-Bit PWM macht meines Wissens aber 256 Taktzyklen pro PWM-Zyklus...
Man könnte also nur von 0-99,6% einstellen. Nicht 0-100%...
Wenn ich mich nicht täusche bleit der PWM-Pin meines AVR aber 100% auf 
high wenn ich 0xFF als PWM-Wert einstelle und 100% auf low wenn ich 0 
einstelle... Es muss also irgendwo einen Sprung geben, oder wie oder 
was?
Oder hab ich grad so einen krassen Gedankenfehler?

Wär nett wenn jemand ne Antwort wüsste. Vielen dank.
lg Richard

von Code (Gast)


Lesenswert?

Code?

von Sam .. (sam1994)


Lesenswert?

PWM hat immer Sprünge ist schließlich digital.

Mit dem Wert 255 möchtest du 5V ausgeben. Und das hast du ja mit 100% an 
erreicht.

Richard schrieb:
> die 8-Bit PWM macht meines Wissens aber 256 Taktzyklen pro PWM-Zyklus...
> Man könnte also nur von 0-99,6% einstellen. Nicht 0-100%...

0-255 ^= 256 Werte

von Richard (Gast)


Lesenswert?

jaja, das ist schon alles richtig, Samuel, nur reduzieren wir mal 
testweise auf 1 Bit...
Wert 0 ^= 0V,    0%
Wert 1 ^= 2,5V, 50%
(Wert 2 ^= 5V, 100%, gibts aber nicht bei 1Bit)

Bei 8-Bit komme ich so auf nur 99,6%, denn für 100% bräuchte ich das 
9.Bit, das es nicht gibt. Für mich ist das gerade so neu, dass ich es 
nicht glauben kann und mich frage, o die hardware-pwm von 0xFE auf 0xFF 
einfach einen "Sprung" macht und 0xFF als das für 100% nötige 0x100 
interpretiert...
Ich finde in keinem Datenblatt was. Gesucht hab ich jetzt beim Mega88 
und Tiny2313.

von Marcel K. (viewer)


Lesenswert?

Hallo Richard,
also ich habe mal vor langer Zeit einen MOS-FET mit PWM betrieben. Die 
genaue Beschaltung weiß ich nicht mehr. Aber auf jeden Fall hatte ich, 
glaub ich, im normal-Betrieb bei PWM = 0 nicht aus. Hier im Forum bin 
ich dann auf einen Hinweis gestoßen, dass der PWM nicht wirklich bei PWM 
= 0 = aus ist, sonder wirklich mal ganz, ganz kurz einschaltet. Das ist 
bei mir aufgefallen, weil ich den MOS-FET nie richtig aus bekommen habe. 
Dann habe ich das ganze im "inverse"- Modus betrieben, dann war bei PWM 
= 0xFF wirklich aus.
ZU DEINEM PROBLEM:
Du schreibst:
bei 0 = aus
bei 1 = 1 Taktzyklus
bei 2 = 2 Taktzyklen
...
bei 255 = 255 Taktzyklen

Du zählst doch die "0" nicht als Zyklus, also sind es 255 Takte + aus = 
256!

Wo ist dann Dein Problem? :o)

von O. D. (odbs)


Lesenswert?

Hallo Richard, deine Überlegungen sind richtig.

Es gibt 256 Zyklen bei einer 8bit-PWM. Wenn dein Eingangswertebereich 
von 0 bis 255 reicht, gibt es zwei Möglichkeiten:

1. Ist der Ausgang zwischen 0 und 255 von 256 Zyklen an, kannst du die 
100% nie erreichen.

2. Ist der Ausgang zwischen 1 und 256 Zyklen an, erreichst du die 100%, 
nicht aber die 0%.

Bei der Software-PWM kannst du tricksen: Entweder die Zyklenzahl um eins 
verringern, oder zwischen 0% und 100% irgendwo einen Sprung einbauen. 
Wenn es um die Ansteuerung eines Motors oder einer LED geht, ist das 
egal. Bei einem durch PWM simulierten D/A-Wandler macht man das besser 
nicht.

Zur Hardware-PWM: Schau dir das Datenblatt und die diversen Timer-Modi 
mal genau an, grundsätzlich hast du das gleiche Problem wie oben. Es 
lässt sich aber lösen ;)

von michael (Gast)


Lesenswert?

aus dem Datenblatt zum Atmega8, Kapitel Timer2, modes of operation, fast 
pwm:

The extreme values for the OCR2 Register represent special cases when 
generating a PWM waveform output in the fast PWM mode. If the OCR2 is 
set equal to BOTTOM, the output will be a narrow spike for each MAX+1 
timer clock cycle. Setting the OCR2 equal to MAX will result in a 
constantly high or low output (depending on the polarity of the output 
set by the COM21:0 bits.)


Viele Grüße
michael

von Richard (Gast)


Lesenswert?

Danke euch allen. Dann leuchtet das alles ein.

Meine SoftwarePWM stützt sich jetzt auf den Timer/Counter0 (8bit) 
welcher mit clk/256 taktet und im CTC mode läuft wobei TOP auf 254 
gelegt wurde.
Damit habe ich 0-100% abgedeckt (per oszi überprüft).
Die software arbeitet nach dem Prinzip der intelligenten PWM aus 
http://www.mikrocontroller.net/articles/Soft-PWM nur eben in eigener 
Ausarbeitung. Ich war zu faul mich Stundenlang in den Code 
einzuarbeiten, da hab ich lieber selbst meine Fehler gemacht!

Danke nochmal an alle, auch an diejenigen, die mir bei meinen Anderen 
Fragen geholfen haben!
lg Richard

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.