ฉันจะไปอัตราการรับส่งข้อมูลได้สูงเท่าใด (โดยไม่มีข้อผิดพลาด)?


40

มาตรฐานคือ 9600 บอด นั่นเป็นเพียงมาตรฐาน การใช้ Arduino Uno SMD R2 อัตราการรับส่งข้อมูลที่เป็นประโยชน์สูงสุดที่ฉันสามารถทำได้คือเท่าไหร่

คะแนนโบนัสสำหรับผู้กล้า: คุณจะสร้างกลไกตรวจสอบข้อผิดพลาดได้อย่างไรแล้วเพิ่มอัตราการส่งข้อมูลที่ไร้สาระเพื่อรับอัตราการถ่ายโอนที่สูง


1
เป็นที่น่าสังเกตว่าบอร์ด Arduino ที่ใช้ FTDI USB-ICs ICs สามารถไปได้อย่างรวดเร็วจริงๆ FT232 ทั่วไปสามารถไปได้ 3 Megabaud (นั่นคือ 3,000,000 baud) โดยไม่มีปัญหา การใช้ ATmega16U2 เป็นปัจจัย จำกัด
Connor Wolf

โคลน Arduino 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. จะใช้ชิป CH340 สำหรับ USB comms
PNDA

คำตอบ:


59

มีหลายปัจจัยที่นี่:

  • ATmega328P MCU สามารถรับอัตราการรับส่งข้อมูลได้สูงเพียงใด
  • อินเตอร์เฟส USB-Serial สามารถรับอัตราการรับส่งข้อมูลได้สูงเท่าใด
  • ความถี่ oscillator บน ATmega328P คืออะไร?
  • ความถี่ oscillator บนอินเตอร์เฟส USB แบบอนุกรมคืออะไร (ถ้ามี)
  • อินเตอร์เฟซแบบอนุกรม USB ของ Baud-rate ไม่สอดคล้องกันเพียงใด

ปัจจัยทั้งหมดเหล่านี้เกี่ยวข้องกับการกำหนดอัตราการรับส่งข้อมูลสูงสุดที่สามารถทำได้ ATmega328P ใช้ตัวหารฮาร์ดแวร์จากอัตรานาฬิกาเพื่อสร้างนาฬิกาพื้นฐานสำหรับอินเตอร์เฟสแบบอนุกรม หากมีอัตราส่วนจำนวนเต็มไม่มีจากนาฬิกาหลักเพื่อบิตเวลาของการอัตราการส่งข้อมูลที่ต้องการ MCU ที่จะไม่สามารถที่จะตรงผลิตอัตราที่ต้องการ สิ่งนี้สามารถนำไปสู่ปัญหาที่อาจเกิดขึ้นเนื่องจากอุปกรณ์บางประเภทมีความไวต่อการรับข้อมูลที่ไม่ตรงกันมากเกินไป

อินเทอร์เฟซที่ใช้ FTDI นั้นค่อนข้างทนทานต่ออัตราการรับส่งข้อมูลที่ไม่ตรงกันมากถึงข้อผิดพลาดหลายเปอร์เซ็นต์ อย่างไรก็ตามฉันได้ทำงานกับโมดูล GPS แบบฝังพิเศษที่ไม่สามารถจัดการกับข้อผิดพลาดของอัตราการส่งข้อมูล 0.5% ได้

อินเตอร์เฟสแบบอนุกรมทั่วไปสามารถทนต่อข้อผิดพลาด baud-rate 5% อย่างไรก็ตามเนื่องจากปลายแต่ละด้านสามารถปิดได้ข้อมูลจำเพาะที่พบบ่อยคือ + -2.5% ด้วยวิธีนี้หากปลายด้านหนึ่งเร็ว 2.5% และปลายอีกด้านช้า 2.5% ข้อผิดพลาดโดยรวมของคุณยังคงเป็นเพียง 5%


อย่างไรก็ตาม. Uno ใช้ ATmega328P เป็น MCU หลักและ ATmega16U2 เป็นอินเตอร์เฟส USB แบบอนุกรม เราโชคดีเช่นกันที่ MCU ทั้งสองนี้ใช้ฮาร์แวร์ USART ที่คล้ายคลึงกันรวมถึงนาฬิกา 16 Mhz

เนื่องจาก MCU ทั้งสองมีฮาร์แวร์และอัตรานาฬิกาเหมือนกันทั้งคู่จะมีข้อผิดพลาดอัตราการรับส่งข้อมูลเดียวกันในทิศทางเดียวกันดังนั้นเราจึงสามารถละเว้นปัญหาข้อผิดพลาดการรับส่งข้อมูลได้

อย่างไรก็ตามคำตอบที่ "ถูกต้อง" สำหรับคำถามนี้จะเกี่ยวข้องกับการขุดแหล่งที่มาสำหรับ ATmega16U2 และหาอัตราการรับส่งข้อมูลที่เป็นไปได้จากที่นั่น แต่เนื่องจากฉันขี้เกียจฉันคิดง่ายการทดสอบเชิงประจักษ์จะใช้งานได้

ภาพรวมอย่างรวดเร็วที่แผ่นข้อมูล ATmega328P สร้างตารางต่อไปนี้:
ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นด้วยอัตรารับส่งข้อมูลสูงสุดที่ระบุไว้ที่ 2 Mbps ฉันจึงเขียนโปรแกรมทดสอบอย่างรวดเร็ว:

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 บอดไม่มีปัญหา

โปรดทราบว่าอัตราการรับส่งข้อมูลนี้จะให้วงจรนาฬิกา64บิตต่อไบต์ต่อไบต์ดังนั้นจึงเป็นเรื่องที่ท้าทายอย่างยิ่งที่จะทำให้อินเตอร์เฟซอนุกรมไม่ว่าง ในขณะที่แต่ละไบต์อาจถูกถ่ายโอนอย่างรวดเร็วมากมีโอกาสมากที่จะไม่ได้ใช้งานอินเตอร์เฟส


แก้ไข: การทดสอบจริง!

2 Mbps เป็นจริง:
ป้อนคำอธิบายรูปภาพที่นี่
แต่ละ bit-time คือ 500 ns ซึ่งตรงกับสิ่งที่คาดหวัง

ปัญหาด้านประสิทธิภาพ! ความยาวของแพ็กเก็ตโดยรวม:
500 Kbaud: ป้อนคำอธิบายรูปภาพที่นี่

1 ล้านบาท: ป้อนคำอธิบายรูปภาพที่นี่

2 Mbaud: หมายเหตุ : การ overhoot ที่ ป้อนคำอธิบายรูปภาพที่นี่
สังเกตเห็นได้นั้นเกิดจากการปฏิบัติกราวด์ของโพรบขอบเขตที่ไม่ดีและอาจไม่จริง ฉันใช้คลิปกราวด์ซึ่งเป็นส่วนหนึ่งของโพรบขอบเขตของฉันและการเหนี่ยวนำตัวเหนี่ยวนำน่าจะเป็นสาเหตุของการโอเวอร์เฮทส่วนใหญ่

อย่างที่คุณเห็นความยาวการส่งโดยรวมจะเท่ากันสำหรับ 0.5, 1 และ 2 Mbaud นี่เป็นเพราะรหัสที่วางไบต์ในบัฟเฟอร์อนุกรมได้รับการปรับให้เหมาะสม ดังนั้นคุณจะไม่ประสบความสำเร็จในสิ่งที่ดีกว่า500 Kbaud ที่มีประสิทธิภาพเว้นแต่ว่าคุณจะเขียนไลบรารีอนุกรมของคุณเอง ห้องสมุด Arduino นั้นได้รับการปรับปรุงอย่างไม่ดีนักดังนั้นมันอาจจะไม่ยากเกินไปที่จะรับ 2 Mbaud ที่เหมาะสมอย่างน้อยก็สำหรับการส่งสัญญาณต่อเนื่องหากคุณใช้เวลาสักระยะหนึ่ง


4
ภาพประกอบที่ดีของการ จำกัด ปริมาณงาน!
jippie

1
@AnnonomusPerson - หากคุณเปลี่ยนเป็นนาฬิกา 20 Mhz คุณสามารถทำได้ 2.5 Mbps
Connor Wolf

1
@AnnonomusPerson - คุณต้องสลับทั้งสองอย่างหรือใช้ FTDI usb-serial interface กับ 20 Mhz ATmega328P oscillator ATmega328P ไม่สามารถทำความเร็ว 2.5 Mbps โดยไม่มีคริสตัล 20 Mhz / resonator เช่นเดียวกับอินเทอร์เฟซ ATmega16U2 ใด ๆ
Connor Wolf

1
คำตอบที่ดี! การแก้ไขเล็ก ๆ เพียงครั้งเดียว: ที่ 2 Mb / s การส่งแต่ละไบต์ใช้ 80 CPU รอบไม่ใช่ 64 นี่เป็นเพราะเวลาที่เหมาะสมแต่ละไบต์มีค่า 10 บิต (1 เริ่ม 8 ข้อมูล 1 หยุด)
Edgar Bonet

1
@ linhartr22 - สายเข้ามาเล่นจริงๆถ้าพวกมันยาวเช่นใน 12 "+ ฉันคิดว่าคงไม่น่าเป็นไปได้ที่คนจำนวนมากกำลังใช้สายเคเบิลยาว 100 ฟุตมากเกินไปนอกจากนี้คำถามก็คือarduino / ATmegaสูงแค่ไหนอัตราการรับส่งข้อมูลสามารถไปได้ไม่ว่าการประกอบสายเคเบิลโดยพลการจะสูงได้เพียงใด
คอนเนอร์ Wolf

7

หน้าต่าง Arduino Serial Monitor จำกัด คุณไว้ที่ 115200 แต่นั่นไม่ใช่อัตรารับส่งข้อมูลสูงสุดที่สามารถทำได้ คุณสามารถอ่านเอกสารข้อมูล Atmel และ FT232 (หรืออะไรก็ตามที่คุณใช้) เพื่อหาค่าสูงสุด แต่ฉันสามารถใช้ 230400 (เร็วเป็นสองเท่าเร็วที่สุดเท่าที่ Arduino Serial Monitor รองรับ) ไม่มีปัญหา

หากคุณต้องการเห็นผลลัพธ์ในคอมพิวเตอร์ของคุณคุณจะต้องมีจอภาพแบบอนุกรมที่รองรับตัวเลือกอัตราการรับส่งข้อมูลอื่น ๆ ฉันชอบCoolTermและปลวก

โปรดทราบว่าสิ่งนี้ขึ้นอยู่กับความเร็วสัญญาณนาฬิกาของคุณเป็นอย่างมาก

นี่คือเครื่องคิดเลขที่จะช่วยคุณคำนวณสิ่งที่เป็นไปได้


ในขณะที่คุณเริ่มต้นทำงานได้เร็วขึ้นและเร็วขึ้นข้อ จำกัด จะกลายเป็นห้องสมุดอนุกรม - การติดตั้งใช้งานไม่ได้มีประสิทธิภาพมาก
Cybergibbons

เว็บไซต์ของลิงค์ตาย
Codebeat

3

นี่อาจเป็นหนึ่งในไม่กี่ด้านที่บอร์ด el-Cheapo แตกต่างจากบอร์ดดั้งเดิม อัตราการถ่ายโอนสูงสุดต่อเนื่องนั้น จำกัด เพียงแค่คุณภาพของบอร์ดและการจัดวางเท่านั้น เมื่อข้อมูลอนุกรมเข้าสู่ชิป AVR หรือ USB อินเตอร์เฟสข้อมูลจะถูกประมวลผลแตกต่างจากโปรโตคอลอนุกรม UART

โปรดจำไว้ว่าไมโครคอนโทรลเลอร์มีฮาร์ดแวร์พื้นฐานบางอย่างที่จะย้ายเข้า / ออกข้อมูลอนุกรมไปยัง / จากหมุด IO แต่อัตราสูงสุดที่แน่นอนถูก จำกัด ไว้ที่นาฬิกา 16MHz (สำหรับ AVRs) เมื่อมีการย้ายไบต์ไปยังบัฟเฟอร์อนุกรมฮาร์ดแวร์ UART จะเข้าควบคุมและดึง / ดึงบิตด้วยตนเอง AVR ที่ดีที่สุดถึงคำสั่ง 16M ต่อวินาทีและอินเทอร์รัปต์ที่ใช้เติมบัฟเฟอร์อนุกรมมีค่าใช้จ่ายบางส่วน (อย่างน้อย 8 เห็บนาฬิกาสำหรับการจัดการขัดจังหวะ + คำสั่งเพื่อบันทึกสถานะปัจจุบัน + หลายคำแนะนำสำหรับการเติมบัฟเฟอร์จริง) ที่บิตเรตที่กำหนดโพรโทคอลจะทำงานที่ whopping n บิตต่อวินาที แต่คอนโทรลเลอร์ของคุณต้องการเวลามากกว่าในการเติมบัฟเฟอร์อนุกรมเกินกว่าที่จะต้องการส่งออกข้อมูลจริงส่งผลให้ปริมาณงานเฉลี่ยลดลงกว่าที่คุณคาดไว้ เป็นเวลานานพอสมควร

สิ่งที่ต้องคำนึงถึงอีกประการหนึ่งคือค่าใช้จ่ายทั้งหมดที่ต้องใช้ในการส่งข้อมูลไปยัง UART (หรือดึงเข้า) ไม่สามารถใช้ในโปรแกรมจริงของคุณและส่งผลต่อปริมาณงานจริงโดยเฉลี่ยอีกครั้ง คุณสามารถใช้ทุกรอบการเรียนการสอนเพียงครั้งเดียวไม่ว่าจะเป็นการเติมบัฟเฟอร์หรือสำหรับการคำนวณลูปหลัก

ปริมาณงานสูงสุดจึงขึ้นอยู่กับแอปพลิเคชันที่คุณใช้ (ความเร็วในการสร้าง / คำนวณ / พร้อมที่จะย้ายไปยัง / จากบัฟเฟอร์อนุกรม) และบิต 'กายภาพ' จริงเป็นเพียงส่วนเล็ก ๆ ของการตัดสินใจออกแบบ


1
ฉันจริงๆสงสัยจริง ๆ ว่าบอร์ดใด ๆ ที่ออกมีปัญหารูปแบบที่รุนแรงพอที่จะป้องกันไม่ให้สัญญาณ 2 Mhz ทำงานได้ดี 2 Mhz ไม่ใช่ความถี่สูง
Connor Wolf

@FakeName อย่างน้อยหนึ่งบอร์ดบนโต๊ะของฉันที่นี่เพิ่มขึ้น BER เมื่อฉันกดความเร็วอนุกรม ฉันมักจะใช้ 9600 ซึ่งเกินพอสำหรับแอปพลิเคชั่นส่วนใหญ่และแข็งแกร่ง
jippie

ไม่ได้ล้อเล่น! ฮะ. ฉันสงสัยว่าเลย์เอาต์ต้องเกิดขึ้นได้อย่างไร ฉันสงสัยว่ามันไม่ใช่เลย์เอาต์มากพอ ๆ กับ resonators / คริสตัลที่ทนต่อความยากจนได้
Connor Wolf

1
อัตราการรับส่งข้อมูลสูงโดยเฉพาะอย่างยิ่งถ้าU2Xn = 1ใน USART มีแนวโน้มที่จะได้รับบ้า ๆ บอ ๆ เกี่ยวกับความไม่ตรงกัน
Connor Wolf

@FakeName ฉันเป็นไดโนเสาร์ฉันชอบ "9600 8N1" ด้วยเหตุผลผิด ๆ ที่คุณนึกถึง; o)
jippie

2

การตรวจสอบข้อผิดพลาดนั้นง่ายมากและมี AVR lib ที่ทำสิ่งนี้ในหนึ่งสายการบิน

อ่านต่อ util/crc16.hและคุณควรจะไปในเวลาไม่นานด้วยตัวอย่างรวม

ซีอาร์ซีนั้นค่อนข้างแข็งแกร่งและรวดเร็วสำหรับการใช้งานที่เรียบง่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.