Forum: Mikrocontroller und Digitale Elektronik XMega, Timer, Hi-Res, Frequency Waveform Generation


von Johannes R. (jor)


Lesenswert?

Hallo,
ich habe folgendes Problem. Ich betreibe einen Timer des XMega (Hi-Res 
Erweiterung) mit 120 MHz und generiere damit ein Rechtecksignal mit 
variabler Frequenz (Frequency (FRQ) Waveform Generation).
Es besteht jedoch kein linearer Zusammenhang zwischen dem Compare-Match 
Wert und der Frequenz des am Pin anliegenden Signals. Folgende Messungen 
habe ich durchgeführt.
1
CCA (Compare Match)  gemessene Frq.  res. Per.-Frq.
2
100                  577,4 kHz       117 MHz
3
50                   1,111 MHz       113 MHz
4
20                   2,5   MHz       105 MHz
5
10                   4,292 MHz        94 MHz
6
5                    6,667 MHz        80 MHz
7
4                    7,519 MHz        75 MHz
8
2                    10,0  MHz        60 MHz
9
1                    12,05 MHz        48 MHz
10
0                    14,93 MHz        29 MHz

Den Wert für die resultierende Peripherie Frequenz habe ich mit der im 
Datenblatt Angegebenen Formel:

Wie kommt es zu diesem Zusammenhang? Ist er irgendwo im Datenblatt oder 
einer Application Note beschrieben?

von Karl H. (kbuchegg)


Lesenswert?

Jo R. schrieb:

> Den Wert für die resultierende Peripherie Frequenz habe ich mit der im
> Datenblatt Angegebenen Formel:
>
>
> Wie kommt es zu diesem Zusammenhang? Ist er irgendwo im Datenblatt oder
> einer Application Note beschrieben?


Nachdenken.

Dein Timer ist im Grunde nur ein Teiler. Wenn der Timer bei jedem 2.ten 
Taktsignal einen Compare Match auslöst dann tritt dieses Ereignis 
logischerweise halb so oft auf, wie du Pulse im Taktsignal hast. Du hast 
damit die Frequenz effektiv halbiert.

Löst der Timer nur bei jedem 3.ten Taktisgnal den Compare Match aus, 
dann kommen die Compare Matches logischerweise mit 1/3 der Frequenz des 
Taksignales.

Allgemeiner: Löst der Timer bei jedem n-ten Taktisgnal einen Compare 
Match aus, dann tritt das Ereignis 'Compare Match' mit 1/n der 
Taktfrequenz auf.

Das erklärt schon mal, warum in der Formel F_per und CCA vorkommen und 
warum F_per durch CCA geteilt wird.

Warum CCA+1

Ganz einfach. Damit der Timer 3 Takte abzählt, muss er zählen: 0, 1, 2
d.h. der Compare Match muss bei 2 kommen, damit 3 Takte vergehen. der 
Zählerstand 0 ist ja auch noch da.

Und dann bleibt noch das * 2

Wenn du mit dem Compare Match, bei jedem Auftreten eines Compare Match 
einen Ausgangspin toggelst, dann brauchst du logischerweise 2 Compare 
Matsches, bis du den Ausgang von 0 über 1 wieder auf 0 zurückgebracht 
hast.
Eine 'Schwingung' beginnt bei 0 und endet wenn der Ausgang wieder 0 
wird. Daher brauchst du 2 Compare Matches und daher halbiert sich die 
bisher errechnete Frequenz noch.

von Karl H. (kbuchegg)


Lesenswert?

Deine Tabelle res. Per.-Frq. kann nicht stimmen.
Aus der Formel ist völlig klar, dass der Wert kleiner werden muss, wenn 
CCA größer wird.

1/2 ist nun mal größer als 1/3 und das ist größer als 1/4, etc.
Je größer der Nenner in einem Bruch wird, desto kleiner wird der Wert 
des Bruches.

von Karl H. (kbuchegg)


Lesenswert?

> Es besteht jedoch kein linearer Zusammenhang zwischen dem
> Compare-Match Wert und der Frequenz des am Pin anliegenden Signals.

Das ist richtig.
Siehe Formel.

Es ist ein 1/n Zusammenhang.

von jor (Gast)


Lesenswert?

Vielen Dank für die ausführlichen Antworten. Aber ich habe mich wohl 
leider missverstädnlich/falsch ausgedrückt. Es ist kein linearer 
Zusammenhang.

Mein Problem ist: Ich takte den Timer mit 120MHz. Wenn ich jetzt den 
CompareMatch auf z.B. CCA=10 stelle, dann müsste ich einen Takt mit der 
Frequenz von 5,45 MHz am Pin haben. Gemessen beträgt dieser aber nur 
4,292 MHz.

von Karl H. (kbuchegg)


Lesenswert?

jor schrieb:

> Mein Problem ist: Ich takte den Timer mit 120MHz. Wenn ich jetzt den
> CompareMatch auf z.B. CCA=10 stelle, dann müsste ich einen Takt mit der
> Frequenz von 5,45 MHz am Pin haben. Gemessen beträgt dieser aber nur
> 4,292 MHz.

2 Möglichkeiten

* Fehlmessung

* Nachdem wir davon ausgehen können, dass sich der Timer wohl kaum
  verzählen wird, werden dann wohl die 120Mhz nicht so ganz stimmen.
  Wo kommen die denn her?

von Johannes R. (jor)


Lesenswert?

Aber wie in der Tabelle zu sehen ist müssten sich dann die 120 MHz 
verändern wenn ich ausschließlich den CCA Wert im Programm verändere.

Fehlmessung kann ich natürlich nicht ganz ausschließen aber ich messe 
mit einem Rigol DS1102E und traue diesem zu, dass es sich bei CCA=0 
(14,93MHz) nicht um >400% vermisst

Die 120 MHz kommen aus der internen PLL mit Faktor 4. Diese wird über 
einen externen Quarzoszillator versorgt mit 30MHz.
Der externe Quarzoszillator hat an seinem Ausgang laut Oszi einen Takt 
von 29,94MHz. Damit schließe ich persönlich den Messfehler aus.

von Karl H. (kbuchegg)


Lesenswert?

Jo R. schrieb:
> Aber wie in der Tabelle zu sehen ist müssten sich dann die 120 MHz
> verändern wenn ich ausschließlich den CCA Wert im Programm verändere.

Ach, jetzt versteh ich.
Du hast die Timer Frequenz aus der gemessenen zurückgerechnet!

Das sieht in der Tat dann seltsam aus.

von Helmut (Gast)


Lesenswert?

>Die 120 MHz kommen aus der internen PLL mit Faktor 4. Diese wird über
>einen externen Quarzoszillator versorgt mit 30MHz.
>Der externe Quarzoszillator hat an seinem Ausgang laut Oszi einen Takt
>von 29,94MHz. Damit schließe ich persönlich den Messfehler aus.

Autsch. IMHO verträgt (lt. Datenblatt) der XMega 4...16Mhz externen 
Oszillator. Das gilt zumindest für den XMega128A1.
Läuft der XMega sicher mit externem Quarz??

von jor (Gast)


Lesenswert?

Nein mit externem Quarzoszillator. Im Datenblatt steht nicht explizit 
drin in welchem Bereich die external clock liegen darf aber in einem 
Diagramm (Active Supply Current vs. Frequency) geht sie auf jeden Fall 
bis 32 MHz.

Wie gesagt Probleme mit der Taktversorgung schließe ich eigentlich aus 
da bei großen Compare-Match-Werten CCA die Taktversorgung stimmt.

Initialisierung Takt:
1
   CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,                    // Frequency range for high-frequency crystal, does not apply for external clock or 32kHz crystals.
2
                       false,                                     // True of high-quality watch crystals are used and low-power oscillator is desired.
3
                       OSC_XOSCSEL_EXTCLK_gc );                   // Combined selection of oscillator type (or external clock) and startup times.
4
   CLKSYS_Enable(OSC_XOSCEN_bm);
5
   do {} while ( CLKSYS_IsReady(OSC_XOSCRDY_bm) == 0 );
6
   CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 4);                     // Configuration of the internal high-frequency PLL
7
   CLKSYS_Enable(OSC_PLLEN_bm);                                   // enables the selected oscillator
8
   CLKSYS_Prescalers_Config(CLK_PSADIV_1_gc, CLK_PSBCDIV_2_2_gc); // Configuration System Clock Prescalers
9
   do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
10
   CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );          // selects the main system clock source
11
   CLKSYS_Disable(OSC_RC2MEN_bm);                                 // disable the internal 2 MHz RC Oscillator

Initialisierung Timer:
1
   /* @brief Enable High-Resolution Mode */
2
   HIRESD.CTRL = HIRES_HREN_TC1_gc;
3
4
   TCD1.CTRLB = TC1_CCAEN_bm | TC_WGMODE_FRQ_gc;
5
   TCD1.CCA = 20;
6
   TCD1.CTRLA |= TC_CLKSEL_DIV1_gc;

von ich (Gast)


Lesenswert?

5 Sekunden ins Datenblatt geschaut:

• External clock options
– 0.4 - 16 MHz Crystal Oscillator
– 32.768 kHz Crystal Oscillator
– External clock

von ich (Gast)


Lesenswert?

> CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,

12TO16... da stehts auch!

von Johannes R. (jor)


Lesenswert?

ich schrieb:
> 5 Sekunden ins Datenblatt geschaut:
>
> • External clock options
> – 0.4 - 16 MHz Crystal Oscillator
> – 32.768 kHz Crystal Oscillator
> – External clock

also unter einem Quarzoszillator versteht man bzw. ich eine fertige 
Oszillatorschaltung die einen bestimmten Takt liefert. dieser ist in 
meinem Fall 30MHz und an XTAL1 angeschlossen. Im Datenblatt wird diese 
Art von Taktversorgung "External clock" genannt.

von Johannes R. (jor)


Lesenswert?

ich schrieb:
>> CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,
>
> 12TO16... da stehts auch!

Das hat wenn man als Eingang "external Clock" wählt keinen Einfluss. Ich 
hätte da beliebig etwas angeben können.

von ich (Gast)


Lesenswert?

Ach so, dann hab ich dich falsch verstanden.
Man hat doch beim xmega die möglichkeit die fper auf einem Pin aus zu 
geben, oder? Das würd ich mal versuchen.

Ich würde auch mal versuchen deine 30MHz über den Vorteiler an die PLL 
zu geben, so wie auch der interne 32MHz Oszillator angeschlossen ist.

von ala42 (Gast)


Lesenswert?

Das Datenblatt sagt: fFRQ = fPER/(2*(CCA+1))
Gemessen hast Du: fFRQ = fPER/(2*(CCA+4))
Scheint so, als wenn bei der hohen fPER da noch drei zusätzliche Takte 
verbraten werden, bis der Teiler wieder scharf ist.

von Hagen R. (hagen)


Lesenswert?

Der Timer läuft bis 32Mhz und an CPU_PER und nicht CPU_PERx4. Du hast 
den HiRes Modus noch nicht korrekt verinnerlicht. Im HiRes Modus läuft 
der Timer immer noch mit CPU_PER also mit max. 32MHz und gleichem Takt 
wie die CPU. Die somit erzeugbaren Frequenzen beziehen sich max. auf 
32MHz. Dabei zählt der Timer intern aber +4 statt +1 und vergleicht die 
untersten 2 Bits mit einem speziellen Hardware Comparator der mit 
CPU_PERx4 laufen kann.

Anders ausgedrückt: zeige uns im Datenblatt wie du den Timer mit 
CLK_PERx4 takten kannst statt mit CLK_PER=CLK_CPU.
Imk HiRes Modus taktet man mit CLK_PERx4 nur einen schnellen 2Bit 
Comparator der die untersten 2 Bits der Compare Register vergleicht.

Ergo: Frequenzauflösung des Timer wie bei 32MHz aber PWM Auflösung um 
Faktor 4 erhöht so als ob die Compare Register mit 32x4 MHz laufen 
würden.

Gruß Hagen

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.