Forum: Mikrocontroller und Digitale Elektronik STM32: Jitter PLL Frequenzerzeugung


von Curby23523 N. (Gast)


Lesenswert?

Hallo,

ich benutze einen STM32F413VGT6, mit einem 8MHz Quarz und PLL, um 72MHz 
System/Timertakt zu erzeugen.

Wenn ich nun eine Frequenz um ca. 400kHz erzeuge und ausgeben lasse, 
dann driftet diese um 2 bis 4 kHz, ist also nicht sonderlich stabil. Mir 
ist klar, dass dies bei niedrigeren Frequenzen stabiler wäre, jedoch:

Ist dies noch im Rahmen? Kann ich den Jitter irgendwie verbessern? Die 
Teiler/Multiplikatoren der PLL lauten:

PLL = 8MHz / 4 * 72 / 2;

Für Ideen wäre ich dankbar, ich hätte es gerne etwas genauer. Wenn ihr 
spezifische Codeabschnitte braucht teile ich diese gerne. Ein paar 
Bitmasken fehlen mir noch im folgenden Code. Gibt es für mehrstellige 
Bitfelder gute vordefinierte Masken in der CMSIS?
1
  /*############################CPU Clock einstellen############################*/
2
  FLASH->ACR = 3;                                  //3 Waitstates
3
  RCC->CR |= RCC_CR_HSEON;                            //Extenen Quarz an
4
  while(!(RCC->CR & RCC_CR_HSERDY));                        //Auf Quarz warten
5
  RCC->PLLCFGR &= 0xffff0000;                            //PLLCFGR Reseten
6
  RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC;                        //HSE als Source
7
  RCC->PLLCFGR |= 0x04;                              //PLL Pre Divider = 8 -> 2Mhz
8
  RCC->PLLCFGR |= (72UL<<6);                            //PLL Multiplikaor = 72
9
  RCC->CFGR |= (0b100 << 10); //APB1 Teiler
10
  RCC->CR |= RCC_CR_PLLON;                            //PLL an
11
  while(!(RCC->CR & RCC_CR_PLLRDY));                        //Auf PLL warten
12
  RCC->CFGR |= 0b10;                                //PLL auswählen
13
  while((RCC->CFGR & 0x0C) != 0b1000);                      //Auf PLL warten
14
  RCC->CR &= ~(RCC_CR_HSION);                            //HSI aus
15
  FLASH->ACR |= FLASH_ACR_PRFTEN;

von m.n. (Gast)


Lesenswert?

Nils N. schrieb:
> Wenn ich nun eine Frequenz um ca. 400kHz erzeuge und ausgeben lasse,
> dann driftet diese um 2 bis 4 kHz, ist also nicht sonderlich stabil.

Lösche alle delay() und nimm einen Timer.

von Curby23523 N. (Gast)


Lesenswert?

m.n. schrieb:
> Nils N. schrieb:
>> Wenn ich nun eine Frequenz um ca. 400kHz erzeuge und ausgeben lasse,
>> dann driftet diese um 2 bis 4 kHz, ist also nicht sonderlich stabil.
>
> Lösche alle delay() und nimm einen Timer.

Ach, echt..? ;)...

Natürlich verwende ich einen Hardware Timer mit Output-Compare..

von Dr. Sommer (Gast)


Lesenswert?

Bitte den Quellcode mithilfe der Konstanten aus den Headern neu 
schreiben, ala RCC_CFGR_SWS und Konsorten. So kann das keine Sau lesen.

von A. B. (Gast)


Lesenswert?

Nils N. schrieb:

> Wenn ich nun eine Frequenz um ca. 400kHz erzeuge und ausgeben lasse,
> dann driftet diese um 2 bis 4 kHz, ist also nicht sonderlich stabil. Mir

Was soll das "driften" denn eigentlich heißen??? Und was soll der 
Abschnitt
mit der Initalisierung des System-Taktes??? Wo ist der "interessante", 
nämlich der des angesprochenen Timers???

Wenn man den Verdacht hat, dass die PLL der Übeltäter ist: den MCO 
Ausgang nutzen und da einen Frequenzzähler dran klemmen. Oder alternativ 
den HSE-Takt direkt als Systemtakt verwenden, ohne PLL, geht doch auch. 
(Wobei 1% schon recht übel wäre; wenn es tatsächlich der Systemtakt sein 
sollte, hätte ich eher den Oszillator in Verdacht, ungünstiges Layout 
oder so.)

Sobald klar ist, ob der Oszillator, der Systemtakt oder eben nur die 
Ausgangsfrequenz "instabil" ist, wär' man ja schon ein gutes Stück 
weiter?!

von Curby23523 N. (Gast)


Angehängte Dateien:

Lesenswert?

Driften bedeutet, dass die Frequenz um +- 4kHz hin und her schwankt.

Der Quarz schlittert auch deutlich, aber auch mit dem internen OSC habe 
ich den Jitter. Die Ausgabe des Systemtakt als 72MHz / 4 auf MCO_2 zeigt 
eine Frequenz um 18MHz +- 0,08. Auf dem Screenshot sieht man den 
Systemtaktausgang und wie das ganze periodisch schwankt, sprich die 
Schwebung.

Den Timer konfiguriere ich mit folgenen Zeilen:
1
TIM1->CCMR1 |= (0b011 << 4); //Ausgang toggeln
2
TIM1->CCER |= TIM_CCER_CC1E;                         
3
TIM1->BDTR |= TIM_BDTR_MOE;
4
TIM1->ARR = 0xffff;              
5
TIM1->CR1 |= TIM_CR1_CEN;

Mein Quarz hat 18pf Kondensatoren bekommen und an OSC_OUT einen 220 Ohm 
Widerstand.

von holger (Gast)


Lesenswert?


Beitrag #5308000 wurde von einem Moderator gelöscht.
von Frickelfritze (Gast)


Lesenswert?

Nils N. schrieb:
> Die Ausgabe des Systemtakt als 72MHz / 4 auf MCO_2 zeigt
> eine Frequenz um 18MHz +- 0,08.

Die Messung mittels Digital-Oszilloskop ist stark fehler-
behaftet und hat nur sehr geringe Aussagekraft!

Messe mit einem Frequenzzähler oder einem Spektrumanalysator.

Unterscheide klar <Drift> und <Jitter>.

von Frickelfritze (Gast)


Lesenswert?

Nils N. schrieb:
> Auf dem Screenshot sieht man

... (dumpf) nicht viel.

Besser wird es mit

http://www.ko4bb.com/TDS2xxDump/

von Curby23523 N. (Gast)


Angehängte Dateien:

Lesenswert?

Ok. Mit dieser PLL gebe ich mit einem Hardwaretimer eine 420kHz Frequenz 
mit output compare aus. Diese Frequenz schwankt von 418-422kHz in einem 
Zeitraum von 40µS. Ist das noch im Rahmen? Ich finde nicht.

Frickelfritze schrieb:
> Nils N. schrieb:
>> Auf dem Screenshot sieht man
>
> ... (dumpf) nicht viel.
>
> Besser wird es mit
>
> http://www.ko4bb.com/TDS2xxDump/

Ich habe kein RS232 Modul und habe auch nicht vor es zu kaufen, danke. 
Ich finde man erkennt genug.

von Frickelfritze (Gast)


Lesenswert?

Nils N. schrieb:
> Ist das noch im Rahmen? Ich finde nicht.

Hast du es nicht verstanden?

Das Oszilloskop misst praktisch "grafisch" die Periodendauer
und gibt dir die berechnete Frequenz dazu aus. Das ist
verdammt ungenau.

Etwas besser wird es wenn du nur zwei oder drei Perioden
darstellst.

von Felix (Gast)


Lesenswert?

Ich finde, es sieht wie eine Schwebung aus, die durch zeitdiskretes 
Abtasten auftritt.

Du könntest das hier mal versuchen:
-stelle die Timebase so ein, dass nur etwa 4 Rechtecksignale 
gleichzeitig sichtbar sind.
-Trigger Singleshot

Jetzt löse den Trigger viele Male (größer 20 würde ich sagen) aus und 
prüfe jedesmal, ob die Rechtecke zur vorigen Messung unterschiedlich 
breit sind und wenn ja, wie groß der Unterschied ist.
Wenn es sich um ein HW-Phänomen handelt, müssten irgendwann mal 
Rechteckbreiten vorhanden sein, die merklich von dem erwarteten Wert 
abweichen, sowohl nach oben als auch nach unten.

Wenn das nicht der Fall ist, hat dich das Bild deines Tektronix 
wahrscheinlich auf die falsche Fährte geführt.

Dieser STM hat auch keine SpreadSpectrum-Funktion soweit ich das in 
CubeMX auf die Schnelle gesehen habe, die sowas erklären würde.

von pegel (Gast)


Lesenswert?

Nils N. schrieb:
> Der Quarz schlittert auch deutlich,

Ich habe das eben mit dem F103 probiert, allerdings mit HAL, dürfte aber 
keine Rolle spielen.
HSE direkt an MCO 8,00066 MHz stabil über Minuten.
Mit HSI bei PLL 64 MHz / 2 habe ich auch genau diese +- 4kHz.
Mit HSE bei PLL 72 MHz / 2 habe ich allerdings konstant 36,0030MHz.

Bist du sicher das er wirklich HSE benutzt und nicht durch einen Fehler 
im HSE Zweig wieder auf HSI schaltet?

Gemessen mit DS1054Z.

von Karl (Gast)


Lesenswert?

Frickelfritze schrieb:

> Das Oszilloskop misst praktisch "grafisch" die Periodendauer
> und gibt dir die berechnete Frequenz dazu aus.

"grafisch" - Was heißt das genau?

> Das ist verdammt ungenau.

Kannst du das belegen oder ist das nur eine Bauchmeinug?

Dein Nick ist nicht gerade vertrauenerweckend.

von Verzweifelt an PIC (Gast)


Lesenswert?

Nur mal eine Frage: Auf deinem Oszi steht eine Bandbreite von 60MHz und 
du misst ein 72MHz Signal? Stimmt dezent was nicht oder?

von pegel (Gast)


Lesenswert?

Er misst 72MHz/4 passt schon.

von Curby23523 N. (Gast)


Lesenswert?

Verzweifelt an PIC schrieb im Beitrag #5308062:
> Nur mal eine Frage: Auf deinem Oszi steht eine Bandbreite von 60MHz und
> du misst ein 72MHz Signal? Stimmt dezent was nicht oder?

Ich mess 18MHz, weil der STM32 mir die 72MHz geteilt durch 4 ausgibt. 
Das ist also soweit in Ordnung.

pegel schrieb:
> Bist du sicher das er wirklich HSE benutzt und nicht durch einen Fehler
> im HSE Zweig wieder auf HSI schaltet?

Dass der HSI ungenau ist und größere Temperaturdrift hat, ok. Aber auch 
der sollte nicht so einen Jitter haben.

Felix schrieb:
> Dieser STM hat auch keine SpreadSpectrum-Funktion soweit ich das in
> CubeMX auf die Schnelle gesehen habe, die sowas erklären würde.

Hat er, ist aber deaktiviert. Zumindest sehe ich das im Datenblatt.



Evtl. hilft hier mal ein analoges Oszilloskop zu verwenden.

von pegel (Gast)


Lesenswert?

Nils N. schrieb:
> Aber auch der sollte nicht so einen Jitter haben.

Wenn ich mir das HSI Tastverhältnis ansehe, ist schon fast 1% drin.

von Walter T. (nicolas)


Lesenswert?

Nils N. schrieb:
> sprich die
> Schwebung.

Welche Schwebung? Eine Schwebung kann es nur zwischen zwei Signalen 
geben. Auf dem Bild sieht man erst einmal nur, daß Du die Zeitauflösung 
nicht fein genug eingestellt hast.

Wenn Du den Jitter sehen willst, stell das Oszilloskopbild auf ewig 
nachleuchten und die Zeitauflösung auf 10 ns.

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.