मैं कितनी ऊंची बॉड दर (त्रुटियों के बिना) जा सकता हूं?


40

मानक 9600 बॉड है। वह सिर्फ मानक हैएक Arduino Uno SMD R2 का उपयोग करना, मुझे प्राप्त होने वाली उच्चतम व्यावहारिक बॉड दर क्या है?

दुस्साहस के लिए बोनस अंक: आप एक त्रुटि जाँच तंत्र बनाने और फिर बॉड दर हास्यास्पद उच्च स्थानांतरण दर बढ़ाने के लिए कैसे जाएंगे?


1
यह ध्यान देने योग्य है कि Arduino बोर्ड जो FTDI USB- धारावाहिक ICs का उपयोग करते हैं, वास्तव में तेजी से जा सकते हैं। आम FT232 मुद्दों के बिना 3 मेगाबॉड (कि 3,000,000 बॉड) जा सकता है। ATmega16U2 का उपयोग सीमित कारक है।
कॉनर वुल्फ

मेरे क्लोन Arduino नैनो कि मैं eBay से मिला 1,099,999 पर अधिकतम। गंभीरता से। यह किया। एक बार जब यह 1,100,000 तक पहुंच गया, तो उत्पादन में वृद्धि हुई। laqq`na`fca`fga`fga`bcngaah````iin`ha`a`a`bga`fga`bcqpahhqfq```fh`oopa`bca`fca। यह USB comms के लिए CH340 चिप का उपयोग करता है।
पीएनडीए

जवाबों:


59

यहाँ कई कारक हैं:

  • ATmega328P MCU से बॉड-रेट कितना ऊंचा हो सकता है?
  • यूएसबी-सीरियल इंटरफ़ेस कितना उच्च स्तर की बॉड-दर प्राप्त कर सकता है?
  • ATmega328P पर थरथरानवाला आवृत्ति क्या है?
  • यूएसबी-सीरियल इंटरफ़ेस (यदि यह एक है) पर थरथरानवाला आवृत्ति क्या है?
  • बॉड-दर बेमेल का यूएसबी-सीरियल इंटरफ़ेस कितना सहिष्णु है?

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

एफटीडीआई-आधारित इंटरफेस बॉड-दर बेमेल के प्रति काफी सहिष्णु हैं, कई प्रतिशत त्रुटि तक। हालांकि, मैंने विशेष रूप से एम्बेडेड जीपीएस मॉड्यूल के साथ काम किया है जो 0.5% बॉड दर त्रुटि को भी संभालने में असमर्थ थे।

सामान्य सीरियल इंटरफेस ~ 5% बॉड-रेट त्रुटि के सहिष्णु हैं। हालांकि, चूंकि प्रत्येक छोर बंद हो सकता है, एक अधिक सामान्य कल्पना + -2.5% है। इस तरह, यदि एक छोर 2.5% तेज है, और दूसरा 2.5% धीमा है, तो आपकी समग्र त्रुटि अभी भी केवल 5% है।


वैसे भी। Uno प्राथमिक MCU के रूप में ATmega328P और USB- सीरियल इंटरफ़ेस के रूप में ATmega16U2 का उपयोग करता है। हम यहाँ भी भाग्यशाली हैं कि ये दोनों MCUs समान हार्स USART, और साथ ही 16 मेगाहर्ट्ज घड़ियों का उपयोग करते हैं।

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

वैसे भी, इस प्रश्न का "उचित" उत्तर ATmega16U2 के लिए स्रोत को खोदने, और वहां से संभावित बॉड-रेट्स को बाहर करने के लिए शामिल होगा, लेकिन जब से मैं आलसी हूं, मैं सरल, अनुभवजन्य परीक्षण काम करूंगा।

ATmega328P डेटाशीट पर एक त्वरित नज़र निम्नलिखित तालिका उत्पन्न करती है:
यहाँ छवि विवरण दर्ज करें

इसलिए 2 एमबीपीएस की अधिकतम बताई गई दर, मैंने एक त्वरित परीक्षण कार्यक्रम लिखा:

void setup(){};

void loop()
{

  delay(1000);
  Serial.begin(57600);
  Serial.println("\r\rBaud-rate = 57600");
  delay(1000);
  Serial.begin(76800);
  Serial.println("\r\rBaud-rate = 76800");
  delay(1000);
  Serial.begin(115200);
  Serial.println("\r\rBaud-rate = 115200");
  delay(1000);
  Serial.begin(230400);
  Serial.println("\r\rBaud-rate = 230400");
  delay(1000);
  Serial.begin(250000);
  Serial.println("\r\rBaud-rate = 250000");
  delay(1000);
  Serial.begin(500000);
  Serial.println("\r\rBaud-rate = 500000");
  delay(1000);
  Serial.begin(1000000);
  Serial.println("\r\rBaud-rate = 1000000");
  delay(1000);
  Serial.begin(2000000);
  Serial.println("\r\rBaud-rate = 2000000");
};

और फिर एक सीरियल टर्मिनल के साथ प्रासंगिक धारावाहिक पोर्ट को देख रहा है:

यहाँ छवि विवरण दर्ज करें

तो यह प्रतीत होता है कि हार्डवेयर समस्याओं के बिना 2,000,000 बॉड पर चल सकता है।

ध्यान दें कि यह बॉड दर केवल MCU 64 80 घड़ी-चक्र प्रति बाइट देता है, इसलिए धारावाहिक इंटरफ़ेस को व्यस्त रखना बहुत चुनौतीपूर्ण होगा। जबकि व्यक्तिगत बाइट्स को बहुत तेज़ी से स्थानांतरित किया जा सकता है, इंटरफ़ेस के निष्क्रिय होने पर बहुत समय होने की संभावना है।


संपादित करें: वास्तविक परीक्षण!

2 एमबीपीएस वास्तविक है:
यहाँ छवि विवरण दर्ज करें
प्रत्येक बिट-टाइम 500 एनएस है, जो कि अपेक्षित होने के साथ बिल्कुल मेल खाता है।

प्रदर्शन के कारण! कुल पैकेट लंबाई:
500 कबूद: यहाँ छवि विवरण दर्ज करें

1 Mbaud: यहाँ छवि विवरण दर्ज करें

2 Mbaud: यहाँ छवि विवरण दर्ज करें
नोट: ध्यान देने योग्य ओवरशूट खराब स्कोप जांच ग्राउंडिंग प्रथाओं के कारण है, और शायद वास्तविक नहीं है। मैं ग्राउंड-क्लिप-लीड का उपयोग कर रहा हूं जो मेरे कार्यक्षेत्र जांच का हिस्सा है, और लीड-इंडक्शन बहुसंख्यक ओवरशूट का कारण है।

जैसा कि आप देख सकते हैं, समग्र संचरण लंबाई 0.5, 1 और 2 Mbaud के लिए समान है। इसका कारण यह है कि सीरियल बफ़र में बाइट्स रखने वाला कोड खराब रूप से अनुकूलित है। जैसे, आप कभी भी कुछ बेहतर हासिल नहीं करेंगे तो एक प्रभावी 500 कबूद, जब तक आप अपने खुद के सीरियल लाइब्रेरी नहीं लिखते। Arduino पुस्तकालयों को बहुत खराब तरीके से अनुकूलित किया गया है, इसलिए संभवतया 2 Mbaud प्राप्त करना बहुत मुश्किल नहीं होगा , कम से कम फट प्रसारण के लिए, यदि आप इस पर थोड़ा समय बिताते हैं।


4
थ्रूपुट सीमा का अच्छा चित्रण!
जिप्पी

1
@AnnonomusPerson - यदि आप 20 मेगाहर्ट्ज घड़ी पर स्विच करते हैं, तो आप 2.5 एमबीपीएस कर सकते हैं।
कॉनर वुल्फ

1
@NnonomusPerson - आपको दोनों स्वैप करने की आवश्यकता होगी, या 20 मेगाहर्ट्ज ATmega328P थरथरानवाला के साथ एक FTDI USB- सीरियल इंटरफ़ेस का उपयोग करना होगा। ATmega328P 20 Mhz क्रिस्टल / अनुनादक के बिना 2.5 एमबीपीएस नहीं कर सकता है। वही किसी भी ATmega16U2 इंटरफेस के लिए सच है।
कॉनर वुल्फ

1
बहुत बढ़िया जवाब! बस एक छोटा सुधार: 2 एमबी / एस पर, प्रत्येक बाइट ट्रांसमिशन में 80 सीपीयू चक्र होते हैं, 64 नहीं। ऐसा इसलिए है, क्योंकि समय-वार, प्रत्येक बाइट 10 बिट (1 प्रारंभ, 8 डेटा, 1 स्टॉप) के लायक है।
एडगर बोनेट

1
@ linhartr22 - वायर्स केवल तभी प्ले में आते हैं जब वे लंबे होते हैं , जैसे कि 12 "+ में। मुझे लगता है कि यह संभव नहीं है कि बहुत से लोग 100 फुट लंबी केबल का बहुत अधिक उपयोग कर रहे हैं। इसके अलावा, सवाल यह था कि आर्डिनो / एटीमेगा कितना ऊंचा था। बॉड दर जा सकता है, न कि कितनी उच्च मनमानी केबल असेंबली जा सकती है।
कॉनर वुल्फ

7

Arduino सीरियल मॉनिटर विंडो आपको 115200 तक सीमित करती है, लेकिन यह उच्चतम बॉड दर सक्षम नहीं है। आप अधिकतम जानने के लिए Atmel और FT232 (या जो भी आप उपयोग कर रहे हैं) datasheets पढ़ सकते हैं, लेकिन मैं बिना किसी समस्या के सफलतापूर्वक 230400 (दो बार जितनी जल्दी Arduino Serial Monitor सबसे बड़ा समर्थन करता है) का उपयोग करने में सक्षम हूं।

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

ध्यान दें कि यह आपकी घड़ी की गति पर भी निर्भर करता है।

यहां एक कैलकुलेटर है जो संभव है कि गणना करने में आपकी सहायता करता है।


जैसे-जैसे आप तेजी से और तेजी से जाने लगते हैं, सीमा सीरीयल लाइब्रेरी बन जाती है - यह कार्यान्वयन बहुत कुशल नहीं है।
Cybergibbons

लिंक की वेबसाइट मृत है
कोडबीट

3

यह संभवतः उन कुछ पहलुओं में से एक है जहां एल-सस्ता बोर्ड मूल बोर्डों से अलग हैं। अधिकतम सीरियल ट्रांसफर दर बोर्ड की गुणवत्ता और उसके लेआउट द्वारा बहुत ही सीमित है। एक बार सीरियल डेटा या तो AVR या USB इंटरफ़ेस चिप में प्रवेश करता है, तो डेटा को सीरियल UART प्रोटोकॉल से अलग तरीके से संसाधित किया जाएगा।

हालांकि ध्यान रखें कि माइक्रोकंट्रोलर के पास कुछ बुनियादी हार्डवेयर हैं IO पिन से / से सीरियल डेटा को / में शिफ्ट करने के लिए, लेकिन पूर्ण अधिकतम दर 16MHz घड़ी (AVRs) तक सीमित है। एक बार एक बाइट को सीरियल बफर में स्थानांतरित कर दिया जाता है, UART हार्डवेयर अपने आप खत्म हो जाएगा और अपने आप बिट्स में पुश / पुल आउट कर देगा। औसत पर AVR 16M निर्देश प्रति सेकंड तक पहुंच जाता है और धारावाहिक बफ़र को भरने के लिए उपयोग किए जाने वाले व्यवधानों में कुछ ओवरहेड होता है (वर्तमान स्थिति को बचाने के लिए रुकावट से निपटने के लिए कम से कम 8 घड़ी की टिक + निर्देश + वास्तव में बफर को भरने के लिए कई निर्देश)। किसी दिए गए बिटरेट पर, प्रोटोकॉल प्रति सेकंड एक बिट n पर चलेगा, लेकिन आपके कंट्रोलर को सीरियल बफर को भरने के लिए अधिक समय की आवश्यकता है, क्योंकि यह वास्तव में डेटा को आउटपुट करने की आवश्यकता है, जिसके परिणामस्वरूप आप की अपेक्षा कम औसत थ्रूपुट और UART निष्क्रिय हो जाता है अपेक्षाकृत लंबे समय के लिए।

याद रखने का एक और प्रभाव यह है कि UART पर डेटा को पुश करने (या इसे खींचने) के लिए आवश्यक सभी ओवरहेड को आपके वास्तविक कार्यक्रम में खर्च नहीं किया जा सकता है, फिर से औसत व्यावहारिक प्रवाह को प्रभावित करता है। आप केवल एक बार प्रत्येक निर्देश चक्र का उपयोग कर सकते हैं, या तो बफर भरने के लिए या मुख्य लूप की गणना के लिए।

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


1
मैं वास्तव में, वास्तव में किसी भी बोर्ड पर संदेह करता हूं कि लेआउट के मुद्दे काफी गंभीर हैं जो 2 मेगाहर्ट्ज सिग्नल को ठीक करने से रोकते हैं। 2 Mhz बिल्कुल उच्च आवृत्ति नहीं है।
कॉनर वुल्फ

@FakeName मेरी डेस्क पर कम से कम एक बोर्ड ने धारावाहिक गति बढ़ाने पर BER बढ़ा दिया है। मैं आमतौर पर 9600 का उपयोग करता हूं, जो कि अधिकांश अनुप्रयोगों के लिए पर्याप्त से अधिक है और मजबूत है।
जिप्पी

मजाक नहीं! हुह। मुझे आश्चर्य है कि लेआउट को होने के लिए कितना बुरा होना चाहिए? मुझे संदेह है कि यह लेआउट जितना गरीब-सहिष्णु अनुनादक / क्रिस्टल नहीं है, हालांकि।
कॉनर वुल्फ

1
उच्च बॉड-दर, विशेष रूप U2Xn = 1से USART में, यदि बेमेल के बारे में बहुत क्रैंक मिलता है।
कॉनर वुल्फ

@FakeName मैं एक डायनासोर हूं, मैं सभी गलत विरासत कारणों के लिए "9600 8N1" की तरह सोच सकता हूं, ओ)
jippie

2

त्रुटि जाँच वास्तव में बहुत आसान है और एक AVR परिवाद है जो एक लाइनर में ऐसा करता है।

पर पढ़ें util/crc16.hऔर शामिल उदाहरणों के साथ कुछ ही समय में जाने के लिए आपको अच्छा होना चाहिए।

सीआरसी सरल अनुप्रयोगों के लिए काफी मजबूत और तेज है।

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