czwartek, 14 kwietnia 2011

Czas - odmierzanie


Autor: Dondu

Mikrokontrolery są "wręcz stworzone" do odmierzania jednostek czasu. Dlatego w sieci można znaleźć wiele tego rodzaju projektów.

Ale jest jeden istotny problem - dokładność odmierzanego czasu.

Na problem ten wpływają:
  • mikrokontrolery mają wewnętrzne liczniki 8 lub 16 bitowe, 
  • oscylatory są z reguły są wielokrotnością liczby 10 np. 2.000.000 Hz
  • oscylatory mają ograniczoną dokładność (od 0,0005% do kilku procent)
  • oscylatory z biegiem czasu oraz temperatury zmieniają swoją wartość


Dokładność oscylatorów

Istotnym elementem odmierzania czasu jest dokładność źródła sygnału zegarowego. Dokładność określana jest z pomocą jednostki zwanej PPM (ang. Parts Per Million). To ogólnie stosowana jednostka, nie tylko w elektronice, która określa ułamkową część parametru jakiego dotyczy. W przypadku oscylatorów stosuje się ją do określenie dokładności utrzymania częstotliwości oraz jej zmiany z powodu starzenia czy temperatury.


Wzór: Przykład przeliczenia ppm na procenty



Oscylatory RC

Prawie wszystkie mikrokontrolery zawierają w sobie wewnętrzne oscylatory RC lub umożliwiają podłączenie zewnętrznych. Ich dokładność jest dość niska i zbliżona do ±2% (czyli 20.000ppm). Oznacza, że w skrajnym przypadku pomiar jednej sekundy może się różnić (zarówno w dół jak i w górę) o:

Wzór: Maksymalna odchyłka pomiaru 1 sekundy
dla oscylatora RC o dokładności 2%


Niby niewiele, ale gdy popatrzysz na całą dobę to:


Wzór: Maksymalna odchyłka zegara na dobę dla oscylatora RC o dokładności 2%


A to jest nie do przyjęcia! Jak sobie z tym radzić?
  • stosując zewnętrzny rezonator kwarcowy
  • stosując zewnętrzny sygnał zegarowy (wysokiej jakości generator wzorcowy)
  • dokonać kalibracji



Rezonator kwarcowy

Z punktu widzenia elektronika rezonatory kwarcowe (zwane kwarcami) są tanim elementem dającym bardzo stabilny i dokładny sygnał zegarowy dla układów z mikrokontrolerami. Większość z nich jako podstawę ma liczbę 10.

Dokładność rezonatorów kwarcowych waha się od kilku do kilkudziesięciu PPM. Najpopularniejsze i najtańsze są z przedziału pomiędzy ±10-50ppm.

Większość wymaga dodatkowo zastosowania dwóch kondensatorów, których wartość podana jest przez producenta rezonatora.

Kwarce podlegają procesowi starzenia, który wynosi np. ±5 ppm/rok

Przykładowy rezonator: CSA310 (dokument PDF)
więcej: Wikipedia - Rezonator_kwarcowy



Rezonator kwarcowy 32.768 Hz (tzw. zegarkowy)

Ten kwarc ma kolosalną zaletę. Jego podstawą jest liczba 2, a nie 10. Dlatego łatwo można wykorzystywać najprostsze ośmio i szesnastobitowe timery w mikrokontrolerach uzyskując dokładny okres trwania jednej sekundy. Oczywiście dokładność samego kwarcu jest nadal problemem, a dodatkowo nie produkuje się tych kwarców dokładniejszych niż 20ppm - technologia wymięka :-).



Rezonator kwarcowy - ważne zasady!

Rys. Przykład prowadzenia
ścieżek na PCB
Aby zapewnić odporność kwarcu na zakłócenia, powinieneś:
  • montować go najbliżej mikrokontrolera jak się da (2-5mm),
  • kondensatory jak najbliżej kwarcu,
  • otoczyć kwarc i kondensatory ścieżką masy jak na rysunku,
  • jeżeli ma metalową obudowę to podłącz ją do masy,
  • na pinach sąsiadujących z pinami kwarcu nie powinno być sygnałów szybkozmiennych.







Zewnętrzny sygnał zegarowy

Większość mikrokontrolerów pozwala na taktowanie mikrokontrolera zewnętrznym sygnałem zegarowym. Umożliwia to podłączenie do mikrokontrolera wzorcowego generatora wysokiej jakości, gdy projektowany układ wymaga aż takiej dokładności zegara. Jak ktoś ma możliwość może podłączyć nawet sygnał z zegara atomowego :-)

Dodatkowo umożliwia to wspólną synchronizację pracy różnych układów na jednym sygnale zegarowym.



Kalibracja

Trzeba użyć kalibracji czyli poprawki, która będzie sukcesywnie korygowała ten problem. Kalibrację dokonywać można na kilka sposobów:
  • programowo
  • sprzętowo
  • sprzętowo i programowo jednocześnie
Rozwiązań sprzętowych i programowych jest wiele i zależą od wybranego przez Ciebie mikrokontrolera, dlatego nie opisuję ich tutaj, a jedynie sygnalizuję problem.



Moduły RTCC i RTC

RTCC (ang. Real-Time Clock and Calendar) to moduł wewnętrzny lub zewnętrzny, który jest kompleksowym zestawem liczników zegara. Ułatwia budowę urządzeń, ale nie jest niezbędny, by poprawny zegar zrobić. Zaletą tych modułów jest to, że z reguły mają dodatkowe układy do kalibracji, które znacznie zwiększają dokładność budowanych z ich wykorzystaniem zegarów.


Niektóre mikrokontrolery mające w sobie moduł RTC lub RTCC mają osobne wejścia do podłączenia kwarcu zegarkowego 32.768 Hz. To kolosalna zaleta, ponieważ procesor może wtedy działać na zupełnie innym kwarcu, podczas gdy RTCC działa na kwarcu zegarkowym. Ba, możliwe jest nawet zatrzymanie czy uśpienie procesora, a RTCC działa dalej - ot takie czary :-)



Przykładowe projekty timerów zegarków

Przykładowe projekty znajdziesz tutaj: Ciekawe projekty - Zegary, stopery, RTC

Zobacz także Devastatora:



19 komentarzy:

  1. Typowe kwarce mają dokładność rzędu 10-50 ppm (czyli part-per-million, czyli 0,001%-0,005%). 2% ma wewnętrzny oscylator procesora. Podany opis jest mylący.

    OdpowiedzUsuń
  2. Dziękuję za zwrócenie uwagi. Rozbudowałem ten temat, by już nie było niejasności.

    OdpowiedzUsuń
  3. Przydałby się jakiś artykuł o kalibracji

    OdpowiedzUsuń
  4. OK, dopiszę do listy TODO.

    OdpowiedzUsuń
  5. Witam, mam pytanie odnośnie sprawdzania oscylatora za pomocą oscyloskopu. Używam uC microchipa PIC16F i PIC18F, jednak zasada działania nie różni się niczym od ATMEGI chyba, zgodnie z dokumentacją dodałem kondensatory z zakresu 15p-33p do kwarcu (20MHz) całość startuje poprawnie program jak i urządzenie działa. Wyczytałem w datasheet microhipa że można dodawać rezystor i zmieniać pojemności kondensatorów dla uzyskania szybszego startu i stabilniejszej częstotliwości - zasadniczo jest to meczenie się nad prognozowanym niezauważalnym niemal zyskiem, ale zawsze można się czegoś nauczyć i w razie problemów z oscylatorem wiadomo gdzie i jak szukać.
    Po podłączeniu sond oscyloskopu, urządzenie startuje z wew oscylatora i sygnalizuje to zapaleniem się diody alarmu - osc problem, próbowałem wielokrotnie, nawet przebudowałem PCB (skróciłem ścieżki) bez efektu, po jakimś czasie doszedłem do wniosku, że jedynym co różni urządzenie działające od nie działającego jest oscyloskop i sondy. Przyjrzałem się sondom i jest - pojemność 15pF, pojemność kanału oscyloskopu 30pF, wylutowałem kondensatory z PCB zakładając że oscyloskop i sondy zastąpią pojemności wcześniej dodane - nic z tego nie działa, pewnie pojemność jest zbyt duża.
    Chciał bym wiedzieć w jaki sposób zmierzyć czas startu oscylatora i jak sprawić by przebieg pojawił się na oscyloskopie - korzystałem ze standardowych sond HAMEGA dołączonych do osycloskopu analogowego
    korzystałem z datasheetow microchipa :
    http://ww1.microchip.com/downloads/en/AppNotes/00826a.pdf
    http://ww1.microchip.com/downloads/en/AppNotes/00943A.pdf
    http://ww1.microchip.com/downloads/en/AppNotes/00849a.pdf

    myślę że musiałem coś pominąć, czegoś nie doczytać, lub układ pomiarowy nie taki jak trzeba.

    OdpowiedzUsuń
    Odpowiedzi
    1. Temat raczej wymaga szerszej dyskusji, więc warto założyć odpowiedni wątek na elektrodzie. Kwarce 20 MHz to zazwyczaj kwarce overtonowe - po przyłączeniu sondy niewykluczone, że obciążenie jakie wnosi na tyle zmienia parametry, że wzbudzenie drgań jest niemożliwe, lub wzbudzają się ona na częstotliwości podstawowej kwarcu. Lepiej zastosować kwarc na częstotliwości podstawowej, a wyższą uzyskać przez PLL.

      Usuń
    2. Witaj.

      Do którego pinu przykładasz sondę? Sprawdź na OSC2, ponieważ piny te różnią się wewnętrzną strukturą.

      Co do pomiaru czasu startu oscylatora, to nie miałem takiej potrzeby. Na szybko mogę podpowiedzieć, byś zaiteresował się bitem OSTS.

      Sugestia tmf-a byś założył temat na forum jest dobrą sugestią: Elektroda - Mikrokontrolery PIC

      Usuń
    3. Dziękuje za odpowiedzi!
      W między czasie postanowiłem zrobić osobny układ testowy dla tego problemu oparty o nieco przerobioną płytkę z strony
      http://leon-instruments.blogspot.com/2011/04/pytki-testowe-do-mikrokontrolerow.html#atmega128dil64
      Zamiast zwykłej podstawki/adaptera dil64 dodałem jeszcze kondensatory filtrujące tak by były możliwie blisko - uniwersalność podstawki na tym ucierpi ale zawsze nieco bliżej będą kondensatory. Dojdzie niestety pojemność płytki stykowej.

      Zamierzam sprawdzić całość na PIC16F1527, program - raczej konfiguracja samego uC bez żadnych zadań do wykonania, z wyłączonym WDT, jedynie LED wskazujący co się dzieje w rejestrze OSCSTAT: OSCILLATOR STATUS REGISTER, bit OSTS. Na jego podstawie do tej pory program zapalał LED informujący o problemie z oscylatorem. Chce sprawdzić czy podniesienie napięcia zasilania z 3V3 do 5V coś zmieni, niby od 2V5 można na 20MHz działać, ale przy pomiarach może dodatkowe obciążenie w postaci pojemności układu pomiarowego przeważało szalę.

      Jak to nie pomoże, zobaczę czy PICKIT3 da się podłączyć do tego uC jako debuger, może tą drogą coś zdziałam.
      Ostatnią deską ratunku będzie rada Tmf, by skorzystać z pomocy na elektrodzie.

      Jak tylko znajdę czas na polutowanie układu testowego i jakieś miarodajne próby, podzielę się wnioskami.

      PS. Niezbędny jest 100% sprawny i pewny oscylator z opcją fail-safe clock ponieważ układ będzie pracował w ruchu 3D - rejestrator parametrów lotu + autopilot (oparty o 3 osiowy akcelerometr i żyroskop)

      Usuń
    4. ... w takim razie czekamy na wyniki :-)

      Usuń
    5. Witam ponownie
      Udało mi się przeprowadzić pomiary układu z samym procesorem i kwarcem (z kondensatorami oczywiście), jak dotąd wnioski są następujące:

      PIC16F1527, najpewniej z powodu funkcji fail-safe clock nie pozwala na przeprowadzenie pomiaru za pomocą sondy pasywnej - próbowałem sondami 1:1, 1:10, 1:100, każdemu podłączeniu sondy nawet do działającego układu (zastąpienie jednego kondensatora sondą itd itp) towarzyszy natychmiastowy spadek częstotliwości (do generatora wew ) - w najlepszym przypadku dodawałem ~20pF pojemności przez oscyloskop i sondę 1:100. Podniesienie napięcia zasilania do 5V nic nie zmieniło.
      Częstotliwość z jaką jest taktowany uC mierzyłam na 2 kanale, układ miał za zadanie non stop zmieniać stan jednego z wyjść.

      Postanowiłem wykorzystać dla porównania inny układ nieco starszy bez funkcji fail-safe clock PIC16F84A. Tu bez problemu udało się podłączyć sondę 1:100 i uzyskać stabilny przebieg na oscyloskopie, wg. microchipa powinno być to około 4V (przy 5V napięcia zasilania). Uzyskałem niemal 4,5V co widać na oscylogramie poniżej, niestety ograniczeniem była maksymalna częstotliwość używanego oscyloskopu, dlatego nie widać czy przebieg jest odkształcony - nie widać nawet czy to na pewno sinusoida...
      Przy okazji postaram się skorzystać z nieco szybszego sprzętu i dokonać dalszych pomiarów.

      oscylogram:
      http://zapodaj.net/dcb007617dd98.jpg.html
      podstawa czasu 100ns, 10mV na działkę sonda 1:100


      By zbadać działanie PIC16F1527, jak i mieć wyniki bardziej zbliżone do rzeczywistych (bez dodatkowej pojemności min ~20pF), chcę zbudować sondę FET - z tego co się orientuje są dość kosztowne więc wole takowa zbudować w oparciu o dokumentację na stronie poniżej - co o tym myślicie, ma to jakiś sens, czy raczej strata czasu?

      http://oliverbetz.de/hit/hit_e.htm

      Usuń
    6. Mierzenie częstotliwości rezonatora poprzez przyłożenie sondy do niego natychniast spowoduje zafałszowanie pomiar. Pamiętajcie, że sonda ma swoją pojemność, która wpłynie na częstotliwość rezonatora. Zmiana wartości kondensatorów podłączonych do rezonatora też powoduje zmianę jego częstotliwości. Jak chcecie zmierzyć prawdziwą częstotliwość, z jaką pracuje mikrokontroler, to programowo sterujcie jakimś pinem uC co np. 20 instrukcji procka (bez wykorzystania przerwań) lub za pomocą przerwania jakiegoś licznika

      Usuń
    7. Tak to istotny problem. Znacznie lepszym sposobem zamiast programu jest wykorzystanie po prostu timera z wyjściem na jakiś pin i pomiar częstotliwości tego pinu, znając oczywiście w jaki sposób ustawiamy fusebity, timer i jego preskaler. Wtedy program w żaden sposób nie wpłynie na poprawność pomiaru.

      Usuń
  6. 'Moduły RTC nie są wyposażone w kalendarz"

    A DS1307? :)

    OdpowiedzUsuń
    Odpowiedzi
    1. Masz rację. To kwestia nazewnictwa pełnego lub uproszczonego. Usunąłem to zdanie.
      Dziękuję za zwrócenie uwagi. :-)

      Usuń
  7. Przy kwarcu zegarkowym autor miał chyba na myśli 32.768 kHz (kilo Hertz'ów) a nie 32.768 Hz...

    OdpowiedzUsuń
    Odpowiedzi
    1. Blog pisany jest w języku polskim, a więc zgodnie z naszymi zasadami znakiem rozdzielającym część dziesiętną jest przecinek, a kropka symbolem grupowania cyfr. Dlatego nie ma pomyłki.

      Usuń
  8. A jak jest ze stabilnością częstotliwości 50 Hz sieci energetycznej i czy na jej podstawie można zbudować licznik zegara?
    Ostatnio były informacje o jakiś rozbieżnościach.

    OdpowiedzUsuń
    Odpowiedzi
    1. Polska norma mówi:

      "Częstotliwość sieciowa w sieciach połączonych synchronicznie z systemem elektroenergetycznym powinna być
      zawarta w przedziale:
      ♦ 50 Hz ± 1% – przez 95% czasu w roku,
      ♦ 50 Hz ± 4%/-6% – przez cały czas.
      Dla pozostałych sieci przedział 95-procentowy wynosi ± 2%, zaś przedział 100-procentowy ± 15%."


      Różnica 1% w ciągu doby, to 864 sekundy :)

      Usuń
    2. Dzięki za odpowiedź...
      Powyższe pytanie zadałem w związku z informacją sprzed kilku miesięcy, o spóźnianiu się o 6 minut różnych sprzętów AGD w 25 krajach Europy z powodu "odchylenia pochodzącego z bloku z Kosowa i Serbii".

      Idąc tym tropem, jeżeli producenci sprzętu AGD powszechnie stosują częstotliwość sieci do liczników zegara, to ogólnie, nie może być aż tak źle, jak podałeś (~14 min/dobę).

      Dalej...
      Normy podają skrajne wartości plus/minus, a pomiar częstotliwości jest pomiarem chwilowym, więc w danym momencie, nie może przekraczać norm i mogą się tego trzymać.
      Ale biorąc pod uwagę dłuższy odcinek czasu, wahania te, po uśrednieniu, mogą być bliskie 0% i dlatego je stosują.

      Jeżeli moje przemyślenia są prawidłowe i długoterminowa stabilność częstotliwości sieci ma tolerancję bliską 0%, to jeżeli się nie mylę, jako źródło stabilnego zegara 50 Hz, wystarczyłby transoptor z odpowiednim rezystorem wpięty w sieć.

      Usuń