Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem bei PWM


von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe gerade ein Problem mit der PWM. In Anhang ein Datenblattauszug 
des ATmega16, meine Frage bezieht sich auf Mode 15.

Zunächst folgendes: mein ATmega rennt mit 12,288MHz, ich benutze Timer 1 
mit einem Prescaler von 1. Mein OCR1A ist auf den Wert 1000 gesetzt. Was 
genau macht der Mode 15? Ist so wie golgt:

Der Timer 1 zählt von Null an so lange hoch, bis TCNT1 = OCR1A ist, dann 
wird der Pin OC1A gesetzt. Jetzt läuft der Timer weiter bis 0xFFFF, dann 
wird der Pin wieder gelöscht und das ganze Spiel geht von vorne los. 
Somit hätte ich also eine 16Bit-PWM an OC1A, so wie ich es haben will.

Leider messe ich mit dem Scope, egal was ich einstelle, ein 
symmetrisches Rechteck an OC1A.

Ich tue mich recht schwer beim Verständnis der ganzen Modi. Vielleicht 
kann mir jemand ein Tip geben, wo mein Denkfehler ist.

Ich habe das Gefühl, dass der Timer beim ersten Compare-Match nicht 
weiter hoch zählt, sondern gleich wieder bei Null angängt. Das würde 
zumindest die Symmetrie erklären.

Ich möchte einen Impulsgenerator pauen, dafür hätte ich gerne eine PWM 
mit einer höheren Auflösung als 10Bit.

MfG
Tobias

von Tobias (Gast)


Lesenswert?

Ich hab hier in einem Wikiartikel folgendes gefunden (jetzt zum 
CTC-Mode):

*******************************************************
Clear Timer on Compare (CTC)

(eingeschränkte PWM)

Der Zähler zählt hoch, bis er mit OCRnx übereinstimmt (BOTTOM->OCRnx: 
Match!) und wird dann auf Null gesetzt. Der maximale Wert lässt sich 
also über das Register OCRnx komfortabel bestimmen.

Konkret bedeutet das, dass die in diesem Modus vom Prescaler erzeugte 
Basisfrequenz nochmals durch den Wert von OCRnx geteilt wird.

Für PWM:

Wenn eingestellt ist, dass der OC-Ausgang bei jedem Match umschaltet 
(toggle), entspricht der eingestellt Wert dem Pulsweitenverhältnis. Bei 
OCRnx=128 des 8 Bit T/C wäre also etwa die Hälfte der Zeit der Pin 
eingeschaltet.

Allerdings kann das beim T/C 0 des tiny2313 nur der Ausgang A (OC0A). 
Also ins Datenblatt gucken!
*******************************************************

Das stimmt aber doch nicht. Wenn ich auf toggel gestellt habe, erhalte 
ich ein sym. Rechteck am Ausgang, dessen Frequenz durch OCR1A bestimmt 
wird. Oder hat mich mein Verständnis jetzt komplett verlassen?

von Tobias (Gast)


Lesenswert?

Ich habe meinen Timer jetzt so konfiguriert:

TCCR1A = 1<<COM1A1)|(1<<COM1B1)|(0<<COM1A0)|(0<<COM1B0)|
         (1<<WGM11)|(1<<WGM10);
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);

OCR1A = 100;

Wenn ich das mit AVR Studio simuliere, so kann ich erkennen, dass TCNT1 
hochzählt bis 1023, dann wieder runter bis 0 usw.

Im Datenblatt steht:

"The counter counts from BOTTOM to TOP then restarts from BOTTOM."

So wie es jetzt ist, wird genau das nicht gemacht und ich habe keine 
Peilung. Es sollte von 0 bis 100 gezählt werden, dann kommt der Match 
und OC1A wird gesetzt, dann zählt er weiter bis TOP (0xFFFF) und OC1A 
wird gelöscht.

Ich geh jetzt ins Bett, komme nicht mehr weiter :(

Gute nacht!

von Johannes A. (Gast)


Lesenswert?

Wenn ich Dich recht verstehe, willst Du eine PWM mit änderbarem (oder
freiem) TOP-Wert auf OC1A erzeugen. Dazu darfst Du allerdings nicht
OCR1A als TOP verwenden, und, zumindest im Toggle-Mode des Pins, auch
nicht die Fast-PWM.

Weil, im ersten Fall kriegst Du nie einen Compare (und damit Toggle)
für einen anderen Wert als TOP (=OCR1A) und im zweiten Fall bestenfalls
(d.h. mit ICR als TOP) nur jeweils einmal einen unsymmetrischen 
Ausgangsimpuls, wenn sich der OCR-Wert ändert...

Ist vielleicht etwas kraus zu verstehen, abes es ist völlig logisch ;-)

Gruß Johannes


von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

Hmm, und wie ist dann das Timingdiagramm (Anhang) der Fast-PWM zu 
verstehen?

Es zeigt doch klar eine PWM. TCNT1 zählt hoch bis zum ersten Match mit 
OCR1A (blaue Linie). An diesem Punkt wird OC1A auf Null gesetzt. Nun 
zählt TCNT1 weiter bis TOP (0xFFFF) (erste gelbe Linie) mit der Folge, 
dass OC1A gesetzt wird und so lange high bleibt, bis der nächste Match 
kommt.

von Johannes A. (Gast)


Lesenswert?

Im Bild ist OCRnA TOP, und danach richten sich die Perioden.

Nun ist OCnA aber nicht das einzige Register, der in das Schema OCnx 
passt, sondern OCnB tut das genauso, sofern OCRnB auf einen kleineren 
Wert gesetzt ist als OCRnA. DAS bedeuten die blauen und gelben Linien.

Mit anderen Worten: Eine PWM geht nur mit einem anderen Register als 
dem,
das den TOP-Wert macht. Also wenn OCRnA TOP ist, kannst Du nur mit OCRnB 
oder, falls vorhanden, OCRnC eine PWM erzeugen. Und um (auch) OCRnA 
dafür zu benutzen, muss für TOP entweder das ICR (bei Fast-PWM Modus 14) 
oder ein fester Wert (nicht Fast-PWM) verwendet werden.

Vielleicht kraus zu verstehen, aber völlig logisch :-)

Gruß Johannes

von Volker (Gast)


Lesenswert?

Johannes hat recht.

Mir ist aber noch etwas aufgefallen

TCCR1A = 1<<COM1A1)|(1<<COM1B1)|(0<<COM1A0)|(0<<COM1B0)|
         (1<<WGM11)|(1<<WGM10);

Ich nehme an mit |(0<<COM1A0) willst du das entsprechende Bit auf 0 
setzen.

Falls das Bit aber zuvor 1 war erreicht du das damit nicht.

Müsste wohl eher heißen:  & (~(1<<COM1A0))

Volker

von Volker (Gast)


Lesenswert?

Sorry, war Unsinn was ich geschrieben habe. Ich übersah, dass du dem 
TCCR1A-Register die Werte direkt zuweist.

Volker

von Tobias (Gast)


Lesenswert?

@Johannes

Ok, ich nerv nochmal kurz :)

Mode 7 (Fast-PWM, 10-bit)
-------------------------
Zählt bis Match (TCNT1=OCR1A), verändert Pin OC1A, zählt weiter bis 
0x3FF und verändert wieder OC1A. Daher bekomme ich eine PWM, deren 
Impulsdauer durch OCR1A bestimmt wird.

Mode 15 (Fast-PWM)
------------------
Zählt bis Match (TCNT1=OCR1A), verändert Pin OC1A und zählt nicht 
weiter bis 0xFFFF sondern fängt wieder bei Null an. Daher kriege ich 
hier keine PWM. Soweit sehe ich das ein.

Frage: Warum heißt Mode 15 dann Fast-PWM und wofür brauche ich den?

von Tobias (Gast)


Lesenswert?

Oh man, manchmal stehe ich echt auf dem Schlauch. Ist doch alles 
logisch, jetzt hab ich es geschnallt. Natürlich braucht man zwei 
Register, ich benutze jetzt noch ICR1. Mein Denkfehler war, dass ich mit 
ICR1 immer zwingend ein externes Signal verbunden habe aber das ist 
natürlich nicht notwendig.

Danke :)

von Hannes L. (hannes)


Lesenswert?

Tobias wrote:
> Oh man, manchmal stehe ich echt auf dem Schlauch. Ist doch alles
> logisch, jetzt hab ich es geschnallt. Natürlich braucht man zwei
> Register, ich benutze jetzt noch ICR1. Mein Denkfehler war, dass ich mit
> ICR1 immer zwingend ein externes Signal verbunden habe aber das ist
> natürlich nicht notwendig.
>
> Danke :)

Nunja, ICR1 dient ja auch vorrangig der Impulsbreiten- bzw. 
Periodendauermessung externer Signale am ICP-Pin mittels 
Input-Capture-Interrupt. Die Zweitnutzung als Timer1-TOP-Wert ist ein 
Sonderfall, der nichtmal bei allen AVRs üblich ist.
Dein Missverständnis ist also gar nicht so abwegig. ;-)

...

von Johannes A. (Gast)


Lesenswert?

Nein, das ICR dient bei allen AVRs seit dem mega64/128 nicht mehr 
vorrangig der Impulsbreiten- bzw. Periodendauermessung, sondern ganz 
regulär auch als TOP der PWM-Erzeugung. Das ist einfach eine Frage der 
Bibliotheken, aus denen die Chips zusammengestellt werden.

Chipentwicklung ist letztlich wie Programmieren: Bestimmte 
Funktionalitäten werden nicht mehr jedesmal neu formuliert, sondern 
einfach "inkludet". Der Entwickler mag dabei vielleicht noch die 
zugehörigen Register zurechtrücken können, aber auf die Grundfunktionen 
hat er keinen Einfluss mehr.

Gruß Johannes

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.