Ada beberapa faktor di sini:
- Seberapa tinggi tingkat baud yang dapat dicapai oleh ATmega328P MCU?
- Seberapa tinggi baud-rate yang dapat dicapai oleh antarmuka USB-Serial?
- Berapa frekuensi osilator pada ATmega328P?
- Berapa frekuensi osilator pada antarmuka serial-USB (jika ada)?
- Seberapa toleran antarmuka USB serial dari ketidakcocokan baud-rate?
Semua faktor ini relevan untuk menentukan tingkat baud maksimum yang dapat dicapai. ATmega328P menggunakan pembagi perangkat keras dari clock-rate-nya untuk menghasilkan clock-dasar untuk antarmuka serial. Jika tidak ada rasio integer dari jam utama ke bit-time dari laju baud yang diinginkan, MCU tidak akan dapat secara tepat menghasilkan laju yang diinginkan. Ini dapat menyebabkan masalah potensial, karena beberapa perangkat jauh lebih sensitif terhadap ketidakcocokan baud-rate daripada yang lain.
Antarmuka berbasis FTDI cukup toleran terhadap ketidakcocokan baud-rate, hingga beberapa persen kesalahan. Namun, saya telah bekerja dengan modul GPS tertanam khusus yang tidak mampu menangani bahkan tingkat kesalahan baud 0,5%.
Antarmuka serial umum toleran ~ 5% kesalahan baud-rate. Namun, karena masing-masing ujung dapat dimatikan, spesifikasi yang lebih umum adalah + -2,5%. Dengan cara ini, jika salah satu ujungnya 2,5% cepat, dan yang lainnya lambat 2,5%, kesalahan keseluruhan Anda masih hanya 5%.
Bagaimanapun. Uno menggunakan ATmega328P sebagai MCU utama, dan ATmega16U2 sebagai antarmuka serial-USB. Kami juga beruntung di sini karena kedua MCU ini menggunakan USART harware serupa, serta 16 jam Mhz.
Karena kedua MCU memiliki harware dan clock-rate yang sama, keduanya akan memiliki kesalahan baud-rate yang sama dalam arah yang sama, sehingga kita dapat secara fungsional mengabaikan masalah kesalahan baud.
Bagaimanapun, jawaban yang "tepat" untuk pertanyaan ini akan melibatkan penggalian sumber untuk ATmega16U2, dan mencari kemungkinan baud-rate dari sana, tetapi karena saya malas, saya pikir sederhana, pengujian empiris akan bekerja.
Sekilas tentang lembar data ATmega328P menghasilkan tabel berikut:
Jadi mengingat max baud-rate 2 Mbps, saya menulis program uji cepat:
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");
};
Dan kemudian melihat port serial yang relevan dengan terminal serial:
Jadi tampaknya perangkat keras dapat berjalan pada 2.000.000 baud tanpa masalah.
Perhatikan bahwa baud rate ini hanya memberikan MCU 64 80 clock-cycles per byte, jadi akan sangat menantang untuk membuat antarmuka serial tetap sibuk. Sementara masing-masing byte dapat ditransfer dengan sangat cepat, ada kemungkinan banyak waktu ketika antarmuka hanya menganggur.
Edit: Pengujian Aktual!
2 Mbps adalah nyata:
setiap bit-time adalah 500 ns, yang cocok persis dengan apa yang diharapkan.
Masalah kinerja! Panjang paket keseluruhan:
500 Kbaud:
1 Mbaud:
2 Mbaud:
Catatan: overshoot yang terlihat disebabkan oleh praktik grounding probe lingkup yang buruk, dan mungkin tidak nyata. Saya menggunakan ground-clip-lead yang merupakan bagian dari probe lingkup saya, dan induktansi-lead kemungkinan merupakan penyebab mayoritas overshoot.
Seperti yang Anda lihat, panjang transmisi keseluruhan adalah sama untuk 0,5, 1 dan 2 Mbaud. Ini karena kode yang menempatkan byte dalam buffer serial dioptimalkan dengan buruk. Dengan demikian, Anda tidak akan pernah mencapai sesuatu yang lebih baik daripada 500 Kbaud yang efektif , kecuali Anda menulis perpustakaan serial Anda sendiri. Perpustakaan Arduino dioptimalkan dengan sangat buruk, sehingga mungkin tidak akan terlalu sulit untuk mendapatkan 2 Mbaud yang tepat, setidaknya untuk transmisi burst, jika Anda menghabiskan sedikit waktu untuk itu.