mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik tiny25 Problem PWM


Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
  DDRB |= (1<<PIN0) | (1<<PIN1);

  TCCR0A  =  (1<<COM0A1) | (0<<COM0A0) // timer0 pwm A non inverting Mode 
           | (1<<WGM01)  | (1<<WGM00);  // timer0 Fast PWM (lower 2 bits )
  TCCR0B  =  (0<<WGM02)  // timer0 Fast PWM (highest bit )
           | (0<<CS02) | (1<<CS01) | (1<<CS00); // timer0 prescaler 64

  OCR0A = 0;
  _delay_ms(5000);

  while(1)
  {
    ++OCR0A;
    _delay_ms(50);
  }

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Tassilo Böhr (big_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.