मुझे सटीक समय कैसे मिलेगा?


16

मैंने एक Arduino का उपयोग करके एक घड़ी बनाई है, लेकिन समय बहाव लगता है। मुझे रोलओवर मुद्दे की जानकारी है; घड़ी एक सप्ताह के दौरान लगभग 15 मिनट तक बहाव करती है।

मैं डिजी-की से इस गुंजयमान यंत्र के साथ एक कस्टम पीसीबी का उपयोग कर रहा हूं । कोड प्रत्येक लूप की शुरुआत में मिलिस () फ़ंक्शन को पढ़ता है, और उस मान से काम करता है।

मेरा सवाल यह है: मैं एक Arduino के साथ समय कैसे माप सकता हूं, सटीक रूप से एक निष्क्रिय डेस्क घड़ी बनाने के लिए पर्याप्त है?


3
मिलिसेकंड फ़ंक्शन को एक रुकावट के डेटा के साथ आपूर्ति की जाती है, जो चलाने के लिए कुछ घड़ी चक्र लेती है। यह प्रत्येक टिक के लिए समय की एक न्यूनतम राशि जोड़ता है।
TheDoctor

3
@ TheDoctor: यह गलत है। व्यवधान ड्राइव करने वाले हार्डवेयर टाइमर को धीमा नहीं करता है millis()
एडगर बोनट

जवाबों:


15

नोट: यद्यपि मेरा उत्तर स्वीकार कर लिया गया था और उसका वोट स्कोर अधिक है, फिर भी सुनिश्चित करें कि आपने एडगर बोनट के महान उत्तर को पढ़ा कि कैसे अपने आरडीनो को आरटीसी के बिना समय रखें।

मैं DS1307 रियल टाइम क्लॉक का उपयोग करने में काफी सफल रहा हूं। यहां इसकी डेटाशीट का लिंक दिया गया है ।

नीचे इसकी कुछ विशेषताएं दी गई हैं:

  • यह Arduino के साथ संचार के लिए IC इंटरफ़ेस का उपयोग करता है, जिससे इसे सही पुस्तकालयों (नेट पर उपलब्ध) का उपयोग करके प्रोग्राम करना आसान हो जाता है।

  • यह एससीएल और एसडीए पिंस (क्रमशः ए 4 और ए 5) के माध्यम से अरुडिनो से जुड़ा हुआ है, इस प्रकार केवल 2 पिन का उपयोग कर रहा है।

  • इसे चलाने के लिए बहुत कम बाहरी घटकों की आवश्यकता होती है।

  • आईटी को एक सिक्का सेल बैटरी से जोड़ा जा सकता है, इसलिए अरुडिनो बंद होने पर भी यह समय रखेगा। अपने कम पावर मोड में, सिक्का सेल बैटरी वर्षों तक रहता है।

  • यह बहुत कम बहती है (मेरे मामले में यह प्रति सप्ताह केवल कुछ सेकंड में बहती है)।

  • यह बहुत महंगा नहीं है।

यदि आप RTC का उपयोग करने का इरादा नहीं रखते हैं, तो आप क्रिस्टल को प्रतिस्थापित कर सकते हैं जो सामान्यतः क्रिस्टल थरथरानवाला मॉड्यूल के लिए घड़ी प्रदान करने के लिए उपयोग किया जाता है जैसे कि Farnel या इस अन्य से एक । वे नीचे की छवियों की तरह 4 पिन पैकेज में आते हैं। वे आपके arduino के लिए एक बहुत अधिक सटीक घड़ी उत्पन्न करेंगे।

क्रिस्टल थरथरानवाला छवि क्रिस्टल थरथरानवाला छवि क्रिस्टल थरथरानवाला छवि

उल्लिखित दोनों मॉड्यूल में 50 पीपीएम की सहिष्णुता है और 5 वी पर काम करती है।

फिर, बस स्पष्ट होने के लिए, इन क्रिस्टल ऑसिलेटर मॉड्यूल को नीचे की तरह नियमित 2 पिन क्रिस्टल के साथ भ्रमित नहीं होना चाहिए । उदाहरण के लिए, MCUs के लिए बाहरी घड़ियों के सर्किट्री का हिस्सा हैं।

क्रिस्टल थरथरानवाला


क्या DS1302 काफी अच्छा है या मुझे DS1307 में जाना चाहिए?
केली एस। फ्रेंच

14

घड़ी बनाने के लिए आपको RTC की आवश्यकता नहीं है: ATmega चिप में RTC के कर्तव्यों को पूरा करने के लिए आवश्यक सभी हार्डवेयर हैं। यहां कैसे:

  1. एक 32768 हर्ट्ज घड़ी क्रिस्टल प्राप्त करें: या तो इसे खरीदें या एक पुरानी घड़ी को इकट्ठा करें। विशेष रूप से समय को ध्यान में रखते हुए बनाए गए इन क्रिस्टलों में तापमान बहुत कम होता है। यदि आप RTC चिप का उपयोग करना चाहते हैं, तो आपको उनमें से एक की भी आवश्यकता होगी।

  2. 8 मेगाहर्ट्ज RC थरथरानवाला को चलाने के लिए अपने ATmega के फ़्यूज़ को कॉन्फ़िगर करें। यह आपके millis()फ़ंक्शन को बहुत गलत बना देगा , और XTAL1 और XTAL2 पिन भी मुक्त कर देगा।

  3. घड़ी क्रिस्टल को TOSC1 और TOSC2 पिन से कनेक्ट करें। ये XTAL1 और XTAL2 (328P पर 9 और 10) के समान पिन हैं। अलग-अलग नामों का मतलब अलग-अलग कार्यों से है।

  4. अतुल्यकालिक ऑपरेशन के लिए टाइमर / काउंटर 2 को कॉन्फ़िगर करें, सामान्य गिनती मोड, 128 के लिए प्रस्केलर सेट करें और टाइमर के प्रवाह में बाधा को सक्षम करें।

अब आपको प्रति सेकंड एक बार बहुत ही स्थिर दर पर TIMER2_OVF व्यवधान मिलेगा। आपको केवल ISR में घड़ी के प्रदर्शन को एक सेकंड से आगे बढ़ाना होगा। बीच-बीच में, आप MCU को बहुत गहरी नींद में डाल सकते हैं (पावर-सेव स्लीप मोड: कुछ भी नहीं बल्कि टाइमर / काउंटर 2) और कुछ वर्षों तक AA कोशिकाओं पर चलते हैं। जब तक प्रदर्शन शक्ति-भूख है, जाहिर है।

मैंने अपनी 24-घंटे की एक दीवाल घड़ी बनाने के लिए ठीक यही किया । यह लिंक अब फ्रेंच में मूल प्रलेखन के अंग्रेजी अनुवाद की ओर इशारा करता है।

क्वार्ट्ज अंशांकन

यदि आप अपने क्वार्ट्ज को कैलिब्रेट नहीं करते हैं, तो आप एक महत्वपूर्ण बहाव की उम्मीद कर सकते हैं, आमतौर पर प्रति सप्ताह कुछ सेकंड । बहाव दर एमसीयू में क्रिस्टल को जोड़ने वाले निशानों के आवारा समाई पर निर्भर करता है। सिद्धांत रूप में, इसे कुछ अतिरिक्त, बारीक ट्यून्ड कैपेसिटेंस जोड़कर हटाया जा सकता है। यह ध्यान देने योग्य है कि आरटीसी के साथ आपको एक ही बहाव समस्या होगी

यदि आप इस तरह की सटीकता से संतुष्ट हैं, तो इसके साथ रहें और खुश रहें। हालांकि, यदि आप बहाव को मापने के लिए परवाह करते हैं, तो आप देखेंगे कि यह बहुत स्थिर है। फिर आप आसानी से सॉफ़्टवेयर में इसकी भरपाई कर सकते हैं, और प्रति वर्ष कुछ सेकंड की सटीकता प्राप्त कर सकते हैं ।

बहाव को सही करने के लिए एल्गोरिथ्म बहुत सरल है। मापा बहाव से, आप इंटरप्ट के बीच सटीक देरी का पता लगाते हैं, जो कि 10 9  नैनोसेकेंड के करीब होना चाहिए , फिर:

#define ONE_SECOND    1000000000  // in nanoseconds
#define ONE_INTERRUPT  999993482  // for example

ISR(TIMER2_OVF_vect)
{
    static uint32_t unaccounted_time;

    unaccounted_time += ONE_INTERRUPT;
    while (unaccounted_time >= ONE_SECOND) {
        advance_display_by_one_second();
        unaccounted_time -= ONE_SECOND;
    }
}

उपरोक्त उदाहरण में, क्वार्ट्ज थोड़ा तेज है, और सॉफ्टवेयर हर कुछ दिनों में "लापता" एक टिक की भरपाई करता है। यदि क्वार्ट्ज बहुत धीमा था, तो समान कोड हर कुछ दिनों में एक बार डबल-टिक करेगा।

इस तरह का अंशांकन आरटीसी के लिए भी किया जा सकता है, लेकिन यह काफी अधिक जटिल होगा, क्योंकि आरटीसी टूटे-फूटे रूप में समय की रिपोर्ट करता है जो स्वाभाविक रूप से अंकगणितीय संचालन के लिए उधार नहीं देता है।


वाह, यह वास्तव में चालाक डिजाइन है! मुझे वास्तव में पसंद है कि आपने डिज़ाइन को स्पष्ट करने के लिए पर्याप्त फ़ोटो कैसे लगाए हैं, यहां तक ​​कि हमारे लिए मूर्ख मोनोग्लोट एमरिकन्स :) मुझे इस तरह के स्पष्ट प्रोजेक्ट प्रलेखन को देखना बहुत पसंद है!
14:19 पर जॉन वाल्थर

2
@ जॉनवेल्थौर: धन्यवाद! अब आप मुझे अनुवाद लिखने के लिए प्रोत्साहित कर रहे हैं। :-)
एडगर बोनट

2
@ जॉनवेल्थौर: हो गया! लिंक अब अंग्रेजी अनुवाद की ओर इशारा करता है।
एडगर बोनट

बस स्पष्ट होने के लिए, जब आप कहते हैं, "ATmega चिप में सभी हार्डवेयर आवश्यक हैं", यह पूरी तरह सच नहीं है जब आपको एक नया क्रिस्टल प्राप्त करना होगा। मुझे लगता है कि आपका समाधान धीमा है और क्रिस्टल की जगह ऊपर नहीं है, लेकिन मैं थोड़ा उलझन में था जब आप कहते हैं कि मुझे हार्डवेयर की आवश्यकता नहीं है और फिर चारों ओर मुड़ें और कहें कि मुझे हार्डवेयर के एक टुकड़े को बदलने की आवश्यकता है।
केली एस। फ्रेंच

@ KellyS.French: मेरा वाक्य था "ATmega चिप में RTC के कर्तव्यों को पूरा करने के लिए आवश्यक सभी हार्डवेयर हैं " (जोर दिया गया)। लेकिन फिर यह ध्यान रखना महत्वपूर्ण है कि सर्वव्यापी DS1307 सहित अधिकांश RTCs को संचालित करने के लिए बाहरी क्रिस्टल की आवश्यकता होती है। एटीमेगा अलग नहीं है: आरटीसी को बदलने के लिए यह सब आवश्यक है , लेकिन क्रिस्टल को बदलने के लिए नहीं जिसे आपको आरटीसी से कनेक्ट करना होगा। कृपया ध्यान दें कि आरटीसी मॉड्यूल है और अधिक बस से एक आरटीसी, के रूप में यह क्रिस्टल शामिल नहीं है।
एडगर बोनट

6

आपके द्वारा निर्दिष्ट गुंजयमान यंत्र में 0.3% स्थिरता है, जहां क्रिस्टल या क्रिस्टल थरथरानवाला (जैसा कि रिकार्डो द्वारा उल्लेख किया गया है) 50ppm है। कई बार अधिक स्थिर। प्रतिध्वनि का तापमान बहाव भी भयानक नहीं है। सूर्य के प्रकाश द्वारा ताप इसे बदल देगा। इसलिए एक अनुनादक का उपयोग लंबे समय तक रखने के लिए नहीं किया जाना चाहिए।

इसलिए या तो एक क्रिस्टल या क्रिस्टल थरथरानवाला का उपयोग करने से आपको वही मिलेगा जो आप चाहते हैं। या तो यह ATmega पर उपयोग कर रहा है और फ़्यूज़ को क्रमशः सेट करता है या हमें RTC से कनेक्ट करता है।


जहां 50ppm 0.005% स्थिरता है?
मैथ्यू जी।

उत्तर को संक्षिप्त रखने के लिए मैं उस युक्ति का सामान्यीकरण करता हूं। Res को एक तरफ ध्यान दें। बहुत बड़ी सहिष्णुता है और काफी हद तक बंद हो सकती है। जैसा कि जॉन डब्ल्यू अनुभव कर रहे हैं। "सही काम के लिए सही हिस्सा"
एमफ्लगागा

ओह, मैं शब्दावली @mpflaga के बारे में उत्सुक था ... मेरे लिए नया।
मैथ्यू जी।

4

यदि आप एक वास्तविक समय घड़ी (जैसे DSDS1307) की तरह अतिरिक्त हार्डवेयर का उपयोग नहीं करना चाहते हैं, तो आप सभी अप्रयुक्त अवरोधों को अक्षम करके समय सटीकता में सुधार कर सकते हैं। डिफ़ॉल्ट रूप से Arduino स्केच सक्षम किए गए विभिन्न रुकावट दिनचर्या के साथ आते हैं और अक्सर वे वास्तव में आपके स्केच के लिए उपयोग नहीं किए जाते हैं। यह पता लगाने का सबसे आसान तरीका है कि क्या आप इसे जारी करने की कोशिश करने और उन्हें अक्षम करने के बिना कर सकते हैंnoInterrupts();


3
−1 (हालांकि यह −4 के योग्य है) क्योंकि: 1. जब तक आपको वास्तव में उनकी आवश्यकता नहीं होती है, सभी अवरोधों को डिफ़ॉल्ट रूप से अक्षम किया जाता है, TIMER0_OVF के एकमात्र अपवाद के साथ, जो समय को बनाए रखने के लिए आवश्यक है। 2. Arduinos की समय सटीकता मुख्य रूप से गुंजयमान यंत्र की गुणवत्ता द्वारा सीमित है। 3. व्यवधान की सटीकता पर कोई प्रभाव नहीं पड़ता है millis()जब तक कि आप उन्हें एक समय में एक से अधिक मिलीसेकंड खर्च करने का प्रबंधन नहीं करते हैं, जिस स्थिति में आपको अन्य समस्याएं हैं ... 4. साथ व्यवधान को अक्षम करना समय पर रखने से noInterrupts()रोक देगा millis()!
एडगर बोनट

2

मैं समझता हूं कि Arduino के साथ बहुत सी भावना मितव्ययी है और कभी-कभी एक समस्या के माध्यम से ट्रूडिंग होती है। मैं अपने कार्यस्थल के लिए Arduino (और अब chipKIT का उपयोग करता हूं, क्योंकि यह 10x RAM और 10x द क्लॉक स्पीड है) और मुझे गति और काम करने के लिए "परिधीय कार्यों" की आवश्यकता है।

मैं अपनी एक परियोजना में वास्तविक समय घड़ी का उपयोग करता हूं और इससे बहुत खुश हूं। उनके पास "मृत" संस्करण भी है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.