Zrobiłem zegar używając Arduino, ale czas wydaje się płynąć. Mam świadomość problemu z rolowaniem ; zegar wydaje się dryfować o około 15 minut w ciągu tygodnia.
Używam niestandardowej płytki z tym rezonatorem od Digi-key. Kod odczytuje funkcję millis () na początku każdej pętli i działa na podstawie tej wartości.
Moje pytanie brzmi: w jaki sposób mogę mierzyć czas za pomocą Arduino, wystarczająco dokładnie, aby stworzyć znośny zegar biurkowy?
millis()
.Odpowiedzi:
Uwaga: chociaż moja odpowiedź została zaakceptowana i ma wyższy wynik głosowania, przeczytaj wspaniałą odpowiedź Edgara Boneta na temat tego, jak zmusić Arduino do zachowania czasu bez RTC.
Z powodzeniem korzystam z zegara czasu rzeczywistego DS1307. Oto link do arkusza danych .
Poniżej znajdują się niektóre z jego funkcji:
Wykorzystuje interfejs IC do komunikacji z Arduino, co ułatwia programowanie przy użyciu odpowiednich bibliotek (dostępnych w sieci).
Jest podłączony do Arduino poprzez piny SCL i SDA (odpowiednio analogowe A4 i A5), a więc tylko 2 piny.
Do działania wymaga bardzo mało komponentów zewnętrznych.
IT można podłączyć do baterii pastylkowej, dzięki czemu utrzyma on czas nawet przy wyłączonym Arduino. W trybie niskiego zużycia energii bateria pastylkowa działa przez lata.
Dryfuje bardzo mało (w moim przypadku dryfuje tylko kilka sekund w tygodniu).
To nie jest bardzo drogie.
Jeśli nie zamierzasz używać RTC, możesz wymienić kryształ, który jest zwykle używany do dostarczania zegara do arduino dla modułu oscylatora kryształowego, takiego jak ten z Farnel lub ten inny . Występują w 4-pinowych opakowaniach, jak na zdjęciach poniżej. Wygenerują one znacznie bardziej precyzyjny zegar dla twojego arduino.
Oba wymienione moduły mają tolerancję 50 ppm i działają przy napięciu 5 V.
Ponownie, dla jasności, tych modułów oscylatora kwarcowego nie należy mylić ze zwykłym 2-pinowym kryształem, jak poniżej. Są to na przykład układy zewnętrznych zegarów dla MCU.
źródło
Nie potrzebujesz RTC, aby zbudować zegar: układ ATmega ma cały sprzęt niezbędny do wykonywania zadań samego RTC. Oto jak:
Zdobądź kryształ zegarka 32768 Hz: kup go lub zdemontuj stary zegar. Kryształy te, specjalnie zaprojektowane do utrzymywania czasu, mają wyjątkowo mały dryft temperaturowy. Potrzebujesz także jednego z nich, jeśli chcesz użyć układu RTC.
Skonfiguruj bezpieczniki swojego ATmega, aby uruchomić oscylator RC 8 MHz. To sprawi, że twoja
millis()
funkcja będzie okropnie niedokładna, a także zwolni piny XTAL1 i XTAL2.Podłącz kryształ zegarka do pinów TOSC1 i TOSC2. Są to te same piny, co XTAL1 i XTAL2 (9 i 10 w 328P). Różne nazwy oznaczają różne funkcje.
Skonfiguruj Timer / Licznik 2 do pracy asynchronicznej, normalnego trybu zliczania, preskalera ustawionego na 128 i włącz przerwanie przepełnienia timera.
Teraz otrzymasz przerwanie TIMER2_OVF ze stałą szybkością raz na sekundę. W ISR wystarczy przesunąć wyświetlanie zegara o jedną sekundę. Pomiędzy przerwami możesz wprowadzić MCU w bardzo głęboki sen (tryb uśpienia oszczędzania energii: nic nie działa poza Timerem / Licznikiem 2) i latami działać na kilku ogniwach AA. Oczywiście, chyba że wyświetlacz jest energochłonny.
Zrobiłem dokładnie to, aby zbudować 24-godzinny zegar ścienny jednoręczny . Ten link wskazuje teraz na angielskie tłumaczenie oryginalnej dokumentacji na francuski.
Kalibracja kwarcowa
Jeśli nie skalibrujesz kwarcu, możesz spodziewać się znacznego dryfu, zwykle kilka sekund w tygodniu . Szybkość dryfu zależy od pojemności błądzącej śladów łączących kryształ z MCU. Zasadniczo można go usunąć przez dodanie dodatkowej, precyzyjnie dostrojonej pojemności. Warto zauważyć, że miałbyś ten sam problem z dryfowaniem z RTC.
Jeśli jesteś zadowolony z tego rodzaju dokładności, żyj nim i bądź szczęśliwy. Jeśli jednak zmierzysz dryf, zauważysz, że jest on bardzo stabilny. Następnie możesz łatwo zrekompensować to w oprogramowaniu i osiągnąć dokładność kilku sekund rocznie .
Algorytm korygowania znoszenia jest bardzo prosty. Na podstawie zmierzonego dryfu obliczasz dokładne opóźnienie między przerwaniami, które powinno być bardzo bliskie 10 9 nanosekund, a następnie:
W powyższym przykładzie kwarc jest nieco zbyt szybki, a oprogramowanie kompensuje „brak” tyknięcia co kilka dni. Gdyby kwarc był zbyt wolny, ten sam kod zamiast tego dwukrotnie zaznaczałby raz na kilka dni.
Tego rodzaju kalibrację można również wykonać dla RTC, ale byłoby to znacznie bardziej złożone, ponieważ RTC zgłasza czas w rozbiciu, który naturalnie nie nadaje się do operacji arytmetycznych.
źródło
Podany rezonator ma stabilność 0,3%, przy czym kryształowy lub oscylator kryształowy (jak wspomniał Ricardo) ma 50 ppm. Wiele razy bardziej stabilny. Nie wspominając już o tym, że dryft temperatury rezonatora jest straszny. Ogrzewanie światłem słonecznym to zmieni. Dlatego rezonator nie powinien być używany do utrzymywania czasu przez długi czas.
Dlatego użycie kryształowego lub kryształowego oscylatora dostanie to, czego chcesz. Albo używając go na ATmega i odpowiednio ustaw bezpieczniki, albo nas podłączonego do RTC.
źródło
Jeśli nie chcesz używać dodatkowego sprzętu, takiego jak zegar czasu rzeczywistego (np. DSDS1307), możesz znacznie poprawić dokładność taktowania poprzez wyłączenie wszystkich nieużywanych przerwań. Domyślnie szkice Arduino są wyposażone w różne procedury przerwania i często nie są używane do szkicu. Najszybszym sposobem, aby dowiedzieć się, czy możesz obejść się bez niego, spróbuj je wyłączyć, wydając
noInterrupts();
źródło
millis()
chyba że uda ci się przeznaczyć więcej niż jedną milisekundę na ich obsługę, w takim przypadku masz inne problemy ... 4. Wyłączenie przerwania z wnoInterrupts()
ogóle nie pozwolimillis()
zachować czasu!Rozumiem, że wiele ducha w Arduino jest oszczędny i od czasu do czasu przedziera się przez problem. Używam Arduino (a teraz chipKIT, ponieważ ma 10-krotnie więcej pamięci RAM i 10-krotnie większą prędkość zegara) w moim miejscu pracy i potrzebuję „funkcji peryferyjnych”, aby działać szybko i jak najszybciej.
Korzystam z zegara czasu rzeczywistego Sparkfun w jednym z moich projektów i jestem z niego bardzo zadowolony. Mają także wariant „Dead on” .
źródło