18.4.2012 V diskusi u Danyka se řešila otázka, jak moc je vhodné použití síťového kmitočtu jako časové základny pro digitální hodiny. V minulosti se tento způsob skutečně používal, neboť návrh zjednodušil a zlevnil o krystalový oscilátor a 5 - 6 čítačů typu MH7490. Podle normy je jmenovitý kmitočet sítě 50 Hz ±1% (po 99,5% roku). To by v nejhorším případě znamenalo časovou odchylku 864 s (14,4 minuty), což by bylo naprosto nepoužitelné. V případě hodin nás ale příliš nezajímá okamžitá odchylka (to 1% fakt okem na displeji nepoznáte), mnohem důležitější je dlouhodobá stabilita. Jinak řečeno, kmitočet musí mít dlouhodobě přesnou střední hodnotu, ale může mít i větší rozptyl. Někde jsem slyšel, že se v dnešní době provádí denní dorovnávání počtu period síťového napětí tak, aby se průměrná hodnota kmitočtu co nejvíce blížila 50 Hz, tzn. 4320000 period za den.
Rozhodl jsem se to ověřit jednoduchým pokusem. Využil jsem k tomu desku s MCU Atmel ATmega128, kterou jsem vyrobil v rámci diplomky. MCU si generuje hodinový kmitočet z krystalového oscilátoru na 16 MHz. Při stabilitě ±20 ppm může být denní odchylka asi 2 vteřiny. Pro přesnější měření by bylo nutno použít čas z přijímače GPS, DCF77 či NTP serveru. Nicméně pro hrubé posouzení, zdali je síť přesná jako krystal nebo mnohem horší to postačí. K desce jsem připojil alfanumerický LCD, abych mohl odchylku průběžně sledovat. Síťový kmitočet se měří přes trafo s výstupním napětím 6 V, které je upraveno jednoduchým tvarovacím obvodem:
První dioda propustí pouze kladnou půlvlnu, jejíž amplituda je omezena odporem a bílou LED (neměl jsem po ruce zenerku na malé napětí). Případný VF bordel potlačí kondenzátor. Výstup z tvarovače je připojen na vstup MCU INT1, který generuje přerušení při náběžné hraně. Obslužná rutina přerušení inkrementuje 32-bitový SW čítač. Druhý 32-bitový SW čítač se inkrementuje pomocí přerušení od vnitřního 16-bitového HW čítače TIMER1, který bere hodiny z krystalu vydělené 8 a jehož čítací cyklus je zkrácený na rozsah 0 - 39999, což dává také 50 Hz. V hlavní smyčce se pouze každou vteřinu vypíšou oba SW čítače na LCD a jednou za 10 minut se uloží do vnitřní EEPROM. Po třech hodinách běhu vidím, že se síť předbíhá proti krystalu o 22 period, po uplynutí 24 hodin provedu vyhodnocení. Zde je výpis jednoduchého programu v C:
volatile DWord cnt_mains=-1; volatile DWord cnt_xtal=0; DWord EEMEM eeprom[1024]; int ee_index=0; char print_buffer[80]; // buffer pro tisk na terminal ISR(TIMER1_COMPA_vect) { cnt_xtal++; } ISR(INT1_vect) { cnt_mains++; } int main(void) { lcd_init(LCD_2LINE); // inicializace LCD - 2 radkovy rezim lcd_mode(LCD_ON|LCD_CUROFF|LCD_CURBLOFF); lcd_entry_mode(LCD_INC|LCD_SHIFTOFF); TCCR1A=0x00; TCCR1B=0x0A; // F_CPU/8 TCCR1C=0x00; OCR1A=39999; // F_CPU/8/40000 = 50Hz SETB(TIMSK, OCIE1A); // zapni OC 1A interrupt EICRA=0x0C; // nastav citlivost INT1 na nabeznou hranu SETB(EIMSK, INT1); // povol preruseni INT1 sei(); // povol globalne preruseni for ( ; ; ) // nekonecna smycka { if ((cnt_xtal%(50*60*10))==0) // kazdych 10 minut { // zapis pocitadlo site eeprom_busy_wait(); // pockej az je EEPROM pripravena k zapisu eeprom_write_dword(eeprom+ee_index, cnt_mains); ee_index++; // aktualizuj index slov v EEPROM delay_ms2(30); // pockej chvilku na zmenu cnt_xtal } if ((cnt_xtal%50)==0) // kazdou vterinu { // vypis pocitadla na LCD sprintf(print_buffer, "M=%lu\n", cnt_mains); lcd_print(print_buffer, 0); sprintf(print_buffer, "X=%lu", cnt_xtal); lcd_print(print_buffer, 0); lcd_gotoxy(1, 1); } } return(0); }
19.4.2012 Po uplynutí 24 hodin jsem odečetl hodnotu čítače period, kretá činila 4319637 oproti krystalu, který načítal 4320000 period, tj. rozdíl 363 period, což odpovídá zpoždění o 7,26 s. Jak jsem dále zjistil, krystalový oscilátor se předběhl asi o 4 - 5 s oproti skutečnému času (NTP server), takže zpoždění sítě bylo pouze o 2 - 3 s. Pro další přesnější měření použiju GPS přijímač s výstupem časových impulsů 1 Hz. Jak je tedy vidět, z hlediska dlouhodobé stability může síť celkem dobře nahradit obyčejný krystalový oscilátor v hodinách. Z praktického hlediska má krystalový oscilátor výhodu v tom, že je nezávislý a lze ho snadno zálohovat z baterie, čímž se předejde možným výpadkům.
Z paměti EEPROM jsem přečetl hodnoty čítače uložené po 10-minutových intervalech a vytvořil z nich graf relativní odchylky od jmenovitého kmitočtu 50 Hz. Očekával jsem jistou souvislost s denním zatížením sítě, které vidíme na druhém grafu od ČEPSu. Po prudkém nárůstu zatížení kolem 7 hodiny ráno se také kmitočet sítě snižuje, nejvíce kolem 8 hodiny. Večer mezi 21. a 23. hodinou nastává velký pokles zatížení, na který reaguje sít prudkým zvýšením kmitočtu kolem 21. hodiny. Střední hodnotu kmitočtu jsem naměřil 49,9958 Hz se směrodatnou odchylkou 0,0185 a maximální relativní odchylkou +0,1% / -0,12%.
27.4.2012 Z předchozího měření jsem zjistil, že dlouhodobá stabilita kmitočtu sítě je srovnatelná s běžným krystalovým oscilátorem a proto je nutné použít pro přesnější měření lepší časovou referenci. K tomu jsem využil přijímač satelitní navigace GPS, jehož výstup s přesnými vteřinovými impulsy jsem zavedl na vstup MCU INT0, jehož obsluha přerušení při náběžné hraně synchronizuje počítadlo krystalového oscilátoru. Tím je zajištěno, že při krátkodobém výpadku GPS signálu poběží vnitřní časomíra autonomně a po obnově signálu se opět sesynchronizuje. Ještě předtím jsem zkoumal odchylku samotného krystalového oscilátoru 16 MHz a se zděšením jsem zjistil, že tiká rychleji o 131 ppm, tzn. odchylka 11,3 s za den. Co sem prohlížel datasheety, tak krystaly typu HC49 se běžně vyrábí s tolerancí ±20 až ±100 ppm. K tomu se ještě přidává teplotní koeficient a stárnutí. Dále kmitočet ovlivňují i připojené kondenzátory mezi piny XTAL1, XTAL2 a zem.
S oscilátorem synchronizovaným podle GPS jsem provedl další měření ve čtvrtek 26.4.2012. Interval ukládání stavu počítadla period jsem zkrátil na 5 minut. Po uplynutí 24 hodin čítač sítě napočítal 4319824 period, tzn. zpoždění o 176 period neboli 3,52 s. Z vyčtených dat jsem stanovil střední hodnotu kmitočtu sítě 49,9980 Hz se směrodatnou odchylkou 0,0188 a maximální relativní odchylkou +0,09% / -0,17%. Z grafu zatížení sítě od ČEPSu je opět vidět určitá souvislost s ranním náběhem spotřeby a poklesem kmitočtu a nočním poklesem spotřeby a zvýšením kmitočtu.
2.5.2012 Do třetice všeho dobrého jsem provedl ještě jedno měření v úterý 1.5.2012 - Svátek práce. Dalo se tedy předpokládat, že zatížení sítě bude nižší a jinak časově distribuované než běžný pracovní den, což také graf ČEPSu potvrzuje. Opět je zde vidět určitá souvislost s odchylkou frekvence - minimální spotřeba v 6 hodin ráno odpovídá max. frekvenci, pak frekvence klesá. Během večerní špičky spotřeby v 9 hodin je frekvence minimální a s odlehčením sítě prudce stoupá. Po uplynutí 24 hodin čítač sítě napočítal 4319867 period, tzn. zpoždění o 133 period neboli 2,66 s. Z vyčtených dat jsem stanovil střední hodnotu kmitočtu sítě 49,9985 Hz se směrodatnou odchylkou 0,0173 a maximální relativní odchylkou ±0,11%. Zřejmě při vyrovnanějším zatížení sítě je i kmitočet stabilnější.