Arduino: micros () की तुलना में बेहतर माइक्रोसेकंड संकल्प?


11

Micros () प्रलेखन नोट करता है कि रिटर्न वैल्यू हमेशा 4 के कई होगी।

क्या उच्च रिज़ॉल्यूशन माइक्रोसेकंड क्लिक प्राप्त करने का कोई तरीका है, अधिमानतः 1 माइक्रोसेकंड स्तर तक?

AVR स्तर तक गिरना स्वीकार्य है।


1
जब आप इसे पूरी तरह से अंग्रेजी प्रश्न बनाते हैं तो आप एक टैग के साथ अपना शीर्षक शुरू करने पर जोर क्यों देते हैं?
स्टीवनवह

4
क्षमा याचना स्टीवन, मैंने ईमानदारी से सोचा (और लगता है) यह एक अच्छा तरीका है प्रश्न को स्पष्ट रूप से और स्पष्ट रूप से व्यक्त करें। इस बारे में बहुत चर्चा हुई, और जेफ़ ने कुछ मामलों में सहमति व्यक्त की कि यह पूछने का एक अच्छा तरीका था। चर्चा यहाँ है; हीटमैप्स ने मुझे आश्वस्त किया है कि प्रश्नों की इन शैली के लिए यह ऑपरेटिंग वातावरण पर जोर देने के लिए भुगतान करता है। meta.stackexchange.com/questions/10647/writing-good-tmarks/… लेकिन, अपने उत्कृष्ट उत्तरों के लिए सम्मान से बाहर, मुझे यह वापस बदलने में खुशी होगी यदि आपको लगता है कि यह सबसे अच्छा है।
मार्क हैरिसन

क्या पल्सिन () फ़ंक्शन के लिए इसका उपयोग करना संभव है? मुझे संकल्प लेस में 1 usec की तुलना में दालों की लंबाई मापने की आवश्यकता है।

यह स्थान शीर्ष पर प्रश्न के उत्तर के लिए आरक्षित है। यदि आपके पास कुछ पूछना है, तो अपना प्रश्न शुरू करें।
ओलिन लेथ्रोप

जवाबों:


9

हां, आपके Arduino की मूल घड़ी दर के आधार पर। उदाहरण के लिए यहाँ ATM -ga2560 के काउंटर-टाइमर 2 और 16MHz की मूल घड़ी दर के लिए पूर्व-स्केलिंग के बाद काउंटर-टाइमर इनपुट फ़्रीक्वेंसी और अवधि हैं। टाइमर ने "प्रीस्कूलर" मूल्य विकल्पों में बनाया है जो आवृत्ति / अवधि निर्धारित करते हैं, इस तालिका में दिखाया गया है:

    TCCR2B bits 2-0    Prescaler    Freq [KHz], Period [usec] after prescale
          0x0          (TC stopped)      --         --
          0x1                1        16000.        0.0625
          0x2                8         2000.        0.500
          0x3               32          500.        2.000
          0x4               64          250.        4.000
          0x5              128          125.        8.000
          0x6              256           62.5      16.000
          0x7             1024           15.625    64.000

बेहतर समय संकल्प के लिए, आप TCNT2 नामक मान का उपयोग करते हैं। काउंटर में निर्माण है जो 0 से 255 तक जाता है क्योंकि टाइमर 8 बिट है। जब काउंटर TCNT2 द्वारा निर्दिष्ट मूल्य तक पहुंचता है तो यह एक बाधा को ट्रिगर करता है। इस व्यवधान को TIMER2_OVF_vect कहा जाता है।

यह जानकारी दी, परिणामी रुकावट दर होगी: 16 मेगाहर्ट्ज / (प्रीस्कूलर * (255 - TCNT2) -

आप पूर्ण 16MHz (62.5nSec) पर चलने के लिए टाइमर प्राप्त कर सकते हैं, हालांकि यह आपकी ज़रूरत से ज़्यादा तेज़ है; (255-2) की प्रारंभिक गणना के साथ 2 मेगाहर्ट्ज आपको 1 मेगाहर्ट्ज इंटरप्ट रेट देगा। अपने ISR में 2 से भाग दें:

extern uint32_t MicroSecClock = 0;

ISR(TIMER2_OVF_vect) {// this is a built in function that gets called when the timer gets to the overflow counter number
  static uint_8 count;            // interrupt counter

  if( (++count & 0x01) == 0 )     // bump the interrupt counter
    ++MicroSecClock;              // & count uSec every other time.

  digitalWrite(53,toggle);// pin 53 is arbitrary
  TCNT2 = 253;                    // this tells the timer when to trigger the interrupt. when the counter gets to 253 out of 255(because the timer is 8 bit) the timmer will trigger an interrupt
  TIFR2 = 0x00;                   // clear timer overflow flag
};

आपके MCU के लिए डेटा शीट मूल संसाधन है; यह लेख आपको (और मुझे दिया!) एक अच्छी शुरुआत देगा।


4

मार्क, मैंने Arduino Atmega328 Timer2 के आधार पर फ़ंक्शन का एक नया सेट लिखने का फैसला किया, और 0.5us को सटीक रूप से प्राप्त करने के लिए, अतिप्रवाह अवरोधों का उपयोग किया। मेरा कोड यहां डाउनलोड और उपयोग के लिए उपलब्ध है:

http://electricrcaircraftguy.blogspot.com/2014/02/Timer2Counter-more-precise-Arduino-micros-function.html

यहाँ एक संक्षिप्त विवरण दिया गया है: "मैंने" माइक्रोस () "रिप्लेसमेंट फंक्शन पर 0.5us परिशुद्धता प्राप्त करने के लिए" लिबरी "लिखा है, ताकि मैं 1us के भीतर एक PWM या PPM सिग्नल पढ़ने के लिए दोहराए जाने वाले परिणाम प्राप्त कर सकूं। मैंने चारों ओर खोज की। इंटरनेट और कुछ तुलनीय नहीं मिल सका (या जिसका उपयोग करना आसान था, और सर्वो लीबिया के माध्यम से पीडब्लूएम सिग्नल लिखने की अरुडिनो की क्षमता को बनाए रखा है), इसलिए मुझे लगता है कि यह Arduino और Radio Control की दुनिया में मेरा पहला बड़ा योगदान है। "


3

यदि AVR स्तर तक गिरना स्वीकार्य है (जैसा कि आपने अपने प्रश्न में उल्लेख किया है), आप एक टाइमर सेट कर सकते हैं और यहां तक ​​कि AVR की घड़ी की टिक भी प्राप्त कर सकते हैं।

आपको अपने एवीआर की डेटशीट का उल्लेख करने की आवश्यकता है क्योंकि यह अलग-अलग ATMegas और ATTinys में भिन्न है। लेकिन प्रक्रिया हमेशा समान होती है। आपको क्या करने की आवश्यकता है:

  • तय करें कि कौन सा प्रीस्कूलर उपयोग करना है (उदाहरण के लिए इसे 1 पर सेट करें, अर्थात यदि आप वास्तविक सीपीयू घड़ी की गति चाहते हैं तो कोई प्रिस्कलिंग नहीं), टीसीआर प्रलेखन का संदर्भ लें
  • एक टाइमर अतिप्रवाह व्यवधान, एक बाधा हैंडलर सेट करें और विश्व स्तर पर व्यवधान को सक्रिय करें
  • टाइमर / काउंटर कंट्रोल रजिस्टर में टाइमर को सक्रिय करें TCCR

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

यहाँ पुराने AT90S2313 के लिए कुछ उदाहरण कोड है, लेकिन यह आपको अच्छे संकेत देता है कि मूल रूप से क्या करना है:

/* uC: AT90S2313 */
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
  // set up timer 0
  TCCR0 = (1<<CS01); // Prescaler 8

  // enable overflow interrupt
  TIMSK |= (1<<TOIE0);

  // activate interrupts
  sei();

  while(1)
  {
     /* Do whatever you like */
  }
}


ISR (TIMER0_OVF_vect)
{    
   /*
      This gets called everytime there in an overflow in the timer register  
   */
}

धन्यवाद फीजै। क्या मैं एक Arduino स्केच के संदर्भ में इन व्यवधानों को सेट कर सकता हूं?
मार्क हैरिसन

1
मैं arduino ढांचे से परिचित नहीं हूं। लेकिन अगर यह आंतरिक रूप से सभी टाइमर सेट नहीं करता है, तो आप निश्चित रूप से कर सकते हैं। अन्यथा आप अभी भी टाइमर रजिस्टर पढ़ सकते हैं और खुद की गणना कर सकते हैं।
फीजई

हाँ, आप Arduino में पूर्ण C ++ में प्रोग्रामिंग कर रहे हैं और सभी रजिस्टरों और प्रतीकों का उपयोग कर सकते हैं जैसे TIMSK, TOIE0आदि (atmega328p डेटाशीट से कॉपी टाइमर सेटअप)। ऐसा लगता है कि आप ISR () मैक्रो का उपयोग नहीं कर सकते, इसके बजाय arduino.cc/en/Reference/Attachorterrupt का उपयोग करें ।
जोफॉर्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.