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
Sorry, war Unsinn was ich geschrieben habe. Ich übersah, dass du dem TCCR1A-Register die Werte direkt zuweist. 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.