Ci sono diversi fattori qui:
- Quanto può raggiungere un baud rate con la MCU ATmega328P?
- Quanto è alta la velocità di trasmissione dell'interfaccia USB-seriale?
- Qual è la frequenza dell'oscillatore sull'ATmega328P?
- Qual è la frequenza dell'oscillatore sull'interfaccia seriale USB (se ne ha una)?
- Quanto è tollerata l'interfaccia USB-seriale della discrepanza di baud rate?
Tutti questi fattori sono rilevanti per determinare il baud rate massimo raggiungibile. ATmega328P utilizza un divisore hardware dalla frequenza di clock per generare il clock di base per l'interfaccia seriale. Se non esiste un rapporto intero tra il clock principale e il bit-time della velocità di trasmissione desiderata, l'MCU non sarà in grado di produrre esattamente la velocità desiderata. Ciò può portare a potenziali problemi, poiché alcuni dispositivi sono molto più sensibili alla discrepanza di baud rate rispetto ad altri.
Le interfacce basate su FTDI sono abbastanza tolleranti nei confronti della discrepanza di baud rate, con errori fino a diversi percento. Tuttavia, ho lavorato con moduli GPS integrati specializzati che non sono stati in grado di gestire nemmeno un errore di baud rate dello 0,5%.
Le interfacce seriali generali tollerano un errore di baud rate del 5% circa. Tuttavia, poiché ciascuna estremità può essere disattivata, una specifica più comune è + -2,5%. In questo modo, se un'estremità è veloce al 2,5% e l'altra è lenta al 2,5%, l' errore complessivo è ancora solo del 5%.
In ogni modo. Uno utilizza un ATmega328P come MCU primario e un ATmega16U2 come interfaccia seriale USB. Siamo anche fortunati qui che entrambi questi MCU utilizzano USART harware simili, nonché orologi da 16 Mhz.
Poiché entrambi gli MCU hanno lo stesso hardware e frequenza di clock, entrambi avranno lo stesso errore di baud rate nella stessa direzione, quindi possiamo ignorare funzionalmente il problema di errore di baud.
Ad ogni modo, la risposta "corretta" a questa domanda implicherebbe la ricerca della fonte per l'ATmega16U2 e la determinazione dei possibili baud rate da lì, ma dato che sono pigro, immagino che test empirici semplici funzioneranno.
Una rapida occhiata alla scheda tecnica ATmega328P produce la seguente tabella:
Quindi, dato il baud rate massimo dichiarato di 2 Mbps, ho scritto un programma di test rapido:
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");
};
E poi guardando la porta seriale pertinente con un terminale seriale:
Quindi sembra che l'hardware possa funzionare a 2.000.000 di baud senza problemi.
Si noti che questa velocità di trasmissione fornisce all'MCU 64 80 cicli di clock per byte, quindi sarebbe molto difficile mantenere occupata l'interfaccia seriale. Mentre i singoli byte possono essere trasferiti molto rapidamente, è probabile che ci sia molto tempo quando l'interfaccia è semplicemente inattiva.
Modifica: test effettivi!
I 2 Mbps sono reali:
ogni bit-time è di 500 ns, che corrisponde esattamente a quanto previsto.
Problemi di prestazione! Lunghezza complessiva del pacchetto:
500 Kbaud:
1 MBaud:
2 Mbaud:
Nota: il notevole superamento è dovuto a cattive pratiche di messa a terra della sonda dell'oscilloscopio e probabilmente non è reale. Sto usando il cavo di massa che fa parte della mia sonda dell'oscilloscopio e l'induttanza del cavo è probabilmente la causa della maggior parte del superamento.
Come puoi vedere, la lunghezza totale della trasmissione è la stessa per 0,5, 1 e 2 MBaud. Questo perché il codice che inserisce i byte nel buffer seriale è scarsamente ottimizzato. Come tale, non otterrai mai niente di meglio di un efficace 500 Kbaud, a meno che tu non scriva le tue librerie seriali. Le librerie di Arduino sono scarsamente ottimizzate, quindi probabilmente non sarebbe troppo difficile ottenere 2 Mbaud adeguati, almeno per le trasmissioni a raffica, se ci passassi un po 'di tempo.