hi,
ich hab grad ein komisches Verhalten in der PWM und will wissen, ob das
normal ist und ob man das umgehen kann, falls ja.
ich hab eine nicht-invertierte FastPWM (Mode 3) auf timer0A aufgesetzt.
Am Port hängt testweise ne LED.
wenn ich 0 in das Compatre-register schreibe hätte ich erwartet, dass
die LED ausbleibt.
Sie leuchtet aber. Ansosnten funktioniert die PWM erwartungsgemäß.
Ich hätt aber gern, dass ich mit dem compare-register den Dutycyle von
0-100% steuern kann und nicht nur von 0,5%-100
Laut beschreibung, zählt die PWM im mode 3 immer aufwärts. bei 0 wird
der Port aktiviert und bei CompareMatch deaktiviert.
warum ist bei OCR0A=0 der Outport dann an?
und woraus ich gar nicht schlau werde, ist der modus 7.
In der Beschreibung steht, bis OCR0A hochzählt und dann bei 0 anfängt.
Wann wird dann aber der Port abgeschalten? (bei 0 wird ja der Port
angschalten)
hier meine initialisierung:
auch in den ersten 5sec leuchtet die led.
1
DDRB|=(1<<PIN0)|(1<<PIN1);
2
3
TCCR0A=(1<<COM0A1)|(0<<COM0A0)// timer0 pwm A non inverting Mode
4
|(1<<WGM01)|(1<<WGM00);// timer0 Fast PWM (lower 2 bits )
5
TCCR0B=(0<<WGM02)// timer0 Fast PWM (highest bit )
Hm.
Nachdem noch ein paar mal gesucht habe, habe ich folgenden Absatz
gefunden:
>The extreme values for the OCR0A Register represents>special cases when generating a PWM waveform output>in the fast PWM mode. If the OCR0A is set equal to BOTTOM,>the output will be a narrow spike for each MAX+1 timer clock cycle.
:-(
bleibt wo nur die Benutzung eines anderen Modus.
Über ne aufklärung betreffs Mode 7 wär ich dennoch dankbar.
Du kannst schon den Mode 3 verwenden.
Wenn du den invertierenden Mode nimmst und deine
PWM-Werte in Software ebenfalls invertierst erhäst du
echte 0 % und nur oben sind es nicht mehr ganz 100 %
Aber das schwache leuchten ist dann weg.
Abend,
ich empfehle für solche Fälle die Phase Correct PWM Mode (Mode 1 oder
5).
Dort steht nämlich:
The extreme values for the OCR0A Register represent special cases when
generating a PWM waveform output in the phase correct PWM mode. If the
OCR0A is set equal to BOTTOM, the output will be continuously low and if
set equal to MAX the output will be continuously high for non-inverted
PWM mode. For inverted PWM the output will have the opposite logic
values.
Das ist doch gewünscht, oder?
Hinter die 'Geheimnisse' der anderen Modi (speziell die Tatsache, daß
man nicht immer zwischen 0 und 100% wählen kann) bin ich allerdings auch
noch nicht vollständig gekommen...
Tassilo
Tassilo Böhr schrieb:
> Hinter die 'Geheimnisse' der anderen Modi (speziell die Tatsache, daß> man nicht immer zwischen 0 und 100% wählen kann) bin ich allerdings auch> noch nicht vollständig gekommen...
Das Problem ist ein grundsätzliches.
Du hast 255 mögliche Tastverhältnisse 1..255 und die beiden DC-Zustände
0% bzw. 100%. Das ergibt 257 Möglichkeiten und die kannst Du mit 8Bit
nicht darstellen. Das Problem ist daher unabhängig vom PWM-Mode.
PWM-Mode, die 0% und 100% können, lassen dafür einen Wert aus.
Peter
das mit dem invertiertem Modus ist klar. Da verschiebt sich das Problem
auf die High-Seite, wo es bei LEDs nicht auffällt.
Das mit der phasen-korrekten war mir auch klar. schrieb ich ja, dass ich
wohl nen anderen Modus nehmen muss.
Eigenartiger weise zeigt der PWM auf timer1B (habs mit A nicht brobiert)
dieses Verhalten nicht
Peter Dannegger schrieb:
> Tassilo Böhr schrieb:>> Hinter die 'Geheimnisse' der anderen Modi (speziell die Tatsache, daß>> man nicht immer zwischen 0 und 100% wählen kann) bin ich allerdings auch>> noch nicht vollständig gekommen...>> Das Problem ist ein grundsätzliches.> Du hast 255 mögliche Tastverhältnisse 1..255 und die beiden DC-Zustände> 0% bzw. 100%. Das ergibt 257 Möglichkeiten
wie kommst du denn darauf?
Ws gibt 0-100%
nach meinem Verständnis ist bei bit 0% = 0 und 100% = 255
dazwischen liegt eine mit 8bit diskretisierte Linearisierung
> und die kannst Du mit 8Bit> nicht darstellen. Das Problem ist daher unabhängig vom PWM-Mode.> PWM-Mode, die 0% und 100% können, lassen dafür einen Wert aus.>>> Peter
Das verhalten ist eher in der internen Verschaltung der PWM zu suchen.
Da wird halt erst gesetzt, dann Verglichen und wieder ausgeschaltet.
Der andere Timer, der ja komplett anders aufgebaut ist legt dieses
Verhalten nichth an den Tag.
Schreib Dur ne Routine, die die bei PWM=0% die PWM komplett deaktivert.
So habe ich mich bei meiner "RGB-RC5-IKEA-LAMPE" aus der Schlinge
gezogen.
Ich hatte mir einen #define einzeiler geschrieben.
Vlad Tepesch schrieb:
> wie kommst du denn darauf?
Also nochmal ganz langsam anhand einer 2Bit-PWM:
Ein 2Bit-Timer hat 4 Zustände:
00, 01, 10, 11
Eine PWM damit hat aber 5 Zustände:
0%: 0 0 0 0
25%: 1 0 0 0
50%: 1 1 0 0
75%: 1 1 1 0
100%: 1 1 1 1
Man kann es mit jeder Bitbreite probieren, es fehlt immer ein Zustand.
Und es ist völlig egal, welcher PWM-Mode verwendet wird.
Den fehlenden Wert kann man aber ganz leicht dadurch erzeugen, indem man
den Pin von der PWM wegschaltet und dafür 0 bzw. 1 in den Portpin
schreibt.
Wenn man dann noch das Endwertregister auf 254 stellt, d.h. der
PWM-Timer hat nur 255 Zählwerte, hat man ne echte 8Bit-PWM von 0% bis
100%.
Peter
>Ein 2Bit-Timer hat 4 Zustände:>00, 01, 10, 11>Eine PWM damit hat aber 5 Zustände:>0%: 0 0 0 0>25%: 1 0 0 0>50%: 1 1 0 0>75%: 1 1 1 0>100%: 1 1 1 1
diese definition ist doch willkürlich.
Man könnte es aber auch mit 2bit so definieren, dann passt es:
0%: 0 0
33%: 0 1
66%: 1 0
100%: 1 1
DAs ist ja eher die herangehensweise, die man benutzt.
Man hat ein minimum und ein maximum, und dazwischen werden die
verbleibenden Werte (meistlinear) aufgeteilt.
Im Datenblatt steht ja:
>If the OCR0A is set equal to BOTTOM,>the output will be a narrow spike for each MAX+1 timer clock cycle.
Heißt für mich dass dennoch im selben timer-zyklus abgeschalten wird. Es
tritt halt nur diese kleine anomalie auf. Das ist aber nicht
PWM-prinzipbedingt, sondern schaltungstechnisch.
Vlad Tepesch schrieb:
> diese definition ist doch willkürlich.
?????
Du hast 4 Zeitabschnitte, dann kannst Du auch alle 4 auf 0 oder 1
setzen.
Und dazu brauchst Du eben 5 Kombinationen.
> Man könnte es aber auch mit 2bit so definieren, dann passt es:> 0%: 0 0> 33%: 0 1> 66%: 1 0> 100%: 1 1
Das ist Quatsch mit Soße.
Ob 0,1 oder 1,0 ergibt immer 50%
33% wäre 1, 0, 0
66% wäre 1, 1, 0
D.h. Dein Zähler darf nur 0, 1, 2, 0, 1, 2 zählen, also 3 Schritte
Die Anzahl der möglichen PWM Werte ist immer Zählschritte + 1.
Das ist das grundsätzliche Prinzip einer PWM, nicht irgendeine
Betrachtungsweise.
Peter
Peter Dannegger hat Recht, wenn ein Timer von 0 bis 3 zählt, gibt es 4
Zeitpunkte, in denen der Pin eingeschaltet werden kann. Der Punkt ist
aber, dass er auf jeden Fall eingeschaltet wird und die Möglichkeit des
Nicht-Einschaltens nicht codiert werden kann mit 2 Bit.
Beim MSP430 löst man das üblicherweise so, dass man den Timer nur einen
Schritt weniger zählen lässt, als man Codierschritte für die Pulsweite
hat.
Grüße,
Peter