Poprawianie dokładności zegara RTC

| Technika

Niedokładności zegara czasu rzeczywistego wywołane wpływami zewnętrznymi i starzeniem się można skompensować za pomocą algorytmu.

Poprawianie dokładności zegara RTC

Rys. 1. Dzięki umieszczeniu RTC wraz z interfejsem komunikacyjnym oraz innymi funkcjami obsługowymi w jednym chipie i z mikrokontrolerem, system staje się tańszy

We współczesnych systemach multimedialnych ważnym elementem jest dokładny zegar czasu rzeczywistego (RTC). Zegar ten mieści się w chipie RTC, zawierającym wzorcowy oscylator kwarcowy, który dostarcza informacji czasowych w formacie sekund, minut, godzin, dni i lat z uwzględnieniem przestępnych. Aktualny czas może być odczytywany z odpowiedniego rejestru w chipie RTC, za pośrednictwem szeregowego interfejsu (SPI) albo I²C.

W niektórych systemach do interfejsu użytkownika i do innych funkcji obsługowych służy dodatkowy mikrokontroler, który może zostać użyty także do funkcji RTC. Zapewnia on wtedy zliczanie upływających sekund z użyciem zewnętrznego generatora kwarcowego. Konwersja zliczanych sekund na minuty, godziny, dni i lata jest dokonywana przez program.

Rys. 2. W RTC wykorzystującym mikrokontroler używa się zwykle oscylatora 32,768 kHz, którego impulsy są zliczane w 16-bitowym liczniku CNT1

Zastosowanie specjalnego chipa RTC zdejmuje to obciążenie z głównego programu. A generatory kwarcowe wielu chipów są temperaturowo stabilizowane, osiągając dokładność 2 do 3 ppm. Natomiast zastosowanie we wbudowanym RTC mikrokontrolera wraz z interfejsem użytkownika i funkcjami obsługowymi obniża koszt systemu (rys. 1).

Jednakże dokładność czasu, którym posługuje się mikrokontroler, silnie zależy od dokładności generatora służącego za wzorzec. Dokładność ta mieści się zwykle w granicach 20-45 ppm, co przekłada się na nieakceptowalny błąd do 4s dziennie. Użycie dokładniejszego kwarcu jest rozwiązaniem oczywistym, ale droższym i z tego względu nie nadaje się do urządzeń tanich.

Alternatywnym sposobem jest zastosowanie algorytmu kalibrującego, który korygując niedokładność systemowego generatora kwarcowego, zwiększa dokładność RTC. Niektóre algorytmy korzystają w tym celu z tablic. W zaprezentowanym rozwiązaniu obliczony współczynnik korekcyjny może kompensować zmiany wywołane starzeniem się kryształu kwarcu, a także wpływ temperatury.

Kalibracja

Rys. 3. Po pierwszym przerwaniu 1Hz stan CNT1 wynosi VAL. Jeśli zegar RTC jest dokładny, stan CNT1 za każdym przerwaniem będzie taki sam, ponieważ będzie on w ciągu każdej sekundy zliczał tę samą liczbę impulsów. Jeżeli jednak częstotliwość oscylatora RTC nie jest dokładna, stan CNT1 za każdym przerwaniem będzie inny

W RTC z mikrokontrolerem wykorzystuje się zwykle sygnał oscylatora kwarcowego 32,768 kHz, którego impulsy są zliczane przez licznik, taki jak na przykład 16-bitowy licznik CNT1 (rys. 2). Cykl zegarowy jego oscylatora jest jednosekundowy. Gdy system jest włączony, co sekundę stan licznika CNT1 wzrasta od 0 do 32767.

Jest to kwarc niezbyt dokładny, więc CNT1 przepełnia się do 0 częściej niż raz na sekundę, jeśli częstotliwość jest większa od 32,768 kHz, lub rzadziej, gdy jest mniejsza. Stan licznika CNT2 odzwierciedla zatem liczbę sekund od momentu włączenia systemu. W celu wykalibrowania systemu mierzący czas mikrokontroler łączy się z wzorcowym zegarem RTC i z dokładnym źródłem przerwań 1Hz.

Źródłem tym może być zespół drugiego mikrokontrolera z dokładnym, ale droższym, zegarem RTC. Moduł GPS, moduł teletekstu lub RDS pozwala taką kalibrację wykonywać okresowo w czasie pracy systemu. Pierwsze dokładne przerwanie 1Hz pojawia się wkrótce po włączeniu kalibrowanego mikrokontrolera. Stan CNT1 wynosi wtedy VAL.

Jeśli zegar RTC jest dokładny, stan CNT1 za każdym razem będzie taki sam, ponieważ będzie on w ciągu każdej sekundy zliczał tę samą liczbę impulsów. Jeżeli jednak częstotliwość oscylatora RTC nie jest dokładna, będzie inaczej (rys. 3). Jeśli zliczony czas wynosi T sekund, z drugim i następnymi dokładnymi przerwaniami 1Hz mikrokontroler wprowadza do pamięci stan CNT1, a następnie oblicza współczynnik kalibracji i zapisuje go w swojej pamięci Flash.

Jeśli nie da się tego dokonać w biegu, mikrokontroler może dokonać tego zapisu w RAM, polegając na podtrzymującej RTC baterii. Po zakończeniu tego działania algorytm kalibracyjny może przekazać kontrolę działającemu w mikrokontrolerze głównemu kodowi. Algorytmy na rysunkach 4-6 ilustrują, jak mikrokontroler zwiększa stan CNT1 co 1/32786 sekundy, a stan CNT2 każdorazowo, gdy CNT1 przepełnia się z 32767 do 0.

Rys. 4. Główny program mikrokontrolera, oprócz swoich normalnych funkcji, każdorazowo po upływie CF sekund zwiększa lub zmniejsza stan CNT2

Rys. 5. Algorytm zwiększający stan sprzętowego licznika CNT1 co 1/32768 sekundy

Konwersji stanu licznika na format godzin, minut i sekund dokonuje program. Mikrokontroler zwiększa stan CNT3 z każdym przerwaniem dokładnego sygnału 1Hz. W każdym momencie stan CNT3 wyraża w sekundach czas, jaki upłynął od pierwszego przerwania dokładnego 1Hz plus jeden. E jest błędem CNT1 na każdy przyrost w CNT3. ERR1 do ERRT są błędami w CNT1 po 1 do T sekund od pojawienia się pierwszego przerwania dokładnego 1Hz.

Każde przerwanie odpowiada przyrostowi w CNT3. Całkowity błąd w CNT1, pojawiający się po (T+1) sekundach, wynosi ECAŁK = ERRT. Zadaniem układu eksperymentalnego jest wyznaczenie średniego błędu w CNT1, występującego po każdym przerwaniu 1Hz do przyrostu stanu CNT3. Błąd ten również może zostać wyznaczony w następujący sposób: błąd na sekundę (E)=[stan CNT1 (gdy CNT3=2) - stan CNT1 (gdy CNT3=T+1)]/T).

Czas w sekundach, po upływie którego błąd wyniesie 1 sekundę, można obliczyć z wielkości E równaniem: CF=32786/E, gdzie CF jest współczynnikiem kalibracji. Zatem dzięki zwiększaniu lub zmniejszaniu co CF sekund stanu CNT2, czyli używanego przez mikrokontroler licznika sekund, można uzyskać dużą dokładność.

Większą dokładność osiąga się także przez zwiększanie lub zmniejszanie co T sekund stanu CNT1 o CF, ponieważ eliminuje to błąd zaokrąglania wyniku dzielenia. W algorytmie jednakże użyto pierwszego sposobu, z powodu niemożności modyfikacji licznika CNT1 w układzie doświadczalnym.

Sieć działań i procedura kalibracji

Rys. 6. Mikrokontroler zwiększa stan CNT3 z każdym przerwaniem dokładnego oscylatora 1Hz

Na rysunkach 4-6 przedstawiono przebieg działania algorytmu, który jest wykonywany w następujących krokach:

  • W każdym kroku cyklu zegarowego niedokładnego generatora sprzętowy moduł licznika zwiększa stan CNT1.
  • Stan CNT2 zwiększa się za każdym razem, gdy CNT1 przepełnia się z 32767 do 0.
  • Stan CNT3 zwiększa się z każdym przerwaniem dokładnego generatora 1Hz.
  • Wraz z drugim przerwaniem dokładnego generatora 1Hz początkowy stan CNT1 jest kopiowany w RAM - w RAM1, a stan CNT3 podwyższany. Stan CNT3 jest zwiększany z każdym kolejnym przerwaniem dokładnego 1Hz.
  • Gdy stan CNT3 wynosi T+1, gdzie T jest czasem zliczania, nowy stan CNT1 jest kopiowany w RAM - w RAM2.
  • Jeśli RAM2>RAM1, oblicza się E=(RAM2-RAM1)/T; jeśli RAM1 >RAM2, oblicza się E=(RAM1-RAM2)/T; a współczynnik kalibracji CF=32768/E
  • Obliczoną wielkość CF wprowadza się do pamięci Flash mikrokontrolera. W razie potrzeby zaświecenie LED sygnalizuje zakończenie kalibracji.
  • Teraz program działający w mikrokontrolerze zwiększa stan CNT2, jeśli RAM1>RAM2, lub zmniejsza stan CNT2, jeśli RAM2>RAM1, co CF sekund.

Za pomocą tego algorytmu można zwiększyć dokładność RTC korzystającego z mikrokontrolera do około 2ppm. (KKP)