Przyczyną niedokładnej pracy zegara, o której mowa we wstępie, są parametry oscylatorów zegarkowych dołączanych do układu scalonego. Podstawowy parametr niepewności częstotliwości oscylacji jest wyrażany w jednostkach „ppm”. Średnio dla większości oscylatorów ten parametr jest równy ±20 ppm. Co to dokładnie oznacza? Jeżelibyśmy chcieli wyrazić ±20 ppm w procentach, to otrzymamy ±0,002%. Można powiedzieć, że to bardzo mało, ale jeśli pomnożymy tę wartość przez liczbę sekund w miesiącu, to w skrajnym wypadku otrzymamy 51,8 s. Oczywiście, jest to wartość skrajna, ponieważ raczej nigdy nie uzyskamy odchyłki maksymalnej – tylko w „jedną stronę”, chociaż może tak się zdarzyć. Nie uwzględniamy tu jeszcze zmian temperatury, które znacząco pogłębiają błąd, ponieważ każdy oscylator jest kalibrowany w określonej temperaturze – dla większości jest 25°C.
Dryft częstotliwości również jest podawany w zależności od temperatury otoczenia. Dla większości typowych oscylatorów wynosi on 0,035 ppm/°C². Jeżeli zegar jest użytkowany w domu lub w pomieszczeniu o stałej temperaturze, to w zasadzie możemy nie uwzględniać dryftu, ale przecież nawet w mieszkaniu temperatura może się zmieniać o kilka stopni w ciągu doby, a dryft ma znaczenie. Jeżeli generator pracuje w zmiennych warunkach, to już nie jest tak wesoło i odchyłka o 10°C od temperatury, dla której był skalibrowany ocylator, spowoduje nam błąd rzędu 9 sekund miesięcznie. Jak temu zaradzić?
Można synchronizować wskazania zegara z wzorcem czasu, pobierając czas z serwera NTP lub korzystając z sygnału radiowego DCF. Wiąże się to jednak z dodatkowymi kosztami, skomplikowaniem programu mikrokontrolera oraz wzrostem złożoności płytki drukowanej. Można też wydać nieco więcej pieniędzy na układ scalony zegara RTC i zastosować DS3231 firmy Maxim Integrated. Co takiego ma ten układ, czego nie mają inne?
Układ obsługuje lata przestępne do 2100 roku, więc nie trzeba tego uwzględniać w programie obsługi zegara. Jednak najważniejszy parametr to pozycja mówiąca o odchyłce częstotliwości w zakresie temperatury od 0 do +40°C. Nie dosyć, że układ nie wymaga zewnętrznego oscylatora, to jeszcze ten wbudowany w jego strukturę jest kompensowany temperaturowo i w podanym zakresie odchyłka zawsze wyniesie ±2 ppm. Dodatkowo, mamy do dyspozycji rejestr o nazwie „Register for Aging Trim”, za pomocą którego można dodawać lub odejmować pojemność w obwodzie generatora kwarcowego, uzyskując taki sam efekt, jak przy zastosowaniu trymera. Na uwagę zasługuje również to, że w zakresie temperatury od –40 do +85°C niepewność oscylatora wynosi jedynie ±3,5 ppm.
Układ ma wbudowany termometr, ale raczej mało dokładny. Może przydać się w roli sensora temperatury panującej w pokoju, ale raczej nie nadaje się do dokładnych pomiarów. Interfejs I²C pracuje z maksymalną częstotliwością zegarową wynoszącą 400 kHz. Układ ma wejście dla baterii podtrzymującej zasilanie zegara w razie zaniku napięcia głównego. Może przy tym pracować w dużym zakresie napięcia zasilającego – od 2,3 do 5,5 V, przy czym nie wymaga konwersji napięcia na szynie I²C. Pobór prądu w stanie aktywnym to 200 mA przy zasilaniu 3,3 V. Pobór prądu z baterii wynosi około 70 mA. Układ jest produkowany w obudowie SO16. Dostępne są również warianty w obudowie SO8 noszące oznaczenie DS3231MZ+.
Podstawowy schemat aplikacyjny układu jest nieskomplikowany i myślę, że nie wymaga omawiania. Dlatego w artykule skupię się na opisie biblioteki funkcji służącej do obsługi tego ciekawego układu – jest ona dostępna w materiałach dodatkowych do tego artykułu, do pobrania z serwera FTP.