Začátkem srpna 2026 se blog přestěhoval na novou adresu.
Mělo by automaticky dojít k přeměrování na novou adresu, pokud se to nestalo, musíte kliknout ručně.
Všechny nové články od začátku srpna 2026 už budou přibývat pouze na nové adrese.
Začátkem srpna 2026 se blog přestěhoval na novou adresu.
Mělo by automaticky dojít k přeměrování na novou adresu, pokud se to nestalo, musíte kliknout ručně.
Všechny nové články od začátku srpna 2026 už budou přibývat pouze na nové adrese.
![]() |
| Ppm po kalibraci říká chybu 0.5s za rok! |
![]() |
| Z měření, které program čte po GPIB se počítají zajímavé popisné statistiky |
< 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)
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ý
![]() |
| Allanův rozptyl[5] (AVAR) |
| Allanova odchylka (ADEV) |
DS3231 má vyvedený pin 32K, kde se po zapnutí napájení objeví aktuální takt krystalu. V ideálním světě by byl přesně 32768.0 Hz
![]() |
| úspěšný test |
![]() |
| selhání s frekvencí mimo toleranci |
![]() |
| frekvence plave už od začátku |
![]() |
| hledáme 70MHz |
Přesnému změření délky jedné celé periody vstupního signálu (tedy doby, po kterou je signál ve stavu HIGH + doby ve stavu LOW) pomocí počítání hodinových taktů mikrokontroléru. Program funguje tak, že si nastaví počítadlo (registr X) na maximum a neustále od něj odečítá jedničku, dokud se nedokončí celá jedna perioda signálu.
SynchronizacePIO automat čeká, dokud měřený pin (index 0) neklesne do logické nuly (LOW). Pokud už na nule je, okamžitě pokračuje dál. Zajišťuje to, že měření nezačne uprostřed již probíhajícího pulzu.
Detekce startu měřeníAutomat vyčkává na náběžnou hranu – okamžik, kdy se pin překlopí z logické 0 na logickou 1 (HIGH). Přesně v tento moment začíná nová perioda a odstartuje se počítání.
Inicializace počítadlaNastaví hodnotu v interním 32bitovém pracovním registru X na nulu (0x00000000).
Příprava maximaProvede bitovou inverzi registru X. Ze samých nul se rázem stane maximální 32bitová hodnota, tedy 0xFFFFFFFF (desítkově 4 294 967 295). Registr se používá jako odpočítávadlo (od maxima směrem dolů).
Smyčka pro úroveň HIGHZkontroluje aktuální stav pinu, který byl nastaven jako skokový (jmp_pin v C kódu). Pokud je na pinu stále logická 1, program skočí na instrukci 6. Pokud je na pinu už logická 0 (začala druhá půlka periody), instrukce neprovede skok a program pokračuje na řádek 5.
Opuštění HIGH smyčkyTento řádek se vykoná pouze ve chvíli, kdy měřený signál spadl z HIGH do LOW. Jedná se o nepodmíněný skok na instrukci 8, čímž se opustí první měřící smyčka a plynule se přejde do druhé měřící smyčky.
Vyrovnání taktu (Smyčka HIGH)Prázdná operace (No Operation), která nedělá nic, ale spotřebuje přesně 1 hodinový takt procesoru. Slouží k tomu, aby jeden oběh HIGH smyčky trval přesně stejný počet taktů bez ohledu na to, kudy kód prochází (udržuje precizní a konstantní časování celého čítače).
Odkrojení taktu (Smyčka HIGH)Sníží hodnotu v registru X o 1 (dekrementuje). Následně skočí zpět na instrukci 4, čímž uzavírá smyčku, která počítá takty, dokud je signál v úrovni HIGH.
Smyčka pro úroveň LOWJsme v měření úseku, kdy je signál dole (LOW). Tato instrukce se ptá: "Naskočil už signál znovu na logickou 1?" Pokud ano (detekována další náběžná hrana = celá perioda je u konce!), skočí se na instrukci 11 a měření se ukončí. Dokud je signál stále v nule, pokračuje se dál na řádek 9.
Vyrovnání taktu (Smyčka LOW)Znovu trik pro udržení stejného počtu taktů. Skočením rovnou na následující řádek 10 se úmyslně spotřebují (spálí) hodinové takty procesoru, aby byla délka LOW smyčky naprosto symetrická (trvala stejný čas) jako HIGH smyčka výše.
Odkrojení taktu (Smyčka LOW)Sníží hodnotu v registru X o 1 a skočí zpět na instrukci 8. Toto uzavírá smyčku, která běží po celou dobu, kdy je signál na logické nule.
Uložení výsledkuJakmile perioda skončila (na pinu se objevila jednička), program se dostal sem. Hodnota z registru X (od čísla 0xFFFFFFFF se mezitím v obou smyčkách odečetl počet uplynulých taktů procesoru) se překopíruje do vstupního posuvného registru (ISR).
Odeslání výsledkuHodnota z ISR se protlačí do RX FIFO paměťové fronty. Z této paměti si už výsledek přečte hlavní C kód (pio_sm_get). Po provedení push se program – díky wrap v hlavním programu – automaticky a bez jakéhokoliv zdržení zacyklí zpět na začátek měření pro další periodu.
Další informace jsou v komentářích viz program [pico_reciprocni_citac] pro Arduino IDE.
Začátkem srpna 2026 se blog přestěhoval na novou adresu. Mělo by automaticky dojít k přeměrování na novou adresu, pokud se to nestalo, musít...