धारावाहिक संचार के लिए Arduino पर उच्च परिशुद्धता समय


11

मैं सीरियल पोर्ट पर पायथन को प्लॉट करने के लिए समय और वोल्टेज की जानकारी भेजने के लिए एक Arduino Uno का उपयोग कर रहा हूं। हालाँकि समय के साथ समय अंतराल के बीच अंतराल समय के साथ बढ़ती जा रही है, मेरी साजिश को प्रभावित करता है। यह विशेष रूप से सच है जब बॉड दर 9600 पर सेट होती है, जहां मेरा प्रारंभिक समय अंतर शायद 1320 है और अपेक्षाकृत कम समय के बाद बढ़कर 16400 हो जाता है। जब यह दर अधिकतम 115200 बीपीएस हो जाती है तो बदलाव धीमी और कम ध्यान देने योग्य होता है, अपेक्षाकृत लंबे समय तक भेजने के बाद भी लगभग 1340 से 1500 तक। सभी बार माइक्रोसेकंड में दिए गए हैं।

मैं जानना चाहूंगा कि क्या मैं इस प्रभाव को कम कर सकता हूं या समाप्त कर सकता हूं, और यदि नहीं तो समझें कि यह क्यों मौजूद है। मैंने इसे बाधित करने और देरी के बारे में चीजें पढ़ी हैं, लेकिन मैं हाथ में इलेक्ट्रॉनिक्स की जटिलता की पूरी तरह से सराहना नहीं करता हूं और जानना चाहूंगा:

  1. क्या मैं टाइमिंग में अधिक सटीकता प्राप्त कर सकता हूं?
  2. समय में इस परिवर्तन का क्या कारण है?

यहाँ मेरे पास वर्तमान में क्या है:

#include <eHealth.h>

extern volatile unsigned long timer0_overflow_count;
float fanalog0;
int analog0;
unsigned long time;    

byte serialByte;
void setup() {
  Serial.begin(9600);
}

void loop() { 
  while (Serial.available()>0){  
    serialByte=Serial.read();
    if (serialByte=='S'){        
      while(1){
        fanalog0=eHealth.getECG();  
        // Use the timer0 => 1 tick every 4 us
        time=(timer0_overflow_count << 8) + TCNT0;        
        // Microseconds conversion.
        time=(time*4);   
        //Print in a file for simulation
        //Serial.print(time);
        //Serial.print(" ");
        Serial.print(fanalog0,5);
        Serial.print("\n");

        if (Serial.available()>0){
          serialByte=Serial.read();
          if (serialByte=='F')  break;
        }
      }
    }
  }
}

"सटीक" से आपका क्या मतलब है? काउंटर द्वारा दिया गया समय काफी सटीक, सटीक और अच्छे संकल्प के साथ होने वाला है। क्या आप चाहते हैं कि समय निश्चित हो (यानी हमेशा समान)?
साइबरबर्गन

माफी, हाँ मुझे लगता है कि मैं क्या मतलब है, उन दोनों के बीच अंतर के अनुरूप और यदि नहीं, तो कारण नहीं है
user3284376

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

क्या करता eHealth.getECG()है? क्या वह कॉल हमेशा समान मात्रा में रहता है?
jfpoilpret

क्या आप बता सकते हैं कि "अपेक्षाकृत कम समय अवधि" कब तक रहती है? क्या Arduino को पुनरारंभ करने के बाद हमेशा ऐसा ही होता है?
jfpoilpret

जवाबों:


4

टाइमिंग को अधिक सटीक बनाने के लिए एक टाइमर और ISR (इंटरप्ट सर्विस रूटीन) का उपयोग करें।

संकल्पना के मेरे 1ms समयबद्ध बाधा सबूत पर एक नज़र डालें । यह विचार उस प्रणाली में यथोचित सटीक 1ms 'दिल की धड़कन' है जिसका उपयोग अन्य घटनाओं को ट्रिगर करने के लिए किया जा सकता है। PoC में इसका उपयोग butHz में एक एलईडी को ब्लिंक करने के लिए किया जाता है, लेकिन नए चर तक पहुंच होने millisecondCounterऔर secondCounterआपको मुख्य लूप में घटनाओं को मनमाने ढंग से (लेकिन सही समय पर) ट्रिगर करने में सक्षम बनाता है।


2
आपका PoC बहुत दिलचस्प है लेकिन इसमें एक दोष है (इसे ठीक करना आसान है) यह 2-बाइट मान को पढ़ता है जबकि इंटरप्ट सक्षम (में loop()) हैं, यह मान ISR द्वारा संशोधित किया जा रहा है। ऐसा हो सकता है कि loop()एक खराब मान (ISR द्वारा एक संशोधन के बीच में) पढ़ता है। मैंने इसके बारे में आपके ब्लॉग पर एक टिप्पणी पोस्ट की है।
jfpoilpret

@jfpoilpret दिलचस्प बिंदु जो आप वहां बनाते हैं, कभी भी राम से मूल्य प्राप्त करने के आधे रास्ते को बाधित करने के बारे में नहीं सोचा था। मैं आज शाम disassembly की जांच करने जा रहा हूं और लेख को अपडेट करूंगा। शायद एक और लेख भी लिखने का एक अच्छा कारण: ओ)
जिप्पी

मैंने आपके PoC से एक नमूना बनाया है और अपने UNO पर हर 10 सेकंड में कम से कम एक बार समस्या को देख सकता है। लेकिन वास्तव में यह बहुत loop()हद तक इस बात पर निर्भर करता है कि आप अपने में क्या करते हैं : मेरे नमूने को केवल मिलीसेकंड का मान मिला है, इसे पिछले पढ़ने के मूल्य पर छोड़ दें और यदि अंतर> 0 (रीसेट काउंटर से 0 के अलावा), संदेश प्रदर्शित करें।
jfpoilpret

@jfpoilpret ने वास्तव में कभी इस पर ध्यान नहीं दिया। मैं इसे अपनी बिल्लियों के लिए भोजन की बाल्टी की निगरानी करने के लिए एक दिल की धड़कन के रूप में उपयोग करता हूं और जब मेरी बिल्लियां निराश होंगी, तो एलईडी फ्लैश करेंगी; ओ) यह निश्चित रूप से भविष्य में आईएसआर का उपयोग करने के तरीके को बदल देगा।
जिप्पी

1
यह एक ब्लॉक ATMEGA16U2 से जुड़ा क्रिस्टल और ATMEGA328P-PU से जुड़ा एक रेज़ोनेटर दिखाता है। 16U2 धारावाहिक इंटरफ़ेस के लिए है 328P "द अरुडिनो" है। दिलचस्प बात यह है कि 16U2 पर्याप्त रूप से अपनी घड़ी को किसी अन्य चिप, जैसे 328P पर धकेल देगा।
उडो क्लेन

3

मैं कुछ चीजों के बारे में सोच सकता हूं जो धारावाहिक लेखन के समय की "स्थिरता" को प्रभावित कर सकती हैं:

  • डेटा का आकार प्रिंटआउट होना चाहिए

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

समाधान: स्ट्रिंग को ज्ञात लंबाई के स्ट्रिंग में प्रिंट करें।

  • बफ़र्ड सीरियल का उपयोग करना

यूनिक्स पर आप बफ़र या एक अनफ़िल्टर्ड तरीके से सीरियल पोर्ट को एक्सेस कर सकते हैं। बफर समय के लिए बफ़र किए गए तरीके का उपयोग करने से यह थोड़ा धीमा हो सकता है क्योंकि बफर भरता है, आमतौर पर ऐसा तब होता है जब डेटा तेजी से आ रहा होता है जब आप इसे पढ़ रहे होते हैं…

समाधान: असंबद्ध सीरियल लाइन का उपयोग करें ( उदाहरण के लिए : डार्विन / OSX पर इसके /dev/cu.usbmodemXXXबजाय /dev/tty.usbmodemXXX)

  • टाइमर की प्राथमिकता

ऐसा लगता है कि आपके टीसी अवरोधक का उपयोग कर रहा है, और AVRs की प्राथमिकताएं बाधित करने के तरीके से हैं, मुझे Atmega328 के लिए प्राथमिकता का क्रम नहीं पता है, और यह आसपास के सबसे प्रलेखित फीचर में से एक नहीं है, इसलिए मुझे नहीं पता कितना सुरक्षित है TC0 बनाम UART बाधा।

समाधान: आगे की प्राथमिकताओं के बारे में प्रलेखन / डेटाशीट में देखें और यदि आवश्यक हो तो टाइमर बदलें; और / या अन्य टाइमर चल रहा है बिना एक परीक्षण करते हैं।

  • वह डेटा जिसे आप पढ़ रहे हैं, समय के साथ पढ़ने में अधिक समय लेता है

कुछ ड्राइवरों को औसत या पिछले मानों पर कुछ ऑपरेशन करने की आवश्यकता होती है, इसलिए आप जितने अधिक मानों को मापते हैं, बफर उतना ही लंबा होता है, और जब तक आप बफर के अधिकतम आकार तक नहीं पहुंच जाते, तब तक मूल्य की गणना करने में अधिक समय लगता है।

समाधान: आपके द्वारा उपयोग किए जा रहे लायब्रेरी के स्रोत कोड को देखें, और या तो इसे ऑप्टिमाइज़ करें, गणना को हटा दें यदि एक है या उस बढ़ते प्रसंस्करण समय को ध्यान में रखें।

  • से बचने के arduino ढांचे ओवरहेड

लेकिन अगर आप वास्तव में arduino से सीरियल आउटपुट ऑप्टिमाइज़ करना चाहते हैं, तो आपको arduino ओवरहेड का उपयोग करने से बचना चाहिए ... लेकिन यह कम सुरुचिपूर्ण और उपयोग करने के लिए आरामदायक है।

मुझे पूरा यकीन है कि अन्य बिंदु हैं जो मुझे याद आ रहे हैं, लेकिन यह पहली चीज है जिसे मैं आगे खुदाई करने से पहले जांच करूंगा।

HTH


2

आपके कोड में बाद की मापों में आउटपुट की अवधि शामिल है। इस प्रकार उत्पादन की लंबाई के आधार पर आप अलग-अलग समय को मापेंगे। इसे निश्चित लंबाई आउटपुट के रूप में तय किया जा सकता है।

अगला मुद्दा यह है कि यूएनओ के पास बहुत खराब टाइमबेस है। अलग Arduino प्रकार बनाम DCF77 समय संदर्भ की तुलना के लिए यहां एक नज़र डालें

निष्कर्ष: यदि आपको सटीक समय की आवश्यकता है या तो क्रिस्टल के साथ एक Arduino प्राप्त करें या RTC के लिए जाएं। मैं अत्यधिक DS3231 / DS3232 आरटीसी की सिफारिश कर सकता हूं क्योंकि ये आमतौर पर बॉक्स से 2 पीपीएम सटीकता प्राप्त करते हैं।

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