Quanto sono importanti le frequenze UART?


17

Userò un cristallo da 8 MHz per far funzionare il mio microcontrollore a 16 MIPS (PLL 4x, istruzioni ciclo 2). Tuttavia, 8 MHz non si dividono in nessuna frequenza UART AFAIK ... quindi quanto sono critiche queste frequenze? Ho intenzione di utilizzare 115.200 baud.

UART può funzionare entro ± 1%? Se questo non funziona, quale frequenza devo usare? (Vorrei avvicinarmi il più possibile a 16 MIPS, per la massima velocità di elaborazione.) Se è importante, sto usando un PIC24FJ64GA004.

Risposte:


13

Se sei entro l'1%, dovresti essere OK.

Supponiamo che il tuo UART utilizzi un clock di sovracampionamento 16x, ad esempio, puoi impostarlo da 1.843.200 Hz a 16x oltre i 115.200 bps. (il sovracampionamento in questo modo è abbastanza comune) Questo consente all'UART di contare 8 over-clock dal fronte di discesa del bit di inizio, in modo da poter localizzare il centro delle celle di bit entro +/- un periodo di over-clock, dopo che conta 16 periodi di over-clock per determinare quando campionare i dati.

Se si assume che possa colpire il centro del bit iniziale, quindi per mantenere il campionamento dei dati seriali nelle celle di bit corrette su 8 bit di dati, la frequenza di clock deve rimanere tra (8-0,5) / 8 e (8 + 0,5 ) / 8 o +/- 6,25% della velocità in bit prevista. L'overclocking più elevato si avvicina alla condizione ideale di colpire il centro del bit di partenza, ma 8x o 16x sono in genere abbastanza vicini da poter supporre che un disadattamento del 5% funzionerà.

Tuttavia, non puoi contare sul fatto che l'altra parte sia perfettamente in frequenza. Se colleghi un dispositivo con una velocità del 4% a un dispositivo con una lente del 4%, avrai un problema. Ho incontrato almeno un caso in cui un PC funzionava un po 'lentamente e un dispositivo un po' veloce, e i due potevano comunicare solo marginalmente, anche se lo stesso dispositivo andava bene con altri PC e il PC andava bene con altri dispositivi. (O-scoped questi a circa 112kbps e 119kbps) Per questo motivo è bene provare a colpire la frequenza nominale il più vicino possibile. Non ho mai visto nulla nel 2% del valore nominale avere un problema.

La solita cosa da fare è utilizzare una frequenza di clock principale che fornisce un numero intero multiplo della frequenza di sovracampionamento UART prevista per la velocità di trasmissione. Ad esempio, se si desidera una CPU in esecuzione a circa 8 MHz, è possibile utilizzare un oscillatore a 7,3728 MHz, che può essere diviso per 4 per ottenere 1,8432 MHz, che risulta esattamente 16 volte 115200.


8 MHz potrebbero essere divisi per 69 per ottenere 115.942 che è ben entro ± 1%. Mi chiedo se il PIC supporti questo tipo di divisione per il suo generatore di baud rate. Lo spero, ma non credo che lo farà.
Thomas O

Il PIC ha un generatore di baud rate. Funzionerebbe bene ma solo per baud inferiori come 9600, non funzionerebbe per baud alti come 115.200, diventa troppo impreciso.
Thomas O

Pensi che potrei usare un cristallo a 7,3728 MHz? (Non userò l'oscillatore interno a 7,37 MHz perché mi piacerebbe la precisione.) Mi permette di dividere per 64 per ottenere una frequenza UART di 115.200. È il più veloce che posso fare con un'alta tolleranza.
Thomas O

1
se il tuo UART lo supporta, è preferibile dargli un overclock (come 16x) in modo che possa sovracampionare il bit iniziale e trovare il centro della cella di bit, ma ottenere un 16x per 115K entro l'1% potrebbe essere una sfida, a meno che usi un cristallo multiplo baud.
JustJeff,

4

L'1% delle menzioni @JustJeff non è richiesto. La maggior parte degli UART consente un errore di mezzo bit sull'ultimo bit. Il più delle volte un frame è composto da 1 bit di avvio, 8 bit di dati e 1 bit di stop, per un totale di 10 bit. Mezzo bit su 10 bit è del 5% (il 6,25% di JustJeff non tiene conto del bit di inizio e di fine).


1
non citarmi male; ri "1%", la mia affermazione era che questo potrebbe essere difficile da raggiungere. Il "6,25%" presupponeva che ti capitasse di colpire il centro del bit di avvio e sarebbe la differenza massima consentita nelle frequenze di clock ricevitore-trasmettitore in tali condizioni.
JustJeff,

1

JustJeff ha dimenticato il bit di inizio, ma Stevenh ha aggiunto il bit di stop. Supponendo che il protocollo comune di 8 bit di dati, 1 bit di inizio e nessun bit di parità (il numero di bit di stop non contano), ci sono 8 1/2 bit di volte dal bordo anteriore del bit di avvio al centro del ultimo bit di dati. In genere, si desidera che il ricevitore esegua il campionamento dell'ultimo bit entro 1/4 di tempo. Si noti che 1/2 bit è la soglia di errore garantita. Qualsiasi cosa lì vicino diventa irraggiungibile poiché c'è sempre un po 'di rumore elettrico e jitter.

1/4 diviso per 8 1/2 = 2,94%.

Come menzionato da JustJeff, la maggior parte delle implementazioni di UART in realtà campionano i dati in arrivo con un clock asincrono 16x. Ciò aggiunge un'altra incertezza di tempo a 1/16 bit poiché questo è l'errore con il quale è possibile misurare il fronte iniziale del bit di avvio. 1/16 bit di tempo su 8 1/2 bit è un altro .74%. Ciò deriva dal budget degli errori calcolato in precedenza. Si finisce con il 2,2% di mancata corrispondenza dell'orologio per il ricevitore per campionare l'ultimo bit entro 1/4 bit dal suo centro.

Come altri hanno già detto, l'uso di un cristallo a 7,3728 MHz è una pratica comune quando è richiesta una baud rate accurata. Di solito è possibile organizzare l'esecuzione della CPU vicino alla sua velocità massima mentre si colpisce la velocità di trasmissione UART in errore di cristallo.


Non sono d'accordo sul fatto che i bit di stop non contano. In questa domanda la comunicazione non è riuscita perché il bit di stop è stato erroneamente impostato su un livello basso.
Stevenvh,

Il bit di stop deve essere presente affinché la comunicazione generale funzioni, ma non entra nel calcolo del budget degli errori per la maggior parte degli UART. Gli UART richiederanno un tempo minimo dopo l'ultimo bit di dati prima del successivo bordo iniziale del successivo bit di avvio. Ecco a cosa serve il tempo di stop bit. Quando questa volta non viene rispettata, viene visualizzato un "errore di inquadratura". Forse è campionato come un bit di dati, ma conosco casi in cui è stato gestito in modo diverso. I vecchi teletipi avevano bisogno di 2 bit di arresto per dare al meccanismo meccanico il tempo di essere pronti ad afferrare il personaggio successivo.
Olin Lathrop,

Ho fatto riferimento al bit di avvio tre volte, no?
JustJeff,

@OlinLathrop: È richiesto il bit di stop per assicurare che quando si invia un byte MSB cui è zero ci sarà essere un fronte di discesa per il successivo bit di start. Dispositivi diversi si comportano in modo diverso nei casi in cui la linea di dati si abbassa prima che si supponga, ma se non ci fosse un bit di stop una sequenza trasmessa di zero byte non conterrebbe informazioni di temporizzazione utili. Tale requisito potrebbe essere soddisfatto con altri mezzi con un overhead fisso dell'inquadramento inferiore al 25%, ma non sono a conoscenza di nessuno che lo faccia.
supercat

1

Un punto non ancora menzionato è che alcuni dispositivi prevedono di trasmettere un byte di dati per ogni byte di dati che ricevono. Se tale dispositivo viene alimentato continuamente di dati, la sua velocità di trasmissione è persino dello 0,1% più lenta di quella del dispositivo di trasmissione e non ha la possibilità di inviare bit di arresto leggermente ridotti, la sua uscita cadrà di un byte indietro ogni 1000 consecutivi byte che entrano. Se il dispositivo è limitato a 16 byte di buffering, lascerà cadere un byte di dati dopo aver superato circa 16.000 e successivamente lascerà cadere circa un byte per mille. Vale la pena notare che i cosiddetti modem "1200 baud" funzionano effettivamente a una velocità leggermente superiore a 1200 bit / secondo (penso che sia circa 1202) proprio per questo motivo (in modo che anche se il trasmettitore è dello 0,15% più veloce di quanto dovrebbe essere,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.