Úprava přesnosti hodin nastavením registru 0x10 (Aging Offset) pro kompenzaci stárnutí krystalu.
Tester[1] mně pomohl jednoduše roztřídil moduly na ty, co nemají kompenzaci nebo mají příliš ujetou frekvenci Zůstaly moduly s funkční teplotní kompenzací a stabilní frekvencí, žel jsou frekvenčně posunuté o ±2 až ±3 ppm, což by mělo jít vyřešit. DS3231 má registr 0x10 (Aging Offset) pro kompenzaci stárnutí krystalu.
Tohle laboratorní cvičení se neobejde bez přesného čítače frekvence. Měření [mikrokontrolerem] je dobré na relativní měření; měří přesně a opakovaně; ale na absolutní čísla to není. Je to jako měření plastovým pravítkem, které někdo nahřál a roztáhl. Měří pořád stejně přesně, ale oproti realitě je měření posunuté.
Zde nastupuje 40 let starý PM6654, má rozlišení 2ns a poslední kalibrací prošel v lednu 2026. Vstup 1MΩ; Pin 32K připojen osciloskopickou sondou (nastaveno na 10:1)
Komunikace po I²C
Raspberry Pi Pico (nebo jakýkoli jiný MCU) má na I²C připojený měřený modul a dělá komunikační rozhraní pro Python. Komunikuje pomocí jednoduchých textových příkazů posílaných po sériové lince. Dá se používat pohodlně ze sériového monitoru z Arduino IDE:
Mám tu [CP2112], který jsem potřeboval pro komunikaci s baterií notebooku, ale rozdělit komunikaci na python ↔ měřák | python ↔ pico | pico ↔ modul se bude lépe ladit.
pico_DS3231_I2C_Full_Manager.ino [ke stažení]
obsahuje komunikaci po sériovém rozhraní, komunikuje se textovými příkazy
příkaz HELP vypíše možnosti
Kalibrátor v Pythonu
AR488-PM6654-DS3231-calibrator.py [ke stažení]
– Načte hodnotu kompenzačního offsetu z registru.
– Provede měření před kalibrací
Po GBIP čte stav čítače (např. FA 32.76805515E+3). Délku měření volím 360 sekund. Čítač má nastavenou dobu „hradlování“ gate na 10s, tj. čas po který průměruje měření než ho odešle.
– Spočte kalibrační offset a po I²C uloží. Registr 0x10 je 8bitový; rozsah od -127 do +127, kde 1 krok je 0,1ppm; která se přičítá nebo odečítá
– Provede měření po kalibraci
– Počítá základní statistiky
– Kreslí graf
|
| po třech iteracích lze dosáhnout pěkné přesnosti (z chyby 10s za měsíc na chybu 10s za rok) |
|
| Ppm po kalibraci říká chybu 0.5s za rok! |
Výpadek napájení smaže kalibraci
Zápis do registru 0x10 není navždy, při odpojení baterie a ztrátě napájení se smázne a vynuluje. Většinu modulů, co se snažím zkalibrovat mám v šuplíku bez záložní baterie. Proto hledám řešení jiné, než moduly očíslovat a vést si tabulku kompenzací, kterou tam nastavím až budu modul potřebovat. Naštěstí má modul ZM-042 nebo HW-084[2] na sobě má EEPROM na I²C adrese 0x57. Komunikační rozhraní pico_DS3231_I2C_Full_Manager.ino zajistí, že při uložení kalibrace do DS3231 zároveň uloží do EEPROM stejnou informaci a když stejným komunikačním rozhraním ověřím příkazem PING, jestli DS3231 komunikuje, tak si načte infromaci o kalibraci, pokud je tam uložená.
Je to krok stranou pro to, abych mohl kalibrovat bez nutnosti záložní baterie. Až budu modul potřebovat, dám baterii, načtu uloženou kalibraci z EEPROM a dál už to bude jen na záložní baterii.
Trocha deskriptivní statistiky
|
| Z měření, které program čte po GPIB se počítají zajímavé popisné statistiky |
– Ochylka v ppm[1] je relativní odchylka průměrné frekvence od ideální hodnota 32768.0 Hz
– Jitter[3] je maximální rozkmit. Ukazuje rozdíl mezi nejvyšší a nejnižší naměřenou frekvencí. Ukazuje hned nejhorší měření, je to přesně opak průměrování.
– Časový drift jenom přepočítává relativní chybu ppm na reálný čas. Třeba pro den (86400s) se spočte 86400 × (PPM / 1E6)
Jaký je šum zdroje signálu
Kalibrace nám nepomůže se šumem samotného krystalu. Ale informace o něm považuji za zajímavé. V kalibračním programu počítame i Allan Dev
– Allanova odchylka je informace o stabilitě oscilátoru. Udává se v ppb.
Pro moje měření v 10s balíčcích
< 10 ppb ... čip je v optimálním a klidném prostředí10 až 50 ppb ... pokoj s prouděním vzduchu50 až 100 ppb ... nadměrný šum, to už je něco špatně (krystal vedle ventilátoru = mechanické vibrace; nestabilní napájení; vadný čip)
Jak to číst, když měření vyjde třeba 8ppb
Kolísání frekvence mezi dvěmi sousedními 10s měřemi bylo 8 miliardtin. Pro frekvenci 32768Hz
Allanova odchylka měří stabilitu (šum), jak moc krystal náhodně plave v krátkodobém časovém horizontu; proto kalibrace na toto měření nebude mít vliv. Běžná směrodatná odchylka předpokládá, že celkový průměr se nemění. Allanova odchylka vyhodnocuje rozdíly mezi sousedícími vzorky. Tím odfiltruje pomalý drift a ukáže čistý krátkodobý šum krystalu. Výsledek se násobí 1E9 a uvádí se v ppb.
Napsat definici, tak to zabiju hned na začátku: Allanova odchylka je druhá odmocnina z Allanova rozptylu[4]. Vzah je stejný jako mezi směrodatnou odchylkou a rozptylem.
Takto se běžně zapíše vzorec, který mně není na první pohled jasný
tohle si musím přepsat, abych to viděl jasněji; jsem hrubě podprůměrný matematik
a teď si vzorec přečtu:
– odchylka σ pro časové okno měření τ
– N počet naměřených vzorků
– N počet naměřených vzorků
– i je index vzorku, suma v cyklu běží od i=1 do N–1
– yᵢ říká jak moc se naměřený vzorek fᵢ liší od ideální hodnoty fₙₒₘ (32768Hz). Čitatel (fᵢ –fₙₒₘ) dává chybu v Hz a jmenovatel /fₙₒₘ vykrátíme jednotky, aby vzniklo pouze bezrozměrné číslo (poměr). Říkáme tomu zlomková frekvence.
– sčítáme rozdíly sousedních vzorků; to mocnění je tady proto, aby nám kladné a záporné rozdíly neodčítaly. Prostě sčítáme plochy jednotlivých výkyvů frekvence.
– průměr ze všech výkyvů frekvence meti vzorky, tedy dělíme N–1, tj. vypočteme průměrný čtverec rozdílu mezi dvěma měřeními; počítáme z dvojic měření (100 vzorků udělá 99 rozdílů)
– 1/2 Proč z toho průměru bereme jen polovinu? Tohle je jediná neintuitivní věc z celého vzorce. Když odečteme dva šumy od sebe, tak se energie šumu sečte; statistik by řekl, že odečtením dvou náhodných veličin se rozpyty (zde energie šumu) nevyruší, ale sečtou. Nejistota (šum) nemůže být záporná. Protože počítáme rozdíl dvou proměnných, jejichž šum je nezávislý, rozptyl (šum) tohoto rozdílu se uměle zdvojnásobí; průměr z těchto měření vyjde taky dvojnásobný, proto musíme vzít jen polovinu, abychom dostali skutečnou fyzikální úroveň šumu
– celé to odmocníme abychom se vrátili z energie šumu do amplitudy šumu; při sčítání se to mocnilo proto, aby všechny rozdíly byly kladné; tím jsme ale změnili jednotku na ppb², která je k ničemu. Odmocněním to vrátíme zpátky.
Pro úplnost shrnutí, že ADEV = sqrt(AVAR)
|
| Allanův rozptyl[5] (AVAR) |
|
| Allanova odchylka (ADEV) |
Podrobnější výklad viz str. 5 [Vigner/2017] kapitola 2.2 o měření časové a frekvenční stability.
Co DS3231 ukáže ve spektrální oblasti
32768Hz je frekvence a přesně 1024Hz od ní vidím fázový šum.
Toto rušení je produkt vnitřní děličky v čipu.
Lze si prohlédnout pouze polovinu grafu od špičky směrem doprava. Šumový graf.
Sukýnka kolem nosné frekvence je symetrická. Vezmu jen pravou polovinu toho grafu a rozbalím si ji do logaritmické stupnice. Vrchol meřeného signálu (32768) je teď v 0Hz a směrem doprava se posunujeme po grafu. Výhoda je, že rozsah 10Hz – 100Hz má na šumovém grafu stejný prosto jako 1Khz – 100kHz.
Jednotka dBc/Hz jsou dB „realative to Carrier“, což chápu jako „decibely pod špičkou“.
„Hloubka v dBc/Hz pod špičkou“ udává, o kolik decibelů je šum v okně 1Hz slabší než celkový výkon užitečného signálu.Čím hlouběji pod špičkou = čím je číslo zápornější, tím čistsí a kvalitnějí je sledovaný signál.