Calcolo del baud rate UART

Una UART ottiene il baud rate dividendo un clock, quindi molte velocità risultano un po’ sbagliate. Scegli la tua scheda e una velocità per vedere i registri del divisore, la velocità reale, l’errore e se funzionerà.

I risultati sono calcoli su formule pubblicate, non misure. Verificali sul tuo hardware. Gratis, senza registrazione

Perché l’errore del baud rate conta

La UART non ha un filo di clock. Il ricevitore sa solo quando è iniziato il bit di start; poi legge ogni bit successivo nel momento in cui se lo aspetta, contando con il proprio clock. Se i due lati vanno a velocità un po’ diverse, il punto di lettura si sposta un po’ di più a ogni bit del carattere.

In un carattere di 10 bit (bit di start, 8 bit di dati, bit di stop: “8N1”) anche l’ultimo bit deve essere letto dentro il suo tempo. In teoria questo lascia circa il 5 % di differenza tra i due lati insieme; i ricevitori reali ne usano una parte per il proprio campionamento. Per questo il calcolatore considera fino all’1 % a posto, fino al 2 % di solito a posto se l’altro lato è preciso, e oltre il 2 % rischioso.

Perché alcune velocità sono esatte e altre no

Il divisore può avere solo certi valori, quindi la velocità reale è il clock diviso per il valore più vicino. Un Arduino Uno a 16 MHz fa esattamente 250000, 500000 e 1000000 baud, ma 115200 diventa 117647 (+2,1 %). Un ESP32 divide il suo clock da 80 MHz con un divisore frazionario e arriva molto vicino a tutte le velocità comuni. L’nRF52 offre solo un elenco fisso di velocità, ognuna con il suo piccolo errore.

La formula

AVR (ATmega328P, ATmega2560):  UBRR = fclk / (16 × baud) − 1     doppia velocità (U2X = 1): fclk / (8 × baud) − 1
STM32:            USARTDIV = fck / (16 × baud), BRR = mantissa a 12 bit + frazione a 4 bit
ESP32, S3, C3:    baud = APB_CLK / (CLKDIV + FRAG / 16)
RP2040, RP2350:   baud = 4 × clk_peri / (64 × IBRD + FBRD)
nRF52840:         valori fissi di BAUDRATE, ognuno con la sua velocità reale nella tabella del registro
errore = (velocità reale − velocità voluta) / velocità voluta × 100 %

Fonte: Datasheet ATmega328P, USART0 “Baud Rate Generation” ed “Examples of UBRRn Settings”; RM0368 / RM0383 “Fractional baud rate generation”; ESP32 Technical Reference Manual, UART Controller; RP2040 Datasheet 4.2.7.1 “Baud Rate Calculation” e uart_set_baudrate() del Pico SDK; nRF52840 Product Specification, registro UARTE BAUDRATE.

Esempio svolto

Arduino Uno, 16 MHz, 115200 baud. Velocità normale: UBRR = 16 000 000 / (16 × 115200) − 1 = 7,68, arrotondato a 8, quindi la velocità reale è 16 000 000 / (16 × 9) = 111111 baud (−3,5 %). Doppia velocità (U2X0 = 1): UBRR = 16, velocità reale 16 000 000 / (8 × 17) = 117647 baud, +2,12 %: la migliore delle due, ma ancora rischiosa.

A 9600 baud lo stesso chip ha UBRR = 103 e 9615 baud, solo lo 0,16 % di errore. Un ESP32 a 115200 baud ha CLKDIV 694 e FRAG 7, praticamente esatto.

Domande e risposte

Quale errore di baud rate è accettabile?

Come regola pratica, tieni ogni lato entro circa il 2 % e la differenza totale tra i due lati ben sotto il 5 %; entro l’1 % va sempre bene. Il ricevitore si risincronizza a ogni bit di start, quindi l’errore deve reggere solo per un carattere, non per tutto il messaggio.

Perché 115200 baud dà errori su un Arduino Uno?

A 16 MHz il divisore più vicino dà 117647 baud, il 2,1 % più veloce. Spesso funziona lo stesso con la connessione USB dell’Uno, perché il chip USB-seriale sulla scheda (un ATmega16U2) va anche lui a 16 MHz e fa lo stesso errore. I problemi arrivano parlando con un altro dispositivo che va esattamente a 115200. 38400 (errore dello 0,2 %) o 250000 (esatto) sono scelte più sicure.

Quali baud rate sono esatti a 16 MHz?

250000, 500000 e 1000000 baud sono esatti a 16 MHz, e 9600, 19200 e 38400 sono entro lo 0,2 %. 115200 e 230400 sbagliano di più del 2 % su un AVR a 16 MHz.

I due dispositivi devono avere le stesse impostazioni?

Sì: lo stesso baud rate e lo stesso formato, di solito 8N1 (8 bit di dati, nessuna parità, 1 bit di stop). Il TX di un lato va all’RX dell’altro e le masse devono essere collegate. Anche i livelli di tensione devono coincidere: un TX a 5 V verso un RX a 3,3 V ha bisogno di un partitore o di un traslatore di livello.

Quanti byte al secondo dà un baud rate?

Con 8N1 ogni byte occupa 10 bit (start, 8 bit di dati, stop), quindi dividi il baud rate per 10: 115200 baud portano al massimo 11520 byte al secondo, 9600 baud ne portano 960.

Impara le basi

Lezioni gratuite del corso di BoardPilot che spiegano le idee dietro questo calcolatore:

Altri calcolatori

Guardalo su una scheda vera

BoardPilot usa questi stessi calcoli dentro l’app, accanto a una vista 3D dal vivo della tua scheda, dei pin e dei fili, con un debug guidato quando qualcosa non funziona. Provalo nel browser o scaricalo per macOS e Windows.