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
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?
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!
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
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.
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
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
@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?
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 :)
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. ;-)
...
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