मैं नमूना आवृत्ति कैसे जान सकता हूं?


16

मैं नमूने दर और बॉड्रेट आदि के बारे में थोड़ा भ्रमित होने लगा हूं, मेरे पास यह Arduino कोड है:

#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;
        }
      }
    }
  }
}

चूँकि कोई विलंब अवरोध नहीं है, नमूना दर / आवृत्ति क्या है? क्या यह Arduino ADC की गति पर आधारित है? जब मैं बॉड्रेट बढ़ाता हूं तो मैं नमूना आवृत्ति या सीरियल दर पर डेटा भेजने की दर बढ़ा रहा हूं?

जवाबों:


21

Arduino ADC घड़ी की गति ..arduino-1.5.5 \ हार्डवेयर \ arduino \ avr \ cores \ arduino \ wiring.c में सेट है।

यहाँ प्रासंगिक हिस्सा है

#if defined(ADCSRA)
    // Set A/D prescale factor to 128
    // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range.
    // XXX: this will not work properly for other clock speeds, and
    // this code should use F_CPU to determine the prescale factor.
    sbi(ADCSRA, ADPS2);
    sbi(ADCSRA, ADPS1);
    sbi(ADCSRA, ADPS0);

    // Enable A/D conversions
    sbi(ADCSRA, ADEN);
#endif

16 MHz Arduino के लिए ADC घड़ी 16 MHz / 128 = 125 KHz पर सेट है। AVR में प्रत्येक रूपांतरण 13 ADC घड़ियों को 125 KHz / 13 = 9615 हर्ट्ज तक ले जाता है।

यह अधिकतम संभव नमूना दर है, लेकिन आपके आवेदन में वास्तविक नमूनाकरण दर लगातार रूपांतरण कॉल के बीच के अंतराल पर निर्भर करती है।
चूंकि आप परिणाम पढ़ते हैं और इसे सीरियल पोर्ट के माध्यम से भेजते हैं, इसलिए आपको देरी हो रही है जो बॉड की दर घटने के साथ बढ़ जाती है। बॉड दर जितनी कम होगी डेटा की समान लंबाई भेजने में उतना ही अधिक समय लगेगा और अगले ADC रूपांतरण को कॉल करने में अधिक समय लगेगा।

आपके एप्लिकेशन में वास्तविक नमूनाकरण दर डिबगर या सिम्युलेटर के उपयोग के साथ निर्धारित किया जा सकता है, लेकिन हर बार जब आप किसी रूपांतरण को निष्पादित करते हैं और डिजिटल पिन टॉगल करते हैं तो आवृत्ति को मापने के लिए एक आसान समाधान है।


इसके अलावा, मेरे समय के टिकटों के बीच का समय ~ 1300 से बढ़कर ~ 16400 तक बढ़ जाता है, निश्चित रूप से उन्हें समान रहना चाहिए? यह 9600 पर है, 115200 पर, वे बहुत समय के बाद केवल लगभग 1500 तक बढ़ जाते हैं।
user3284376

@ user3284376 अपने टाइम स्टैम्प कोड के बारे में, मुझे लगता है कि यह हर समय काम नहीं कर सकता (गलत समय पर कुछ व्यवधानों से पक्षपाती हो सकता है)। मेरा सुझाव है कि आप एक विशिष्ट प्रश्न पोस्ट करें कि कैसे Arduino पर उच्च परिशुद्धता समय प्राप्त किया जाए और अपने कोड का प्रासंगिक हिस्सा वहां रखा जाए।
jfpoilpret

7

मैं एक परियोजना के लिए एक उच्च नमूना दर भी प्राप्त करना चाहता था। पता चला है कि ADPS2 रजिस्टर के ADPS2, ADPS1, ADPS0 बिट्स को 76923 s / s या 76.8 ks / s के नमूने की दर प्राप्त करने के लिए कॉन्फ़िगर किया जा सकता है। लेकिन, सावधान रहें कि मैं अपने arduino के ADC को फ्री रनिंग मोड में चला रहा हूं, निम्नलिखित लाइनें मेरे लिए काम करती हैं।

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
// Set the Prescaler to 16 (16000KHz/16 = 1MHz)
// WARNING: Above 200KHz 10-bit results are not reliable.
//ADCSRA |= B00000100;
sbi(ADCSRA, ADPS2);
cbi(ADCSRA, ADPS1);
cbi(ADCSRA, ADPS0);

// Set ADIE in ADCSRA (0x7A) to enable the ADC interrupt.
// Without this, the internal interrupt will not trigger.
//ADCSRA |= B00001000;
sbi(ADCSRA,ADIE)
}

इस आवृत्ति पर सामान्य 10-बिट परिणाम विश्वसनीय नहीं होते हैं। इसका मतलब है कि नमूना दर बढ़ने से परिणामों की शुद्धता कम हो जाएगी। इसलिए मैं केवल ऊपरी 8 बिट्स का उपयोग करता हूं क्योंकि इस प्रीस्कूलर में ऊपरी 8-बिट्स विश्वसनीय हैं। आप इस पृष्ठ पर और अधिक विस्तार से जा सकते हैं, यह यार चट्टानें! उन्होंने UNO http://www.instructables.com/id/Girino-Fast-Arduino-Oscilloscope/ का उपयोग कर एक उच्च नमूना दर आस्टसीलस्कप बनाया


3

प्रत्येक लूप जिसे आप 9600bps के सीरियल लिंक पर 8 अक्षर प्रिंट कर रहे हैं। प्रत्येक चरित्र 10 बिट्स लेता है (1 शुरुआत, चरित्र के लिए 8 बिट, 1 स्टॉप)। इसका मतलब है कि आप केवल इस लूप के माध्यम से जा सकते हैं ~ 120 गुना / सेकंड।

analogRead()समारोह सिद्धांत रूप में के बारे में 9600 बार / सेकंड पर स्वाद ले सकते हैं, वास्तविक इसके बारे में 8600 बार / सेकंड है।

आपको धारावाहिक संचार द्वारा बाध्य किया जा रहा है।


तो 115200 तक बढ़ते हुए, 1440 गुना / सेकंड देता है, क्या यह नमूना दर है?
user3284376

दे या ले, हाँ। आपको यह ध्यान रखने की आवश्यकता है कि सीरियल के लिए आवश्यक है कि दूसरा छोर जवाब दे, इसलिए आप पीसी रिस्पॉन्स पर निर्भर हैं। यह निर्धारक नहीं है इसलिए आपको घबराना होगा।
साइबरबर्गन

आप चीजों के Arduino अंत पर सही हैं, यह सब ठीक प्रतीत होता है, लेकिन पायथन चीजों पर बहुत धीमी है, चीजों के कंप्यूटर अंत पर प्रदर्शन को बढ़ाने के लिए मुझे किस तरह की चीजों की आवश्यकता होगी?
user3284376

आपको इसे पीसी पर सीरियल के प्रदर्शन के साथ एक समस्या के रूप में नहीं देखना चाहिए, लेकिन डेटा भेजने से आप कैसे नमूना लेते हैं।
साइबरबर्गन

1
@Cybergibbons - नहीं, क्योंकि यह एक यूनो पर चल रहा है, जहां USB और धारावाहिक को हटा दिया गया है, 'S' वर्ण को जारी करने और 'F' को जारी न करने के अलावा पीसी पर कोई निर्भरता नहीं है। स्केच यहाँ पोस्ट किया गया है और जिस प्लेटफ़ॉर्म पर यह चलता है वह ख़ुशी से USB-सीरियल साथी माइक्रो में सीरियल डेटा को फेंक देगा, आँख बंद करके अगर यह या कि यूएसबी के दूसरे छोर पर कुछ भी रख रहा है।
क्रिस स्ट्रैटन

3

धारावाहिक पर 11 बिट्स को 9600 के बॉड पर भेजना, लेकिन नमूने के लिए, मैं इसे एक सरणी में स्टोर कर सकता हूं, जितना संभव हो उतना कम देरी, फिर एक बार यह हो जाने के बाद, मैं इसे सीरियल पोर्ट के माध्यम से एक अजगर स्क्रिप्ट द्वारा पढ़ा जा सकता हूं। मैं matplotlib का उपयोग कर एक FFT के लिए यह कर रहा हूँ। मैं 0-5 वी सिग्नल सुनता हूं, फिर बिना देरी () फ़ंक्शन का उपयोग किए, मैं एनालॉगराइड () मानों को उस सरणी में संग्रहीत करता हूं। एक दूसरे विभाजन में रीडिंग की जाती है, फिर सीरियल डेटा डंप शुरू होता है। जब मैंने दूसरे जुड़े हुए Arduino से टोन () का उपयोग करके इनपुट आवृत्ति को कैलिब्रेट किया, तो मुझे एहसास हुआ कि मुझे .1 हर्ट्ज तक सटीकता प्राप्त करने के लिए सूचकांक को 8915 से विभाजित करना था। क्योंकि उचित इंडेक्स अंतराल प्राप्त करने के लिए किसी को नमूने की आवृत्ति से विभाजित करना होगा, मेरा अनुमान है कि Arduino नमूनाकरण आवृत्ति (मेरे कोड के साथ कम से कम मेरा) 8915Hz है।


1

नमूना दर और बॉड दर के बीच के अंतर के हिस्से का उल्लेख करते हुए, वे अलग-अलग माप हैं।

नमूना दर वह आवृत्ति है जिस पर डिवाइस (arduino) आने वाले एनालॉग मूल्यों के डिजिटल प्रतिनिधित्व को फिर से बना सकता है।

बॉड रेट वह दर है जिस पर संचार चैनल में जानकारी स्थानांतरित की जाती है। यह माइक्रोकंट्रोलर और बाहरी दुनिया (कंप्यूटर) के बीच संचार की दर का वर्णन करता है।

मैं इस Electronics_stack_exchange लिंक की सिफारिश करूंगा। /electronics/135056/sampling-rate-data-rate-and-bandwidth


0

8915Hz - यह 125000/14 ~ = 8928.6 के करीब है। मेरा प्रारंभिक अनुमान है कि आसन्न रूपांतरणों के बीच एक अंतर की आवश्यकता है नमूनाकरण के लिए एक एडीसी घड़ी और रूपांतरण के लिए 13 एडीसी घड़ियों। छोटी सी त्रुटि Arduino के सही घड़ी स्रोत का प्रभाव नहीं हो सकता है। मैं अभी तक आश्वस्त नहीं हूं। यह विषय अब मेरे लिए वास्तविक है क्योंकि नमूना डेटा को डिजिटल फ़िल्टर को फीड करना होगा।


1
मुझे यकीन नहीं है कि जब आप कहते हैं कि आपका क्या मतलब है "यह विषय मेरे लिए अब वास्तविक है क्योंकि नमूना डेटा को डिजिटल फिल्टर खिलाना होगा"। क्या आपको भी ऐसी ही समस्या है?
VE7JRO

प्रत्येक रूपांतरण ADC घड़ी के बढ़ते किनारे पर शुरू होता है, और कम से कम एक ADC घड़ी चक्र कोड निष्पादित होता है। तो हाँ, 8928.6 हर्ट्ज सबसे तेज़ है जो आप analogRead()एक तंग लूप में कॉल करके प्राप्त कर सकते हैं , बनाम एक बहुत लगातार 9615.4 हर्ट्ज फ्री-रनिंग मोड में।
एडगर बोनट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.