यहाँ कई कारक हैं:
- 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 प्राप्त करना बहुत मुश्किल नहीं होगा , कम से कम फट प्रसारण के लिए, यदि आप इस पर थोड़ा समय बिताते हैं।