Baud hızı ne kadar yüksek olabilir (hatasız)?


40

Standart 9600 baud'dur. Bu sadece standart . Bir Arduino Uno SMD R2 kullanarak ulaşabileceğim en yüksek pratik baud hızı nedir?

Otomobil için bonus puanları: Bir hata kontrol mekanizması yaratıp daha sonra yüksek aktarım hızları elde etmek için baud hızını gülünç şekilde yükseltmeye ne dersiniz?


1
FTDI USB-seri IC'leri kullanan Arduino kartlarının GERÇEKTEN hızlı gidebildiğini belirtmekte fayda var. Yaygın FT232, 3 Megabaud'a (yani 3.000.000 baud'a kadar) sorunsuz gidebilir. ATmega16U2 kullanımı sınırlayıcı faktördür.
Connor Wolf

EBay'den aldığım klonum Arduino Nano 1.099.999'da maksimuma çıktı. Ciddi anlamda. O yaptı. 1.100.000'e ulaştığında, çıktı bozuktu. laqq`na`fca`fga`fga`bcngaah````iin`ha`a`a`bga`fga`bcqpahhqfq```fh`oopa`bca`fca. USB haberleşmesi için bir CH340 yongası kullanır.
PNDA

Yanıtlar:


59

Burada birkaç faktör var:

  • ATmega328P MCU ne kadar yüksek bir baud hızı elde edebilir?
  • USB-Seri arayüzü ne kadar yüksek bir baud hızı elde edebilir?
  • ATmega328P'deki osilatör frekansı nedir?
  • USB seri arayüzündeki osilatör frekansı nedir (eğer varsa)?
  • Baud hızı uyumsuzluğunun USB seri arabirimi ne kadar toleranslıdır?

Bu faktörlerin tümü, ulaşılabilir maksimum baud oranının belirlenmesi ile ilgilidir. ATmega328P, seri arabirim için taban saati oluşturmak üzere saat hızından bir donanım böleni kullanır. Ana saatten istenen baud hızının bit zamanına tamsayı oranı yoksa, MCU istenen hızı tam olarak üretemez. Bazı cihazlar baud hızı uyumsuzluğundan ve diğerlerinden daha hassas olduğundan, bu durum olası sorunlara yol açabilir.

FTDI tabanlı arayüzler, baud hızı uyumsuzluğuna oldukça toleranslıdır, yüzde birkaç hataya kadar. Bununla birlikte,% 0.5 baud hızı hatasını bile kaldıramayan özel yerleşik GPS modülleri ile çalıştım.

Genel seri arayüzler ~% 5 baud hızı hatasına toleranslıdır. Ancak, her bir uç kapalı olabileceğinden, daha yaygın bir özellik% + -2.5'dir. Bu şekilde, eğer bir uç% 2.5 hızlı ve diğer% 2.5 yavaşsa, genel hatanız hala% 5'tir.


Neyse. Uno, birincil MCU olarak ATmega328P'yi ve USB seri arabirimi olarak ATmega16U2'yi kullanır. Bu MCU'ların 16 ABD doları ve 16 MHz saati gibi benzer donanım yazılımı USART kullandığı için de şanslıyız.

Her iki MCU da aynı donanım ve saat hızına sahip olduklarından, her ikisi de aynı yönde aynı baud hızı hatasına sahip olacak, böylece baud hatası sorununu işlevsel olarak görmezden gelebiliriz.

Her neyse, bu soruya verilen "doğru" cevap, ATmega16U2 kaynağını kazmayı ve olası baud oranlarını oradan çıkarmayı içerir, ancak tembel olduğum için basit, deneysel testlerin işe yarayacağını düşünüyorum.

ATmega328P veri sayfasında hızlı bir bakış aşağıdaki tabloyu üretir:
görüntü tanımını buraya girin

Yani maksimum 2 Mbps baud hızı verilen göz önüne alındığında, hızlı bir test programı yazdım:

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");
};

Ardından seri terminali bulunan ilgili seri porta bakın:

görüntü tanımını buraya girin

Böylece donanımın 2.000.000 baud'da sorunsuzca çalışabileceği anlaşılıyor.

Bu baud hızının yalnızca MCU 64 80 bayt başına saat döngüleri verdiğini unutmayın, bu nedenle seri arayüzü meşgul etmek çok zor olurdu. Bireysel baytlar çok hızlı bir şekilde aktarılabilse de, arayüz basitçe boştayken çok fazla zaman olabilir.


Düzenleme: Gerçek Test!

2 Mb / sn gerçektir:
görüntü tanımını buraya girin
her bir bit-zamanı 500 ns'dir ve bu beklenenlerle tamamen aynıdır.

Performans sorunları! Genel paket uzunluğu:
500 Kbaud: görüntü tanımını buraya girin

1 Mbaud: görüntü tanımını buraya girin

2 Mbaud: Not : görüntü tanımını buraya girin
Dikkat çeken aşırı çekim, kapsam dışı prob topraklama uygulamalarından kaynaklanmaktadır ve muhtemelen gerçek değildir. Kapsam sondamın bir parçası olan toprak klipsi kullanıyorum ve kurşun endüktansı abartmanın çoğunluğunun sebebi.

Gördüğünüz gibi, toplam aktarım uzunluğu 0,5, 1 ve 2 Mbaud için aynıdır. Bunun nedeni, byte'ları seri arabellekte yerleştiren kodun zayıf şekilde optimize edilmiş olmasıdır. Dolayısıyla, kendi seri kütüphanelerinizi yazmadıkça, etkili bir 500 Kbaud'dan daha iyi bir şeyi asla başaramazsınız . Arduino kütüphaneleri çok kötü bir şekilde optimize edilmiştir, bu nedenle , eğer biraz zaman harcadıysanız, en azından patlama iletimleri için uygun bir 2 Mbaud elde etmek muhtemelen çok zor olmazdı .


4
Verimlilik sınırlamasının güzel resmi!
jippie

1
@AnnonomusPerson - 20 Mhz'lik bir saate geçerseniz 2.5 Mbps yapabilirsiniz.
Connor Wolf

1
@AnnonomusPerson - 20 Mhz ATmega328P osilatör ile her ikisini de değiştirmeniz veya FTDI usb seri arabirim kullanmanız gerekir. ATmega328P 20 Mhz kristali / rezonatörü olmadan 2,5 Mb / sn yapamıyor. Aynısı, ATmega16U2 arayüzleri için de geçerlidir.
Connor Wolf

1
Mükemmel cevap! Sadece küçük bir düzeltme: 2 Mb / s'de, her bir bayt iletimi, 64 değil 80 CPU döngüsü alır. Bunun nedeni, zamana göre, her bir baytın 10 bit (1 başlangıç, 8 veri, 1 durak) değerinde olmasıdır.
Edgar Bonet

1
@ linhartr22 - onlar eğer Telleri sadece gerçekten devreye girer uzun . 12" + olduğu gibi, ben pek çok kişi çok fazla 100 metrelik uzun kablosu kullanıyorsanız muhtemelen olası olduğunu düşünüyorum Ayrıca, soru ne kadar yüksek. arduino / ATmega baud hızı, isteğe bağlı bir kablo düzeneğinin ne kadar yüksek olabileceğini değil
Connor Wolf

7

Arduino Seri Monitor penceresi sizi 115200 ile sınırlar, ancak bu en yüksek baud hızı değildir. Atmel ve FT232'yi (veya ne kullanıyorsanız kullanın) veri sayfalarını maksimumda bulmak için okuyabilirsiniz ancak 230400'ü (Arduino Seri Monitörünün desteklediği en büyük hızın iki katı) sorunsuz bir şekilde başarıyla kullanabiliyorum.

Sonuçları bilgisayarınızda görmek istiyorsanız, diğer baud hızı seçeneklerini destekleyen başka bir seri monitöre ihtiyacınız olacaktır. CoolTerm ve Termite'yi severim .

Bunun ağır saat hızınıza da bağlı olduğunu unutmayın.

Neyin mümkün olduğunu hesaplamanıza yardımcı olacak bir hesap makinesi.


Daha hızlı ve daha hızlı ilerlemeye başladığınızda, sınırlama Seri kütüphanesi haline gelir - uygulaması çok verimli değildir.
Cybergibbons

bağlantının web sitesi öldü
Codebeat

3

Bu muhtemelen el-Cheapo panellerinin orijinal panellerden farklı olduğu birkaç yönden biridir. Maksimum seri aktarım hızı, sadece pano kalitesi ve düzeni ile sınırlıdır. Seri veri AVR veya USB arayüz yongasına girdiğinde, veriler seri UART protokolünden farklı şekilde işlenecektir.

Mikrodenetleyicinin seri verileri G / Ç pinlerinden içeri / dışarı kaydırmak için bazı temel donanıma sahip olduğunu unutmayın, ancak mutlak maksimum hız 16MHz saatle (AVR'ler için) sınırlıdır. Bir bayt seri arabelleğe taşındığında, UART donanımı devralacak ve bitleri kendi kendine çekecek / çekecektir. Bir AVR en iyi saniyede 16M talimatına ulaşır ve seri arabelleği doldurmak için kullanılan kesintilerde bir miktar ek yük bulunur (kesme işlemini gerçekleştirmek için en az 8 saat işareti + mevcut durumu kaydetmek için talimatlar + aslında arabelleği doldurmak için birkaç talimat). Belirli bir bit hızında, protokol saniyede bir bitkin bit hızında çalışır, ancak denetleyicinizin seri arabelleği doldurmak için verileri gerçekten çıkarması gerekenden daha fazla zamana ihtiyacı vardır, bu da beklediğinizden ve UART rölantide olduğundan daha düşük bir ortalama verim sağlar. nispeten uzun bir süre için.

Hatırlanması gereken bir diğer etki de, verileri UART'a çıkarmak (veya çekmek) için gereken tüm ek yükün, gerçek ortalama verimi tekrar etkileyerek gerçek programınızda harcanamayacağıdır. Tamponu doldurmak veya ana döngüyü hesaplamak için her komut döngüsünü yalnızca bir kez kullanabilirsiniz.

Bu nedenle maksimum verim kullandığınız uygulamaya (verilerin ne kadar hızlı üretildiği / hesaplandığı / seri belleğe taşınmaya hazır olduğu) bağlıdır ve gerçek “fiziksel” bit hızı tasarım kararının sadece küçük bir kısmıdır.


1
Gerçekten, GERÇEKTEN, herhangi bir kurulun 2 Mhz sinyalinin iyi çalışmasını engelleyecek kadar ciddi yerleşim düzenleri olduğundan şüpheliyim. 2 Mhz tam olarak yüksek değil.
Connor Wolf

@FakeName Buradaki masamdaki en az bir kart, seri hıza bastığımda BER'i ​​arttırdı. Genellikle 9600 kullanıyorum, bu çoğu uygulama için fazlasıyla yeterli ve sağlam.
jippie

Şaka yapmıyorum! Huh. Bunun gerçekleşmesi için düzen ne kadar kötü olmalı acaba? Olsa da, bunun düşük toleranslı rezonatörler / kristaller kadar mizanpaj olmadığını sanıyordum.
Connor Wolf

1
Yüksek baud oranları, özellikle U2Xn = 1USART’da ise, uyumsuzluk konusunda oldukça huysuz olma eğilimindedir.
Connor Wolf

@FakeName Ben bir dinozorum, düşünebildiğim tüm yanlış eski nedenlerden dolayı "9600 8N1" gibi görünüyorum; o)
jippie

2

Hata kontrolü aslında çok kolaydır ve bunu tek bir astarda yapan bir AVR kitaplığı vardır.

Okumaya util/crc16.hdevam edin ve dahil örnekler ile zaman içinde gitmek iyi olmalı.

CRC basit uygulamalar için oldukça sağlam ve hızlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.