UART frekansları ne kadar kritik?


17

Mikrodenetleyicimi 16 MIPS'de çalıştırmak için 8 MHz'lik bir kristal kullanacağım (PLL 4x, 2 döngü talimatları.) Ancak, 8 MHz herhangi bir UART frekansına AFAIK olarak bölünmez ... yani bu frekanslar ne kadar kritik? 115.200 baud kullanmayı planlıyorum.

UART ±% 1 dahilinde çalışabilir mi? Bu işe yaramazsa, hangi sıklığı kullanmalıyım? (Maksimum işlem hızı için olabildiğince 16 MIPS'ye yakın almak istiyorum.) Önemli olursa, bir PIC24FJ64GA004 kullanıyorum.

Yanıtlar:


13

% 1 içinde iseniz, iyi olmalısınız.

Örneğin, UART'ınızın 16x aşırı örnekleme saati kullandığını varsayalım, örneğin 1.843.200 Hz ila 16x aşırı örnek 115.200 bps olarak ayarlayabilirsiniz. (bunun gibi aşırı örnekleme oldukça yaygındır) Bu, UART'ın başlangıç ​​bitinin düşen kenarından 8 fazla saati geri saymasını sağlar, böylece bit hücrelerinin merkezini saatin +/- bir periyoduna kadar bulabilir veriyi ne zaman örnekleyeceğini belirlemek için saatin 16 dönemini sayar.

Başlangıç ​​bitinin ortasına vurabileceğini varsayarsanız, o zaman 8 veri biti boyunca doğru bit hücrelerinde örnek verileri tutmak için saat frekansı (8-0.5) / 8 ve (8 + 0.5 arasında kalmalıdır) ) / 8 veya hedeflenen bit hızının +/-% 6,25'i. Daha yüksek hız aşırtma, başlangıç ​​bitinin ortasına vurmak için ideal koşula yaklaşır, ancak 8x veya 16x genellikle% 5 uyumsuzluğun işe yarayacağını varsayabilecek kadar yakındır.

Ancak, diğer tarafın frekansta mükemmel olduğuna güvenemezsiniz. % 4 hızlı bir cihazı% 4 yavaş olan bir cihaza bağlarsanız, bir sorununuz olur. Bir bilgisayar biraz yavaş çalışıyor ve bir cihaz biraz hızlı çalışıyordu ve aynı cihaz diğer bilgisayarlarla iyi olmasına rağmen ikisi sadece marjinal olarak iletişim kurabiliyordu ve PC diğer bilgisayarlarla iyiydi cihazlar. (Bunları 112kbps ve 119kbps'de O-kapsamına aldı) Bu nedenle nominal frekansı olabildiğince yakından vurmaya çalışmak iyi. Nominalin% 2'sinde hiçbir sorun görmedim.

Yapılacak en yaygın şey, istenen UART aşırı örnekleme oranının baud hızının katlarının bir tam katı olan bir ana saat hızı kullanmaktır. Örneğin, yaklaşık 8MHz'de çalışan bir CPU istiyorsanız, tam olarak 16 kat 115200 olan 1.8432MHz elde etmek için 4'e bölünebilen bir 7.3728MHz osilatör kullanabilirsiniz.


8 MHz, ±% 1 dahilinde 115.942 elde etmek için 69'a bölünebilir. PIC'nin baud hızı üreteci için bu tür bir bölümü destekleyip desteklemediğini merak ediyorum. Ben umuyorum, ama olacağını sanmıyorum.
Thomas O

PIC, bir baud hızı üretecine sahiptir. İyi çalışır, ancak sadece 9600 gibi daha düşük baud için, 115.200 gibi yüksek baud için işe yaramaz, çok kesin olmaz.
Thomas O

7.3728 MHz kristal kullanabileceğimi düşünüyor musunuz? (Dahili 7.37 MHz osilatörü kullanmayacağım çünkü hassasiyet istiyorum.) 115.200 UART frekansı elde etmek için 64'e bölmemi sağlıyor. Yüksek bir toleransla gidebileceğim en hızlı şey.
Thomas O

1
UART'ınız destekliyorsa, başlangıç ​​bitini aşırı örnekleyebilmesi ve bit hücresinin merkezini bulabilmesi için bir overclock (16x gibi) vermesi tercih edilir, ancak 115K için% 1 ila% 1 arasında bir 16x elde etmek zor olabilir. baud-multipl kristal kullanıyorsunuz.
JustJeff

4

% 1 @JustJeff'den bahsetmek gerekli değildir. Çoğu UART, son bitte yarım bit hatasına izin verir. Çoğu zaman bir çerçeve toplam 10 bit için 1 başlangıç ​​biti, 8 veri tabanı ve 1 durdurma bitinden oluşur. 10 bitte yarım bit% 5'tir (JustJeff'in% 6.25'i başlangıç ​​ve bitiş bitini hesaba katmaz).


1
beni yanlış teklif etme; "% 1" olarak ifade ettiğimde, bunun başarılması zor olabiliyordu. "% 6.25", başlangıç ​​bitinin merkezine çarptığınızı ve bu koşullar altında alıcı-verici saat hızlarında izin verilen maksimum fark olacağını varsayıyordu .
JustJeff

1

JustJeff başlangıç ​​bitini unuttu, ancak Stevenh durdurma bitini ekledi. 8 veri biti, 1 başlangıç ​​biti ve eşlik biti olmayan ortak protokol varsayarsak (durdurma bitlerinin sayısı önemli değildir), başlangıç ​​bitinin ön kenarından ekranın merkezine 8 1/2 bit zaman vardır. son veri biti. Genellikle, alıcının bu son biti 1/4 bit süre içinde örneklemesini istersiniz. 1/2 bitin eşik başarısızlık garantisi olduğunu unutmayın. Her zaman biraz elektrik gürültüsü ve titreşimi olduğu için, yakınlardaki her şey mantıksız hale gelir.

1/4 bölü 8 1/2 =% 2.94.

JustJeff'in belirttiği gibi, çoğu UART uygulaması aslında gelen verileri eşzamansız 16x saat ile örneklemektedir. Başka bir 1/16 bit zaman belirsizliği ekler, çünkü başlangıç ​​bitinin ön kenarının ölçülebildiği hata budur. 8 1/2 bitin 1/16 bit süresi de% 0,74'tür. Bu, daha önce hesaplanan hata bütçesinden çıkar. Alıcının son bitini merkezinin 1/4 bit süresi içinde örneklemesi için% 2.2 izin verilen saat uyumsuzluğu ile sonuçlanırsınız.

Diğerlerinin söylediği gibi, 7.3728MHz kristal kullanmak, doğru baud hızı gerektiğinde yaygın bir uygulamadır. Genellikle kristal hatası içinde UART baud hızına basarken CPU'yu maksimum hızına yakın çalıştırabilirsiniz.


Durdurma bitlerinin önemli olmadığı konusunda hemfikir değilim. Gelen bu soruya durdurma biti yanlışlıkla düşük seviyeye ayarlandı çünkü iletişim başarısız oldu.
stevenvh

Genel iletişimin çalışması için durdurma biti orada olmalıdır, ancak çoğu UART için hata bütçesi hesaplamasına girmez. UART'lar, son veri bitinden sonra bir sonraki başlangıç ​​bitinin bir sonraki ön kenarından önce minimum süre gerektirir. Durma zamanı bunun için. Bu süre karşılanmadığında, bir "çerçeveleme hatası" alırsınız. Belki de bir veri biti gibi örneklenmiş, ancak farklı şekilde ele alındığı durumları biliyorum. Eski teletiplerin mekanik mekanizmaya bir sonraki karakteri yakalamaya hazır olmaları için 2 durdurma bitine ihtiyacı vardı.
Olin Lathrop

Başlangıç ​​bitine üç kez değindim, değil mi?
JustJeff

@OlinLathrop: durdurma biti olan MSB bir bayt gönderirken sıfır orada sağlamak için gereklidir olmak sonraki başlangıç biti için bir düşen kenarı. Veri hattının olması gerekmeden önce azaldığı durumlarda farklı cihazlar farklı davranır, ancak bir durdurma biti yoksa, iletilen sıfır baytlık bir dizi yararlı zamanlama bilgisi içermez. Böyle bir gereksinim, sabit çerçeveleme yükü% 25'ten az olan diğer yollarla karşılanabilir, ancak bunu yapan birinin farkında değilim.
supercat

1

Henüz belirtilmeyen bir nokta, bazı cihazların aldıkları her veri baytı için bir bayt veri iletmeyi beklemesidir. Böyle bir cihaz sürekli olarak veri besliyorsa, baud hızı verici cihazınkinden bile% 0.1 daha yavaştır ve hafifçe büzüşmüş durdurma bitleri göndermek için bir tesisi yoksa, çıkışı her 1000 ardışık için bir bayt geride kalacaktır. Cihaz 16 bayt tamponlama ile sınırlıysa, yaklaşık 16.000'i geçtikten sonra bir bayt veri düşecek ve daha sonra binde kabaca bir bayt düşecektir. Tam olarak bu nedenle "1200 baud" modemlerin aslında 1200 bit / saniyeden biraz daha yüksek bir hızda çalıştığını belirtmek gerekir (bence 1202 civarındadır) (böylece verici olması gerekenden% 0,15 daha hızlı olsa bile) olmak,

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.