Forum: Mikrocontroller und Digitale Elektronik Fast PWM Mode 15


von al3ko (Gast)


Lesenswert?

Hi,

entschuldigt bitte, dass ich euch ein weiteres Mal um Rat fragen muss, 
aber mir scheint die uC Materie nicht so einfach in den Kopf zu gehen.

Ich wage mich gerade an PWM mittels uC heran. Setup ist nach wie vor der 
Atmega8. Fast PWM mit Mode 5 (Fast PWM 8bit) funktioniert mit unten 
stehenden Code. Abhängig vom Wert OCR1A leuchtet die LED unterschiedlich 
hell.
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
  DDRB |= (1<<PB1);
6
  OCR1A = 120;
7
  TCCR1A |= (1<<COM1A1);
8
  TCCR1A |= (1<<WGM11);
9
  TCCR1B |= (1<<WGM12);
10
//  TCCR1B |= (1<<CS10) | (1<<CS12);
11
  TCCR1B |= (1<<CS10);
12
  
13
  while(1)
14
  {
15
    //Code
16
  }
17
}

Spaßeshalber habe ich mal Mode 15 gewählt und die LED leuchtet immer 
gleich hell. Okay, irgendeinen Unterschied müssen die Modes ja haben, 
klar. Aber irgendwie werde ich aus dem Datenblatt nicht schlau, was es 
damit auf sich hat. In diesem Forum habe ich einen Beitrag von spess53 
gefunden:

> Im Mode 15 (OCR1A als Top) hast du nur den PWM-Kanal B zur Verfügung.
> OCR1A bestimmt die Frequenz und Auflösung der PWM. Damit an Kanal B eine
> PWM herauskommt muss OCR1A größer als OCR1B sein.

Ich habe das Datenblatt (Seite 88 bis 90) und Seite (96 bis 101) noch 
mal durchforstet, aber irgendwie scheine ich diese Information übersehen 
zu haben. Wo kann ich Informationen und Konfiguration über die 
jeweiligen Modi finden?

Danke

von Karl H. (kbuchegg)


Lesenswert?

Wenn du mit dem Timer arbeitest (und du schon ein wenig damit umgehen 
kannst), dann fängt die Recherche im Datenblatt am einfachsten immer bei 
der Modus Tabelle an. Dort steht im Grunde alles drinnen, was man auf 
die Schnelle wissen muss.

Für den Timer 1 ist das die Tabelle 39 auf Seite 97/98 des Datenblattes.
Die Zeile des Modus 15 sieht so aus
1
Mode  WGM13 WGM12   WGM11   WGM10  Mode of Operation   TOP   Update    TOV1 Flag
2
     (CTC1) (PWM11) (PWM10)                                 of OCR1x   set on
3
4
...
5
6
15      1    1        1       1     Fast PWM           OCR1A  BOTTOM   TOP

Und hier ist wiederrum die Spalte TOP die für deine konkrete 
Fragestellung relevant. TOP verrät dir, wie eigentlich der Zählumfang 
des Timers festgelegt wird. D.h. bis wohin zählt denn eigentlich der 
Timer, ehe es dann wieder von vorne losgeht?

Beim Modus 5 wäre das zb. 0x00FF  also 255. Warum gerade 255? Weil es 
sich um eine 8 Bit PWM handelt. 8 Bit bedeutet aber der Zähler muss von 
0 bis 255 zählen und in diesem Zahlenbereich je nach Zählerständen das 
PWM-Ausgangsbit umschalten. Das ergibt 256 mögliche Schaltpunkte, daher 
auch 8 Bit PWM. Die Umschaltung selbst wird davon nicht festgelegt, das 
machen die OCR1A bzw. OCR1B Register. Bei Gleichstand vom Zählwert mit 
dem jeweiligen Register wird der entsprechende Ausgansgpin geschaltet. 
Wie das passiert verrät dir die Einstellung der COM... Bits (die 
Tabellen davor). Beachte aber auch: die 0x00FF stehen in der Tabelle 
direkt drinnen. d.h. das in diesem Modus bis 255 gezählt wird, ist fest 
verdrahtet und ist nun mal in diesem Modus so.

Hier, im Modus 15 steht aber in der TOP Spalte: OCR1A
D.h. in diesem Modus legt der Inhalt des OCR1A Registers fest, wie weit 
der Zähler zählt. Steht da 300 drinnen, dann zählt der Timer von 0 bis 
300, steht da 587 drinnen, dann zählt der Timer von 0 bis 587 (und 
dementsprechend kannst du dann auch die PWM in 588 Stufen abstufen).

Daraus folgt aber auch mehr. Da OCR1A hier die Rolle des TOP Registers 
übernimmt, kann mit OCR1A logischerweise keine PWM mehr realisiert 
werden, denn die würde logischerweise immer auf 100% stehen. In diesem 
Modus kann also nur noch mit OCR1B und zugehörigem Pin eine PWM erzeugt 
werden.
D.h. in diesem Modus lässt sich nur noch realisieren:
OCR1A  legt fest, wie weit der Timer zählt
OCR1B  legt fest, bei welchem Zählerstand der Pin umgeschaltet werden 
soll.

von al3ko (Gast)


Lesenswert?

Hallo Karl Heinz (mal wieder :)),
vielen Dank. Bis hierhin meine ich alles verstanden zu haben. Aber nun 
kommts:

Karl Heinz Buchegger schrieb:

> Hier, im Modus 15 steht in der TOP Spalte: OCR1A
> D.h. in diesem Modus legt der Inhalt des OCR1A Registers fest, wie weit
> der Zähler zählt. Steht da 300 drinnen, dann zählt der Timer von 0 bis
> 300, steht da 587 drinnen, dann zählt der Timer von 0 bis 587 (und
> dementsprechend kannst du dann auch die PWM in 587 Stufen abstufen).
Okay, so habe ich es auch verstanden.

> Daraus folgt aber auch mehr. Da OCR1A hier die Rolle des TOP Registers
> übernimmt, kann mit OCR1A logischerweise keine PWM mehr realisiert
> werden, denn die würde logischerweise immer auf 100% stehen.
Das ist für mich nicht logisch. Zuvor schreibst du, dass von 0 bis 587 
gezählt wird. Mit meiner Konfiguration bei COM1A1 (non inverting) 
schließe ich daraus, dass PB1 solange low ist, bis ein Match erreicht 
ist. Deshalb kann ich auch deine weitere Erklärung nicht ganz 
nachvollziehen.

> In diesem
> Modus kann also nur noch mit OCR1B und zugehörigem Pin eine PWM erzeugt
> werden.
> OCR1A  legt fest, wie weit der Timer zählt
> OCR1B  legt fest, bei welchem Zählerstand der Pin umgeschaltet werden
> soll.

Scheinbar übersehe ich etwas Grundlegendes, weshalb ich zu falschen 
Schlussfolgerungen komme. :/

von Karl H. (kbuchegg)


Lesenswert?

al3ko schrieb:

>> Daraus folgt aber auch mehr. Da OCR1A hier die Rolle des TOP Registers
>> übernimmt, kann mit OCR1A logischerweise keine PWM mehr realisiert
>> werden, denn die würde logischerweise immer auf 100% stehen.
> Das ist für mich nicht logisch.

Was ist daran nicht logisch?

> Zuvor schreibst du, dass von 0 bis 587
> gezählt wird. Mit meiner Konfiguration bei COM1A1 (non inverting)
> schließe ich daraus, dass PB1 solange low ist, bis ein Match erreicht
> ist.

Richtig.
Aber wann wird denn der Match erreicht?
Immer dann wenn der Zählerstand mit OCR1A übereinstimmt. Wenn aber 
gleichzeitig mit dieser Übereinstimmung der Zähler auf 0 zurück gesetzt 
wird und wieder von vorne beginnt, dann kann man das ja wohl schwerlich 
eine PWM nennen. Denn deine PWM würde immer gleich aussehen. Von 0 bis n 
ist der Pin auf zb 1 und mit dem Erreichen von n wird der Pin 0. 
Gleichzeitig beginnt aber auch der Timer wieder bei 0 zu zählen und der 
Pin wird wieder 1.

OCR1A sei beispielsweise 7
Timer   0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, ...
                             #                       #
                            Match                  Match

Wird beim Match der Pin abgeschaltet, der Timer zurückgesetzt und der 
Pin geht sofort wieder auf 1, dann unterscheidet sich das inwiefern von

OCR1A sei 9
Timer  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ...
                                  #                             #
                               Match                         Match

In beiden Fällen wird gleichzeitig mit dem Match 2-er lei DInge gemacht. 
Für eine PWM willst du aber eine andere Steuerung des Ausgangs 
realisieren. Du willst vielleicht haben, dass der Timer bis 7 zählt, 
aber der Pin soll nur für die Zählerstände bis 3 auf 1 sein, und ab da 
dann 0 sein


Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
Pin   1  1  1  0  0  0  0  0  1  1  1  0  0  0  0  0  1  1  1
               #           #           #           #


Nur wie machst du denn das? Du brauchst 2 Matches! Den einen, der dir 
den Pin umschaltet und den anderen der den Timer auf 0 zurücksetzt.
Da OCR1A als 'Timer-zurücksetz-Match' dir durch den Modus vorgegeben 
ist, bleibt dir nur noch OCR1B

OCR1A  7
OCR1B  3
Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
Pin   1  1  1  0  0  0  0  0  1  1  1  0  0  0  0  0  1  1  1
               #           #           #           #
             Match B     Match A      Match B     Match A

Und mit OCR1B kannst du jetzt variieren um das Verhältnis der On Zeit 
zur Off Zeit des Pins einzustellen

OCR1A  7
OCR1B  5
Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
Pin   1  1  1  1  1  0  0  0  1  1  1  1  1  0  0  0  1  1  1
                     #     #                 #     #
                Match B   Match A      Match B   Match A

oder in die andere Richtung
OCR1A  7
OCR1B  2
Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
Pin   1  1  0  0  0  0  0  0  1  1  0  0  0  0  0  0  1  1  1
            #              #        #              #
         Match B     Match A      Match B     Match A


Den OCR1A kannst du dafür nicht mehr benutzen. D.h. technisch gesehen 
kannst du schon. Aber dieser Pin wird eben dauern auf 100% sein.

von Al3ko -. (al3ko)


Lesenswert?

Vielen Dank für deine sehr schöne und anschauliche Erklärung. Ich meine 
es nun verstanden zu haben, was an Mode 5 anders läuft. Dort zählt der 
Counter fest bis 255 (8bit) no matter what und fängt dann wieder bei 0 
an. Der Wert für OCR1A setzt somit das "duty cycle", gibt also an wann 
der Match stattfinden wird. Ob inverting oder non-inverting leuchtet die 
LED nun vor oder nach dem Match.
In Mode 15 setzt man den Wert des Timers über OCR1A, also bis wohin der 
Timer zählen soll. Klar, dass man nun einen zweiten Match haben muss, um 
das duty cycle zu setzen (wie lange die LED an bzw. aus sein soll).

Richtig?

von Karl H. (kbuchegg)


Lesenswert?

Alex A. schrieb:

> Richtig?

Exakt.
Und das ist dann auch der Unterschied zum Mode 14.
Im Mode 15 regelt OCR1A, bis wohin der Timer zählt. Im Modus 14 erledigt 
ICR1 diese Aufgabe, sodass OCR1A wieder zur Duty Cycle Einstellung 
benutzt werden kann.

von Al3ko -. (al3ko)


Lesenswert?

Super, ich danke dir.

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.